project-auto-wizard 0.14.0 → 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/package.json +1 -1
- package/payload/scripts/changelog_manager.py +8 -8
- package/payload/scripts/messages.py +306 -0
- package/payload/scripts/version_manager.py +46 -46
- package/payload/workflows/common/PROJECT-COMMON-AI-PR-SUMMARY.yaml +6 -4
- package/payload/workflows/common/PROJECT-COMMON-AUTO-CHANGELOG-CONTROL.yaml +47 -29
- package/payload/workflows/common/PROJECT-COMMON-README-VERSION-UPDATE.yaml +38 -35
- package/payload/workflows/common/PROJECT-COMMON-RELEASE-PUBLISH.yaml +36 -28
- package/payload/workflows/common/PROJECT-COMMON-VERSION-CONTROL.yaml +35 -28
- package/src/commands/doctor.js +5 -0
- package/src/commands/dry-run.js +1 -0
- package/src/core/copy/readme.js +58 -2
- package/src/i18n/catalog/en/commands.js +1 -0
- package/src/i18n/catalog/en/copy.js +1 -0
- package/src/i18n/catalog/ko/commands.js +1 -0
- package/src/i18n/catalog/ko/copy.js +1 -0
- package/src/index.js +4 -3
- package/src/ui/summary.js +1 -1
package/README.ja.md
CHANGED
|
@@ -49,6 +49,8 @@ npx project-auto-wizard --mode full --force --type node --dry-run # preview on
|
|
|
49
49
|
|
|
50
50
|
生成されたファイルをコミットして push してください。`npx project-auto-wizard --mode doctor` は、ワークフローが依存するリポジトリ設定を確認します。
|
|
51
51
|
|
|
52
|
+
メッセージの言語は英語または韓国語(`en` | `ko`)です。`--lang`、環境変数 `PROJECT_AUTO_WIZARD_LANG`、`version.yml` の `language` の順に優先されます。
|
|
53
|
+
|
|
52
54
|
## インストールされるもの
|
|
53
55
|
|
|
54
56
|
| インストール対象 | 用途 |
|
package/README.ko.md
CHANGED
|
@@ -49,6 +49,8 @@ npx project-auto-wizard --mode full --force --type node --dry-run # preview on
|
|
|
49
49
|
|
|
50
50
|
생성된 파일을 커밋하고 push하세요. `npx project-auto-wizard --mode doctor`는 워크플로우가 의존하는 레포 설정을 점검합니다.
|
|
51
51
|
|
|
52
|
+
메시지 언어는 영어 또는 한국어(`en` | `ko`)입니다. `--lang`, 환경변수 `PROJECT_AUTO_WIZARD_LANG`, `version.yml`의 `language` 순서로 우선 적용됩니다.
|
|
53
|
+
|
|
52
54
|
## 설치되는 것
|
|
53
55
|
|
|
54
56
|
| 설치 항목 | 용도 |
|
package/README.md
CHANGED
|
@@ -21,7 +21,7 @@ Everything it installs is plain GitHub Actions in your own repository. No API ke
|
|
|
21
21
|
</div>
|
|
22
22
|
|
|
23
23
|
<!-- AUTO-VERSION-SECTION: DO NOT EDIT MANUALLY -->
|
|
24
|
-
## Latest Version : v0.
|
|
24
|
+
## Latest Version : v0.15.0 (2026-09-30)
|
|
25
25
|
|
|
26
26
|
[Full release history](CHANGELOG.md)
|
|
27
27
|
|
|
@@ -50,6 +50,8 @@ npx project-auto-wizard --mode full --force --type node --dry-run # preview on
|
|
|
50
50
|
|
|
51
51
|
Commit the generated files and push. `npx project-auto-wizard --mode doctor` checks the repository settings the workflows depend on.
|
|
52
52
|
|
|
53
|
+
Messages are in English or Korean (`en` | `ko`). Pick one with `--lang`, the `PROJECT_AUTO_WIZARD_LANG` environment variable, or `language` in `version.yml`, in that order of precedence.
|
|
54
|
+
|
|
53
55
|
## What you get
|
|
54
56
|
|
|
55
57
|
| Installed | Purpose |
|
package/README.zh-CN.md
CHANGED
|
@@ -49,6 +49,8 @@ npx project-auto-wizard --mode full --force --type node --dry-run # preview on
|
|
|
49
49
|
|
|
50
50
|
提交生成的文件并 push。`npx project-auto-wizard --mode doctor` 会检查工作流所依赖的仓库设置。
|
|
51
51
|
|
|
52
|
+
消息语言为英语或韩语(`en` | `ko`)。可通过 `--lang`、环境变量 `PROJECT_AUTO_WIZARD_LANG` 或 `version.yml` 中的 `language` 指定,优先级依次降低。
|
|
53
|
+
|
|
52
54
|
## 安装内容
|
|
53
55
|
|
|
54
56
|
| 安装项 | 用途 |
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "project-auto-wizard",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.15.0",
|
|
4
4
|
"description": "One command DevOps: npx wizard that installs GitHub-native Release Automation (optional GitHub Copilot AI summaries) into any project",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -508,13 +508,13 @@ def _ai_assisted_minor_upgrade(unclassified_lines: list[str]) -> bool:
|
|
|
508
508
|
try:
|
|
509
509
|
return call_openai_compatible(base_url, api_key, model, prompt).strip() == 'MINOR'
|
|
510
510
|
except Exception as e:
|
|
511
|
-
_warn_engine_failure(
|
|
511
|
+
_warn_engine_failure("[warn] " + t("changelog.engine_bump_failed", error=e))
|
|
512
512
|
|
|
513
513
|
if _copilot_enabled():
|
|
514
514
|
try:
|
|
515
515
|
return call_copilot_cli(prompt).strip() == 'MINOR'
|
|
516
516
|
except Exception as e:
|
|
517
|
-
_warn_engine_failure(
|
|
517
|
+
_warn_engine_failure("[warn] " + t("changelog.engine_bump_copilot_failed", error=e))
|
|
518
518
|
return False
|
|
519
519
|
|
|
520
520
|
|
|
@@ -866,7 +866,7 @@ def call_copilot_cli(prompt: str) -> str:
|
|
|
866
866
|
capture_output=True, text=True, timeout=_COPILOT_TIMEOUT_SECONDS,
|
|
867
867
|
)
|
|
868
868
|
if result.returncode != 0:
|
|
869
|
-
raise RuntimeError(
|
|
869
|
+
raise RuntimeError(t("changelog.engine_copilot_exit", code=result.returncode, detail=result.stderr.strip()[:200]))
|
|
870
870
|
return result.stdout
|
|
871
871
|
|
|
872
872
|
|
|
@@ -961,9 +961,9 @@ def cmd_ai_summary(commits_file: str, version: str, output_path: str, pr_title:
|
|
|
961
961
|
summary_text = candidate
|
|
962
962
|
engine = "user-api"
|
|
963
963
|
else:
|
|
964
|
-
failures.append(_warn_engine_failure("[warn]
|
|
964
|
+
failures.append(_warn_engine_failure("[warn] " + t("changelog.engine_user_api_empty")))
|
|
965
965
|
except Exception as e:
|
|
966
|
-
failures.append(_warn_engine_failure(
|
|
966
|
+
failures.append(_warn_engine_failure("[warn] " + t("changelog.engine_user_api_failed", error=e)))
|
|
967
967
|
|
|
968
968
|
if summary_text is None and _copilot_enabled():
|
|
969
969
|
try:
|
|
@@ -972,9 +972,9 @@ def cmd_ai_summary(commits_file: str, version: str, output_path: str, pr_title:
|
|
|
972
972
|
summary_text = candidate
|
|
973
973
|
engine = "copilot"
|
|
974
974
|
else:
|
|
975
|
-
failures.append(_warn_engine_failure("[warn]
|
|
975
|
+
failures.append(_warn_engine_failure("[warn] " + t("changelog.engine_copilot_invalid")))
|
|
976
976
|
except Exception as e:
|
|
977
|
-
failures.append(_warn_engine_failure(
|
|
977
|
+
failures.append(_warn_engine_failure("[warn] " + t("changelog.engine_copilot_failed", error=e)))
|
|
978
978
|
|
|
979
979
|
if summary_text is None:
|
|
980
980
|
classified = classify_commits(commit_lines)
|
|
@@ -990,7 +990,7 @@ def cmd_ai_summary(commits_file: str, version: str, output_path: str, pr_title:
|
|
|
990
990
|
# rescue-print the summary text to stderr. Keep exit code 0
|
|
991
991
|
# (contract so the workflow pipeline is not cut).
|
|
992
992
|
write_ok = False
|
|
993
|
-
print(
|
|
993
|
+
print("[warn] " + t("changelog.output_write_failed", error=e), file=sys.stderr)
|
|
994
994
|
print(summary_text, file=sys.stderr)
|
|
995
995
|
|
|
996
996
|
result = {"ok": write_ok, "engine": engine, "output": output_path}
|
|
@@ -1212,6 +1212,159 @@ EN = {
|
|
|
1212
1212
|
"wf_version.release_publish_triggered": "RELEASE-PUBLISH workflow_dispatch trigger requested (works without WORKFLOW_PAT, recovers version drift automatically)",
|
|
1213
1213
|
"wf_version.backmerge_conflict": "Could not automatically merge {prod} into {dev} (conflict). Merge it manually before the next release PR: {manual}",
|
|
1214
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}",
|
|
1215
1368
|
}
|
|
1216
1369
|
|
|
1217
1370
|
KO = {
|
|
@@ -2270,6 +2423,159 @@ KO = {
|
|
|
2270
2423
|
"wf_version.release_publish_triggered": "RELEASE-PUBLISH workflow_dispatch 트리거 요청 완료 (WORKFLOW_PAT 없이도 동작, 이슈 #61 드리프트 자동 복구)",
|
|
2271
2424
|
"wf_version.backmerge_conflict": "{prod}을 {dev}에 자동 병합하지 못했습니다 (충돌). 다음 릴리스 PR 전에 직접 병합하세요: {manual}",
|
|
2272
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}",
|
|
2273
2579
|
}
|
|
2274
2580
|
|
|
2275
2581
|
CATALOG = {"en": EN, "ko": KO}
|