project-auto-wizard 0.13.3 → 0.15.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.
- package/README.ja.md +2 -0
- package/README.ko.md +2 -0
- package/README.md +3 -1
- package/README.zh-CN.md +2 -0
- package/bin/project-auto-wizard.js +18 -4
- package/package.json +2 -2
- package/payload/config/breaking-changes.json +28 -14
- package/payload/config/wizard-prompts.yml +102 -46
- package/payload/flutter-app/android/fastlane/Fastfile.playstore +44 -32
- package/payload/flutter-app/ios/ExportOptions.plist +8 -8
- package/payload/flutter-app/ios/fastlane/Fastfile +57 -43
- package/payload/scripts/changelog_manager.py +304 -265
- package/payload/scripts/issue_helper.py +54 -50
- package/payload/scripts/messages.py +2585 -0
- package/payload/scripts/truncate_release_notes.py +7 -6
- package/payload/scripts/version_manager.py +110 -107
- package/payload/version.yml.template +2 -1
- package/payload/workflows/common/PROJECT-COMMON-AI-PR-SUMMARY.yaml +23 -16
- package/payload/workflows/common/PROJECT-COMMON-AUTO-CHANGELOG-CONTROL.yaml +106 -63
- package/payload/workflows/common/PROJECT-COMMON-ISSUE-HELPER.yaml +17 -15
- package/payload/workflows/common/PROJECT-COMMON-README-VERSION-UPDATE.yaml +55 -45
- package/payload/workflows/common/PROJECT-COMMON-RELEASE-PUBLISH.yaml +90 -72
- package/payload/workflows/common/PROJECT-COMMON-VERSION-CONTROL.yaml +59 -45
- package/payload/workflows/flutter/PROJECT-FLUTTER-ANDROID-FIREBASE-CICD.yaml +194 -184
- package/payload/workflows/flutter/PROJECT-FLUTTER-ANDROID-PLAYSTORE-CICD.yaml +226 -213
- package/payload/workflows/flutter/PROJECT-FLUTTER-ANDROID-SELFHOSTED-CICD.yaml +46 -42
- package/payload/workflows/flutter/PROJECT-FLUTTER-ANDROID-TEST-APK.yaml +334 -241
- package/payload/workflows/flutter/PROJECT-FLUTTER-APP-BUILD-TRIGGER.yaml +152 -128
- package/payload/workflows/flutter/PROJECT-FLUTTER-CI.yaml +246 -188
- package/payload/workflows/flutter/PROJECT-FLUTTER-IOS-TEST-TESTFLIGHT.yaml +353 -238
- package/payload/workflows/flutter/PROJECT-FLUTTER-IOS-TESTFLIGHT.yaml +96 -85
- package/payload/workflows/go/PROJECT-GO-CI.yaml +47 -36
- package/payload/workflows/go/PROJECT-GO-PR-PREVIEW.yaml +945 -508
- package/payload/workflows/go/PROJECT-GO-SIMPLE-CICD.yaml +155 -133
- package/payload/workflows/next/PROJECT-NEXT-CI.yaml +76 -60
- package/payload/workflows/next/PROJECT-NEXT-CICD.yaml +97 -77
- package/payload/workflows/python/PROJECT-PYTHON-CI.yaml +62 -47
- package/payload/workflows/python/PROJECT-PYTHON-PR-PREVIEW.yaml +942 -505
- package/payload/workflows/python/PROJECT-PYTHON-SIMPLE-CICD.yaml +148 -126
- package/payload/workflows/react/PROJECT-REACT-CI.yaml +86 -70
- package/payload/workflows/react/PROJECT-REACT-CICD.yaml +112 -92
- package/payload/workflows/spring/PROJECT-SPRING-CI.yml +112 -82
- package/payload/workflows/spring/server-deploy/PROJECT-SPRING-NONSTOP-NGINX-CICD.yaml +180 -150
- package/payload/workflows/spring/server-deploy/PROJECT-SPRING-NONSTOP-TRAEFIK-CICD.yaml +161 -131
- package/payload/workflows/spring/server-deploy/PROJECT-SPRING-PR-PREVIEW.yaml +970 -549
- package/payload/workflows/spring/server-deploy/PROJECT-SPRING-SIMPLE-CICD.yaml +193 -162
- package/src/cli/args.js +98 -52
- package/src/cli/help.js +8 -41
- package/src/commands/doctor.js +90 -89
- package/src/commands/dry-run.js +64 -43
- package/src/commands/full.js +79 -77
- package/src/commands/install-settings.js +16 -15
- package/src/commands/interactive-flutter.js +20 -19
- package/src/commands/interactive.js +135 -132
- package/src/commands/purge.js +47 -42
- package/src/commands/status.js +36 -36
- package/src/commands/uninstall.js +43 -41
- package/src/context.js +12 -11
- package/src/core/assets.js +12 -11
- package/src/core/baseline.js +27 -27
- package/src/core/branches.js +29 -27
- package/src/core/branding.js +7 -6
- package/src/core/breaking-check.js +22 -21
- package/src/core/breaking.js +15 -8
- package/src/core/copy/app-files.js +5 -4
- package/src/core/copy/flutter-app.js +8 -8
- package/src/core/copy/gitignore.js +58 -50
- package/src/core/copy/readme.js +102 -36
- package/src/core/copy/simple.js +16 -15
- package/src/core/copy/workflows.js +131 -124
- package/src/core/deploy-style.js +51 -48
- package/src/core/detect-fs.js +57 -57
- package/src/core/detect.js +67 -65
- package/src/core/errors.js +2 -2
- package/src/core/flutter-doctor.js +17 -16
- package/src/core/flutter-hooks.js +33 -32
- package/src/core/flutter-options.js +34 -33
- package/src/core/fsutil.js +12 -12
- package/src/core/installed-stores.js +4 -4
- package/src/core/logger.js +42 -40
- package/src/core/paths-resolve.js +88 -86
- package/src/core/paths.js +10 -10
- package/src/core/release-options.js +8 -8
- package/src/core/removal-exec.js +14 -13
- package/src/core/removal-plan.js +37 -37
- package/src/core/types.js +47 -47
- package/src/core/verify.js +44 -38
- package/src/core/version-yml.js +76 -68
- package/src/core/wizard-env.js +46 -46
- package/src/core/wizard-labels.js +63 -41
- package/src/i18n/catalog/en/cli.js +50 -0
- package/src/i18n/catalog/en/commands.js +188 -0
- package/src/i18n/catalog/en/copy.js +20 -0
- package/src/i18n/catalog/en/core.js +74 -0
- package/src/i18n/catalog/en/core2.js +15 -0
- package/src/i18n/catalog/en/ui.js +221 -0
- package/src/i18n/catalog/en.js +12 -0
- package/src/i18n/catalog/index.js +5 -0
- package/src/i18n/catalog/ko/cli.js +50 -0
- package/src/i18n/catalog/ko/commands.js +188 -0
- package/src/i18n/catalog/ko/copy.js +20 -0
- package/src/i18n/catalog/ko/core.js +74 -0
- package/src/i18n/catalog/ko/core2.js +15 -0
- package/src/i18n/catalog/ko/ui.js +221 -0
- package/src/i18n/catalog/ko.js +10 -0
- package/src/i18n/index.js +44 -0
- package/src/i18n/languages.js +9 -0
- package/src/index.js +132 -97
- package/src/ui/ansi.js +7 -7
- package/src/ui/banner.js +7 -6
- package/src/ui/env-plan.js +82 -81
- package/src/ui/prompts.js +97 -122
- package/src/ui/readline-engine.js +59 -58
- package/src/ui/status-cards.js +37 -31
- package/src/ui/summary.js +90 -89
|
@@ -0,0 +1,2585 @@
|
|
|
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
|
+
# --- version_manager ---
|
|
1216
|
+
"version_manager.err_yml_missing": "ERROR: version.yml not found",
|
|
1217
|
+
"version_manager.warn_code_missing": "WARNING: version_code field missing, adding default value 1",
|
|
1218
|
+
"version_manager.warn_code_regress": "WARNING: version_code {new_code} is lower than current {current} — writing anyway (regression?)",
|
|
1219
|
+
"version_manager.warn_version_missing": "WARNING: version field missing in version.yml, adding it",
|
|
1220
|
+
"version_manager.warn_spring_no_version": "WARNING: spring: {pom} has no project <version> (inherited from parent?) — skipping",
|
|
1221
|
+
"version_manager.warn_spring_property": "WARNING: spring: {pom} <version> is a property ({version}) — skipping",
|
|
1222
|
+
"version_manager.updated": "updated: {path}",
|
|
1223
|
+
"version_manager.warn_spring_no_files": "WARNING: spring: no build.gradle(.kts) or pom.xml found under {dir} — skipping",
|
|
1224
|
+
"version_manager.warn_spring_no_gradle_line": "WARNING: spring: no `version = '...'` line in {file} — skipping",
|
|
1225
|
+
"version_manager.pubspec_ahead": "pubspec.yaml build number {build} is ahead of version_code {code} — adopting it",
|
|
1226
|
+
"version_manager.warn_flutter_missing": "WARNING: flutter: {target} not found — skipping",
|
|
1227
|
+
"version_manager.warn_target_missing": "WARNING: {target} not found — skipping",
|
|
1228
|
+
"version_manager.warn_python_no_version": "WARNING: python: no version in pyproject.toml [project]/[tool.poetry] or setup.py under {dir} — skipping",
|
|
1229
|
+
"version_manager.skipped_plist": "skipped: {file} — CFBundleShortVersionString references a build variable",
|
|
1230
|
+
"version_manager.warn_rn_ios_missing": "WARNING: react-native: {dir} not found — skipping",
|
|
1231
|
+
"version_manager.warn_rn_gradle_missing": "WARNING: react-native: {file} not found — skipping",
|
|
1232
|
+
"version_manager.warn_rn_no_targets": "WARNING: react-native: no target files found under {dir}",
|
|
1233
|
+
"version_manager.warn_unknown_type": "WARNING: unknown project type: {type} — skipping",
|
|
1234
|
+
"version_manager.err_type": "ERROR: {type}: {error}",
|
|
1235
|
+
"version_manager.readme_updated": "README.md version line -> v{version}",
|
|
1236
|
+
"version_manager.warn_read_failed": "WARNING: failed reading project file for {type}: {error}",
|
|
1237
|
+
"version_manager.sync_check": "Version sync check",
|
|
1238
|
+
"version_manager.sync_yml_version": " version.yml: {version}",
|
|
1239
|
+
"version_manager.sync_project_version": " project file: {version}",
|
|
1240
|
+
"version_manager.sync_mismatch": "Version mismatch detected, syncing to higher version: {version}",
|
|
1241
|
+
"version_manager.warn_format_invalid": "WARNING: version format invalid, cannot sync",
|
|
1242
|
+
"version_manager.sync_multi": "Multi-type — reconciling all type files to version.yml version: {version}",
|
|
1243
|
+
"version_manager.sync_ok": "Version already in sync: {version}",
|
|
1244
|
+
"version_manager.err_invalid_version": "ERROR: invalid version format: {version}",
|
|
1245
|
+
"version_manager.err_invalid_version_xyz": "ERROR: invalid version format: {version} (must be x.y.z)",
|
|
1246
|
+
"version_manager.err_generic": "ERROR: {error}",
|
|
1247
|
+
"version_manager.err_no_types_sync": "ERROR: version.yml has no readable project_types — cannot sync project files",
|
|
1248
|
+
"version_manager.err_no_types_check": "ERROR: version.yml has no readable project_types — cannot sync versions",
|
|
1249
|
+
"version_manager.err_write_failed": "failed to write version {version} to version.yml",
|
|
1250
|
+
"version_manager.err_not_json": "{target} is not valid JSON ({error}) — cannot write version",
|
|
1251
|
+
"version_manager.err_sync_failed": "project file sync failed for: {types}",
|
|
1252
|
+
# --- changelog_engine ---
|
|
1253
|
+
"changelog.engine_bump_failed": "bump AI assist failed: {error}",
|
|
1254
|
+
"changelog.engine_bump_copilot_failed": "bump AI assist (copilot) failed: {error}",
|
|
1255
|
+
"changelog.engine_user_api_empty": "user-api failed: empty content in response",
|
|
1256
|
+
"changelog.engine_user_api_failed": "user-api failed: {error}",
|
|
1257
|
+
"changelog.engine_copilot_invalid": "copilot failed: empty or not in the requested Markdown format",
|
|
1258
|
+
"changelog.engine_copilot_failed": "copilot failed: {error}",
|
|
1259
|
+
"changelog.engine_copilot_exit": "copilot exited with {code}: {detail}",
|
|
1260
|
+
"changelog.output_write_failed": "output write failed: {error}",
|
|
1261
|
+
# --- wf_common ---
|
|
1262
|
+
"wf_common.copilot_ai_option": "copilot_ai option: {copilot_ai}",
|
|
1263
|
+
"wf_common.semver_auto_option": "semver_auto option: {semver_auto}",
|
|
1264
|
+
"wf_common.bump_level": "bump level: {bump}",
|
|
1265
|
+
"wf_common.version_bump_failed": "version bump failed",
|
|
1266
|
+
"wf_common.no_changes": "no changes to commit",
|
|
1267
|
+
"wf_common.push_attempt": "push attempt {retry_count}/{max_retries}...",
|
|
1268
|
+
"wf_common.push_failed_syncing": "push failed, syncing with remote...",
|
|
1269
|
+
"wf_common.rebase_ok": "rebase ok, retrying push...",
|
|
1270
|
+
"wf_common.rebase_failed": "rebase failed, manual conflict resolution required",
|
|
1271
|
+
"wf_common.push_gave_up": "push failed after {max_retries} attempts",
|
|
1272
|
+
# --- wf_aisum ---
|
|
1273
|
+
"wf_aisum.expected_version": "expected next version: {version} (current: {current_version}, mode: {mode}, bump: {bump})",
|
|
1274
|
+
"wf_aisum.comment_update_failed": "comment update failed — continuing (this workflow never blocks the PR)",
|
|
1275
|
+
"wf_aisum.comment_post_failed": "comment post failed — continuing (this workflow never blocks the PR)",
|
|
1276
|
+
# --- wf_changelog ---
|
|
1277
|
+
"wf_changelog.pr_not_open": "PR #{pr_number} is already {state} — skipping the release pipeline",
|
|
1278
|
+
"wf_changelog.pr_state": "PR #{pr_number} state: {state}",
|
|
1279
|
+
"wf_changelog.commits_to_summarize": "commits to summarize: {n}",
|
|
1280
|
+
"wf_changelog.version_raised": "confirmed version raised: {head_version} -> {new_version} ({bump} from {main_branch} {main_version})",
|
|
1281
|
+
"wf_changelog.version_reuse_unreleased": "version already confirmed and not yet released — reusing {new_version} ({main_branch} is {main_version})",
|
|
1282
|
+
"wf_changelog.version_reuse_previous": "version already confirmed by a previous run — reusing {new_version} (no re-increment)",
|
|
1283
|
+
"wf_changelog.version_confirmed": "release version confirmed: {new_version} ({bump})",
|
|
1284
|
+
"wf_changelog.summary_engine": "summary engine: {engine_line}",
|
|
1285
|
+
"wf_changelog.comment_updated": "summary comment updated (#{comment_id})",
|
|
1286
|
+
"wf_changelog.comment_update_failed": "comment update failed — continuing (this workflow never blocks the release)",
|
|
1287
|
+
"wf_changelog.comment_posted": "summary comment posted",
|
|
1288
|
+
"wf_changelog.comment_post_failed": "comment post failed — continuing (this workflow never blocks the release)",
|
|
1289
|
+
"wf_changelog.pr_closed_skip_docs": "PR is already {pr_state} — not pushing release docs",
|
|
1290
|
+
"wf_changelog.docs_pushed": "release docs pushed to {head_branch}",
|
|
1291
|
+
"wf_changelog.pr_already_merged": "PR #{pr_number} is already merged",
|
|
1292
|
+
"wf_changelog.automerge_enabled": "automerge enabled: {subject}",
|
|
1293
|
+
"wf_changelog.automerge_unavailable": "automerge unavailable — merged directly: {subject}",
|
|
1294
|
+
"wf_changelog.merge_retry": "merge attempt {attempt}/{max_attempts} failed — retrying in {wait}s",
|
|
1295
|
+
"wf_changelog.merge_gave_up": "PR merge failed after {max_attempts} attempts (allow_merge_commit={allow_merge_commit}) — check branch protection rules, required checks, and token permissions",
|
|
1296
|
+
# --- wf_readme ---
|
|
1297
|
+
"wf_readme.not_found": "README.md not found — nothing to update, skipping",
|
|
1298
|
+
"wf_readme.read_version_failed": "failed to read the current version",
|
|
1299
|
+
"wf_readme.update_failed": "README.md version update failed",
|
|
1300
|
+
"wf_readme.err_type": " error type: {error_type}",
|
|
1301
|
+
"wf_readme.err_current_line": " current version line: {version_line}",
|
|
1302
|
+
"wf_readme.err_header": " extracted header: {header_part}",
|
|
1303
|
+
"wf_readme.err_new_text": " new version text: {version_text}",
|
|
1304
|
+
"wf_readme.hint_formats": "Make sure the README version line matches one of:",
|
|
1305
|
+
"wf_readme.hint_notes": "Notes:",
|
|
1306
|
+
"wf_readme.hint_no_bold": " - no markdown bold (**) characters",
|
|
1307
|
+
"wf_readme.hint_no_regex": " - no regex special characters (*, [, ], ^, $)",
|
|
1308
|
+
"wf_readme.hint_after_colon": " - the version must come right after the colon (:)",
|
|
1309
|
+
"wf_readme.text_with_date": "version text with date: {version_text}",
|
|
1310
|
+
"wf_readme.text": "version text: {version_text}",
|
|
1311
|
+
"wf_readme.line_found": "version line found: {version_line}",
|
|
1312
|
+
"wf_readme.line_inserting": "no version line found — inserting a new one",
|
|
1313
|
+
"wf_readme.line_inserted": "default version line inserted: {version_text}",
|
|
1314
|
+
"wf_readme.warn_bold": "warning: the version line contains markdown bold (**) characters",
|
|
1315
|
+
"wf_readme.warn_current_line": " current line: {version_line}",
|
|
1316
|
+
"wf_readme.warn_may_break": " this may break the version update",
|
|
1317
|
+
"wf_readme.marker_added": "auto-update marker comment added",
|
|
1318
|
+
"wf_readme.updated_line_detail": " updated line: {updated_line}",
|
|
1319
|
+
"wf_readme.line_updated": "version line updated: {version_text}",
|
|
1320
|
+
"wf_readme.no_changes": "no changes in README.md",
|
|
1321
|
+
"wf_readme.pushed": "README.md version update pushed",
|
|
1322
|
+
"wf_readme.err_no_colon": "header extraction failed - no colon (:) found",
|
|
1323
|
+
"wf_readme.err_sed": "sed command failed - {error}",
|
|
1324
|
+
"wf_readme.err_sed_unknown": "unknown sed error",
|
|
1325
|
+
"wf_readme.err_verify": "version replacement verification failed",
|
|
1326
|
+
# --- wf_release ---
|
|
1327
|
+
"wf_release.branch_mode": "branch mode: {mode}",
|
|
1328
|
+
"wf_release.gate_open": "release gate open (mode={mode}, event={event})",
|
|
1329
|
+
"wf_release.gate_closed": "not a release-confirm push in pr-flow mode — skipping",
|
|
1330
|
+
"wf_release.drift_skipped": "drift guard skipped (no version.yml version or no tag yet)",
|
|
1331
|
+
"wf_release.drift_error": "version.yml({file_version}) is ahead of the newest tag({latest_tag}) but no release was published — this version will never reach npm. Recover with: Actions → PROJECT-RELEASE-PUBLISH → Run workflow (workflow_dispatch bypasses this gate).",
|
|
1332
|
+
"wf_release.drift_ok": "drift guard ok (version.yml={file_version}, latest tag={latest_tag})",
|
|
1333
|
+
"wf_release.head_is_docs_commit": "HEAD is already this workflow's release docs commit — skipping re-increment (idempotent re-run)",
|
|
1334
|
+
"wf_release.collect_since": "collecting commits since {last_tag}",
|
|
1335
|
+
"wf_release.collect_all": "no previous tag — collecting the full history",
|
|
1336
|
+
"wf_release.release_version": "release version: {new_version} ({bump})",
|
|
1337
|
+
"wf_release.docs_pushed": "release docs pushed",
|
|
1338
|
+
"wf_release.read_version_failed": "failed to read version",
|
|
1339
|
+
"wf_release.tag_exists": "tag v{version} already exists — skipping tag push",
|
|
1340
|
+
"wf_release.release_exists": "release v{version} already exists — nothing to publish",
|
|
1341
|
+
"wf_release.publishing": "publishing release v{version}",
|
|
1342
|
+
"wf_release.tag_pushed": "tag v{version} pushed",
|
|
1343
|
+
"wf_release.notes_assembled": "release notes assembled ({n} bytes)",
|
|
1344
|
+
"wf_release.published": "GitHub Release v{version} published",
|
|
1345
|
+
# --- wf_version ---
|
|
1346
|
+
"wf_version.trunk_skip": "trunk-based mode detected — RELEASE-PUBLISH owns version bumping, skipping",
|
|
1347
|
+
"wf_version.confirm_skip": "release-confirm commit detected (chore(release):) — skipping safety-net bump",
|
|
1348
|
+
"wf_version.release_merge_skip": "release merge detected (push contains a version.yml change) — skipping safety-net bump",
|
|
1349
|
+
"wf_version.direct_push": "direct push to {main_branch} detected — running safety-net version bump",
|
|
1350
|
+
"wf_version.read_current_failed": "failed to read current version",
|
|
1351
|
+
"wf_version.current_version": "current version: {current_version}",
|
|
1352
|
+
"wf_version.new_version": "new version: {new_version}",
|
|
1353
|
+
"wf_version.project_types": "project types: {project_types}",
|
|
1354
|
+
"wf_version.yml_not_found": "version.yml not found",
|
|
1355
|
+
"wf_version.commits_since": "commits since {last_tag}: {n}",
|
|
1356
|
+
"wf_version.no_changes_synced": "no changes to commit (already in sync)",
|
|
1357
|
+
"wf_version.bump_pushed": "version bump commit pushed",
|
|
1358
|
+
"wf_version.commit_failed": "commit failed",
|
|
1359
|
+
"wf_version.no_develop": "branch {develop_branch} not found — nothing to back-merge",
|
|
1360
|
+
"wf_version.already_contains": "{develop_branch} already contains {main_branch}",
|
|
1361
|
+
"wf_version.backmerged": "safety-net bump v{new_version} merged into {develop_branch}",
|
|
1362
|
+
"wf_version.push_retry": "push attempt {attempt} failed — retrying",
|
|
1363
|
+
"wf_version.finished": "version-control workflow finished",
|
|
1364
|
+
"wf_version.sum_skipped": " skipped (release merge / trunk-based): {skip}",
|
|
1365
|
+
"wf_version.sum_previous": " previous version: {current_version}",
|
|
1366
|
+
"wf_version.sum_new": " new version: {new_version}",
|
|
1367
|
+
"wf_version.sum_branch": " branch: {ref_name}",
|
|
1368
|
+
}
|
|
1369
|
+
|
|
1370
|
+
KO = {
|
|
1371
|
+
# --- apk_test ---
|
|
1372
|
+
"apk_test.branch_check_log": "🔍 브랜치 존재 여부 확인: {branch}",
|
|
1373
|
+
"apk_test.branch_exists_log": "✅ 브랜치 존재 확인됨: {branch}",
|
|
1374
|
+
"apk_test.branch_not_found_log": "❌ 브랜치를 찾을 수 없음: {branch}",
|
|
1375
|
+
"apk_test.branch_missing_title": "🤖 ❌ **Android 테스트 APK 빌드 실패 - 브랜치를 찾을 수 없습니다**",
|
|
1376
|
+
"apk_test.kv_head": "| 항목 | 값 |",
|
|
1377
|
+
"apk_test.row_requested_branch": "| **요청된 브랜치** | `{branch}` |",
|
|
1378
|
+
"apk_test.row_issue_pr": "| **이슈/PR** | #{number} |",
|
|
1379
|
+
"apk_test.hint_title": "### 💡 확인 사항",
|
|
1380
|
+
"apk_test.hint_pushed": "1. 브랜치가 원격 저장소에 push되었는지 확인하세요",
|
|
1381
|
+
"apk_test.hint_helper_branch": "2. \"Issue Helper\" 댓글의 브랜치명이 올바른지 확인하세요",
|
|
1382
|
+
"apk_test.hint_typo": "3. 브랜치명에 오타가 없는지 확인하세요",
|
|
1383
|
+
"apk_test.workflow_log_link": "🔗 [워크플로우 로그]({url})",
|
|
1384
|
+
"apk_test.branch_not_found_fail": "브랜치를 찾을 수 없습니다: {branch}",
|
|
1385
|
+
"apk_test.branch_check_error_fail": "브랜치 확인 중 오류: {error}",
|
|
1386
|
+
"apk_test.firebase_detected": "✅ Firebase 서비스 계정 감지 - App Distribution 업로드 예정",
|
|
1387
|
+
"apk_test.firebase_missing": "⚠️ Firebase 서비스 계정 없음 - App Distribution 업로드 건너뜀",
|
|
1388
|
+
"apk_test.title_running": "## 🤖 Android APK 빌드 중...",
|
|
1389
|
+
"apk_test.title_done": "## 🤖 ✅ Android APK 빌드 완료!",
|
|
1390
|
+
"apk_test.title_failed": "## 🤖 ❌ Android APK 빌드 실패",
|
|
1391
|
+
"apk_test.table_header": "| 단계 | 상태 | 소요 시간 |",
|
|
1392
|
+
"apk_test.step_prepare": "🔧 준비",
|
|
1393
|
+
"apk_test.step_build": "🔨 APK 빌드",
|
|
1394
|
+
"apk_test.step_upload": "📤 GitHub 아티팩트 업로드",
|
|
1395
|
+
"apk_test.step_firebase": "🔥 Firebase App Distribution",
|
|
1396
|
+
"apk_test.st_running": "⏳ 진행 중...",
|
|
1397
|
+
"apk_test.st_waiting": "⏸️ 대기",
|
|
1398
|
+
"apk_test.st_done": "✅ 완료",
|
|
1399
|
+
"apk_test.st_failed": "❌ 실패",
|
|
1400
|
+
"apk_test.st_skipped": "⏸️ 건너뜀",
|
|
1401
|
+
"apk_test.live_log": "📋 **[실시간 로그 보기]({url})**",
|
|
1402
|
+
"apk_test.log_progress_created": "✅ 진행상황 댓글 생성 완료 (ID: {id})",
|
|
1403
|
+
"apk_test.pull_branch": "🌿 브랜치: {branch}",
|
|
1404
|
+
"apk_test.pull_failed": "⚠️ Pull 실패 (이미 최신 상태일 수 있음)",
|
|
1405
|
+
"apk_test.branch_name_log": "🌿 브랜치명: {branch}",
|
|
1406
|
+
"apk_test.issue_number_missing": "⚠️ 브랜치명에서 이슈 번호를 찾을 수 없습니다.",
|
|
1407
|
+
"apk_test.issue_number_extracted": "✅ 추출된 이슈 번호: #{number}",
|
|
1408
|
+
"apk_test.issue_fetching": "🔍 GitHub API로 이슈 정보 조회 중...",
|
|
1409
|
+
"apk_test.issue_title_default": "이슈 정보 없음",
|
|
1410
|
+
"apk_test.issue_not_found": "⚠️ 이슈 #{number}를 찾을 수 없습니다.",
|
|
1411
|
+
"apk_test.issue_title_log": "📋 이슈 제목: {title}",
|
|
1412
|
+
"apk_test.issue_state_log": "📌 이슈 상태: {state}",
|
|
1413
|
+
"apk_test.event_dispatch": "📋 repository_dispatch 이벤트 감지",
|
|
1414
|
+
"apk_test.event_pr_number": " PR 번호: #{pr}",
|
|
1415
|
+
"apk_test.event_build_number_pr": " 빌드 번호: {build} (PR 번호 사용)",
|
|
1416
|
+
"apk_test.event_workflow_dispatch": "📋 workflow_dispatch 이벤트 감지",
|
|
1417
|
+
"apk_test.event_build_number_default": " 빌드 번호: {build} (기본값)",
|
|
1418
|
+
"apk_test.build_info_header": "📋 빌드 정보:",
|
|
1419
|
+
"apk_test.build_info_build": " 빌드 번호: #{build}",
|
|
1420
|
+
"apk_test.build_info_pr": " PR 번호: #{pr}",
|
|
1421
|
+
"apk_test.build_info_commit": " 커밋 해시: {commit}",
|
|
1422
|
+
"apk_test.build_info_date": " 빌드 날짜: {date}",
|
|
1423
|
+
"apk_test.sign_debug_warning": "서명 Secret이 비어 있어 debug 키로 서명합니다:{missing} (스토어 업로드용 키가 아닙니다)",
|
|
1424
|
+
"apk_test.sign_keystore_empty": "RELEASE_KEYSTORE_BASE64를 디코딩한 keystore가 비어 있습니다",
|
|
1425
|
+
"apk_test.sign_release_ok": "✅ Release Keystore 생성 완료 (release 키로 서명)",
|
|
1426
|
+
"apk_test.key_properties_ok": "✅ key.properties 생성 완료",
|
|
1427
|
+
"apk_test.gradlew_missing": "ℹ️ gradlew가 저장소에 없습니다 — flutter build가 생성합니다",
|
|
1428
|
+
"apk_test.elapsed_min_sec": "{m}분 {s}초",
|
|
1429
|
+
"apk_test.elapsed_sec": "{s}초",
|
|
1430
|
+
"apk_test.log_prepare_done": "✅ 진행상황 업데이트: 준비 완료 ({elapsed})",
|
|
1431
|
+
"apk_test.log_build_done": "✅ 진행상황 업데이트: APK 빌드 완료 ({elapsed})",
|
|
1432
|
+
"apk_test.apk_filename_log": "📦 APK 파일명: {name}",
|
|
1433
|
+
"apk_test.version_set_log": "📋 테스트 빌드 버전 설정: {version}",
|
|
1434
|
+
"apk_test.pubspec_updated": "✅ pubspec.yaml 버전 변경 완료:",
|
|
1435
|
+
"apk_test.flutter_build_log": "📦 Flutter 직접 빌드...",
|
|
1436
|
+
"apk_test.apk_size_log": "📦 APK 파일 크기: {size}MB",
|
|
1437
|
+
"apk_test.apk_size_over": "⚠️ 경고: APK 파일 크기가 500MB를 초과합니다 ({size}MB)",
|
|
1438
|
+
"apk_test.apk_size_ok": "✅ APK 파일 크기가 아티팩트 제한 내입니다 ({size}MB / 500MB)",
|
|
1439
|
+
"apk_test.info_title": "테스트 APK 빌드 정보",
|
|
1440
|
+
"apk_test.info_build_number": "빌드 번호: #{build}",
|
|
1441
|
+
"apk_test.info_pr_number": "PR 번호: #{pr}",
|
|
1442
|
+
"apk_test.info_branch": "브랜치: {branch}",
|
|
1443
|
+
"apk_test.info_commit": "커밋: {commit}",
|
|
1444
|
+
"apk_test.info_full_commit": "전체 커밋 해시: {sha}",
|
|
1445
|
+
"apk_test.info_date": "빌드 날짜: {date}",
|
|
1446
|
+
"apk_test.info_issue_header": "관련 이슈:",
|
|
1447
|
+
"apk_test.info_file_created": "📋 빌드 정보 파일 생성 완료:",
|
|
1448
|
+
"apk_test.firebase_creds_ok": "✅ Firebase 서비스 계정 JSON 파일 생성 완료",
|
|
1449
|
+
"apk_test.fb_notes_build": "테스트 빌드 #{build}",
|
|
1450
|
+
"apk_test.fb_notes_branch": "브랜치: {branch}",
|
|
1451
|
+
"apk_test.fb_notes_commit": "커밋: {commit}",
|
|
1452
|
+
"apk_test.fb_notes_issue": "이슈: #{number} {title}",
|
|
1453
|
+
"apk_test.firebase_upload_ok": "✅ Firebase App Distribution 업로드 성공",
|
|
1454
|
+
"apk_test.firebase_upload_failed": "❌ Firebase App Distribution 업로드 실패 - APK 아티팩트는 정상 업로드됨",
|
|
1455
|
+
"apk_test.result_title": "### 📦 빌드 결과",
|
|
1456
|
+
"apk_test.row_app_version": "| **앱 버전** | `{version}({build})` |",
|
|
1457
|
+
"apk_test.row_branch": "| **브랜치** | `{branch}` |",
|
|
1458
|
+
"apk_test.row_commit": "| **커밋** | `{commit}` |",
|
|
1459
|
+
"apk_test.row_total": "| **총 소요 시간** | {elapsed} |",
|
|
1460
|
+
"apk_test.firebase_installable": "🔥 **Firebase App Tester 앱에서 설치 가능합니다**",
|
|
1461
|
+
"apk_test.firebase_failed_hint": "⚠️ **Firebase 업로드 실패 - 아티팩트에서 APK를 다운로드해주세요**",
|
|
1462
|
+
"apk_test.artifact_link": "📦 **[아티팩트 다운로드]({url})**",
|
|
1463
|
+
"apk_test.run_log_link": "🔗 **[워크플로우 실행 로그]({url})**",
|
|
1464
|
+
"apk_test.log_success": "✅ 진행상황 업데이트: 빌드 성공 (총 {elapsed})",
|
|
1465
|
+
"apk_test.issue_done_title": "🤖 ✅ **Android APK 빌드 완료**",
|
|
1466
|
+
"apk_test.issue_line_version": "- 앱 버전: `{version}({build})`",
|
|
1467
|
+
"apk_test.issue_line_commit": "- 커밋: `{commit}`",
|
|
1468
|
+
"apk_test.log_issue_success": "✅ 이슈 #{number}에도 빌드 성공 댓글 작성 완료",
|
|
1469
|
+
"apk_test.fail_line_branch": "- 브랜치: `{branch}`",
|
|
1470
|
+
"apk_test.fail_line_total": "- 총 소요 시간: {elapsed}",
|
|
1471
|
+
"apk_test.build_error": "❌ 빌드 중 오류가 발생했습니다.",
|
|
1472
|
+
"apk_test.run_log_check_link": "🔗 **[워크플로우 실행 로그 확인]({url})**",
|
|
1473
|
+
"apk_test.log_failed": "❌ 진행상황 업데이트: 빌드 실패 ({elapsed})",
|
|
1474
|
+
"apk_test.issue_failed_title": "🤖 ❌ **Android APK 빌드 실패**",
|
|
1475
|
+
"apk_test.log_issue_failed": "❌ 이슈 #{number}에도 빌드 실패 댓글 작성 완료",
|
|
1476
|
+
"apk_test.notify_ok": "✅ Android 테스트 APK 빌드 성공!",
|
|
1477
|
+
"apk_test.notify_build_number": "빌드 번호: {build}",
|
|
1478
|
+
"apk_test.notify_pr": "PR 번호: {pr}",
|
|
1479
|
+
"apk_test.notify_branch": "브랜치: {branch}",
|
|
1480
|
+
"apk_test.notify_commit": "커밋: {commit}",
|
|
1481
|
+
"apk_test.notify_issue": "관련 이슈: {url}",
|
|
1482
|
+
"apk_test.notify_artifact_hint": "📦 아티팩트에서 APK 파일을 다운로드할 수 있습니다.",
|
|
1483
|
+
"apk_test.notify_fail": "❌ Android 테스트 APK 빌드 실패!",
|
|
1484
|
+
"apk_test.check_logs": "로그를 확인해주세요.",
|
|
1485
|
+
# --- app_trigger ---
|
|
1486
|
+
"app_trigger.reaction_done": "👀 댓글에 확인 리액션 추가 완료",
|
|
1487
|
+
"app_trigger.build_type": "📱 빌드 타입: {type} (Android={android}, iOS={ios})",
|
|
1488
|
+
"app_trigger.branch_from_comment": "🌿 댓글에서 지정된 브랜치: {branch}",
|
|
1489
|
+
"app_trigger.branch_override": "🌿 댓글 지정 브랜치 우선 적용: {branch} (PR head={head})",
|
|
1490
|
+
"app_trigger.pr_confirmed": "✅ PR 확인: #{number}",
|
|
1491
|
+
"app_trigger.branch_name": "🌿 브랜치명: {branch}",
|
|
1492
|
+
"app_trigger.commit_sha": "📝 커밋 해시: {sha}",
|
|
1493
|
+
"app_trigger.issue_extracted": "📌 추출된 이슈 번호: #{number}",
|
|
1494
|
+
"app_trigger.not_pr": "ℹ️ PR이 아닙니다. 이슈에서 브랜치 정보를 찾습니다...",
|
|
1495
|
+
"app_trigger.custom_branch_used": "🌿 댓글 지정 브랜치 사용 (Guide 댓글 건너뜀): {branch}",
|
|
1496
|
+
"app_trigger.related_issue": "📌 관련 이슈 번호: #{number}",
|
|
1497
|
+
"app_trigger.helper_missing_log": "❌ \"Issue Helper\" 댓글을 찾을 수 없습니다.",
|
|
1498
|
+
"app_trigger.helper_missing_error": "이슈에서 \"Issue Helper\" 댓글을 찾을 수 없습니다. 브랜치 정보가 포함된 댓글이 필요합니다.",
|
|
1499
|
+
"app_trigger.helper_found": "✅ \"Issue Helper\" 댓글 발견",
|
|
1500
|
+
"app_trigger.branch_parse_log": "❌ 브랜치 정보를 파싱할 수 없습니다.",
|
|
1501
|
+
"app_trigger.branch_parse_error": "\"Issue Helper\" 댓글에서 브랜치 정보를 파싱할 수 없습니다. 댓글 형식을 확인해주세요.",
|
|
1502
|
+
"app_trigger.branch_extracted": "🌿 추출된 브랜치명: {branch}",
|
|
1503
|
+
"app_trigger.build_info_extracted": "✅ 이슈 #{number}에서 빌드 정보 추출 완료",
|
|
1504
|
+
"app_trigger.comments_error_log": "❌ 이슈 댓글 조회 중 오류 발생:",
|
|
1505
|
+
"app_trigger.comments_error": "이슈 댓글 조회 중 오류가 발생했습니다: {error}",
|
|
1506
|
+
"app_trigger.trigger_failed_body": "❌ **앱 빌드 트리거 실패**\n\n{error}\n\n**해결 방법:**\n- PR에서 빌드하는 경우: PR 페이지에서 댓글을 작성해주세요.\n- 이슈에서 빌드하는 경우: \"Issue Helper\" 댓글이 있어야 합니다.\n - 댓글에 `### 브랜치` 섹션과 브랜치명이 포함되어 있어야 합니다.\n- 또는 댓글에 브랜치명을 직접 지정할 수 있습니다: `/wizard app build <브랜치명>`",
|
|
1507
|
+
"app_trigger.branch_check_log": "🔍 브랜치 존재 여부 확인: {branch}",
|
|
1508
|
+
"app_trigger.branch_exists_log": "✅ 브랜치 존재 확인됨: {branch}",
|
|
1509
|
+
"app_trigger.branch_not_found_log": "❌ 브랜치를 찾을 수 없음: {branch}",
|
|
1510
|
+
"app_trigger.branch_not_found_error": "브랜치 `{branch}`를 찾을 수 없습니다.",
|
|
1511
|
+
"app_trigger.branch_check_error_log": "❌ 브랜치 확인 중 오류: {error}",
|
|
1512
|
+
"app_trigger.branch_check_error": "브랜치 확인 중 오류가 발생했습니다: {error}",
|
|
1513
|
+
"app_trigger.branch_missing_title": "❌ **앱 빌드 트리거 실패 - 브랜치를 찾을 수 없습니다**",
|
|
1514
|
+
"app_trigger.table_head": "| 항목 | 값 |",
|
|
1515
|
+
"app_trigger.row_requested_branch": "| **요청된 브랜치** | `{branch}` |",
|
|
1516
|
+
"app_trigger.row_issue_pr": "| **이슈/PR** | #{number} |",
|
|
1517
|
+
"app_trigger.hint_title": "### 💡 확인 사항",
|
|
1518
|
+
"app_trigger.hint_pushed": "1. 브랜치가 원격 저장소에 push되었는지 확인하세요",
|
|
1519
|
+
"app_trigger.hint_helper_branch": "2. \"Issue Helper\" 댓글의 브랜치명이 올바른지 확인하세요",
|
|
1520
|
+
"app_trigger.hint_typo": "3. 브랜치명에 오타가 없는지 확인하세요",
|
|
1521
|
+
"app_trigger.workflow_log_link": "🔗 [워크플로우 로그]({url})",
|
|
1522
|
+
"app_trigger.branch_not_found_fail": "브랜치를 찾을 수 없습니다: {branch}",
|
|
1523
|
+
"app_trigger.count_lookup": "📊 {type} #{number}의 빌드 횟수 조회 중...",
|
|
1524
|
+
"app_trigger.count_build_type": "📱 빌드 타입: {type}",
|
|
1525
|
+
"app_trigger.count_ios": "📊 iOS 빌드 카운트: ios + app(공용) 통합",
|
|
1526
|
+
"app_trigger.count_android": "📊 Android 빌드 카운트: apk + app(공용) 통합",
|
|
1527
|
+
"app_trigger.count_app": "📊 전체 앱 빌드 카운트: 모든 빌드 명령어 통합",
|
|
1528
|
+
"app_trigger.count_result": "📊 {type} #{number}: {build_type} {count}번째 빌드",
|
|
1529
|
+
"app_trigger.build_number_generated": "📦 생성된 빌드 번호: {number}",
|
|
1530
|
+
"app_trigger.dispatch_start": "🚀 {platform} 빌드 워크플로우 트리거 시작...",
|
|
1531
|
+
"app_trigger.dispatch_source_number": " {type} 번호: #{number}",
|
|
1532
|
+
"app_trigger.dispatch_build_number": " 빌드 번호: {number}",
|
|
1533
|
+
"app_trigger.dispatch_branch": " 브랜치: {branch}",
|
|
1534
|
+
"app_trigger.dispatch_related_issue": " 관련 이슈 번호: {issue}",
|
|
1535
|
+
"app_trigger.none": "없음",
|
|
1536
|
+
"app_trigger.dispatch_done": "✅ {platform} 빌드 워크플로우 트리거 완료",
|
|
1537
|
+
"app_trigger.done_log": "✅ Android 및 iOS 빌드 워크플로우 트리거 완료",
|
|
1538
|
+
"app_trigger.done_build_number": "📦 빌드 번호: {number}",
|
|
1539
|
+
"app_trigger.done_branch": "🌿 브랜치: {branch}",
|
|
1540
|
+
"app_trigger.done_progress_note": "📋 각 플랫폼별 진행상황 댓글이 자동으로 생성됩니다.",
|
|
1541
|
+
# --- changelog ---
|
|
1542
|
+
"changelog.parser_section_ok": " → 섹션 파서 성공",
|
|
1543
|
+
"changelog.parser_lenient_ok": " → 관대한 파서 성공",
|
|
1544
|
+
"changelog.parser_heuristic_ok": " → 휴리스틱 파서 성공",
|
|
1545
|
+
"changelog.section_breaking": "### ⚠️ 호환성 깨짐",
|
|
1546
|
+
"changelog.section_feat": "### ✨ 기능",
|
|
1547
|
+
"changelog.section_fix": "### 🐛 수정",
|
|
1548
|
+
"changelog.section_perf": "### ⚡ 성능",
|
|
1549
|
+
"changelog.section_docs": "### 📝 문서",
|
|
1550
|
+
"changelog.section_refactor": "### ♻️ 리팩토링",
|
|
1551
|
+
"changelog.section_test": "### ✅ 테스트",
|
|
1552
|
+
"changelog.section_deps": "### 📦 의존성",
|
|
1553
|
+
"changelog.section_changes": "### 🔧 변경사항",
|
|
1554
|
+
"changelog.section_wip": "### 🚧 작업 중",
|
|
1555
|
+
"changelog.bump_prompt_prefix": "다음은 정해진 커밋 컨벤션을 따르지 않는 자유형식 커밋 메시지들이다.\n이 중 사용자 대상 새로운 기능(feature) 추가로 보이는 것이 하나라도 있으면 정확히 MINOR라고만 답하고,\n없으면 정확히 PATCH라고만 답해라. 다른 말은 절대 덧붙이지 마라.\n커밋 목록:\n",
|
|
1556
|
+
"changelog.err_no_input": "❌ 입력 파일을 찾을 수 없습니다 (pr_body.md 또는 summary_section.html)",
|
|
1557
|
+
"changelog.input_file": "📄 입력 파일: {input_file}",
|
|
1558
|
+
"changelog.file_size": "📝 파일 크기: {size} bytes",
|
|
1559
|
+
"changelog.parse_start": "\n🔍 Markdown 파싱 시작...",
|
|
1560
|
+
"changelog.parse_ok": "✅ 파싱 성공: {n}개 카테고리",
|
|
1561
|
+
"changelog.parse_ok_one": "✅ 파싱 성공: {n}개 카테고리",
|
|
1562
|
+
"changelog.parse_failed": "⚠️ 파싱 실패, raw_summary만 저장",
|
|
1563
|
+
"changelog.result_header": "\n📊 파싱 결과:",
|
|
1564
|
+
"changelog.result_method": " - 파싱 방식: {method}",
|
|
1565
|
+
"changelog.result_raw_len": " - raw_summary 길이: {n} 문자",
|
|
1566
|
+
"changelog.result_categories": " - 파싱된 카테고리: {n}개",
|
|
1567
|
+
"changelog.result_category_item": " • {title}: {n}개 항목",
|
|
1568
|
+
"changelog.result_category_item_one": " • {title}: {n}개 항목",
|
|
1569
|
+
"changelog.err_json_unreadable": "❌ CHANGELOG.json을 해석할 수 없어 갱신을 중단합니다 (기존 이력 보호): {error}",
|
|
1570
|
+
"changelog.err_json_annotation": "::error::CHANGELOG.json이 올바른 JSON이 아닙니다: {error}",
|
|
1571
|
+
"changelog.json_updated": "\n✅ CHANGELOG.json 업데이트 완료!",
|
|
1572
|
+
"changelog.err_update_failed": "❌ update-from-summary 실패: {error}",
|
|
1573
|
+
"changelog.md_current_version": "**현재 버전:** {version}",
|
|
1574
|
+
"changelog.md_last_updated": "**마지막 업데이트:** {updated}",
|
|
1575
|
+
"changelog.md_no_changes": "*변경사항 정보 없음*",
|
|
1576
|
+
"changelog.md_regenerated": "✅ CHANGELOG.md 재생성 완료!",
|
|
1577
|
+
"changelog.err_md_failed": "❌ CHANGELOG.md 생성 실패: {error}",
|
|
1578
|
+
"changelog.export_header": "버전 {version} 업데이트",
|
|
1579
|
+
"changelog.export_fallback": "버전 {version} 업데이트\n앱 안정성 및 사용자 경험이 개선되었습니다.",
|
|
1580
|
+
"changelog.warn_json_notes": "::warning::CHANGELOG.json에서 {version} 노트를 읽지 못했습니다: {error}",
|
|
1581
|
+
"changelog.warn_md_notes": "::warning::CHANGELOG.md에서 {version} 노트를 읽지 못했습니다: {error}",
|
|
1582
|
+
"changelog.warn_missing_key": "::warning::AI_API_BASE_URL/AI_MODEL이 설정됐지만 AI_API_KEY secret이 없어 사용자 API 티어를 건너뜁니다",
|
|
1583
|
+
"changelog.warn_missing_url_model": "::warning::AI_API_KEY가 설정됐지만 AI_API_BASE_URL/AI_MODEL이 없어 사용자 API 티어를 건너뜁니다",
|
|
1584
|
+
"changelog.prompt_intro": "아래 커밋 목록을 바탕으로 한국어 릴리즈 요약을 작성해줘.",
|
|
1585
|
+
"changelog.prompt_format": "출력 형식: 첫 줄은 '## [{version}]' 헤더로 시작하고,",
|
|
1586
|
+
"changelog.prompt_sections_intro": "해당 항목이 있는 섹션만 다음 이름으로 작성해줘:",
|
|
1587
|
+
"changelog.prompt_names_1": "'{breaking}', '{feat}', '{fix}', '{perf}', '{docs}', '{refactor}',",
|
|
1588
|
+
"changelog.prompt_names_2": "'{test}', '{deps}', '{changes}', '{wip}'.",
|
|
1589
|
+
"changelog.prompt_breaking": "타입 뒤에 '!'가 붙었거나 BREAKING CHANGE인 커밋은 반드시 '{breaking}'에 넣어줘.",
|
|
1590
|
+
"changelog.prompt_bullets": "각 항목은 '- '로 시작하는 불릿으로 작성해줘.",
|
|
1591
|
+
"changelog.prompt_pr_title": "PR 제목: {title}",
|
|
1592
|
+
"changelog.prompt_diff_stat": "파일별 변경 요약:",
|
|
1593
|
+
"changelog.prompt_commits": "커밋 목록:",
|
|
1594
|
+
"changelog.warn_commits_unreadable": "::warning::커밋 목록 파일을 읽지 못해 빈 목록으로 요약합니다: {error}",
|
|
1595
|
+
"changelog.cli_description": "통합 체인지로그 매니저",
|
|
1596
|
+
"changelog.cli_update_help": "PR body에서 CHANGELOG.json 갱신",
|
|
1597
|
+
"changelog.cli_generate_help": "CHANGELOG.json → CHANGELOG.md 생성",
|
|
1598
|
+
"changelog.cli_classify_help": "커밋 목록으로 semver 승격 폭(major/minor/patch) 판단",
|
|
1599
|
+
"changelog.cli_commits_file_help": "커밋 제목 목록 파일 (한 줄당 1개)",
|
|
1600
|
+
"changelog.cli_export_help": "특정 버전 릴리즈 노트 추출",
|
|
1601
|
+
"changelog.cli_version_help": "버전 번호",
|
|
1602
|
+
"changelog.cli_output_help": "출력 파일 경로 (없으면 stdout)",
|
|
1603
|
+
"changelog.cli_ai_summary_help": "커밋 목록으로 AI/규칙 기반 릴리즈 요약 생성",
|
|
1604
|
+
"changelog.cli_summary_output_help": "요약 결과를 저장할 파일 경로",
|
|
1605
|
+
"changelog.cli_pr_title_help": "PR 제목 (프롬프트 컨텍스트로 사용, 선택)",
|
|
1606
|
+
"changelog.cli_diff_stat_help": "git diff --stat 출력 파일 (프롬프트 컨텍스트 확장, 선택)",
|
|
1607
|
+
"changelog.cli_collect_help": "develop에 머지된 PR 중 이번 릴리스에 포함된 이슈 번호 목록 추출",
|
|
1608
|
+
"changelog.cli_shas_help": "이번 릴리스에 포함된 커밋 SHA 목록 파일 (한 줄당 1개)",
|
|
1609
|
+
"changelog.cli_prs_help": "gh pr list --json number,headRefName,mergeCommit 출력 JSON 파일",
|
|
1610
|
+
# --- cibuild ---
|
|
1611
|
+
"cibuild.go_done": "✅ Go 빌드 검증이 성공적으로 완료되었습니다!",
|
|
1612
|
+
"cibuild.python_done": "✅ Python 빌드 검증이 성공적으로 완료되었습니다!",
|
|
1613
|
+
"cibuild.info_title": "📋 빌드 정보:",
|
|
1614
|
+
"cibuild.info_project": " 🎯 프로젝트: {project}",
|
|
1615
|
+
"cibuild.info_branch": " 🌿 브랜치: {branch}",
|
|
1616
|
+
"cibuild.info_commit": " 📝 커밋: {sha}",
|
|
1617
|
+
"cibuild.info_time": " ⏰ 검증 시간: {time}",
|
|
1618
|
+
"cibuild.py_no_deps": "::notice::requirements.txt·pyproject.toml·setup.py가 없어 의존성 설치를 건너뜁니다",
|
|
1619
|
+
"cibuild.py_no_tests_collected": "::notice::수집된 테스트가 없어 pytest를 건너뜁니다",
|
|
1620
|
+
"cibuild.py_no_test_files": "::notice::테스트 파일(tests/, test_*.py 등)이 없어 pytest를 건너뜁니다",
|
|
1621
|
+
"cibuild.py_no_dockerfile": "::notice::{path}/Dockerfile이 없어 Docker 빌드 검증을 건너뜁니다",
|
|
1622
|
+
"cibuild.node_deps_installing": "📦 의존성 설치 중...",
|
|
1623
|
+
"cibuild.node_deps_done": "✅ 의존성 설치 완료",
|
|
1624
|
+
"cibuild.node_no_test_script": "::notice::package.json에 test 스크립트가 없어 테스트를 건너뜁니다",
|
|
1625
|
+
"cibuild.node_test_run": "🧪 npm test 실행: {script}",
|
|
1626
|
+
"cibuild.node_build_start_next": "🔨 Next.js 빌드 시작...",
|
|
1627
|
+
"cibuild.node_build_start": "🔨 빌드 시작...",
|
|
1628
|
+
"cibuild.node_build_project": "프로젝트: {project}",
|
|
1629
|
+
"cibuild.node_build_node": "Node.js: {node}",
|
|
1630
|
+
"cibuild.node_build_failed": "❌ 빌드 실패",
|
|
1631
|
+
"cibuild.node_build_ok": "✅ 빌드 완료",
|
|
1632
|
+
"cibuild.node_build_output": "📁 빌드 결과물:",
|
|
1633
|
+
"cibuild.node_build_next_dir": " - .next/ 폴더 생성됨",
|
|
1634
|
+
"cibuild.node_errlog_title": "❌ 빌드 실패 - 에러 로그",
|
|
1635
|
+
"cibuild.node_errlog_missing": "에러 로그 파일을 찾을 수 없습니다.",
|
|
1636
|
+
"cibuild.node_result_next_ok": "🎉 Next.js 빌드 완료!",
|
|
1637
|
+
"cibuild.node_result_next_fail": "❌ Next.js 빌드 실패",
|
|
1638
|
+
"cibuild.node_result_ok": "🎉 빌드 워크플로우 완료!",
|
|
1639
|
+
"cibuild.node_result_fail": "❌ 빌드 워크플로우 실패",
|
|
1640
|
+
"cibuild.node_result_title": "📊 빌드 결과:",
|
|
1641
|
+
"cibuild.node_result_project": " 📦 프로젝트: {project}",
|
|
1642
|
+
"cibuild.node_result_node": " 📌 Node.js 버전: {node}",
|
|
1643
|
+
"cibuild.node_result_status": " 🆙 빌드 상태: {status}",
|
|
1644
|
+
"cibuild.node_result_branch": " 🌿 브랜치: {branch}",
|
|
1645
|
+
"cibuild.node_result_commit": " 📝 커밋: {sha}",
|
|
1646
|
+
"cibuild.node_result_time": " 🕐 시간: {time}",
|
|
1647
|
+
"cibuild.node_all_ok": "✅ 모든 단계가 성공적으로 완료되었습니다.",
|
|
1648
|
+
"cibuild.node_error_occurred": "❌ 빌드 중 오류가 발생했습니다.",
|
|
1649
|
+
"cibuild.node_log_hint": "💡 Actions 탭에서 'build-log' 아티팩트를 다운로드하여 전체 로그를 확인하세요.",
|
|
1650
|
+
"cibuild.gate_results": "needs 결과: {results}",
|
|
1651
|
+
"cibuild.gate_failed": "실패하거나 취소된 job이 있습니다.",
|
|
1652
|
+
# --- cicd ---
|
|
1653
|
+
"cicd.precheck_secret_title": "필수 Secret 누락",
|
|
1654
|
+
"cicd.precheck_secret_body": "등록되지 않은 GitHub Secret:{missing} — Settings → Secrets and variables → Actions에서 등록하세요",
|
|
1655
|
+
"cicd.precheck_dockerfile_title": "Dockerfile 없음",
|
|
1656
|
+
"cicd.precheck_dockerfile_body": "{path} 파일이 없습니다. 이 워크플로우는 Docker 이미지로 배포하므로 Dockerfile이 필요합니다 (서버 배포를 하지 않는다면 이 워크플로우 파일을 삭제하세요)",
|
|
1657
|
+
"cicd.precheck_ok": "✅ 사전 점검 통과: 필수 Secret과 Dockerfile이 모두 있습니다",
|
|
1658
|
+
"cicd.env_file_created": "✅ {file} 파일 생성 완료",
|
|
1659
|
+
"cicd.dotenv_created": "✅ .env 파일이 생성되었습니다",
|
|
1660
|
+
"cicd.disk_before": "📊 빌드 전 디스크 사용량:",
|
|
1661
|
+
"cicd.disk_cleaning": "🧹 불필요한 파일 정리 중...",
|
|
1662
|
+
"cicd.disk_docker_prune": "🐳 Docker 시스템 정리 중...",
|
|
1663
|
+
"cicd.disk_after_cleanup": "📊 정리 후 디스크 사용량:",
|
|
1664
|
+
"cicd.post_build_cleanup": "🧹 빌드 후 정리 중...",
|
|
1665
|
+
"cicd.disk_final": "📊 최종 디스크 사용량:",
|
|
1666
|
+
"cicd.setup_env": "🔧 환경변수 설정..",
|
|
1667
|
+
"cicd.ssh_auth": "🔐 SSH 인증 방식: {method}",
|
|
1668
|
+
"cicd.deploy_start": "🚀 배포 환경으로 배포합니다 (브랜치: {branch})",
|
|
1669
|
+
"cicd.branch_unsupported": "⚠️ 지원하지 않는 브랜치입니다: {branch}",
|
|
1670
|
+
"cicd.branch_only": "이 워크플로우는 {branch} 브랜치만 지원합니다.",
|
|
1671
|
+
"cicd.branch_hint": "on.push.branches에서 지원할 브랜치를 설정하세요.",
|
|
1672
|
+
"cicd.container_default": "ℹ️ CONTAINER_NAME이 설정되지 않아 PROJECT_NAME을 사용합니다: {container}",
|
|
1673
|
+
"cicd.container_custom": "ℹ️ 사용자 지정 CONTAINER_NAME 사용: {container}",
|
|
1674
|
+
"cicd.config_title": "📋 배포 설정 정보:",
|
|
1675
|
+
"cicd.config_branch": " - 브랜치: {branch}",
|
|
1676
|
+
"cicd.config_project": " - 프로젝트: {project}",
|
|
1677
|
+
"cicd.config_container": " - 컨테이너 이름: {container}",
|
|
1678
|
+
"cicd.config_port": " - 포트: {port}",
|
|
1679
|
+
"cicd.config_image": " - Docker 이미지: {image}",
|
|
1680
|
+
"cicd.pull_image": "⬇️ Docker 이미지 풀: {image}",
|
|
1681
|
+
"cicd.pull_image_short": "⬇️ Docker 이미지 풀...",
|
|
1682
|
+
"cicd.container_check": "🧹 컨테이너 {container} 존재 여부 확인 중...",
|
|
1683
|
+
"cicd.container_exists": "⚠️ 컨테이너 {container} 이(가) 존재합니다. 중지 및 삭제 중...",
|
|
1684
|
+
"cicd.container_removed": "✅ 컨테이너 {container} 이(가) 삭제되었습니다.",
|
|
1685
|
+
"cicd.container_none": "ℹ️ 존재하는 컨테이너 {container} 이(가) 없습니다.",
|
|
1686
|
+
"cicd.container_run": "🚀 새로운 컨테이너 {container} 실행 중...",
|
|
1687
|
+
"cicd.volume_mkdir": "📁 볼륨 마운트 디렉토리 생성: {path}",
|
|
1688
|
+
"cicd.volume_on": "📦 볼륨 마운트 활성화: {opts}",
|
|
1689
|
+
"cicd.volume_off": "ℹ️ 볼륨 마운트 비활성화됨",
|
|
1690
|
+
"cicd.health_wait": "⏳ 컨테이너 초기화 대기 중... ({seconds}초)",
|
|
1691
|
+
"cicd.health_check": "🏥 컨테이너 헬스체크 중...",
|
|
1692
|
+
"cicd.health_no_process": "❌ 컨테이너 {container} 프로세스가 실행되지 않았습니다",
|
|
1693
|
+
"cicd.health_process_ok": "✅ 컨테이너 프로세스 실행 확인 완료",
|
|
1694
|
+
"cicd.http_start": "🌐 HTTP 헬스체크 시작: {url}",
|
|
1695
|
+
"cicd.http_try": " 시도 {i}/{max}...",
|
|
1696
|
+
"cicd.http_ok": "✅ HTTP 헬스체크 성공 (응답 코드: {code})",
|
|
1697
|
+
"cicd.http_fail": "⚠️ HTTP 헬스체크 실패 (응답 코드: {code})",
|
|
1698
|
+
"cicd.http_retry": " {interval}초 후 재시도...",
|
|
1699
|
+
"cicd.http_final_fail": "⚠️ HTTP 헬스체크 최종 실패, 로그 패턴 매칭으로 fallback...",
|
|
1700
|
+
"cicd.http_skipped": "ℹ️ HEALTHCHECK_PATH가 설정되지 않아 로그 패턴 매칭만 사용합니다",
|
|
1701
|
+
"cicd.log_start": "📋 로그 패턴 매칭 시작: '{pattern}'",
|
|
1702
|
+
"cicd.log_ok": "✅ 로그 패턴 매칭 성공: 애플리케이션이 정상적으로 시작되었습니다",
|
|
1703
|
+
"cicd.log_fail": "❌ 로그 패턴 매칭 실패: 애플리케이션 시작 로그를 찾을 수 없습니다",
|
|
1704
|
+
"cicd.debug_title": "📋 디버깅 정보:",
|
|
1705
|
+
"cicd.debug_pattern": " - 검색 패턴: {pattern}",
|
|
1706
|
+
"cicd.debug_container": " - 컨테이너: {container}",
|
|
1707
|
+
"cicd.debug_image": " - 이미지: {image}",
|
|
1708
|
+
"cicd.debug_port": " - 포트: {port}",
|
|
1709
|
+
"cicd.debug_volume": " - 볼륨: {volume}",
|
|
1710
|
+
"cicd.debug_logs": "📋 컨테이너 로그 (최근 50줄):",
|
|
1711
|
+
"cicd.health_done": "✅ 헬스체크 완료: 컨테이너 {container} 이(가) 정상적으로 실행 중입니다",
|
|
1712
|
+
"cicd.deploy_done": "✅ 배포가 성공적으로 완료되었습니다!",
|
|
1713
|
+
"cicd.summary_title": "📋 배포 결과 요약:",
|
|
1714
|
+
"cicd.summary_project": " 🎯 프로젝트: {project}",
|
|
1715
|
+
"cicd.summary_branch": " 🌿 브랜치: {branch}",
|
|
1716
|
+
"cicd.summary_container": " 🐳 컨테이너: {container}",
|
|
1717
|
+
"cicd.summary_port": " 🌐 포트: {port}",
|
|
1718
|
+
"cicd.summary_time": " ⏰ 배포 시간: {time}",
|
|
1719
|
+
"cicd.summary_url": "🔗 접속 URL: {url}",
|
|
1720
|
+
# --- fastlane ---
|
|
1721
|
+
"fastlane.env_empty": "{name} 환경변수가 비어 있습니다. 워크플로우에서 값을 전달하는지 확인하세요.",
|
|
1722
|
+
"fastlane.ios_prepare_wait": "DEPLOY_MODE={deploy_mode}: 빌드 처리 완료까지 기다린 뒤 App Store 버전을 준비합니다.",
|
|
1723
|
+
"fastlane.deploy_mode_unknown": "알 수 없는 DEPLOY_MODE '{deploy_mode}' 입니다. store_only로 처리합니다.",
|
|
1724
|
+
"fastlane.package_name_empty": "PACKAGE_NAME이 비어 있습니다. ANDROID_PACKAGE_NAME secrets/variables를 등록하세요. (예: com.example.app)",
|
|
1725
|
+
"fastlane.android_env_required": "AAB_PATH, GOOGLE_PLAY_JSON_KEY, VERSION_NAME, VERSION_CODE 환경변수가 모두 필요합니다. 워크플로우에서 전달하는지 확인하세요.",
|
|
1726
|
+
"fastlane.changelog_missing": "변경 이력 파일이 없습니다: {file}",
|
|
1727
|
+
"fastlane.play_deploy": "Play 배포: DEPLOY_MODE={deploy_mode} → track={track}, release_status={release_status}",
|
|
1728
|
+
# --- flutter_a ---
|
|
1729
|
+
"flutter_a.precheck_missing_title": "필수 Secret 누락",
|
|
1730
|
+
"flutter_a.precheck_missing_body": "등록되지 않은 GitHub Secret:{missing} — Settings → Secrets and variables → Actions에서 등록하세요",
|
|
1731
|
+
"flutter_a.precheck_passed": "✅ 사전 점검 통과: 필수 Secret이 모두 있습니다",
|
|
1732
|
+
"flutter_a.debug_keystore_empty": "DEBUG_KEYSTORE Secret이 비어 있어 러너 기본 debug 키로 서명합니다 (빌드마다 서명이 달라집니다)",
|
|
1733
|
+
"flutter_a.debug_keystore_created": "Debug Keystore created (DEBUG_KEYSTORE로 서명)",
|
|
1734
|
+
"flutter_a.gradlew_missing": "ℹ️ gradlew가 저장소에 없습니다 — flutter build가 생성합니다",
|
|
1735
|
+
"flutter_a.current_version": "현재 버전: {current_version}",
|
|
1736
|
+
"flutter_a.short_commit_hash": "짧은 커밋 해시: {short_commit_hash}",
|
|
1737
|
+
"flutter_a.project_type": "🔧 프로젝트 타입: {project_type}",
|
|
1738
|
+
"flutter_a.extracting_v_release_notes_changelog": "📄 CHANGELOG.json에서 v{version} 릴리즈 노트 추출 중...",
|
|
1739
|
+
"flutter_a.release_notes_extracted": "✅ 릴리즈 노트 추출 성공!",
|
|
1740
|
+
"flutter_a.extracted_release_notes": "📋 추출된 릴리즈 노트:",
|
|
1741
|
+
"flutter_a.failed_extract_release_notes": "❌ 릴리즈 노트 추출 실패",
|
|
1742
|
+
"flutter_a.default_release_note": "v{version} 업데이트",
|
|
1743
|
+
"flutter_a.changelog_json_not_found_using": "⚠️ CHANGELOG.json 파일이 없습니다. 기본 릴리즈 노트를 사용합니다.",
|
|
1744
|
+
"flutter_a.signing_secrets_empty": "서명 Secret이 비어 있습니다:{missing} (워크플로우 상단 주석 참고)",
|
|
1745
|
+
"flutter_a.keystore_decoded_empty": "RELEASE_KEYSTORE_BASE64를 디코딩한 keystore가 비어 있습니다",
|
|
1746
|
+
"flutter_a.release_keystore_created": "✅ Release Keystore 생성 완료",
|
|
1747
|
+
"flutter_a.key_properties_created": "✅ key.properties 생성 완료",
|
|
1748
|
+
"flutter_a.signing_config_must_added_build": "⚠️ build.gradle.kts에 서명 설정 추가 필요",
|
|
1749
|
+
"flutter_a.android_build_config_check_complete": "✅ Android 빌드 설정 확인 완료",
|
|
1750
|
+
"flutter_a.starting_aab_build": "🚀 AAB 빌드 시작",
|
|
1751
|
+
"flutter_a.build_version": "🎯 빌드 버전: {version_name}",
|
|
1752
|
+
"flutter_a.build_code": "🎯 빌드 코드: {version_code}",
|
|
1753
|
+
"flutter_a.version_name_or_version_code": "❌ VERSION_NAME 또는 VERSION_CODE가 비어있습니다!",
|
|
1754
|
+
"flutter_a.flutter_environment_info": "🔍 Flutter 환경 정보:",
|
|
1755
|
+
"flutter_a.cleaning_previous_build_output": "🧹 이전 빌드 결과물 정리...",
|
|
1756
|
+
"flutter_a.running_flutter_clean_reinstalling_dependencies": "🔄 Flutter clean 및 의존성 재설치...",
|
|
1757
|
+
"flutter_a.setting_version_info_local_properties": "🔧 local.properties에 버전 정보 설정...",
|
|
1758
|
+
"flutter_a.local_properties_updated": "✅ local.properties 업데이트 완료",
|
|
1759
|
+
"flutter_a.version_info_version_name_version": "📋 버전 정보: VERSION_NAME={version_name}, VERSION_CODE={version_code}",
|
|
1760
|
+
"flutter_a.gradle_tuning_applied": "✅ Gradle 최적화 설정 완료",
|
|
1761
|
+
"flutter_a.running_flutter_build": "🔨 Flutter build 실행...",
|
|
1762
|
+
"flutter_a.command_flutter_build_appbundle_release": "📋 명령어: flutter build appbundle --release --build-name={version_name} --build-number={version_code} --verbose",
|
|
1763
|
+
"flutter_a.build_start_time": "⏱️ 빌드 시작 시간: {cmd1}",
|
|
1764
|
+
"flutter_a.flutter_build_failed_exit_code": "❌ Flutter build 실패! Exit code: {build_exit_code}",
|
|
1765
|
+
"flutter_a.build_directory_state": "🔍 빌드 디렉토리 상태:",
|
|
1766
|
+
"flutter_a.aab_apk_not_found": "AAB/APK 파일을 찾을 수 없습니다",
|
|
1767
|
+
"flutter_a.flutter_build_succeeded": "✅ Flutter build 성공!",
|
|
1768
|
+
"flutter_a.checking_build_result": "🔍 빌드 결과 확인:",
|
|
1769
|
+
"flutter_a.aab_file_not_created": "❌ AAB 파일이 생성되지 않았습니다!",
|
|
1770
|
+
"flutter_a.full_build_directory_contents": "🔍 전체 빌드 디렉토리 내용:",
|
|
1771
|
+
"flutter_a.outputs_directory_structure": "🔍 outputs 디렉토리 구조:",
|
|
1772
|
+
"flutter_a.outputs_directory_does_not_exist": "outputs 디렉토리가 없습니다",
|
|
1773
|
+
"flutter_a.aab_file_creation_confirmed": "✅ AAB 파일 생성 확인",
|
|
1774
|
+
"flutter_a.aab_file_size": "📱 AAB 파일 크기: {cmd1}",
|
|
1775
|
+
"flutter_a.aab_file_info": "📋 AAB 파일 정보: {cmd1}",
|
|
1776
|
+
"flutter_a.downloading_bundletool": "📦 bundletool 다운로드 중...",
|
|
1777
|
+
"flutter_a.download_url": "📋 다운로드 URL: {bundletool_url}",
|
|
1778
|
+
"flutter_a.bundletool_download_failed": "❌ bundletool 다운로드 실패",
|
|
1779
|
+
"flutter_a.retrying_fallback_url": "🔄 대체 URL로 재시도...",
|
|
1780
|
+
"flutter_a.bundletool_download_failed_completely": "❌ bundletool 다운로드 완전 실패",
|
|
1781
|
+
"flutter_a.bundletool_downloaded": "✅ bundletool 다운로드 완료",
|
|
1782
|
+
"flutter_a.bundletool_file_size": "📋 bundletool 파일 크기: {cmd1}",
|
|
1783
|
+
"flutter_a.checking_java_environment": "🔍 Java 환경 확인:",
|
|
1784
|
+
"flutter_a.verifying_version_info_inside_aab": "🔍 AAB 파일 내부 버전 정보 검증",
|
|
1785
|
+
"flutter_a.extracting_actual_version_info_aab": "📋 AAB에서 실제 버전 정보 추출 중...",
|
|
1786
|
+
"flutter_a.command_run_java_jar_bundletool": "📋 실행할 명령어: java -jar bundletool.jar dump manifest --bundle='{aab_file}'",
|
|
1787
|
+
"flutter_a.bundletool_result_exit_code": "📋 bundletool 실행 결과 (Exit code: {manifest_exit_code}):",
|
|
1788
|
+
"flutter_a.manifest_extracted": "✅ Manifest 추출 성공",
|
|
1789
|
+
"flutter_a.version_info_comparison": "🎯 버전 정보 비교:",
|
|
1790
|
+
"flutter_a.expected_version_code": " 예상 VERSION_CODE: '{version_code}'",
|
|
1791
|
+
"flutter_a.actual_version_code": " 실제 VERSION_CODE: '{actual_version_code}'",
|
|
1792
|
+
"flutter_a.expected_version_name": " 예상 VERSION_NAME: '{version_name}'",
|
|
1793
|
+
"flutter_a.actual_version_name": " 실제 VERSION_NAME: '{actual_version_name}'",
|
|
1794
|
+
"flutter_a.fatal_error_version_code_could": "❌ 치명적 오류: AAB에서 VERSION_CODE를 추출할 수 없습니다!",
|
|
1795
|
+
"flutter_a.full_manifest_contents": "🔍 전체 Manifest 내용:",
|
|
1796
|
+
"flutter_a.fatal_error_version_code_aab": "❌ 치명적 오류: AAB의 VERSION_CODE가 예상과 다릅니다!",
|
|
1797
|
+
"flutter_a.google_play_would_reject_version": " 이는 Google Play에서 '이미 사용된 버전 코드' 오류를 발생시킵니다.",
|
|
1798
|
+
"flutter_a.debugging_info": "🔍 디버깅 정보:",
|
|
1799
|
+
"flutter_a.version_code_version_yml": " version.yml의 VERSION_CODE: {version_code}",
|
|
1800
|
+
"flutter_a.version_code_inside_aab_file": " AAB 파일 내부의 VERSION_CODE: {actual_version_code}",
|
|
1801
|
+
"flutter_a.flags_passed_flutter_build_command": " Flutter build 명령어에 전달된 플래그:",
|
|
1802
|
+
"flutter_a.full_manifest_contents_2": " 전체 Manifest 내용:",
|
|
1803
|
+
"flutter_a.version_code_check_passed": "✅ VERSION_CODE 검증 성공: {actual_version_code}",
|
|
1804
|
+
"flutter_a.warning_version_name_could_not": "⚠️ 경고: AAB에서 VERSION_NAME을 추출할 수 없습니다",
|
|
1805
|
+
"flutter_a.warning_version_name_differs_expected": "⚠️ 경고: VERSION_NAME이 예상과 다릅니다 (치명적이지 않음)",
|
|
1806
|
+
"flutter_a.expected_actual": " 예상: '{version_name}', 실제: '{actual_version_name}'",
|
|
1807
|
+
"flutter_a.version_name_check_passed": "✅ VERSION_NAME 검증 성공: {actual_version_name}",
|
|
1808
|
+
"flutter_a.failed_extract_manifest_bundletool": "❌ bundletool로 Manifest 추출 실패",
|
|
1809
|
+
"flutter_a.trying_verify_another_way": "🔄 대체 방법으로 검증 시도...",
|
|
1810
|
+
"flutter_a.trying_direct_extraction_unzip": "📋 unzip을 사용한 직접 추출 시도...",
|
|
1811
|
+
"flutter_a.version_info_extracted_unzip": "✅ unzip으로 버전 정보 추출 성공:",
|
|
1812
|
+
"flutter_a.direct_extraction_unzip_failed_too": "❌ unzip을 사용한 직접 추출도 실패",
|
|
1813
|
+
"flutter_a.skipping_aab_verification_continuing": "⚠️ AAB 검증을 건너뛰고 계속 진행합니다.",
|
|
1814
|
+
"flutter_a.aab_build_verification_complete": "✅ AAB 빌드 및 검증 완료",
|
|
1815
|
+
"flutter_a.final_aab": "🎯 최종 AAB: {aab_file}",
|
|
1816
|
+
"flutter_a.file_size": "📱 파일 크기: {cmd1}",
|
|
1817
|
+
"flutter_a.google_play_service_account_json": "GOOGLE_PLAY_SERVICE_ACCOUNT_JSON_BASE64 Secret이 비어 있습니다",
|
|
1818
|
+
"flutter_a.service_account_json_configured": "✅ Service Account JSON 설정 완료",
|
|
1819
|
+
"flutter_a.using_repository_gemfile": "ℹ️ 저장소의 Gemfile을 사용합니다",
|
|
1820
|
+
"flutter_a.fastlane_installed_bundler": "✅ Fastlane 설치 완료 (Bundler)",
|
|
1821
|
+
"flutter_a.fastfile_copied_fastfile_playstore_fastfile": "✅ Fastfile 복사 완료 (Fastfile.playstore → Fastfile)",
|
|
1822
|
+
"flutter_a.fastfile_contents": "📋 Fastfile 내용:",
|
|
1823
|
+
"flutter_a.starting_play_store_deployment": "🚀 Play Store 배포 시작",
|
|
1824
|
+
"flutter_a.deploy_start_time": "🕐 배포 시작 시간: {cmd1}",
|
|
1825
|
+
"flutter_a.version_info_deploy": "📋 배포 대상 버전 정보:",
|
|
1826
|
+
"flutter_a.fatal_error_version_name_or": "❌ 치명적 오류: VERSION_NAME 또는 VERSION_CODE가 비어있습니다!",
|
|
1827
|
+
"flutter_a.means_prepare_build_job_did": "이는 prepare-build 작업에서 출력이 제대로 전달되지 않았음을 의미합니다.",
|
|
1828
|
+
"flutter_a.aab_file_path": "📦 AAB 파일 경로: {aab_path}",
|
|
1829
|
+
"flutter_a.aab_file_not_found": "❌ AAB 파일을 찾을 수 없습니다!",
|
|
1830
|
+
"flutter_a.build_directory_contents": "🔍 빌드 디렉토리 내용:",
|
|
1831
|
+
"flutter_a.directory_does_not_exist": "디렉토리가 존재하지 않습니다",
|
|
1832
|
+
"flutter_a.full_build_directory_structure": "🔍 전체 빌드 디렉토리 구조:",
|
|
1833
|
+
"flutter_a.aab_file_exists": "✅ AAB 파일 존재 확인",
|
|
1834
|
+
"flutter_a.verifying_aab_version": "🔍 AAB 버전 검증 중...",
|
|
1835
|
+
"flutter_a.aab_version_code": "📋 AAB 버전: {final_version_name} (코드: {final_version_code})",
|
|
1836
|
+
"flutter_a.error_aab_version_code_not": "❌ 오류: AAB 버전 코드가 예상과 다릅니다! (예상: {version_code}, 실제: {final_version_code})",
|
|
1837
|
+
"flutter_a.version_check_passed": "✅ 버전 검증 성공",
|
|
1838
|
+
"flutter_a.version_check_failed_continuing_deployment": "⚠️ 버전 검증 실패, 배포 계속 진행",
|
|
1839
|
+
"flutter_a.changelog_ready_version_code": "✅ Changelog 준비 완료 (버전 코드: {version_code})",
|
|
1840
|
+
"flutter_a.default_release_note_name": "v{version_name} 업데이트",
|
|
1841
|
+
"flutter_a.created_default_changelog_version_code": "⚠️ 기본 Changelog 생성 (버전 코드: {version_code})",
|
|
1842
|
+
"flutter_a.service_account_json_file_not": "❌ Service Account JSON 파일을 찾을 수 없습니다",
|
|
1843
|
+
"flutter_a.running_play_store_deployment": "🚀 Play Store 배포 실행",
|
|
1844
|
+
"flutter_a.version_code": "🎯 버전: {version_name} (코드: {version_code})",
|
|
1845
|
+
"flutter_a.play_store_internal_testing_deployment": "✅ Play Store 내부 테스트 배포 성공!",
|
|
1846
|
+
"flutter_a.version": "버전: {version} ({version_code})",
|
|
1847
|
+
"flutter_a.commit": "커밋: {sha}",
|
|
1848
|
+
"flutter_a.how_testers_check_build": "📱 테스터 확인 방법:",
|
|
1849
|
+
"flutter_a.play_console_test_release_internal": "1. Play Console → 테스트 및 출시 → 내부 테스트",
|
|
1850
|
+
"flutter_a.share_test_link_your_testers": "2. 테스터에게 테스트 링크 공유",
|
|
1851
|
+
"flutter_a.play_store_deployment_failed": "❌ Play Store 배포 실패!",
|
|
1852
|
+
"flutter_a.please_check_logs": "로그를 확인해주세요.",
|
|
1853
|
+
"flutter_a.precheck_firebase_app_id_title": "FIREBASE_APP_ID 미설정",
|
|
1854
|
+
"flutter_a.precheck_firebase_app_id_body": "워크플로우 env 섹션의 FIREBASE_APP_ID를 Firebase Console의 앱 ID로 바꾸세요",
|
|
1855
|
+
"flutter_a.precheck_passed_firebase": "✅ 사전 점검 통과: 필수 Secret과 FIREBASE_APP_ID가 모두 있습니다",
|
|
1856
|
+
"flutter_a.firebase_service_account_json_base64": "FIREBASE_SERVICE_ACCOUNT_JSON_BASE64 Secret이 비어 있습니다",
|
|
1857
|
+
"flutter_a.firebase_service_account_json_file": "✅ Firebase 서비스 계정 JSON 파일 생성 완료",
|
|
1858
|
+
"flutter_a.firebase_app_distribution_deployment_succeeded": "✅ Firebase App Distribution 배포 성공!",
|
|
1859
|
+
"flutter_a.launch_firebase_app_tester_app": "1. Firebase App Tester 앱 실행",
|
|
1860
|
+
"flutter_a.select_app": "2. 앱 선택",
|
|
1861
|
+
"flutter_a.download_latest_build": "3. 최신 빌드 다운로드",
|
|
1862
|
+
"flutter_a.firebase_app_distribution_deployment_failed": "❌ Firebase App Distribution 배포 실패!",
|
|
1863
|
+
"flutter_a.ci_config_header": "📋 CI 설정:",
|
|
1864
|
+
"flutter_a.ci_config_trigger": " 트리거: {event_name}",
|
|
1865
|
+
"flutter_a.ci_info_header": "📋 빌드 정보:",
|
|
1866
|
+
"flutter_a.ci_info_branch": " 브랜치: {branch_name}",
|
|
1867
|
+
"flutter_a.ci_info_commit": " 커밋: {commit_hash}",
|
|
1868
|
+
"flutter_a.ci_analyze_start": "🔍 Flutter 코드 분석 시작...",
|
|
1869
|
+
"flutter_a.ci_analyze_done": "✅ 코드 분석 완료",
|
|
1870
|
+
"flutter_a.ci_test_start": "🧪 Flutter 테스트 시작...",
|
|
1871
|
+
"flutter_a.ci_test_passed": "✅ 테스트 통과",
|
|
1872
|
+
"flutter_a.ci_test_skipped_title": "Flutter 테스트 건너뜀",
|
|
1873
|
+
"flutter_a.ci_test_skipped_body": "test/ 폴더에 *_test.dart 파일이 없어 flutter test를 실행하지 않았습니다",
|
|
1874
|
+
"flutter_a.ci_apk_start": "📦 Flutter APK 빌드 시작 (debug)...",
|
|
1875
|
+
"flutter_a.ci_apk_done": "✅ APK 빌드 완료",
|
|
1876
|
+
"flutter_a.ci_podfile_missing": "ℹ️ ios/Podfile이 없어 pod install을 건너뜁니다 (CocoaPods 플러그인 없음)",
|
|
1877
|
+
"flutter_a.ci_ios_start": "📦 Flutter iOS 빌드 시작...",
|
|
1878
|
+
"flutter_a.ci_ios_done": "✅ iOS 빌드 완료",
|
|
1879
|
+
"flutter_a.ci_gate_results": "needs 결과: {results}",
|
|
1880
|
+
"flutter_a.ci_gate_failed": "실패하거나 취소된 job이 있습니다.",
|
|
1881
|
+
"flutter_a.ci_hdr_analyze_running": "## 🔍 Flutter CI (Analyze Only) 진행 중...",
|
|
1882
|
+
"flutter_a.ci_hdr_running": "## 🔨 Flutter CI 진행 중...",
|
|
1883
|
+
"flutter_a.ci_status_skipped": "⏸️ 스킵",
|
|
1884
|
+
"flutter_a.ci_status_running": "⏳ 진행 중...",
|
|
1885
|
+
"flutter_a.ci_status_disabled": "⏸️ 비활성화",
|
|
1886
|
+
"flutter_a.ci_table_head": "| 검사 항목 | 상태 | 소요 시간 |",
|
|
1887
|
+
"flutter_a.ci_row_analyze_running": "| 🔍 Analyze | ⏳ 진행 중... | - |",
|
|
1888
|
+
"flutter_a.ci_row_test_running": "| 🧪 Test | ⏳ 진행 중... | - |",
|
|
1889
|
+
"flutter_a.ci_row_android_pending": "| 🤖 Android 빌드 | {status} | - |",
|
|
1890
|
+
"flutter_a.ci_row_ios_pending": "| 🍎 iOS 빌드 | {status} | - |",
|
|
1891
|
+
"flutter_a.ci_info_head": "| 항목 | 값 |",
|
|
1892
|
+
"flutter_a.ci_row_branch": "| **브랜치** | `{branch}` |",
|
|
1893
|
+
"flutter_a.ci_row_commit": "| **커밋** | `{commit}` |",
|
|
1894
|
+
"flutter_a.ci_note_analyze_only_running": "ℹ️ **Analyze Only 모드**: 빌드 없이 코드 분석만 실행됩니다.",
|
|
1895
|
+
"flutter_a.ci_link_live_log": "**[📋 실시간 로그 보기]({url})**",
|
|
1896
|
+
"flutter_a.ci_footer_auto_update": "*🤖 이 댓글은 자동으로 업데이트됩니다.*",
|
|
1897
|
+
"flutter_a.ci_log_comment_created": "✅ 진행 상황 댓글 생성 완료: #{id}",
|
|
1898
|
+
"flutter_a.ci_dur_min_sec": "{minutes}분 {seconds}초",
|
|
1899
|
+
"flutter_a.ci_dur_sec": "{seconds}초",
|
|
1900
|
+
"flutter_a.ci_log_analyze_result": "📋 코드 분석 결과: {status}, 테스트: {test} ({duration})",
|
|
1901
|
+
"flutter_a.ci_log_android_result": "📋 Android 빌드 결과: {status} ({duration})",
|
|
1902
|
+
"flutter_a.ci_log_ios_result": "📋 iOS 빌드 결과: {status} ({duration})",
|
|
1903
|
+
"flutter_a.ci_status_success": "✅ 성공",
|
|
1904
|
+
"flutter_a.ci_status_failure": "❌ 실패",
|
|
1905
|
+
"flutter_a.ci_status_no_tests": "⏸️ 테스트 없음",
|
|
1906
|
+
"flutter_a.ci_status_not_run": "⏸️ 실행 안 됨",
|
|
1907
|
+
"flutter_a.ci_hdr_analyze_success": "## ✅ Flutter CI (Analyze Only) 성공!",
|
|
1908
|
+
"flutter_a.ci_hdr_analyze_failure": "## ❌ Flutter CI (Analyze Only) 실패",
|
|
1909
|
+
"flutter_a.ci_hdr_success": "## ✅ Flutter CI 성공!",
|
|
1910
|
+
"flutter_a.ci_hdr_failure": "## ❌ Flutter CI 실패",
|
|
1911
|
+
"flutter_a.ci_row_android_result": "| 🤖 Android 빌드 | {status} | {duration} |",
|
|
1912
|
+
"flutter_a.ci_row_ios_result": "| 🍎 iOS 빌드 | {status} | {duration} |",
|
|
1913
|
+
"flutter_a.ci_row_total": "| **총 소요 시간** | {duration} |",
|
|
1914
|
+
"flutter_a.ci_note_analyze_only_done": "ℹ️ **Analyze Only 모드**: 빌드 없이 코드 분석만 실행되었습니다.",
|
|
1915
|
+
"flutter_a.ci_hdr_checks": "### 💡 확인 사항",
|
|
1916
|
+
"flutter_a.ci_analyze_fail_title": "**Analyze 실패 시:**",
|
|
1917
|
+
"flutter_a.ci_analyze_fail_lint": "- `flutter analyze` 로컬에서 실행하여 lint 오류 확인",
|
|
1918
|
+
"flutter_a.ci_analyze_fail_fix": "- 코드 스타일 및 타입 오류 수정",
|
|
1919
|
+
"flutter_a.ci_test_fail_title": "**Test 실패 시:**",
|
|
1920
|
+
"flutter_a.ci_test_fail_local": "- `flutter test` 로컬에서 실행하여 실패한 테스트 확인",
|
|
1921
|
+
"flutter_a.ci_android_fail_title": "**Android 빌드 실패 시:**",
|
|
1922
|
+
"flutter_a.ci_android_fail_gradle": "- Gradle 빌드 로그에서 에러 확인",
|
|
1923
|
+
"flutter_a.ci_android_fail_deps": "- 의존성 버전 호환성 확인",
|
|
1924
|
+
"flutter_a.ci_ios_fail_title": "**iOS 빌드 실패 시:**",
|
|
1925
|
+
"flutter_a.ci_ios_fail_xcode": "- Xcode 빌드 로그에서 에러 확인",
|
|
1926
|
+
"flutter_a.ci_ios_fail_pods": "- CocoaPods 의존성 확인",
|
|
1927
|
+
"flutter_a.ci_link_workflow_log": "**[📋 워크플로우 로그]({url})**",
|
|
1928
|
+
"flutter_a.ci_log_result_updated": "✅ 결과 댓글 업데이트 완료",
|
|
1929
|
+
"flutter_a.ci_log_no_comment_id": "⚠️ 댓글 ID가 없어 업데이트를 건너뜁니다.",
|
|
1930
|
+
# --- ios_test_tf ---
|
|
1931
|
+
"ios_test_tf.branch_check_log": "🔍 브랜치 존재 여부 확인: {branch}",
|
|
1932
|
+
"ios_test_tf.branch_exists_log": "✅ 브랜치 존재 확인됨: {branch}",
|
|
1933
|
+
"ios_test_tf.branch_not_found_log": "❌ 브랜치를 찾을 수 없음: {branch}",
|
|
1934
|
+
"ios_test_tf.branch_missing_title": "🍎 ❌ **iOS TestFlight 빌드 실패 - 브랜치를 찾을 수 없습니다**",
|
|
1935
|
+
"ios_test_tf.kv_head": "| 항목 | 값 |",
|
|
1936
|
+
"ios_test_tf.row_requested_branch": "| **요청된 브랜치** | `{branch}` |",
|
|
1937
|
+
"ios_test_tf.row_issue_pr": "| **이슈/PR** | #{number} |",
|
|
1938
|
+
"ios_test_tf.hint_title": "### 💡 확인 사항",
|
|
1939
|
+
"ios_test_tf.hint_pushed": "1. 브랜치가 원격 저장소에 push되었는지 확인하세요",
|
|
1940
|
+
"ios_test_tf.hint_helper_branch": "2. \"Issue Helper\" 댓글의 브랜치명이 올바른지 확인하세요",
|
|
1941
|
+
"ios_test_tf.hint_typo": "3. 브랜치명에 오타가 없는지 확인하세요",
|
|
1942
|
+
"ios_test_tf.workflow_log_link": "🔗 [워크플로우 로그]({url})",
|
|
1943
|
+
"ios_test_tf.branch_not_found_fail": "브랜치를 찾을 수 없습니다: {branch}",
|
|
1944
|
+
"ios_test_tf.branch_check_error_fail": "브랜치 확인 중 오류: {error}",
|
|
1945
|
+
"ios_test_tf.title_running": "## 🍎 iOS TestFlight 빌드 진행 중...",
|
|
1946
|
+
"ios_test_tf.table_header": "| 단계 | 상태 | 소요 시간 |",
|
|
1947
|
+
"ios_test_tf.step_prepare": "🔧 준비",
|
|
1948
|
+
"ios_test_tf.step_build": "🔨 IPA 빌드",
|
|
1949
|
+
"ios_test_tf.step_deploy": "📤 TestFlight 배포",
|
|
1950
|
+
"ios_test_tf.st_running": "⏳ 진행 중...",
|
|
1951
|
+
"ios_test_tf.st_waiting": "⏸️ 대기",
|
|
1952
|
+
"ios_test_tf.st_done": "✅ 완료",
|
|
1953
|
+
"ios_test_tf.st_failed": "❌ 실패",
|
|
1954
|
+
"ios_test_tf.st_canceled": "⏸️ 취소됨",
|
|
1955
|
+
"ios_test_tf.row_build_number": "| **빌드 번호** | `{build}` |",
|
|
1956
|
+
"ios_test_tf.row_app_version": "| **앱 버전** | `{version}({build})` |",
|
|
1957
|
+
"ios_test_tf.row_branch": "| **브랜치** | `{branch}` |",
|
|
1958
|
+
"ios_test_tf.row_commit": "| **커밋** | `{commit}` |",
|
|
1959
|
+
"ios_test_tf.row_total": "| **총 소요 시간** | {elapsed} |",
|
|
1960
|
+
"ios_test_tf.live_log_link": "**[📋 실시간 로그 보기]({url})**",
|
|
1961
|
+
"ios_test_tf.auto_update_note": "*🤖 이 댓글은 자동으로 업데이트됩니다.*",
|
|
1962
|
+
"ios_test_tf.log_progress_created": "✅ 진행 상황 댓글 생성 완료: #{id}",
|
|
1963
|
+
"ios_test_tf.elapsed_min_sec": "{m}분 {s}초",
|
|
1964
|
+
"ios_test_tf.elapsed_sec": "{s}초",
|
|
1965
|
+
"ios_test_tf.secrets_missing": "필수 GitHub Secret이 비어 있습니다:{missing} (워크플로우 상단 주석 참고)",
|
|
1966
|
+
"ios_test_tf.export_options_missing": "ios/ExportOptions.plist가 없습니다 — 저장소에 추가(커밋)하세요.",
|
|
1967
|
+
"ios_test_tf.export_options_placeholders": "ios/ExportOptions.plist에 채워지지 않은 플레이스홀더가 남아 있습니다 — 팀 ID·번들 ID·프로비저닝 프로파일 이름으로 바꿔 커밋하세요.",
|
|
1968
|
+
"ios_test_tf.fastfile_missing_error": "ios/fastlane/Fastfile이 없습니다 — 저장소에 추가(커밋)하세요.",
|
|
1969
|
+
"ios_test_tf.preflight_ok": "✅ 배포 설정 확인 완료",
|
|
1970
|
+
"ios_test_tf.event_dispatch": "📋 repository_dispatch 이벤트 감지",
|
|
1971
|
+
"ios_test_tf.event_pr_number": " PR 번호: #{pr}",
|
|
1972
|
+
"ios_test_tf.event_build_number_pr": " 빌드 번호: {build} (PR 번호 사용)",
|
|
1973
|
+
"ios_test_tf.event_workflow_dispatch": "📋 workflow_dispatch 이벤트 감지",
|
|
1974
|
+
"ios_test_tf.event_build_number_default": " 빌드 번호: {build} (기본값)",
|
|
1975
|
+
"ios_test_tf.test_build_log": "📋 테스트 빌드: 버전={version}, 빌드번호={build}",
|
|
1976
|
+
"ios_test_tf.branch_name_log": "🌿 브랜치명: {branch}",
|
|
1977
|
+
"ios_test_tf.issue_number_missing": "⚠️ 브랜치명에서 이슈 번호를 찾을 수 없습니다.",
|
|
1978
|
+
"ios_test_tf.issue_number_extracted": "✅ 추출된 이슈 번호: #{number}",
|
|
1979
|
+
"ios_test_tf.issue_fetching": "🔍 GitHub API로 이슈 정보 조회 중...",
|
|
1980
|
+
"ios_test_tf.issue_title_default": "이슈 정보 없음",
|
|
1981
|
+
"ios_test_tf.issue_not_found": "⚠️ 이슈 #{number}를 찾을 수 없습니다.",
|
|
1982
|
+
"ios_test_tf.issue_title_log": "📋 이슈 제목: {title}",
|
|
1983
|
+
"ios_test_tf.issue_state_log": "📌 이슈 상태: {state}",
|
|
1984
|
+
"ios_test_tf.notes_build": "테스트 빌드 #{build}",
|
|
1985
|
+
"ios_test_tf.notes_branch": "브랜치: {branch}",
|
|
1986
|
+
"ios_test_tf.notes_commit": "커밋: {commit}",
|
|
1987
|
+
"ios_test_tf.notes_date": "날짜: {date}",
|
|
1988
|
+
"ios_test_tf.notes_issue_header": "관련 이슈:",
|
|
1989
|
+
"ios_test_tf.notes_generated": "📋 생성된 릴리즈 노트:",
|
|
1990
|
+
"ios_test_tf.title_prepare_failed": "## 🍎 ❌ iOS TestFlight 빌드 실패",
|
|
1991
|
+
"ios_test_tf.prepare_error": "❌ **환경 준비 중 오류가 발생했습니다.**",
|
|
1992
|
+
"ios_test_tf.run_log_check_link": "🔗 [워크플로우 실행 로그 확인]({url})",
|
|
1993
|
+
"ios_test_tf.log_prepare_failed": "❌ 진행 상황 업데이트 완료: 준비 실패",
|
|
1994
|
+
"ios_test_tf.log_prepare_done": "✅ 진행 상황 업데이트 완료: 준비 완료 ({elapsed})",
|
|
1995
|
+
"ios_test_tf.podfile_skip": "ℹ️ ios/Podfile이 없어 pod install을 건너뜁니다 (CocoaPods 플러그인 없음)",
|
|
1996
|
+
"ios_test_tf.plist_missing": "❌ ios/ExportOptions.plist가 없습니다!",
|
|
1997
|
+
"ios_test_tf.plist_missing_hint": "ios/ExportOptions.plist를 저장소에 추가(커밋)하세요. 필요한 Secrets는 워크플로우 상단 주석을 참고하세요.",
|
|
1998
|
+
"ios_test_tf.plist_ok": "✅ ExportOptions.plist 확인됨",
|
|
1999
|
+
"ios_test_tf.title_ipa_done": "## 🍎 ✅ iOS 빌드 완료",
|
|
2000
|
+
"ios_test_tf.log_ipa_done": "✅ 진행 상황 업데이트 완료: IPA 빌드 완료 ({elapsed})",
|
|
2001
|
+
"ios_test_tf.title_ipa_failed": "## 🍎 ❌ iOS TestFlight 빌드 실패",
|
|
2002
|
+
"ios_test_tf.ipa_error": "❌ **IPA 빌드 중 오류가 발생했습니다.**",
|
|
2003
|
+
"ios_test_tf.log_ipa_failed": "❌ 진행 상황 업데이트 완료: IPA 빌드 실패",
|
|
2004
|
+
"ios_test_tf.fastfile_missing": "❌ ios/fastlane/Fastfile이 없습니다!",
|
|
2005
|
+
"ios_test_tf.fastfile_missing_hint": "ios/fastlane/Fastfile을 저장소에 추가(커밋)하세요. 필요한 Secrets는 워크플로우 상단 주석을 참고하세요.",
|
|
2006
|
+
"ios_test_tf.fastfile_ok": "✅ Fastfile 확인됨: ios/fastlane/Fastfile",
|
|
2007
|
+
"ios_test_tf.gemfile_repo": "ℹ️ 저장소의 Gemfile을 사용합니다",
|
|
2008
|
+
"ios_test_tf.ipa_missing": "❌ IPA 파일을 찾을 수 없습니다!",
|
|
2009
|
+
"ios_test_tf.default_notes_echo": "📝 기본 Release Notes: {notes}",
|
|
2010
|
+
"ios_test_tf.upload_ok": "✅ TestFlight 테스트 빌드 업로드 성공!",
|
|
2011
|
+
"ios_test_tf.upload_version": "버전: {version}",
|
|
2012
|
+
"ios_test_tf.upload_build": "빌드 번호: {build}",
|
|
2013
|
+
"ios_test_tf.upload_pr": "PR 번호: {pr}",
|
|
2014
|
+
"ios_test_tf.upload_branch": "브랜치: {branch}",
|
|
2015
|
+
"ios_test_tf.upload_commit": "커밋: {sha}",
|
|
2016
|
+
"ios_test_tf.upload_issue": "관련 이슈: {url}",
|
|
2017
|
+
"ios_test_tf.upload_failed": "❌ TestFlight 테스트 빌드 업로드 실패!",
|
|
2018
|
+
"ios_test_tf.check_logs": "로그를 확인해주세요.",
|
|
2019
|
+
"ios_test_tf.title_deploy_done": "## 🍎 ✅ iOS TestFlight 배포 완료",
|
|
2020
|
+
"ios_test_tf.download_hint": "📱 **TestFlight에서 테스트 앱을 다운로드할 수 있습니다.**",
|
|
2021
|
+
"ios_test_tf.run_log_link": "🔗 [워크플로우 실행 로그]({url})",
|
|
2022
|
+
"ios_test_tf.log_all_done": "✅ 진행 상황 최종 업데이트 완료: 전체 성공 ({elapsed})",
|
|
2023
|
+
"ios_test_tf.title_deploy_failed": "## 🍎 ❌ iOS TestFlight 배포 실패",
|
|
2024
|
+
"ios_test_tf.deploy_error": "❌ **TestFlight 배포 중 오류가 발생했습니다.**",
|
|
2025
|
+
"ios_test_tf.log_deploy_failed": "❌ 진행 상황 최종 업데이트 완료: TestFlight 배포 실패",
|
|
2026
|
+
# --- ios_testflight ---
|
|
2027
|
+
"ios_testflight.secrets_missing": "필수 GitHub Secret이 비어 있습니다:{missing} (워크플로우 상단 주석 참고)",
|
|
2028
|
+
"ios_testflight.export_options_missing": "ios/ExportOptions.plist가 없습니다 — 저장소에 추가(커밋)하세요.",
|
|
2029
|
+
"ios_testflight.export_options_placeholders": "ios/ExportOptions.plist에 채워지지 않은 플레이스홀더가 남아 있습니다 — 팀 ID·번들 ID·프로비저닝 프로파일 이름으로 바꿔 커밋하세요.",
|
|
2030
|
+
"ios_testflight.fastfile_missing_error": "ios/fastlane/Fastfile이 없습니다 — 저장소에 추가(커밋)하세요.",
|
|
2031
|
+
"ios_testflight.preflight_ok": "✅ 배포 설정 확인 완료",
|
|
2032
|
+
"ios_testflight.podfile_skip": "ℹ️ ios/Podfile이 없어 pod install을 건너뜁니다 (CocoaPods 플러그인 없음)",
|
|
2033
|
+
"ios_testflight.version_info": "📋 버전: {version} (빌드번호: {build})",
|
|
2034
|
+
"ios_testflight.default_notes": "v{version} 업데이트",
|
|
2035
|
+
"ios_testflight.plist_placeholders": "❌ ios/ExportOptions.plist에 채워지지 않은 플레이스홀더가 남아 있습니다:",
|
|
2036
|
+
"ios_testflight.plist_placeholders_hint": "팀 ID·번들 ID·프로비저닝 프로파일 이름으로 바꿔 커밋한 뒤 다시 실행하세요.",
|
|
2037
|
+
"ios_testflight.fastfile_missing": "❌ ios/fastlane/Fastfile이 없습니다!",
|
|
2038
|
+
"ios_testflight.fastfile_missing_hint": "ios/fastlane/Fastfile을 저장소에 추가(커밋)하세요. 필요한 Secrets는 워크플로우 상단 주석을 참고하세요.",
|
|
2039
|
+
"ios_testflight.fastfile_ok": "✅ Fastfile 확인됨: ios/fastlane/Fastfile",
|
|
2040
|
+
"ios_testflight.gemfile_repo": "ℹ️ 저장소의 Gemfile을 사용합니다",
|
|
2041
|
+
"ios_testflight.ipa_missing": "❌ IPA 파일을 찾을 수 없습니다!",
|
|
2042
|
+
"ios_testflight.default_notes_echo": "📝 기본 Release Notes: {notes}",
|
|
2043
|
+
"ios_testflight.upload_ok": "✅ TestFlight 업로드 성공!",
|
|
2044
|
+
"ios_testflight.upload_version": "📱 버전: {version}",
|
|
2045
|
+
"ios_testflight.upload_build": "🔢 빌드번호: {build}",
|
|
2046
|
+
"ios_testflight.upload_commit": "📝 커밋: {sha}",
|
|
2047
|
+
"ios_testflight.upload_failed": "❌ TestFlight 업로드 실패!",
|
|
2048
|
+
"ios_testflight.check_logs": "로그를 확인해주세요.",
|
|
2049
|
+
# --- issue_helper ---
|
|
2050
|
+
"issue_helper.err_list_comments": "이슈 코멘트 조회 실패({status}): {issue_number}",
|
|
2051
|
+
"issue_helper.err_update_comment": "코멘트 갱신 실패({status})",
|
|
2052
|
+
"issue_helper.comment_updated": "기존 코멘트를 갱신했습니다.",
|
|
2053
|
+
"issue_helper.err_create_comment": "코멘트 작성 실패({status})",
|
|
2054
|
+
"issue_helper.comment_created": "새 코멘트를 작성했습니다.",
|
|
2055
|
+
"issue_helper.err_repo_info": "레포 정보 조회 실패({status})",
|
|
2056
|
+
"issue_helper.err_base_ref": "base 브랜치 ref 조회 실패({base}, {status})",
|
|
2057
|
+
"issue_helper.branch_exists": "브랜치가 이미 존재함, 건너뜀: {branch_name}",
|
|
2058
|
+
"issue_helper.err_create_branch": "브랜치 생성 실패({branch_name}, {status})",
|
|
2059
|
+
"issue_helper.branch_created": "브랜치 생성됨: {branch_name}",
|
|
2060
|
+
"issue_helper.warn_issue_missing": "::warning::이슈 #{n}이 레포에 없어 PR 본문 Closes 연결에서 제외합니다",
|
|
2061
|
+
"issue_helper.warn_is_pr": "::warning::#{n}은 이슈가 아니라 PR이라 Closes 연결에서 제외합니다",
|
|
2062
|
+
"issue_helper.issue_check_failed": "이슈 #{n} 확인 실패({status}) — 확인하지 못해 그대로 연결합니다",
|
|
2063
|
+
"issue_helper.no_issue_to_link": "연결할 이슈가 없음 — 건너뜀 (PR #{pr_number})",
|
|
2064
|
+
"issue_helper.err_get_pr": "PR 조회 실패({status}): {pr_number}",
|
|
2065
|
+
"issue_helper.link_unchanged": "이슈 연결 변경 없음 — 건너뜀 (PR #{pr_number})",
|
|
2066
|
+
"issue_helper.err_update_pr": "PR 본문 갱신 실패({status}): {pr_number}",
|
|
2067
|
+
"issue_helper.link_done": "이슈 연결 완료: {numbers} (PR #{pr_number})",
|
|
2068
|
+
"issue_helper.err_no_event_path": "ERROR: GITHUB_EVENT_PATH가 없습니다.",
|
|
2069
|
+
"issue_helper.err_event_payload": "ERROR: 이벤트 페이로드를 읽을 수 없습니다: {error}",
|
|
2070
|
+
"issue_helper.not_relevant_event": "열림 또는 제목 변경 이벤트가 아님 → 종료",
|
|
2071
|
+
"issue_helper.err_repo_format": "ERROR: GITHUB_REPOSITORY 형식이 올바르지 않습니다: {repo}",
|
|
2072
|
+
"issue_helper.err_no_token": "ERROR: GITHUB_TOKEN이 없습니다.",
|
|
2073
|
+
"issue_helper.commit_template_default": "${issueTitle} : feat : {변경 사항에 대한 설명} ${issueUrl}",
|
|
2074
|
+
"issue_helper.branch_title": "브랜치명",
|
|
2075
|
+
"issue_helper.commit_title": "커밋 메시지",
|
|
2076
|
+
"issue_helper.no_issue_numbers": "이슈 번호가 없음 — 건너뜀",
|
|
2077
|
+
"issue_helper.run_failed": "실행 실패: {error}",
|
|
2078
|
+
# --- truncate ---
|
|
2079
|
+
"truncate.file_missing": "릴리즈 노트 파일 없음, 건너뜀: {path}",
|
|
2080
|
+
"truncate.within_limit": "한도 이내 ({length}/{limit} {mode}), 자르지 않음: {path}",
|
|
2081
|
+
"truncate.truncated": "한도 초과 ({length} -> {limit} {mode} 이하로 절단): {path}",
|
|
2082
|
+
"truncate.limit_positive": "ERROR: limit은 양수여야 함: {limit}",
|
|
2083
|
+
# --- version ---
|
|
2084
|
+
"version.bump_help": "승격 폭 (기본 patch — 지정 안 하면 기존 동작과 동일)",
|
|
2085
|
+
# --- wf_aisum ---
|
|
2086
|
+
"wf_aisum.no_issue_in_branch": "브랜치명에서 이슈 번호를 찾지 못함 — 건너뜀: {ref}",
|
|
2087
|
+
# --- wf_changelog ---
|
|
2088
|
+
"wf_changelog.pr_list_limit": "gh pr list가 --limit 200에 도달했습니다 — 오래된 병합 PR이 누락됐을 수 있습니다 (조회된 PR: {count})",
|
|
2089
|
+
"wf_changelog.no_issues": "이번 릴리스에 연결할 이슈 없음 — 건너뜀",
|
|
2090
|
+
"wf_changelog.issues_linked": "이슈 연결: {issues}",
|
|
2091
|
+
"wf_changelog.merge_conflict": "릴리스 PR이 {prod}와 충돌합니다 (버전 파일·CHANGELOG 등) — {prod}에만 있는 커밋을 {dev}에 병합한 뒤 push하세요: git checkout {dev} && git merge origin/{prod} (버전 줄 충돌은 어느 쪽을 택해도 다음 실행이 알맞게 다시 확정합니다)",
|
|
2092
|
+
"wf_changelog.merge_commit_disabled": "이 레포는 merge commit이 비활성화되어 있습니다 — Settings에서 'Allow merge commits'를 켜세요; 릴리스 감지는 merge commit subject를 사용합니다",
|
|
2093
|
+
"wf_changelog.merge_confirmed": "PR #{pr} 병합 확인 (경과 {elapsed}s)",
|
|
2094
|
+
"wf_changelog.merge_timeout": "PR #{pr} 병합을 {max}s 내에 확인하지 못했습니다 — RELEASE-PUBLISH 자동 트리거를 건너뜁니다. WORKFLOW_PAT이 등록되어 있다면 기존 경로로 정상 진행되며, 없다면 필요 시 RELEASE-PUBLISH를 수동으로 workflow_dispatch 하세요.",
|
|
2095
|
+
"wf_changelog.release_publish_triggered": "RELEASE-PUBLISH workflow_dispatch 트리거 요청 완료 (WORKFLOW_PAT 없이도 동작)",
|
|
2096
|
+
# --- wf_preview ---
|
|
2097
|
+
"wf_preview.chk_deleted_3": "3. 브랜치가 삭제되지 않았는지 확인하세요",
|
|
2098
|
+
"wf_preview.chk_helper_exists": "1. Issue Helper 댓글이 존재하는지 확인하세요",
|
|
2099
|
+
"wf_preview.chk_helper_marker": "3. `ISSUE_HELPER_MARKER` 환경변수가 올바른지 확인하세요",
|
|
2100
|
+
"wf_preview.chk_helper_section": "2. 댓글에 `### 브랜치` 섹션이 있는지 확인하세요",
|
|
2101
|
+
"wf_preview.chk_name_1": "1. 브랜치명이 정확한지 확인하세요",
|
|
2102
|
+
"wf_preview.chk_name_2": "2. 브랜치명이 정확한지 확인하세요",
|
|
2103
|
+
"wf_preview.chk_pushed_1": "1. 브랜치가 push되었는지 확인하세요",
|
|
2104
|
+
"wf_preview.chk_pushed_2": "2. 브랜치가 push되었는지 확인하세요",
|
|
2105
|
+
"wf_preview.cmd_advanced": "<summary>🔧 고급 명령어 (다른 Issue/PR에서 제어)</summary>",
|
|
2106
|
+
"wf_preview.cmd_build": "| `/wizard server build` | 최신 커밋으로 재배포 |",
|
|
2107
|
+
"wf_preview.cmd_build_branch": "| `/wizard server build {branchName}` | 최신 커밋으로 재배포 |",
|
|
2108
|
+
"wf_preview.cmd_destroy": "| `/wizard server destroy` | Preview 환경 삭제 |",
|
|
2109
|
+
"wf_preview.cmd_destroy_branch": "| `/wizard server destroy {branchName}` | Preview 환경 삭제 |",
|
|
2110
|
+
"wf_preview.cmd_detected_build": "✅ 명령어 감지: build",
|
|
2111
|
+
"wf_preview.cmd_detected_build_branch": "✅ 명령어 감지: build (브랜치: {branch})",
|
|
2112
|
+
"wf_preview.cmd_detected_destroy": "✅ 명령어 감지: destroy",
|
|
2113
|
+
"wf_preview.cmd_detected_destroy_branch": "✅ 명령어 감지: destroy (브랜치: {branch})",
|
|
2114
|
+
"wf_preview.cmd_detected_status": "✅ 명령어 감지: status",
|
|
2115
|
+
"wf_preview.cmd_detected_status_branch": "✅ 명령어 감지: status (브랜치: {branch})",
|
|
2116
|
+
"wf_preview.cmd_from_issue": "ℹ️ Issue 댓글에서 명령어 감지",
|
|
2117
|
+
"wf_preview.cmd_from_pr": "ℹ️ PR 댓글에서 명령어 감지",
|
|
2118
|
+
"wf_preview.cmd_not_wizard": "ℹ️ /wizard server 명령어가 아님",
|
|
2119
|
+
"wf_preview.cmd_status": "| `/wizard server status` | 현재 상태 확인 |",
|
|
2120
|
+
"wf_preview.cmd_status_branch": "| `/wizard server status {branchName}` | 현재 상태 확인 |",
|
|
2121
|
+
"wf_preview.deploy_hint": "배포하려면: `/wizard server build`",
|
|
2122
|
+
"wf_preview.deploy_hint_branch": "배포하려면: `/wizard server build {branchName}`",
|
|
2123
|
+
"wf_preview.done_label": "완료",
|
|
2124
|
+
"wf_preview.dur_min_sec": "{minutes}분 {seconds}초",
|
|
2125
|
+
"wf_preview.dur_sec": "{seconds}초",
|
|
2126
|
+
"wf_preview.env_branch": "| **브랜치** | `{branchName}` |",
|
|
2127
|
+
"wf_preview.env_commit": "| **커밋** | `{sha}` |",
|
|
2128
|
+
"wf_preview.env_container_issue": "| **컨테이너** | `{projectName}-pr-{issueNumber}` |",
|
|
2129
|
+
"wf_preview.env_container_name": "| **컨테이너** | `{containerName}` |",
|
|
2130
|
+
"wf_preview.env_container_num": "| **컨테이너** | `{projectName}-pr-{number}` |",
|
|
2131
|
+
"wf_preview.env_container_pr": "| **컨테이너** | `{projectName}-pr-{prNumber}` |",
|
|
2132
|
+
"wf_preview.env_marker": "| **마커** | `{marker}` |",
|
|
2133
|
+
"wf_preview.env_status_absent": "| **상태** | 🔴 Not Found |",
|
|
2134
|
+
"wf_preview.env_status_deleted": "| **상태** | 삭제됨 |",
|
|
2135
|
+
"wf_preview.env_status_running": "| **상태** | 🟢 Running |",
|
|
2136
|
+
"wf_preview.fail_branch_missing": "브랜치를 찾을 수 없습니다",
|
|
2137
|
+
"wf_preview.fail_branch_missing_named": "브랜치를 찾을 수 없습니다: {branchName}",
|
|
2138
|
+
"wf_preview.footer_context": "*🤖 이 댓글은 {contextType} Preview 시스템에 의해 자동 생성되었습니다.*",
|
|
2139
|
+
"wf_preview.footer_custom": "*🤖 이 댓글은 Custom Branch Preview 시스템에 의해 자동 생성되었습니다.*",
|
|
2140
|
+
"wf_preview.footer_generic": "*🤖 이 댓글은 Preview 시스템에 의해 자동 생성되었습니다.*",
|
|
2141
|
+
"wf_preview.footer_issue": "*🤖 이 댓글은 Issue Preview 시스템에 의해 자동 생성되었습니다.*",
|
|
2142
|
+
"wf_preview.footer_pr": "*🤖 이 댓글은 PR Preview 시스템에 의해 자동 생성되었습니다.*",
|
|
2143
|
+
"wf_preview.footer_pr_issue": "*🤖 이 댓글은 PR/Issue Preview 시스템에 의해 자동 생성되었습니다.*",
|
|
2144
|
+
"wf_preview.footer_progress": "*🤖 이 댓글은 자동으로 업데이트됩니다.*",
|
|
2145
|
+
"wf_preview.hint_docker": "- Docker 이미지 빌드 실패",
|
|
2146
|
+
"wf_preview.hint_docker_go": "- Docker 이미지 빌드 실패 (Go 의존성/빌드 문제)",
|
|
2147
|
+
"wf_preview.hint_docker_python": "- Docker 이미지 빌드 실패 (Python 의존성 문제)",
|
|
2148
|
+
"wf_preview.hint_env_missing": "- 환경변수 누락 (.env 파일 설정 확인)",
|
|
2149
|
+
"wf_preview.hint_gradle": "- Gradle 빌드 실패",
|
|
2150
|
+
"wf_preview.hint_health_timeout": "- Health Check 타임아웃 (120초 내 기동 완료 안됨)",
|
|
2151
|
+
"wf_preview.hint_secrets": "- 필수 Secret(DOCKERHUB_*, SERVER_*) 미등록 또는 Dockerfile 없음 → 로그의 \"배포 사전 점검\" 단계 확인",
|
|
2152
|
+
"wf_preview.hint_server_conn": "- 서버 연결 문제",
|
|
2153
|
+
"wf_preview.hint_start": "- 컨테이너 시작 실패",
|
|
2154
|
+
"wf_preview.hint_start_go": "- 컨테이너 시작 실패 (애플리케이션 기동 오류)",
|
|
2155
|
+
"wf_preview.hint_start_python": "- 컨테이너 시작 실패 (FastAPI/Uvicorn 기동 오류)",
|
|
2156
|
+
"wf_preview.hint_start_spring": "- 컨테이너 시작 실패 (Spring Boot 기동 오류)",
|
|
2157
|
+
"wf_preview.line_branch": "**브랜치**: `{branchName}`",
|
|
2158
|
+
"wf_preview.line_commit": "**커밋**: `{sha}`",
|
|
2159
|
+
"wf_preview.link_build_logs": "**[📋 빌드/배포 로그 확인]({runUrl})**",
|
|
2160
|
+
"wf_preview.link_logs": "**[📋 실시간 로그 보기]({runUrl})**",
|
|
2161
|
+
"wf_preview.log_branch_exists": "✅ 브랜치 존재: {branchName}",
|
|
2162
|
+
"wf_preview.log_branch_found": "✅ 브랜치 발견: {branchName}",
|
|
2163
|
+
"wf_preview.log_branch_missing": "❌ 브랜치 없음: {branchName}",
|
|
2164
|
+
"wf_preview.log_check_branch": "🔍 브랜치 확인: {branchName}",
|
|
2165
|
+
"wf_preview.log_check_exists": "🔍 브랜치 존재 확인: {branchName}",
|
|
2166
|
+
"wf_preview.log_hash": "✅ 해시 생성: custom-{hashStr}",
|
|
2167
|
+
"wf_preview.log_helper_no_branch": "⚠️ Issue Helper 댓글에서 브랜치를 찾을 수 없습니다.",
|
|
2168
|
+
"wf_preview.log_issue_number": "✅ Issue 번호 추출: #{n}",
|
|
2169
|
+
"wf_preview.log_marker": "📝 마커: {marker}",
|
|
2170
|
+
"wf_preview.log_search_branch": "🔍 Issue #{issueNumber}에서 브랜치 검색 중...",
|
|
2171
|
+
"wf_preview.next_logs": "1. 위 링크에서 빌드/배포 로그를 확인하세요",
|
|
2172
|
+
"wf_preview.next_retry": "2. 문제를 수정한 후 다시 시도하세요: `/wizard server build`",
|
|
2173
|
+
"wf_preview.next_retry_branch": "2. 문제를 수정한 후 다시 시도하세요: `/wizard server build {branchName}`",
|
|
2174
|
+
"wf_preview.precheck_dockerfile_body": "{path} 파일이 없습니다. 이 워크플로우는 Docker 이미지로 배포하므로 Dockerfile이 필요합니다 (서버 배포를 하지 않는다면 이 워크플로우 파일을 삭제하세요)",
|
|
2175
|
+
"wf_preview.precheck_dockerfile_title": "Dockerfile 없음",
|
|
2176
|
+
"wf_preview.precheck_ok": "✅ 사전 점검 통과: 필수 Secret과 Dockerfile이 모두 있습니다",
|
|
2177
|
+
"wf_preview.precheck_secret_body": "등록되지 않은 GitHub Secret:{missing} — Settings → Secrets and variables → Actions에서 등록하세요",
|
|
2178
|
+
"wf_preview.precheck_secret_title": "필수 Secret 누락",
|
|
2179
|
+
"wf_preview.r_container_absent": "❌ 컨테이너 없음",
|
|
2180
|
+
"wf_preview.r_container_confirmed": "✅ 컨테이너 실행 확인됨",
|
|
2181
|
+
"wf_preview.r_container_exited": "❌ 컨테이너 비정상 종료!",
|
|
2182
|
+
"wf_preview.r_container_logs": "📋 컨테이너 로그 (최근 100줄):",
|
|
2183
|
+
"wf_preview.r_container_missing_info": "ℹ️ 컨테이너가 존재하지 않음: {container_name}",
|
|
2184
|
+
"wf_preview.r_container_name": "📛 컨테이너: {container_name}",
|
|
2185
|
+
"wf_preview.r_container_new_named": "🐳 새 컨테이너 시작: {container_name}",
|
|
2186
|
+
"wf_preview.r_container_removing": "🐳 컨테이너 삭제 중...",
|
|
2187
|
+
"wf_preview.r_container_removing_named": "🗑️ 컨테이너 삭제 중: {container_name}",
|
|
2188
|
+
"wf_preview.r_container_running": "✅ 컨테이너 실행 중",
|
|
2189
|
+
"wf_preview.r_container_starting": "🐳 새 컨테이너 실행 중...",
|
|
2190
|
+
"wf_preview.r_deploy_done": "✅ 배포 완료!",
|
|
2191
|
+
"wf_preview.r_deploy_failed_not_running": "❌ 배포 실패: 컨테이너가 실행되지 않음",
|
|
2192
|
+
"wf_preview.r_deploy_head_custom": "🚀 Custom Branch Preview 배포 시작",
|
|
2193
|
+
"wf_preview.r_deploy_head_custom_short": "🚀 Custom Branch Preview 배포",
|
|
2194
|
+
"wf_preview.r_deploy_head_issue": "🚀 Issue Preview 배포 시작",
|
|
2195
|
+
"wf_preview.r_deploy_head_pr": "🚀 PR Preview 배포 시작",
|
|
2196
|
+
"wf_preview.r_destroy_head": "🗑️ Preview 삭제",
|
|
2197
|
+
"wf_preview.r_destroy_head_custom": "🗑️ Custom Branch Preview 삭제",
|
|
2198
|
+
"wf_preview.r_destroy_head_pr": "🗑️ PR Preview 삭제",
|
|
2199
|
+
"wf_preview.r_domain": "🌐 도메인: {domain}",
|
|
2200
|
+
"wf_preview.r_existing_cleanup": "🗑️ 기존 컨테이너 정리 중...",
|
|
2201
|
+
"wf_preview.r_existing_removed": "🗑️ 기존 컨테이너 삭제: {container_name}",
|
|
2202
|
+
"wf_preview.r_hc_done": "✅ 배포 및 Health Check 완료! (방식: {health_check_method})",
|
|
2203
|
+
"wf_preview.r_hc_ok_http": "✅ 정상 기동 확인! (HTTP 응답: {health_path})",
|
|
2204
|
+
"wf_preview.r_hc_ok_log": "✅ 정상 기동 확인! (로그 패턴)",
|
|
2205
|
+
"wf_preview.r_hc_start": "⏳ Health Check 시작 (최대 120초 대기)...",
|
|
2206
|
+
"wf_preview.r_hc_timeout": "❌ Health Check 타임아웃 (120초)",
|
|
2207
|
+
"wf_preview.r_hc_wait_60": "⏳ Health Check 대기 (최대 60초)...",
|
|
2208
|
+
"wf_preview.r_hc_waiting": "⏳ 대기 중... ({retry_count}/{max_retries}) - 상태: {status}",
|
|
2209
|
+
"wf_preview.r_image_pulling": "📥 Docker 이미지 Pull 중...",
|
|
2210
|
+
"wf_preview.r_image_removing": "🖼️ 이미지 삭제 중...",
|
|
2211
|
+
"wf_preview.r_num_generic": "🔢 번호: #{pr_number}",
|
|
2212
|
+
"wf_preview.r_num_issue": "🔢 Issue 번호: #{issue_number}",
|
|
2213
|
+
"wf_preview.r_num_pr": "🔢 PR 번호: #{pr_number}",
|
|
2214
|
+
"wf_preview.r_project_name": "📦 프로젝트: {project_name}",
|
|
2215
|
+
"wf_preview.r_removed": "✅ 삭제 완료!",
|
|
2216
|
+
"wf_preview.r_ssh_auth": "🔐 SSH 인증 방식: {ssh_auth_method}",
|
|
2217
|
+
"wf_preview.r_status_head": "🔍 Preview 상태 확인",
|
|
2218
|
+
"wf_preview.r_status_head_custom": "🔍 Custom Branch Preview 상태 확인",
|
|
2219
|
+
"wf_preview.r_wait_i": "대기 중... ({i}/12)",
|
|
2220
|
+
"wf_preview.redeploy_hint": "다시 배포하려면: `/wizard server build`",
|
|
2221
|
+
"wf_preview.redeploy_hint_branch": "다시 배포하려면: `/wizard server build {branchName}`",
|
|
2222
|
+
"wf_preview.row_build_done": "| 🔨 프로젝트 빌드 | ✅ 완료 | {buildDuration} |",
|
|
2223
|
+
"wf_preview.row_build_progress": "| 🔨 프로젝트 빌드 | ⏳ 진행 중... | - |",
|
|
2224
|
+
"wf_preview.row_build_status": "| 🔨 프로젝트 빌드 | {buildStatus} | {buildTime} |",
|
|
2225
|
+
"wf_preview.row_deploy_done": "| 🚀 서버 배포 & Health Check | ✅ 완료 | {deployDuration} |",
|
|
2226
|
+
"wf_preview.row_deploy_progress": "| 🚀 서버 배포 & Health Check | ⏳ 진행 중... | - |",
|
|
2227
|
+
"wf_preview.row_deploy_status": "| 🚀 서버 배포 & Health Check | {deployStatus} | - |",
|
|
2228
|
+
"wf_preview.row_deploy_wait": "| 🚀 서버 배포 & Health Check | ⏸️ 대기 | - |",
|
|
2229
|
+
"wf_preview.row_docker_done": "| 🐳 Docker 이미지 빌드 & Push | ✅ 완료 | {dockerDuration} |",
|
|
2230
|
+
"wf_preview.row_docker_progress": "| 🐳 Docker 이미지 빌드 & Push | ⏳ 진행 중... | - |",
|
|
2231
|
+
"wf_preview.row_docker_status": "| 🐳 Docker 이미지 빌드 & Push | {dockerStatus} | {dockerTime} |",
|
|
2232
|
+
"wf_preview.row_image_done": "| 🐳 Docker 이미지 생성 | ✅ 완료 | {dockerDuration} |",
|
|
2233
|
+
"wf_preview.row_image_progress": "| 🐳 Docker 이미지 생성 | ⏳ 진행 중... | - |",
|
|
2234
|
+
"wf_preview.row_image_status": "| 🐳 Docker 이미지 생성 | {dockerStatus} | {dockerTime} |",
|
|
2235
|
+
"wf_preview.row_image_wait": "| 🐳 Docker 이미지 생성 | ⏸️ 대기 | - |",
|
|
2236
|
+
"wf_preview.sec_causes": "### 🔍 가능한 원인",
|
|
2237
|
+
"wf_preview.sec_check": "### 💡 확인 사항",
|
|
2238
|
+
"wf_preview.sec_commands": "### 📋 명령어",
|
|
2239
|
+
"wf_preview.sec_env": "### 🌐 Preview 환경",
|
|
2240
|
+
"wf_preview.sec_next": "### 💡 다음 단계",
|
|
2241
|
+
"wf_preview.skip_no_branch": "⚠️ 브랜치가 존재하지 않아 빌드를 건너뜁니다.",
|
|
2242
|
+
"wf_preview.status_done": "✅ 완료",
|
|
2243
|
+
"wf_preview.status_failed": "❌ 실패",
|
|
2244
|
+
"wf_preview.status_init_failed": "⚠️ 초기화 실패",
|
|
2245
|
+
"wf_preview.status_waiting": "⏸️ 대기",
|
|
2246
|
+
"wf_preview.tbl_commands": "| 명령어 | 설명 |",
|
|
2247
|
+
"wf_preview.tbl_items": "| 항목 | 값 |",
|
|
2248
|
+
"wf_preview.tbl_steps": "| 단계 | 상태 | 소요 시간 |",
|
|
2249
|
+
"wf_preview.title_absent": "## ❌ Preview 환경 없음",
|
|
2250
|
+
"wf_preview.title_branch_missing": "## ❌ 브랜치를 찾을 수 없습니다",
|
|
2251
|
+
"wf_preview.title_branch_missing_warn": "## ⚠️ 브랜치를 찾을 수 없습니다",
|
|
2252
|
+
"wf_preview.title_custom_absent": "## ❌ Custom Branch Preview 환경 없음",
|
|
2253
|
+
"wf_preview.title_custom_building": "## 🚀 Custom Branch Preview 빌드 중...",
|
|
2254
|
+
"wf_preview.title_custom_deployed": "## ✅ Custom Branch Preview 배포 완료!",
|
|
2255
|
+
"wf_preview.title_custom_destroyed": "## 🗑️ Custom Branch Preview 환경 삭제 완료!",
|
|
2256
|
+
"wf_preview.title_custom_destroyed_short": "## 🗑️ Custom Branch Preview 삭제 완료",
|
|
2257
|
+
"wf_preview.title_custom_failed": "## ❌ Custom Branch Preview 배포 실패!",
|
|
2258
|
+
"wf_preview.title_custom_running": "## ✅ Custom Branch Preview 환경 실행 중",
|
|
2259
|
+
"wf_preview.title_custom_started": "## 🚀 Custom Branch Preview 배포 시작",
|
|
2260
|
+
"wf_preview.title_destroyed": "## 🗑️ Preview 환경 삭제 완료!",
|
|
2261
|
+
"wf_preview.title_issue_building": "## 🚀 Issue Preview 빌드 중...",
|
|
2262
|
+
"wf_preview.title_issue_deployed": "## ✅ Issue Preview 배포 완료!",
|
|
2263
|
+
"wf_preview.title_issue_failed": "## ❌ Issue Preview 배포 실패!",
|
|
2264
|
+
"wf_preview.title_pr_building": "## 🚀 PR Preview 빌드 중...",
|
|
2265
|
+
"wf_preview.title_pr_deployed": "## ✅ PR Preview 배포 완료!",
|
|
2266
|
+
"wf_preview.title_pr_failed": "## ❌ PR Preview 배포 실패!",
|
|
2267
|
+
"wf_preview.title_running": "## ✅ Preview 환경 실행 중",
|
|
2268
|
+
# --- wf_readme ---
|
|
2269
|
+
"wf_readme.hint_first_example": "## 최신 버전 : v1.0.0 (2025-08-15)",
|
|
2270
|
+
"wf_readme.default_heading": "최신 버전",
|
|
2271
|
+
# --- wf_release ---
|
|
2272
|
+
"wf_release.drift_heading": "### ⚠️ 릴리스 누락 감지",
|
|
2273
|
+
"wf_release.drift_version_line": "- version.yml: `{version}`",
|
|
2274
|
+
"wf_release.drift_tag_line": "- 최신 태그: `{tag}`",
|
|
2275
|
+
"wf_release.drift_body": "릴리스 확정 없이 버전만 올라갔습니다. 이 버전은 npm에 배포되지 않습니다.",
|
|
2276
|
+
"wf_release.drift_recover": "복구: Actions → PROJECT-RELEASE-PUBLISH → Run workflow",
|
|
2277
|
+
"wf_release.readme_dispatch_ok": "README-VERSION-UPDATE workflow_dispatch 트리거 요청 완료",
|
|
2278
|
+
"wf_release.readme_dispatch_skip": "README-VERSION-UPDATE 워크플로우를 깨우지 못했습니다 (삭제했거나 비활성화됨) — README 버전 갱신을 건너뜁니다",
|
|
2279
|
+
"wf_release.not_merge_release": "v{version}은 릴리스 PR 병합으로 들어온 릴리스가 아닙니다 — 배포는 push 이벤트가 맡습니다",
|
|
2280
|
+
"wf_release.bot_merged": "PR #{pr}을 봇 토큰이 병합했습니다 — push 이벤트가 배포를 깨우지 못했습니다",
|
|
2281
|
+
"wf_release.merger_unknown_pat": "병합 주체를 확인하지 못했고 WORKFLOW_PAT이 있습니다 — push 이벤트가 배포를 실행했다고 보고 건너뜁니다",
|
|
2282
|
+
"wf_release.merger_unknown_nopat": "병합 주체를 확인하지 못했고 WORKFLOW_PAT이 없습니다 — 봇 토큰 병합으로 봅니다",
|
|
2283
|
+
"wf_release.human_merged": "PR #{pr}을 {user}이(가) 병합했습니다 — push 이벤트가 배포를 이미 실행했으므로 건너뜁니다",
|
|
2284
|
+
"wf_release.no_targets": "{branch} push로 도는 배포 워크플로우가 없습니다 — 건너뜁니다",
|
|
2285
|
+
"wf_release.deploy_trigger_ok": "{wf} workflow_dispatch 트리거 요청 완료",
|
|
2286
|
+
"wf_release.deploy_trigger_warn": "{wf} 배포 워크플로우를 깨우지 못했습니다 — Actions 탭에서 Run workflow로 직접 실행하세요",
|
|
2287
|
+
# --- wf_spring_ci ---
|
|
2288
|
+
"wf_spring_ci.status_ok": "✅ 성공",
|
|
2289
|
+
"wf_spring_ci.status_fail": "❌ 실패",
|
|
2290
|
+
"wf_spring_ci.err_compile_header": "## 🚨 컴파일 에러",
|
|
2291
|
+
"wf_spring_ci.err_compile_missing": "에러 로그를 찾을 수 없습니다.",
|
|
2292
|
+
"wf_spring_ci.err_test_header": "## 🧪 테스트 실패",
|
|
2293
|
+
"wf_spring_ci.err_test_missing": "테스트 에러 로그를 찾을 수 없습니다.",
|
|
2294
|
+
"wf_spring_ci.err_build_header": "## 📦 빌드 에러",
|
|
2295
|
+
"wf_spring_ci.err_build_missing": "빌드 에러 로그를 찾을 수 없습니다.",
|
|
2296
|
+
"wf_spring_ci.comment_title": "## 🔧 CI Build Check 결과",
|
|
2297
|
+
"wf_spring_ci.comment_success": "### ✅ 빌드 성공!",
|
|
2298
|
+
"wf_spring_ci.comment_failure": "### ❌ 빌드 실패!",
|
|
2299
|
+
"wf_spring_ci.table_header": "| 단계 | 상태 |",
|
|
2300
|
+
"wf_spring_ci.row_compile": "| 컴파일 | {status} |",
|
|
2301
|
+
"wf_spring_ci.row_test": "| 테스트 | {status} |",
|
|
2302
|
+
"wf_spring_ci.row_build": "| 빌드 | {status} |",
|
|
2303
|
+
"wf_spring_ci.overall": "**전체 상태**: {status}",
|
|
2304
|
+
"wf_spring_ci.details_header": "### 📋 에러 상세 정보",
|
|
2305
|
+
"wf_spring_ci.fix_header": "### 🔧 해결 방법",
|
|
2306
|
+
"wf_spring_ci.fix_build": "- 로컬에서 `./gradlew clean build` 명령어로 빌드를 확인해보세요",
|
|
2307
|
+
"wf_spring_ci.fix_error": "- 에러 메시지를 참고하여 코드를 수정해주세요",
|
|
2308
|
+
"wf_spring_ci.fix_test": "- 테스트가 실패한 경우 `./gradlew test` 명령어로 테스트를 실행해보세요",
|
|
2309
|
+
"wf_spring_ci.footer": "*🤖 GitHub Actions에 의해 자동 생성됨 - {time}*",
|
|
2310
|
+
"wf_spring_ci.date_locale": "ko-KR",
|
|
2311
|
+
"wf_spring_ci.check_summary_success": "빌드 검증이 성공했습니다.",
|
|
2312
|
+
"wf_spring_ci.check_summary_failure": "빌드 검증이 실패했습니다.",
|
|
2313
|
+
"wf_spring_ci.check_compile": "컴파일: {status}",
|
|
2314
|
+
"wf_spring_ci.check_test": "테스트: {status}",
|
|
2315
|
+
"wf_spring_ci.check_build": "빌드: {status}",
|
|
2316
|
+
"wf_spring_ci.build_failed": "❌ 빌드가 실패했습니다. 위의 에러 메시지를 확인해주세요.",
|
|
2317
|
+
"wf_spring_ci.gate_results": "needs 결과: {results}",
|
|
2318
|
+
"wf_spring_ci.gate_failed": "실패하거나 취소된 job이 있습니다.",
|
|
2319
|
+
# --- wf_spring_deploy ---
|
|
2320
|
+
"wf_spring_deploy.prod_yml_created": "✅ application-prod.yml 파일 생성 완료 ({dir})",
|
|
2321
|
+
"wf_spring_deploy.ssh_auth_method": "🔐 SSH 인증 방식: {method}",
|
|
2322
|
+
"wf_spring_deploy.image_pull": "📥 이미지 Pull: {image}",
|
|
2323
|
+
"wf_spring_deploy.volume_mkdir": "📁 볼륨 마운트 디렉토리 생성: {path}",
|
|
2324
|
+
"wf_spring_deploy.volume_disabled": "ℹ️ 볼륨 마운트 비활성화됨",
|
|
2325
|
+
"wf_spring_deploy.volume_enabled": "📦 볼륨 마운트 활성화: {host} → {container}",
|
|
2326
|
+
"wf_spring_deploy.idle_slot_cleanup": "🗑️ idle 슬롯 정리: {name}",
|
|
2327
|
+
"wf_spring_deploy.banner_project": "📦 프로젝트: {name}",
|
|
2328
|
+
"wf_spring_deploy.banner_domain": "🌐 도메인: {domain}",
|
|
2329
|
+
"wf_spring_deploy.banner_image": "🖼️ 이미지: {image}",
|
|
2330
|
+
"wf_spring_deploy.old_removed": "🗑️ old={name} 제거",
|
|
2331
|
+
"wf_spring_deploy.old_absent": "ℹ️ old={name} 없음 — 정리 생략",
|
|
2332
|
+
"wf_spring_deploy.inflight_wait": "⏱️ in-flight 요청 처리 대기 ({sec}초)",
|
|
2333
|
+
"wf_spring_deploy.prune_dangling": "🧹 dangling(<none>) 이미지 정리...",
|
|
2334
|
+
"wf_spring_deploy.new_container_start": "🐳 새 컨테이너 기동: {name}",
|
|
2335
|
+
"wf_spring_deploy.simple_env_setup": "🔧 환경변수 설정..",
|
|
2336
|
+
"wf_spring_deploy.simple_container_name_default": "ℹ️ CONTAINER_NAME이 설정되지 않아 PROJECT_NAME을 사용합니다: {name}",
|
|
2337
|
+
"wf_spring_deploy.simple_container_name_custom": "ℹ️ 사용자 지정 CONTAINER_NAME 사용: {name}",
|
|
2338
|
+
"wf_spring_deploy.simple_deploy_start": "🚀 배포 환경으로 배포합니다 (브랜치: {branch})",
|
|
2339
|
+
"wf_spring_deploy.simple_config_header": "📋 배포 설정 정보:",
|
|
2340
|
+
"wf_spring_deploy.simple_config_branch": " - 브랜치: {branch}",
|
|
2341
|
+
"wf_spring_deploy.simple_config_project": " - 프로젝트: {name}",
|
|
2342
|
+
"wf_spring_deploy.simple_config_container": " - 컨테이너 이름: {name}",
|
|
2343
|
+
"wf_spring_deploy.simple_config_port": " - 포트: {port}",
|
|
2344
|
+
"wf_spring_deploy.simple_config_image": " - Docker 이미지: {image}",
|
|
2345
|
+
"wf_spring_deploy.simple_image_pull": "⬇️ Docker 이미지 풀: {image}",
|
|
2346
|
+
"wf_spring_deploy.simple_container_check": "🧹 컨테이너 {name} 존재 여부 확인 중...",
|
|
2347
|
+
"wf_spring_deploy.simple_container_exists": "⚠️ 컨테이너 {name} 이(가) 존재합니다. 중지 및 삭제 중...",
|
|
2348
|
+
"wf_spring_deploy.simple_container_removed": "✅ 컨테이너 {name} 이(가) 삭제되었습니다.",
|
|
2349
|
+
"wf_spring_deploy.simple_container_missing": "ℹ️ 존재하는 컨테이너 {name} 이(가) 없습니다.",
|
|
2350
|
+
"wf_spring_deploy.simple_container_starting": "🚀 새로운 컨테이너 {name} 실행 중...",
|
|
2351
|
+
"wf_spring_deploy.simple_volume_enabled": "📦 볼륨 마운트 활성화: {option}",
|
|
2352
|
+
"wf_spring_deploy.simple_init_wait": "⏳ 컨테이너 초기화 대기 중... ({sec}초)",
|
|
2353
|
+
"wf_spring_deploy.simple_hc_check": "🏥 컨테이너 헬스체크 중...",
|
|
2354
|
+
"wf_spring_deploy.simple_hc_process_missing": "❌ 컨테이너 {name} 프로세스가 실행되지 않았습니다",
|
|
2355
|
+
"wf_spring_deploy.simple_hc_process_ok": "✅ 컨테이너 프로세스 실행 확인 완료",
|
|
2356
|
+
"wf_spring_deploy.simple_http_start": "🌐 HTTP 헬스체크 시작: {url}",
|
|
2357
|
+
"wf_spring_deploy.simple_http_attempt": " 시도 {i}/{max}...",
|
|
2358
|
+
"wf_spring_deploy.simple_http_ok": "✅ HTTP 헬스체크 성공 (응답 코드: {code})",
|
|
2359
|
+
"wf_spring_deploy.simple_http_fail": "⚠️ HTTP 헬스체크 실패 (응답 코드: {code})",
|
|
2360
|
+
"wf_spring_deploy.simple_http_retry": " {sec}초 후 재시도...",
|
|
2361
|
+
"wf_spring_deploy.simple_http_fallback": "⚠️ HTTP 헬스체크 최종 실패, 로그 패턴 매칭으로 fallback...",
|
|
2362
|
+
"wf_spring_deploy.simple_hc_path_unset": "ℹ️ HEALTHCHECK_PATH가 설정되지 않아 로그 패턴 매칭만 사용합니다",
|
|
2363
|
+
"wf_spring_deploy.simple_log_match_start": "📋 로그 패턴 매칭 시작: '{pattern}'",
|
|
2364
|
+
"wf_spring_deploy.simple_log_match_ok": "✅ 로그 패턴 매칭 성공: 애플리케이션이 정상적으로 시작되었습니다",
|
|
2365
|
+
"wf_spring_deploy.simple_log_match_fail": "❌ 로그 패턴 매칭 실패: 애플리케이션 시작 로그를 찾을 수 없습니다",
|
|
2366
|
+
"wf_spring_deploy.simple_debug_header": "📋 디버깅 정보:",
|
|
2367
|
+
"wf_spring_deploy.simple_debug_pattern": " - 검색 패턴: {pattern}",
|
|
2368
|
+
"wf_spring_deploy.simple_debug_container": " - 컨테이너: {name}",
|
|
2369
|
+
"wf_spring_deploy.simple_debug_image": " - 이미지: {image}",
|
|
2370
|
+
"wf_spring_deploy.simple_debug_port": " - 포트: {port}",
|
|
2371
|
+
"wf_spring_deploy.simple_debug_volume": " - 볼륨: {volume}",
|
|
2372
|
+
"wf_spring_deploy.simple_debug_profile": " - 프로파일: {profile}",
|
|
2373
|
+
"wf_spring_deploy.simple_logs_tail": "📋 컨테이너 로그 (최근 50줄):",
|
|
2374
|
+
"wf_spring_deploy.simple_hc_done": "✅ 헬스체크 완료: 컨테이너 {name} 이(가) 정상적으로 실행 중입니다",
|
|
2375
|
+
"wf_spring_deploy.simple_deploy_done": "✅ 배포가 성공적으로 완료되었습니다!",
|
|
2376
|
+
"wf_spring_deploy.simple_summary_header": "📋 배포 결과 요약:",
|
|
2377
|
+
"wf_spring_deploy.simple_summary_project": " 🎯 프로젝트: {name}",
|
|
2378
|
+
"wf_spring_deploy.simple_summary_branch": " 🌿 브랜치: {branch}",
|
|
2379
|
+
"wf_spring_deploy.simple_summary_container": " 🐳 컨테이너: {name}",
|
|
2380
|
+
"wf_spring_deploy.simple_summary_port": " 🌐 포트: {port}",
|
|
2381
|
+
"wf_spring_deploy.simple_summary_time": " ⏰ 배포 시간: {time}",
|
|
2382
|
+
"wf_spring_deploy.simple_access_url": "🔗 접속 URL: {url}",
|
|
2383
|
+
"wf_spring_deploy.nginx_deploy_start": "🚀 Nginx Blue-Green 무중단 배포 시작",
|
|
2384
|
+
"wf_spring_deploy.nginx_backup_dir": "📁 nginx 백업 디렉토리 생성: {dir}",
|
|
2385
|
+
"wf_spring_deploy.nginx_backup_file": "💾 nginx config 백업: {file}",
|
|
2386
|
+
"wf_spring_deploy.nginx_find_active": "🔍 nginx config 의 현재 활성 포트 탐색",
|
|
2387
|
+
"wf_spring_deploy.nginx_active_missing": "⚠️ 활성 포트를 찾지 못함 → 기본값(BLUE={blue})을 활성으로 간주",
|
|
2388
|
+
"wf_spring_deploy.nginx_active_port": "🎨 현재 활성 포트: {port}",
|
|
2389
|
+
"wf_spring_deploy.nginx_new_deploy": "🐳 신규 배포 → 포트={port} 컨테이너={name}",
|
|
2390
|
+
"wf_spring_deploy.nginx_old_container": "🗑️ 이전 컨테이너 (제거 예정) = {name}",
|
|
2391
|
+
"wf_spring_deploy.nginx_new_container_start": "🐳 새 컨테이너 기동: {name} (포트 {port})",
|
|
2392
|
+
"wf_spring_deploy.nginx_hc_start": "⏳ 헬스체크 시작 (최대 {retries}회 × {interval}초)",
|
|
2393
|
+
"wf_spring_deploy.nginx_hc_ok": "✅ 헬스체크 성공 (시도 {i})",
|
|
2394
|
+
"wf_spring_deploy.nginx_hc_progress": "⏳ 헬스체크 진행중... ({i}/{max})",
|
|
2395
|
+
"wf_spring_deploy.nginx_hc_fail": "❌ 헬스체크 실패 → 배포 중단",
|
|
2396
|
+
"wf_spring_deploy.nginx_new_cleanup": "🗑️ 신규 컨테이너 정리: {name}",
|
|
2397
|
+
"wf_spring_deploy.nginx_toggle": "🔧 nginx config 포트 토글: {old} → {new}",
|
|
2398
|
+
"wf_spring_deploy.nginx_apply": "🔧 nginx 설정 적용 및 검증",
|
|
2399
|
+
"wf_spring_deploy.nginx_test_fail": "❌ nginx 설정 검증 실패 → 백업 파일로 복구",
|
|
2400
|
+
"wf_spring_deploy.nginx_test_ok": "✅ nginx 설정 검증 성공",
|
|
2401
|
+
"wf_spring_deploy.nginx_reload_fail": "⚠️ reload 실패 → restart 시도",
|
|
2402
|
+
"wf_spring_deploy.nginx_restart_fail": "❌ nginx reload/restart 실패 → 백업 복구",
|
|
2403
|
+
"wf_spring_deploy.nginx_domain_check": "🌐 도메인 접근 검증 ({domain})",
|
|
2404
|
+
"wf_spring_deploy.nginx_domain_ok": "✅ 도메인 접근 검증 성공 (시도 {i})",
|
|
2405
|
+
"wf_spring_deploy.nginx_domain_progress": "⏳ 도메인 접근 검증 중... ({i}/{max})",
|
|
2406
|
+
"wf_spring_deploy.nginx_domain_fail": "⚠️ 도메인 접근 검증 실패: 배포 진행 (DNS 전파 지연 가능성)",
|
|
2407
|
+
"wf_spring_deploy.nginx_backup_keep": "🧹 백업 파일 최신 {keep}개 보존",
|
|
2408
|
+
"wf_spring_deploy.nginx_done": "✅ 무중단 배포 완료. active={name} (포트 {port})",
|
|
2409
|
+
"wf_spring_deploy.traefik_deploy_start": "🚀 Blue-Green 무중단 배포 시작",
|
|
2410
|
+
"wf_spring_deploy.traefik_entry": "🔧 Traefik 진입: localhost:{port} (entrypoint={entrypoint})",
|
|
2411
|
+
"wf_spring_deploy.traefik_extra_network": "🔗 추가 네트워크 연결: {net}",
|
|
2412
|
+
"wf_spring_deploy.traefik_labels": "🔍 Traefik 라벨 확인:",
|
|
2413
|
+
"wf_spring_deploy.traefik_hc_start": "⏳ 헬스체크 시작 (최대 {max_wait}초, {retries}회 × {interval}초)",
|
|
2414
|
+
"wf_spring_deploy.traefik_exited": "❌ 컨테이너 비정상 종료 (exited). 로그 200줄:",
|
|
2415
|
+
"wf_spring_deploy.traefik_kept": "ℹ️ 컨테이너 {name} 유지 (자동 삭제 안 함) — 수동 검증/디버깅",
|
|
2416
|
+
"wf_spring_deploy.traefik_rollback_note": "ℹ️ old={name} 존재 시 그대로 유지 → 사실상 자동 롤백",
|
|
2417
|
+
"wf_spring_deploy.traefik_hc_pass": "✅ 헬스체크 통과 ({n}/{max}) HTTP={code}",
|
|
2418
|
+
"wf_spring_deploy.traefik_waiting": "⏳ 대기 ({n}/{max}) status={status} http={http}",
|
|
2419
|
+
"wf_spring_deploy.traefik_hc_timeout": "❌ 헬스체크 타임아웃 ({sec}초)",
|
|
2420
|
+
"wf_spring_deploy.traefik_logs_header": "🔍 {name} 최근 200줄 로그:",
|
|
2421
|
+
"wf_spring_deploy.traefik_done": "✅ 무중단 배포 완료. active={name}",
|
|
2422
|
+
# --- wf_version ---
|
|
2423
|
+
"wf_version.release_publish_triggered": "RELEASE-PUBLISH workflow_dispatch 트리거 요청 완료 (WORKFLOW_PAT 없이도 동작, 이슈 #61 드리프트 자동 복구)",
|
|
2424
|
+
"wf_version.backmerge_conflict": "{prod}을 {dev}에 자동 병합하지 못했습니다 (충돌). 다음 릴리스 PR 전에 직접 병합하세요: {manual}",
|
|
2425
|
+
"wf_version.backmerge_push_failed": "{dev}에 push하지 못했습니다 (브랜치 보호 등). 다음 릴리스 PR 전에 직접 병합하세요: {manual}",
|
|
2426
|
+
# --- version_manager ---
|
|
2427
|
+
"version_manager.err_yml_missing": "오류: version.yml을 찾을 수 없습니다",
|
|
2428
|
+
"version_manager.warn_code_missing": "경고: version_code 필드가 없어 기본값 1을 추가합니다",
|
|
2429
|
+
"version_manager.warn_code_regress": "경고: version_code {new_code}이(가) 현재 값 {current}보다 낮습니다 — 그대로 기록합니다 (역행 여부 확인 필요)",
|
|
2430
|
+
"version_manager.warn_version_missing": "경고: version.yml에 version 필드가 없어 추가합니다",
|
|
2431
|
+
"version_manager.warn_spring_no_version": "경고: spring: {pom}에 프로젝트 <version>이 없습니다 (부모에서 상속?) — 건너뜁니다",
|
|
2432
|
+
"version_manager.warn_spring_property": "경고: spring: {pom}의 <version>이 속성값({version})입니다 — 건너뜁니다",
|
|
2433
|
+
"version_manager.updated": "수정됨: {path}",
|
|
2434
|
+
"version_manager.warn_spring_no_files": "경고: spring: {dir} 아래에서 build.gradle(.kts)나 pom.xml을 찾지 못했습니다 — 건너뜁니다",
|
|
2435
|
+
"version_manager.warn_spring_no_gradle_line": "경고: spring: {file}에 `version = '...'` 줄이 없습니다 — 건너뜁니다",
|
|
2436
|
+
"version_manager.pubspec_ahead": "pubspec.yaml 빌드 번호 {build}이(가) version_code {code}보다 앞서 있어 그 값을 사용합니다",
|
|
2437
|
+
"version_manager.warn_flutter_missing": "경고: flutter: {target}을(를) 찾을 수 없습니다 — 건너뜁니다",
|
|
2438
|
+
"version_manager.warn_target_missing": "경고: {target}을(를) 찾을 수 없습니다 — 건너뜁니다",
|
|
2439
|
+
"version_manager.warn_python_no_version": "경고: python: {dir} 아래의 pyproject.toml [project]/[tool.poetry]나 setup.py에 버전이 없습니다 — 건너뜁니다",
|
|
2440
|
+
"version_manager.skipped_plist": "건너뜀: {file} — CFBundleShortVersionString이 빌드 변수를 참조합니다",
|
|
2441
|
+
"version_manager.warn_rn_ios_missing": "경고: react-native: {dir}을(를) 찾을 수 없습니다 — 건너뜁니다",
|
|
2442
|
+
"version_manager.warn_rn_gradle_missing": "경고: react-native: {file}을(를) 찾을 수 없습니다 — 건너뜁니다",
|
|
2443
|
+
"version_manager.warn_rn_no_targets": "경고: react-native: {dir} 아래에서 대상 파일을 찾지 못했습니다",
|
|
2444
|
+
"version_manager.warn_unknown_type": "경고: 알 수 없는 프로젝트 타입: {type} — 건너뜁니다",
|
|
2445
|
+
"version_manager.err_type": "오류: {type}: {error}",
|
|
2446
|
+
"version_manager.readme_updated": "README.md 버전 줄 -> v{version}",
|
|
2447
|
+
"version_manager.warn_read_failed": "경고: {type} 프로젝트 파일을 읽지 못했습니다: {error}",
|
|
2448
|
+
"version_manager.sync_check": "버전 동기화 확인",
|
|
2449
|
+
"version_manager.sync_yml_version": " version.yml: {version}",
|
|
2450
|
+
"version_manager.sync_project_version": " 프로젝트 파일: {version}",
|
|
2451
|
+
"version_manager.sync_mismatch": "버전 불일치를 감지해 더 높은 버전으로 맞춥니다: {version}",
|
|
2452
|
+
"version_manager.warn_format_invalid": "경고: 버전 형식이 올바르지 않아 동기화할 수 없습니다",
|
|
2453
|
+
"version_manager.sync_multi": "멀티 타입 — 모든 타입 파일을 version.yml 버전({version})으로 맞춥니다",
|
|
2454
|
+
"version_manager.sync_ok": "이미 버전이 일치합니다: {version}",
|
|
2455
|
+
"version_manager.err_invalid_version": "오류: 올바르지 않은 버전 형식: {version}",
|
|
2456
|
+
"version_manager.err_invalid_version_xyz": "오류: 올바르지 않은 버전 형식: {version} (x.y.z 형식이어야 합니다)",
|
|
2457
|
+
"version_manager.err_generic": "오류: {error}",
|
|
2458
|
+
"version_manager.err_no_types_sync": "오류: version.yml에서 project_types를 읽을 수 없어 프로젝트 파일을 동기화할 수 없습니다",
|
|
2459
|
+
"version_manager.err_no_types_check": "오류: version.yml에서 project_types를 읽을 수 없어 버전을 동기화할 수 없습니다",
|
|
2460
|
+
"version_manager.err_write_failed": "version.yml에 버전 {version}을(를) 기록하지 못했습니다",
|
|
2461
|
+
"version_manager.err_not_json": "{target}이(가) 올바른 JSON이 아닙니다 ({error}) — 버전을 기록할 수 없습니다",
|
|
2462
|
+
"version_manager.err_sync_failed": "프로젝트 파일 동기화 실패: {types}",
|
|
2463
|
+
# --- changelog_engine ---
|
|
2464
|
+
"changelog.engine_bump_failed": "bump AI 보조 실패: {error}",
|
|
2465
|
+
"changelog.engine_bump_copilot_failed": "bump AI 보조(copilot) 실패: {error}",
|
|
2466
|
+
"changelog.engine_user_api_empty": "user-api 실패: 응답에 내용이 없습니다",
|
|
2467
|
+
"changelog.engine_user_api_failed": "user-api 실패: {error}",
|
|
2468
|
+
"changelog.engine_copilot_invalid": "copilot 실패: 응답이 비었거나 요청한 Markdown 형식이 아닙니다",
|
|
2469
|
+
"changelog.engine_copilot_failed": "copilot 실패: {error}",
|
|
2470
|
+
"changelog.engine_copilot_exit": "copilot이 종료 코드 {code}로 끝났습니다: {detail}",
|
|
2471
|
+
"changelog.output_write_failed": "출력 파일 쓰기 실패: {error}",
|
|
2472
|
+
# --- wf_common ---
|
|
2473
|
+
"wf_common.copilot_ai_option": "copilot_ai 옵션: {copilot_ai}",
|
|
2474
|
+
"wf_common.semver_auto_option": "semver_auto 옵션: {semver_auto}",
|
|
2475
|
+
"wf_common.bump_level": "승격 폭: {bump}",
|
|
2476
|
+
"wf_common.version_bump_failed": "버전 승격에 실패했습니다",
|
|
2477
|
+
"wf_common.no_changes": "커밋할 변경 사항이 없습니다",
|
|
2478
|
+
"wf_common.push_attempt": "push 시도 {retry_count}/{max_retries}...",
|
|
2479
|
+
"wf_common.push_failed_syncing": "push 실패, 원격과 동기화합니다...",
|
|
2480
|
+
"wf_common.rebase_ok": "rebase 성공, push를 다시 시도합니다...",
|
|
2481
|
+
"wf_common.rebase_failed": "rebase 실패, 충돌을 직접 해결해야 합니다",
|
|
2482
|
+
"wf_common.push_gave_up": "push가 {max_retries}회 시도 후에도 실패했습니다",
|
|
2483
|
+
# --- wf_aisum ---
|
|
2484
|
+
"wf_aisum.expected_version": "예상 다음 버전: {version} (현재: {current_version}, 모드: {mode}, 승격: {bump})",
|
|
2485
|
+
"wf_aisum.comment_update_failed": "댓글 수정 실패 — 계속 진행합니다 (이 워크플로우는 PR을 막지 않습니다)",
|
|
2486
|
+
"wf_aisum.comment_post_failed": "댓글 등록 실패 — 계속 진행합니다 (이 워크플로우는 PR을 막지 않습니다)",
|
|
2487
|
+
# --- wf_changelog ---
|
|
2488
|
+
"wf_changelog.pr_not_open": "PR #{pr_number}은(는) 이미 {state} 상태입니다 — 릴리스 파이프라인을 건너뜁니다",
|
|
2489
|
+
"wf_changelog.pr_state": "PR #{pr_number} 상태: {state}",
|
|
2490
|
+
"wf_changelog.commits_to_summarize": "요약할 커밋 수: {n}",
|
|
2491
|
+
"wf_changelog.version_raised": "확정 버전을 올렸습니다: {head_version} -> {new_version} ({main_branch} {main_version} 기준 {bump})",
|
|
2492
|
+
"wf_changelog.version_reuse_unreleased": "이미 확정됐고 아직 릴리스되지 않은 버전이라 {new_version}을(를) 재사용합니다 ({main_branch}는 {main_version})",
|
|
2493
|
+
"wf_changelog.version_reuse_previous": "이전 실행에서 이미 확정된 버전이라 {new_version}을(를) 재사용합니다 (다시 올리지 않음)",
|
|
2494
|
+
"wf_changelog.version_confirmed": "릴리스 버전 확정: {new_version} ({bump})",
|
|
2495
|
+
"wf_changelog.summary_engine": "요약 엔진: {engine_line}",
|
|
2496
|
+
"wf_changelog.comment_updated": "요약 댓글을 수정했습니다 (#{comment_id})",
|
|
2497
|
+
"wf_changelog.comment_update_failed": "댓글 수정 실패 — 계속 진행합니다 (이 워크플로우는 릴리스를 막지 않습니다)",
|
|
2498
|
+
"wf_changelog.comment_posted": "요약 댓글을 등록했습니다",
|
|
2499
|
+
"wf_changelog.comment_post_failed": "댓글 등록 실패 — 계속 진행합니다 (이 워크플로우는 릴리스를 막지 않습니다)",
|
|
2500
|
+
"wf_changelog.pr_closed_skip_docs": "PR이 이미 {pr_state} 상태입니다 — 릴리스 문서를 push하지 않습니다",
|
|
2501
|
+
"wf_changelog.docs_pushed": "릴리스 문서를 {head_branch}에 push했습니다",
|
|
2502
|
+
"wf_changelog.pr_already_merged": "PR #{pr_number}은(는) 이미 병합되었습니다",
|
|
2503
|
+
"wf_changelog.automerge_enabled": "automerge 활성화: {subject}",
|
|
2504
|
+
"wf_changelog.automerge_unavailable": "automerge를 쓸 수 없어 직접 병합했습니다: {subject}",
|
|
2505
|
+
"wf_changelog.merge_retry": "병합 시도 {attempt}/{max_attempts} 실패 — {wait}초 후 다시 시도합니다",
|
|
2506
|
+
"wf_changelog.merge_gave_up": "PR 병합이 {max_attempts}회 시도 후에도 실패했습니다 (allow_merge_commit={allow_merge_commit}) — 브랜치 보호 규칙, 필수 체크, 토큰 권한을 확인하세요",
|
|
2507
|
+
# --- wf_readme ---
|
|
2508
|
+
"wf_readme.not_found": "README.md가 없습니다 — 수정할 것이 없어 건너뜁니다",
|
|
2509
|
+
"wf_readme.read_version_failed": "현재 버전을 읽지 못했습니다",
|
|
2510
|
+
"wf_readme.update_failed": "README.md 버전 수정에 실패했습니다",
|
|
2511
|
+
"wf_readme.err_type": " 오류 유형: {error_type}",
|
|
2512
|
+
"wf_readme.err_current_line": " 현재 버전 줄: {version_line}",
|
|
2513
|
+
"wf_readme.err_header": " 추출한 머리말: {header_part}",
|
|
2514
|
+
"wf_readme.err_new_text": " 새 버전 문구: {version_text}",
|
|
2515
|
+
"wf_readme.hint_formats": "README 버전 줄이 다음 중 하나와 같은 형식인지 확인하세요:",
|
|
2516
|
+
"wf_readme.hint_notes": "참고:",
|
|
2517
|
+
"wf_readme.hint_no_bold": " - 마크다운 굵게(**) 문자를 쓰지 마세요",
|
|
2518
|
+
"wf_readme.hint_no_regex": " - 정규식 특수문자(*, [, ], ^, $)를 쓰지 마세요",
|
|
2519
|
+
"wf_readme.hint_after_colon": " - 버전은 콜론(:) 바로 뒤에 와야 합니다",
|
|
2520
|
+
"wf_readme.text_with_date": "날짜 포함 버전 문구: {version_text}",
|
|
2521
|
+
"wf_readme.text": "버전 문구: {version_text}",
|
|
2522
|
+
"wf_readme.line_found": "버전 줄 발견: {version_line}",
|
|
2523
|
+
"wf_readme.line_inserting": "버전 줄이 없어 새로 추가합니다",
|
|
2524
|
+
"wf_readme.line_inserted": "기본 버전 줄을 추가했습니다: {version_text}",
|
|
2525
|
+
"wf_readme.warn_bold": "경고: 버전 줄에 마크다운 굵게(**) 문자가 들어 있습니다",
|
|
2526
|
+
"wf_readme.warn_current_line": " 현재 줄: {version_line}",
|
|
2527
|
+
"wf_readme.warn_may_break": " 버전 수정이 깨질 수 있습니다",
|
|
2528
|
+
"wf_readme.marker_added": "자동 갱신 표시 주석을 추가했습니다",
|
|
2529
|
+
"wf_readme.updated_line_detail": " 수정된 줄: {updated_line}",
|
|
2530
|
+
"wf_readme.line_updated": "버전 줄을 수정했습니다: {version_text}",
|
|
2531
|
+
"wf_readme.no_changes": "README.md에 변경 사항이 없습니다",
|
|
2532
|
+
"wf_readme.pushed": "README.md 버전 수정을 push했습니다",
|
|
2533
|
+
"wf_readme.err_no_colon": "머리말 추출 실패 - 콜론(:)을 찾을 수 없습니다",
|
|
2534
|
+
"wf_readme.err_sed": "sed 명령 실패 - {error}",
|
|
2535
|
+
"wf_readme.err_sed_unknown": "알 수 없는 sed 오류",
|
|
2536
|
+
"wf_readme.err_verify": "버전 교체 검증에 실패했습니다",
|
|
2537
|
+
# --- wf_release ---
|
|
2538
|
+
"wf_release.branch_mode": "브랜치 모드: {mode}",
|
|
2539
|
+
"wf_release.gate_open": "릴리스 게이트 열림 (mode={mode}, event={event})",
|
|
2540
|
+
"wf_release.gate_closed": "pr-flow 모드에서 릴리스 확정 push가 아니므로 건너뜁니다",
|
|
2541
|
+
"wf_release.drift_skipped": "드리프트 검사 건너뜀 (version.yml 버전이 없거나 아직 태그가 없음)",
|
|
2542
|
+
"wf_release.drift_error": "version.yml({file_version})이(가) 최신 태그({latest_tag})보다 앞서 있지만 릴리스가 발행되지 않았습니다 — 이 버전은 npm에 배포되지 않습니다. 복구: Actions → PROJECT-RELEASE-PUBLISH → Run workflow (workflow_dispatch는 이 게이트를 우회합니다).",
|
|
2543
|
+
"wf_release.drift_ok": "드리프트 검사 통과 (version.yml={file_version}, 최신 태그={latest_tag})",
|
|
2544
|
+
"wf_release.head_is_docs_commit": "HEAD가 이미 이 워크플로우의 릴리스 문서 커밋입니다 — 버전을 다시 올리지 않습니다 (재실행 안전)",
|
|
2545
|
+
"wf_release.collect_since": "{last_tag} 이후 커밋을 수집합니다",
|
|
2546
|
+
"wf_release.collect_all": "이전 태그가 없어 전체 히스토리를 수집합니다",
|
|
2547
|
+
"wf_release.release_version": "릴리스 버전: {new_version} ({bump})",
|
|
2548
|
+
"wf_release.docs_pushed": "릴리스 문서를 push했습니다",
|
|
2549
|
+
"wf_release.read_version_failed": "버전을 읽지 못했습니다",
|
|
2550
|
+
"wf_release.tag_exists": "태그 v{version}이(가) 이미 있어 태그 push를 건너뜁니다",
|
|
2551
|
+
"wf_release.release_exists": "릴리스 v{version}이(가) 이미 있어 발행할 것이 없습니다",
|
|
2552
|
+
"wf_release.publishing": "릴리스 v{version}을(를) 발행합니다",
|
|
2553
|
+
"wf_release.tag_pushed": "태그 v{version}을(를) push했습니다",
|
|
2554
|
+
"wf_release.notes_assembled": "릴리스 노트 작성 완료 ({n} 바이트)",
|
|
2555
|
+
"wf_release.published": "GitHub Release v{version}을(를) 발행했습니다",
|
|
2556
|
+
# --- wf_version ---
|
|
2557
|
+
"wf_version.trunk_skip": "trunk-based 모드입니다 — 버전 승격은 RELEASE-PUBLISH가 맡으므로 건너뜁니다",
|
|
2558
|
+
"wf_version.confirm_skip": "릴리스 확정 커밋(chore(release):)을 감지했습니다 — 안전망 버전 승격을 건너뜁니다",
|
|
2559
|
+
"wf_version.release_merge_skip": "릴리스 병합을 감지했습니다 (push에 version.yml 변경 포함) — 안전망 버전 승격을 건너뜁니다",
|
|
2560
|
+
"wf_version.direct_push": "{main_branch}에 직접 push를 감지했습니다 — 안전망 버전 승격을 실행합니다",
|
|
2561
|
+
"wf_version.read_current_failed": "현재 버전을 읽지 못했습니다",
|
|
2562
|
+
"wf_version.current_version": "현재 버전: {current_version}",
|
|
2563
|
+
"wf_version.new_version": "새 버전: {new_version}",
|
|
2564
|
+
"wf_version.project_types": "프로젝트 타입: {project_types}",
|
|
2565
|
+
"wf_version.yml_not_found": "version.yml을 찾을 수 없습니다",
|
|
2566
|
+
"wf_version.commits_since": "{last_tag} 이후 커밋: {n}개",
|
|
2567
|
+
"wf_version.no_changes_synced": "커밋할 변경 사항이 없습니다 (이미 동기화됨)",
|
|
2568
|
+
"wf_version.bump_pushed": "버전 승격 커밋을 push했습니다",
|
|
2569
|
+
"wf_version.commit_failed": "커밋에 실패했습니다",
|
|
2570
|
+
"wf_version.no_develop": "브랜치 {develop_branch}이(가) 없어 역병합할 것이 없습니다",
|
|
2571
|
+
"wf_version.already_contains": "{develop_branch}이(가) 이미 {main_branch}를 포함합니다",
|
|
2572
|
+
"wf_version.backmerged": "안전망 버전 승격 v{new_version}을(를) {develop_branch}에 병합했습니다",
|
|
2573
|
+
"wf_version.push_retry": "push 시도 {attempt} 실패 — 다시 시도합니다",
|
|
2574
|
+
"wf_version.finished": "version-control 워크플로우 종료",
|
|
2575
|
+
"wf_version.sum_skipped": " 건너뜀 (릴리스 병합 / trunk-based): {skip}",
|
|
2576
|
+
"wf_version.sum_previous": " 이전 버전: {current_version}",
|
|
2577
|
+
"wf_version.sum_new": " 새 버전: {new_version}",
|
|
2578
|
+
"wf_version.sum_branch": " 브랜치: {ref_name}",
|
|
2579
|
+
}
|
|
2580
|
+
|
|
2581
|
+
CATALOG = {"en": EN, "ko": KO}
|
|
2582
|
+
|
|
2583
|
+
|
|
2584
|
+
if __name__ == "__main__":
|
|
2585
|
+
sys.exit(main(sys.argv[1:]))
|