project-auto-wizard 0.13.2 → 0.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- 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 +296 -257
- package/payload/scripts/issue_helper.py +54 -50
- package/payload/scripts/messages.py +2279 -0
- package/payload/scripts/truncate_release_notes.py +7 -6
- package/payload/scripts/version_manager.py +64 -61
- package/payload/version.yml.template +2 -1
- package/payload/workflows/common/PROJECT-COMMON-AI-PR-SUMMARY.yaml +17 -12
- package/payload/workflows/common/PROJECT-COMMON-AUTO-CHANGELOG-CONTROL.yaml +59 -34
- package/payload/workflows/common/PROJECT-COMMON-ISSUE-HELPER.yaml +17 -15
- package/payload/workflows/common/PROJECT-COMMON-README-VERSION-UPDATE.yaml +17 -10
- package/payload/workflows/common/PROJECT-COMMON-RELEASE-PUBLISH.yaml +54 -44
- package/payload/workflows/common/PROJECT-COMMON-VERSION-CONTROL.yaml +24 -17
- 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 +85 -89
- package/src/commands/dry-run.js +63 -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 +45 -35
- 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 +187 -0
- package/src/i18n/catalog/en/copy.js +19 -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 +187 -0
- package/src/i18n/catalog/ko/copy.js +19 -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 +128 -94
- 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 +89 -88
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
// 한국어 메시지: core 영역 (2부).
|
|
2
|
+
export default {
|
|
3
|
+
"core.breakingCheck.confirm": "위 호환성 변경을 확인했고 계속 진행할까요?",
|
|
4
|
+
"core.breakingCheck.nonInteractive": "⚠️ CRITICAL 호환성 변경이 있습니다 — 비대화형 실행이라 계속 진행합니다. 위 내용을 꼭 확인하세요.",
|
|
5
|
+
"core.logger.error.nameExhausted": "로그 파일 이름이 모두 사용 중입니다: {base}",
|
|
6
|
+
"core.logger.warn.startFailed": "실행 로그를 시작하지 못했습니다: {message}",
|
|
7
|
+
"core.logger.warn.writeStopped": "실행 로그 기록을 중단합니다: {message}",
|
|
8
|
+
"core.logger.summary.title": "=== 요약 ===",
|
|
9
|
+
"core.removalExec.readmeSection": "README.md 버전 섹션",
|
|
10
|
+
"core.verify.eitherSep": " 또는 ",
|
|
11
|
+
"core.versionYml.error.templateRequired": "version.yml.template 원문이 필요합니다 (payload/version.yml.template 누락?)",
|
|
12
|
+
"core.versionYml.error.unknownPlaceholder": "version.yml.template에 알 수 없는 플레이스홀더: {{{name}}}",
|
|
13
|
+
"core.versionYml.pathsComment": "타입별 프로젝트 폴더 (레포 루트 기준 상대경로)",
|
|
14
|
+
"core.versionYml.deployComment": "마법사가 기억하는 배포 설정 (비민감 / 직접 수정 가능)",
|
|
15
|
+
};
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
// 한국어 메시지: ui 영역 (src/ui, src/commands/interactive*).
|
|
2
|
+
export default {
|
|
3
|
+
"ui.banner.compact": "{mode} 모드 (--force)",
|
|
4
|
+
"ui.status-cards.detect.title": "🔍 프로젝트를 살펴보는 중...",
|
|
5
|
+
"ui.status-cards.detect.foundWithMarker": "{marker} 발견 → {type} 감지",
|
|
6
|
+
"ui.status-cards.detect.found": "{type} 감지",
|
|
7
|
+
"ui.status-cards.detect.none": "마커 파일 없음 → {type} (직접 선택 가능)",
|
|
8
|
+
"ui.status-cards.detect.versionBranch": "버전: {version} · 브랜치: {branch}",
|
|
9
|
+
"ui.status-cards.card.title": "프로젝트 분석 결과",
|
|
10
|
+
"ui.status-cards.card.labelWidth": "10",
|
|
11
|
+
"ui.status-cards.card.typeMulti": "타입(멀티)",
|
|
12
|
+
"ui.status-cards.card.type": "타입",
|
|
13
|
+
"ui.status-cards.card.version": "버전",
|
|
14
|
+
"ui.status-cards.card.branch": "브랜치",
|
|
15
|
+
"ui.status-cards.card.mode": "통합 모드",
|
|
16
|
+
"ui.status-cards.card.envMode": "환경변수",
|
|
17
|
+
"ui.status-cards.card.stores": "스토어",
|
|
18
|
+
"ui.status-cards.card.none": "없음",
|
|
19
|
+
"ui.status-cards.card.deployMode": "배포모드",
|
|
20
|
+
"ui.status-cards.card.on": "켜짐",
|
|
21
|
+
"ui.status-cards.card.off": "꺼짐",
|
|
22
|
+
"ui.status-cards.card.autoBump": "자동승격",
|
|
23
|
+
"ui.status-cards.card.paths": "경로",
|
|
24
|
+
"ui.status-cards.kind.update": "{title} — 템플릿 {from} → {to}",
|
|
25
|
+
"ui.status-cards.kind.updateTitle": "업데이트",
|
|
26
|
+
"ui.status-cards.kind.fresh": "{title} — 이 프로젝트에 처음 설치합니다 (템플릿 {version})",
|
|
27
|
+
"ui.status-cards.kind.freshTitle": "신규 통합",
|
|
28
|
+
"ui.summary.features.title": "통합된 기능:",
|
|
29
|
+
"ui.summary.features.versionSystem": " ✅ 버전 관리 시스템 (version.yml)",
|
|
30
|
+
"ui.summary.features.readmeAuto": " ✅ README.md 자동 버전 업데이트",
|
|
31
|
+
"ui.summary.features.workflows": " ✅ GitHub Actions 워크플로우 (릴리스 자동화 포함)",
|
|
32
|
+
"ui.summary.features.gitignore": " ✅ .gitignore 백업 파일 제외 항목 (*.bak/*.template.yaml)",
|
|
33
|
+
"ui.summary.branches.title": "브랜치 구성:",
|
|
34
|
+
"ui.summary.branches.trunk": " 🌿 {main} 단일 브랜치 (trunk-based) — RELEASE-PUBLISH 하나가 버전확정→체인지로그→tag→Release를 순차 처리",
|
|
35
|
+
"ui.summary.branches.prFlow": " 🌿 개발 {develop} → 릴리스 {main} (pr-flow) — 릴리스 PR에서 버전확정·체인지로그·automerge",
|
|
36
|
+
"ui.summary.branches.developMissing": " ⚠️ '{develop}' 브랜치가 아직 원격에 없습니다 — 만들기 전에는 개발 브랜치 워크플로우가 동작하지 않습니다",
|
|
37
|
+
"ui.summary.branches.developHint": " → 설치 파일을 커밋해 {main}을 push한 뒤: git push origin {main}:{develop}",
|
|
38
|
+
"ui.summary.engine.title": "릴리스 노트 요약 엔진:",
|
|
39
|
+
"ui.summary.engine.chain": " 🤖 AI_API_KEY(선택) → Copilot(선택·AI Credits 소비, 기본 꺼짐) → 규칙 fallback — 릴리스는 절대 막히지 않음",
|
|
40
|
+
"ui.summary.files.title": "추가된 파일:",
|
|
41
|
+
"ui.summary.files.versionYml": " 📄 version.yml (버전: {version}, 타입: {types})",
|
|
42
|
+
"ui.summary.files.buildNumber": " 빌드 번호: {code}",
|
|
43
|
+
"ui.summary.files.readmeAdded": " 📝 README.md (버전 섹션 추가)",
|
|
44
|
+
"ui.summary.files.readmeMissing": " ℹ️ README.md가 없어 버전 섹션을 추가하지 않았습니다",
|
|
45
|
+
"ui.summary.files.readmeMissingHint": " → README.md를 만든 뒤 다시 실행하면 추가됩니다 (그 전까지 README 버전 갱신 워크플로우는 건너뜁니다)",
|
|
46
|
+
"ui.summary.workflows.title": "추가된 워크플로우:",
|
|
47
|
+
"ui.summary.workflows.installed": " 📦 새로 설치됨 ({count}개):",
|
|
48
|
+
"ui.summary.workflows.updated": " 🔄 업데이트됨 ({count}개, 수정하지 않은 파일을 최신으로 교체):",
|
|
49
|
+
"ui.summary.scripts.overwritten": "(기존 파일을 새 버전으로 덮어씀)",
|
|
50
|
+
"ui.summary.answers.title": " ⚙️ 적용된 환경설정:",
|
|
51
|
+
"ui.summary.answers.default": " (기본값)",
|
|
52
|
+
"ui.summary.cleanup.previousDeploy": "이전 배포 방식 정리",
|
|
53
|
+
"ui.summary.cleanup.deselectedStores": "선택 해제한 스토어 배포 정리",
|
|
54
|
+
"ui.summary.cleanup.removed": "삭제 (손대지 않은 파일)",
|
|
55
|
+
"ui.summary.cleanup.backedUp": "수정하신 내용이 있어 백업",
|
|
56
|
+
"ui.summary.flutterApp.title": " 📱 Flutter 스토어 배포 파일:",
|
|
57
|
+
"ui.summary.flutterApp.created": "새로 생성",
|
|
58
|
+
"ui.summary.flutterApp.kept": "기존 파일 유지",
|
|
59
|
+
"ui.summary.flutterApp.plistHint": " → ExportOptions.plist의 __TEAM_ID__ · __BUNDLE_ID__ · __PROVISIONING_PROFILE_NAME__ 을 실제 값으로 채워야 iOS 배포가 동작합니다",
|
|
60
|
+
"ui.summary.log.path": " 📋 실행 로그: {path}",
|
|
61
|
+
"ui.summary.log.hint": " → 무엇을 어떤 값으로 설치했는지 시간순으로 남아 있습니다 (git에 올라가지 않습니다)",
|
|
62
|
+
"ui.summary.legacyLogs": " ℹ️ 이전 버전의 설치 기록(.md)이 git에 추적 중입니다:",
|
|
63
|
+
"ui.summary.spring.title": " 💡 Spring 프로젝트 추가 설정:",
|
|
64
|
+
"ui.summary.spring.sync": " • build.gradle / build.gradle.kts / pom.xml 의 버전 정보가 자동 동기화됩니다",
|
|
65
|
+
"ui.summary.todo.title": "⚠️ 다음 작업을 확인해주세요:",
|
|
66
|
+
"ui.summary.todo.unresolved": "값이 채워지지 않은 항목이 있습니다 — 직접 채워야 동작합니다",
|
|
67
|
+
"ui.summary.title": "✨ project-auto-wizard 설치 완료!",
|
|
68
|
+
"ui.summary.todo.patPath": " → 레포지토리 Settings > Secrets > Actions",
|
|
69
|
+
"ui.summary.todo.patName": " → Secret 이름: WORKFLOW_PAT (권한: repo, workflow)",
|
|
70
|
+
"ui.summary.todo.secrets": "아래 GitHub Secret을 등록해야 배포 워크플로우가 동작합니다 ({count}개)",
|
|
71
|
+
"ui.summary.todo.secretsPath": " → Settings > Secrets and variables > Actions",
|
|
72
|
+
"ui.summary.todo.either": " (둘 중 하나)",
|
|
73
|
+
"ui.summary.todo.optionalSecrets": "선택 Secret (없어도 동작합니다 — 필요할 때 등록, {count}개)",
|
|
74
|
+
"ui.summary.todo.commit": "설치된 파일을 커밋해 {main}에 push하세요",
|
|
75
|
+
"ui.summary.todo.commitDevelop": " → {develop}에도 같은 파일이 있어야 합니다 — 한쪽에 커밋한 뒤 다른 쪽에 병합하세요",
|
|
76
|
+
"ui.summary.todo.commitExample": " 예) git checkout {develop} && git merge {main} && git push",
|
|
77
|
+
"ui.summary.todo.changelogLink": " → README의 '전체 버전 기록 보기'(CHANGELOG.md) 링크는 첫 릴리스에서 CHANGELOG가 생성된 뒤부터 열립니다",
|
|
78
|
+
"ui.summary.todo.pat": "릴리스 automerge용 PAT (선택 — 없으면 GITHUB_TOKEN 폴백으로 자동 진행)",
|
|
79
|
+
"ui.summary.todo.patAccount": " → 등록 시 개인 계정이 아닌 조직 bot/machine 계정으로 발급하세요",
|
|
80
|
+
"ui.summary.todo.patOptional": " → 없어도 태그·Release 발행과 배포 워크플로우 실행까지 자동으로 이어지며, 있으면 조금 더 빠릅니다",
|
|
81
|
+
"ui.summary.todo.permissions": "GitHub Actions 권한 (변경 불필요)",
|
|
82
|
+
"ui.summary.todo.permissionsRead": " → Workflow permissions가 기본값 Read여도 설치된 워크플로우는 그대로 동작합니다",
|
|
83
|
+
"ui.summary.todo.permissionsWrite": " → 직접 추가한 워크플로우가 permissions 선언 없이 쓰기 작업을 할 때만 Read and write로 올리세요",
|
|
84
|
+
"ui.summary.footer": "📖 워크플로우 구성과 릴리스 흐름은 README를 참고하세요.",
|
|
85
|
+
"ui.env-plan.card.example": " 예) {example}",
|
|
86
|
+
"ui.env-plan.card.default": " 기본값: {value}",
|
|
87
|
+
"ui.env-plan.validate.port": "1~65535 사이의 숫자로 입력하세요.",
|
|
88
|
+
"ui.env-plan.validate.sshAuth": "password 또는 key 중 하나로 입력하세요.",
|
|
89
|
+
"ui.env-plan.validate.javaVersion": "JDK 버전 숫자로 입력하세요 (예: 21, 17).",
|
|
90
|
+
"ui.env-plan.each.intro": " 값을 입력하세요. 그대로 두려면 아무것도 입력하지 말고 Enter를 누르면 기본값이 적용됩니다.",
|
|
91
|
+
"ui.env-plan.each.enable": "↳ {label} — 활성화할까요?",
|
|
92
|
+
"ui.env-plan.each.input": "↳ 값 입력 (Enter=기본값 «{def}» 유지):",
|
|
93
|
+
"ui.env-plan.each.invalid": " ⚠️ '{input}' — {problem}",
|
|
94
|
+
"ui.env-plan.each.result": " → {label} = {input}",
|
|
95
|
+
"ui.env-plan.intro.title": "▶ 워크플로우 환경설정을 채웁니다",
|
|
96
|
+
"ui.env-plan.intro.line1": " 설치되는 워크플로우가 사용할 값입니다. 항목마다 '무엇에 쓰이는지·설명·예시'와",
|
|
97
|
+
"ui.env-plan.intro.line2": " 기본값을 함께 보여드립니다. 그대로 둬도 되고, 원하는 것만 바꿀 수 있습니다.",
|
|
98
|
+
"ui.env-plan.intro.rule": " ─────────────────────────────────────────────",
|
|
99
|
+
"ui.env-plan.choice.message": "어떻게 채울까요?",
|
|
100
|
+
"ui.env-plan.choice.all": "① 위 기본값 그대로 전부 설치 (입력 없이 바로 진행)",
|
|
101
|
+
"ui.env-plan.choice.each": "② 하나씩 직접 입력 (모든 항목을 순서대로)",
|
|
102
|
+
"ui.env-plan.choice.some": "③ 몇 개만 골라서 바꾸기 (고른 것만 입력 · 나머지는 기본값)",
|
|
103
|
+
"ui.env-plan.some.option": "{label} (기본: {def})",
|
|
104
|
+
"ui.env-plan.some.message": "바꿀 항목을 고르세요 (Space로 선택 · Enter로 확정)",
|
|
105
|
+
"ui.readline-engine.aborted": "사용자가 중단했습니다.",
|
|
106
|
+
"ui.readline-engine.footer.select": "└ ↑/↓ 이동 · Enter 확정 · ESC 취소",
|
|
107
|
+
"ui.readline-engine.footer.multiselect": "└ ↑/↓ 이동 · Space 토글 · Enter 확정 · ESC 취소",
|
|
108
|
+
"ui.readline-engine.footer.confirm": "└ ←/→ 또는 y/n · Enter 확정 · ESC 취소",
|
|
109
|
+
"ui.readline-engine.warn.disabled": "선택할 수 없는 항목입니다.",
|
|
110
|
+
"ui.readline-engine.warn.required": "최소 1개 이상 선택하세요.",
|
|
111
|
+
"ui.readline-engine.none": "(없음)",
|
|
112
|
+
"ui.readline-engine.yes": "예",
|
|
113
|
+
"ui.readline-engine.no": "아니오",
|
|
114
|
+
"ui.readline-engine.cancelled": "취소했습니다.",
|
|
115
|
+
"ui.prompts.mode.messageAgain": "다음으로 무엇을 할까요?",
|
|
116
|
+
"ui.prompts.mode.message": "무엇을 설치할까요?",
|
|
117
|
+
"ui.prompts.mode.full": "설치 / 업데이트 — 버전관리 + 자동화 워크플로우 (처음이라면 추천)",
|
|
118
|
+
"ui.prompts.mode.uninstall": "완전 삭제 — 마법사가 설치·수정한 모든 항목 제거(확인 후, README·gitignore·version.yml 포함)",
|
|
119
|
+
"ui.prompts.mode.status": "설치 상태 확인 — 읽기 전용, 버전·타입·드리프트 확인",
|
|
120
|
+
"ui.prompts.mode.doctor": "환경 진단 — 읽기 전용, gh CLI·권한·secret 설정 점검",
|
|
121
|
+
"ui.prompts.confirm.message": "이 정보로 진행할까요?",
|
|
122
|
+
"ui.prompts.confirm.continue": "예, 계속 진행",
|
|
123
|
+
"ui.prompts.confirm.edit": "수정하기",
|
|
124
|
+
"ui.prompts.confirm.cancel": "아니오, 취소",
|
|
125
|
+
"ui.prompts.edit.type": "프로젝트 타입",
|
|
126
|
+
"ui.prompts.edit.version": "버전",
|
|
127
|
+
"ui.prompts.edit.branch": "기본 브랜치",
|
|
128
|
+
"ui.prompts.edit.semverAuto": "자동 버전 승격",
|
|
129
|
+
"ui.prompts.edit.copilotAi": "Copilot AI 요약",
|
|
130
|
+
"ui.prompts.edit.envMode": "환경변수 방식",
|
|
131
|
+
"ui.prompts.edit.flutterStore": "스토어 배포 대상",
|
|
132
|
+
"ui.prompts.edit.deployMode": "배포 모드",
|
|
133
|
+
"ui.prompts.edit.done": "모두 맞음, 계속",
|
|
134
|
+
"ui.prompts.edit.message": "어떤 항목을 수정할까요?",
|
|
135
|
+
"ui.prompts.types.select": "프로젝트 타입을 선택하세요 (Space 토글, Enter 확정)",
|
|
136
|
+
"ui.prompts.types.confirmNote": "선택한 타입에 따라 설치되는 CI/CD 워크플로우와 버전 동기화 대상 파일이 달라집니다.\n감지 결과가 맞으면 그대로 Enter를 누르세요.",
|
|
137
|
+
"ui.prompts.types.confirmTitle": "프로젝트 타입 확정",
|
|
138
|
+
"ui.prompts.types.confirmMessage": "이 프로젝트의 타입입니다 (Space 토글, Enter 확정)",
|
|
139
|
+
"ui.prompts.types.withMarker": "{type} — {marker} 발견",
|
|
140
|
+
"ui.prompts.deployStyle.note": "서버 배포 워크플로우는 서로 대체재입니다 (Nginx와 Traefik을 동시에 쓰지 않습니다).\n고른 방식만 설치하고 자동 실행(push 트리거)까지 켭니다. PR 프리뷰는 배포 방식과 함께 설치되고,\n\"서버 배포 안 함\"을 고르면 모든 타입에서 CD와 PR 프리뷰를 함께 제외합니다.\n무중단 배포는 spring에만 있습니다 — 다른 타입(python·go·react·next)은 단일 서버 배포로 설치됩니다.",
|
|
141
|
+
"ui.prompts.deployStyle.title": "배포 방식",
|
|
142
|
+
"ui.prompts.deployStyle.message": "서버 배포는 어떤 방식으로 할까요?",
|
|
143
|
+
"ui.prompts.deployStyle.none": "서버 배포 안 함 — CD·PR 프리뷰 워크플로우와 배포 설정을 생성하지 않음",
|
|
144
|
+
"ui.prompts.envMode.label.dart-define": "dart-define (신규 설치 기본) — 시크릿을 --dart-define-from-file로 빌드에 전달, 프로젝트에 .env를 만들지 않음",
|
|
145
|
+
"ui.prompts.envMode.label.dotenv": "dotenv — Flutter 루트에 .env를 만들어 flutter_dotenv·envied가 읽음 (기존 설치 유지값)",
|
|
146
|
+
"ui.prompts.stores.label.android": "Android — Google Play Store (fastlane)",
|
|
147
|
+
"ui.prompts.stores.label.ios": "iOS — TestFlight / App Store Connect (fastlane)",
|
|
148
|
+
"ui.prompts.deployMode.label.android.store_only": "store_only — internal 트랙에 업로드 (기본)",
|
|
149
|
+
"ui.prompts.deployMode.label.android.store_prepare": "store_prepare — production 트랙에 draft로 업로드 (Play Console에서 직접 출시)",
|
|
150
|
+
"ui.prompts.deployMode.label.android.store_submit": "store_submit — production 심사 제출까지",
|
|
151
|
+
"ui.prompts.deployMode.label.ios.store_only": "store_only — TestFlight 업로드 (기본)",
|
|
152
|
+
"ui.prompts.deployMode.label.ios.store_prepare": "store_prepare — 앱 버전·메타데이터 준비까지 (심사 제출 안 함)",
|
|
153
|
+
"ui.prompts.deployMode.label.ios.store_submit": "store_submit — 심사 제출까지",
|
|
154
|
+
"ui.prompts.deployMode.platform.android": "Android (Play Store)",
|
|
155
|
+
"ui.prompts.deployMode.platform.ios": "iOS (TestFlight)",
|
|
156
|
+
"ui.prompts.deployMode.message": "{platform} 배포 모드를 선택하세요",
|
|
157
|
+
"ui.prompts.envMode.note": "시크릿 ENV_FILE(.env 형식)을 Flutter 빌드에 넘기는 방식입니다.\ndart-define은 String.fromEnvironment로 읽고, dotenv는 flutter_dotenv·envied가 .env 파일을 읽습니다.\n나중에 확인 화면의 '수정하기 > 환경변수 방식'에서 바꿀 수 있습니다.",
|
|
158
|
+
"ui.prompts.envMode.title": "환경변수 방식",
|
|
159
|
+
"ui.prompts.envMode.message": "Flutter 환경변수는 어떤 방식으로 넘길까요?",
|
|
160
|
+
"ui.prompts.stores.note": "고른 플랫폼의 스토어 배포 워크플로우와 fastlane 파일(Fastfile 등)만 설치합니다.\n아무것도 고르지 않으면 스토어 배포 없이 설치합니다 (Firebase·Selfhosted·Test APK·CI는 항상 설치).",
|
|
161
|
+
"ui.prompts.stores.title": "스토어 배포 대상",
|
|
162
|
+
"ui.prompts.stores.message": "스토어에 배포할 플랫폼을 선택하세요 (Space 토글, Enter 확정)",
|
|
163
|
+
"ui.prompts.branch.note": "pr-flow는 develop에서 작업해 main으로 PR을 올리는 팀 협업 흐름입니다.\ntrunk-based는 브랜치를 하나만 두고 그 브랜치에서 바로 작업하는 단순한 흐름입니다.",
|
|
164
|
+
"ui.prompts.branch.title": "브랜치 전략",
|
|
165
|
+
"ui.prompts.branch.message": "브랜치 전략을 선택하세요",
|
|
166
|
+
"ui.prompts.branch.prFlow": "develop → main PR 흐름 (pr-flow) — 팀 협업/리뷰 프로세스가 필요할 때",
|
|
167
|
+
"ui.prompts.branch.trunk": "main 단일 브랜치 (trunk-based) — 개인/소규모 프로젝트로 브랜치 없이 단순하게 쓸 때",
|
|
168
|
+
"interactive.flutter.deployModeTitle": "배포 모드",
|
|
169
|
+
"interactive.flutter.storeFirst": "스토어 배포 대상을 먼저 선택하세요 ('스토어 배포 대상' 항목).",
|
|
170
|
+
"interactive.question.semverAuto": "자동 버전 승격을 사용하시겠습니까? (커밋 타입에 따라 major/minor/patch 자동 결정)",
|
|
171
|
+
"interactive.question.copilotAi": "Copilot으로 AI 요약을 생성하시겠습니까? (GitHub Copilot AI Credits가 소비되며, 사용할 수 없으면 자동으로 규칙 기반 요약으로 전환됩니다)",
|
|
172
|
+
"interactive.banner.modeLabel": "대화형 통합 마법사",
|
|
173
|
+
"interactive.intro": "project-auto-wizard — 대화형 통합 마법사",
|
|
174
|
+
"interactive.cancel.install": "설치를 취소했습니다.",
|
|
175
|
+
"interactive.cancel.integration": "통합을 안전하게 취소했습니다.",
|
|
176
|
+
"interactive.outro.uninstall": "완전 삭제를 마쳤습니다.",
|
|
177
|
+
"interactive.outro.done": "통합 완료 — {mode} 모드로 설치했습니다.",
|
|
178
|
+
"interactive.hint.version": "다음 화면의 '수정하기 > 버전'에서 바로 고칠 수 있습니다.",
|
|
179
|
+
"interactive.hint.branch": "다르면 뒤의 '릴리스 브랜치' 질문에서 바꿀 수 있습니다.",
|
|
180
|
+
"interactive.summary.title": "프로젝트 분석 결과",
|
|
181
|
+
"interactive.edit.versionPrompt": "새 버전 (예: 1.0.0)",
|
|
182
|
+
"interactive.edit.versionInvalid": "버전 형식이 올바르지 않습니다 (x.y.z 형태) — 기존 값을 유지합니다.",
|
|
183
|
+
"interactive.edit.versionInvalidTitle": "⚠ 버전",
|
|
184
|
+
"interactive.edit.branchPrompt": "기본 브랜치",
|
|
185
|
+
"interactive.branch.releasePrompt": "릴리스 브랜치를 선택하세요 (기본: {branch})",
|
|
186
|
+
"interactive.branch.developPrompt": "개발 브랜치를 선택하세요 (기본: develop)",
|
|
187
|
+
"interactive.branch.trunkNote": "릴리스 브랜치({main}) 하나만 사용하는 trunk-based 모드로 설치합니다 (RELEASE-PUBLISH 단독).",
|
|
188
|
+
"interactive.branch.modeTitle": "브랜치 모드",
|
|
189
|
+
"interactive.branch.title": "브랜치",
|
|
190
|
+
"interactive.branch.defaultNew": "{name} (기본값 — 없으면 새로 생성)",
|
|
191
|
+
"interactive.branch.defaultMark": "{name} (기본값)",
|
|
192
|
+
"interactive.branch.custom": "직접 입력...",
|
|
193
|
+
"interactive.branch.namePrompt": "브랜치 이름",
|
|
194
|
+
"interactive.branch.invalid": "'{name}'은(는) 브랜치 이름으로 쓸 수 없습니다 (공백·특수문자·'..' 등 불가) — 다시 입력하세요.",
|
|
195
|
+
"interactive.branch.invalidTitle": "⚠ 브랜치",
|
|
196
|
+
"interactive.removed.title": "이전 설치에는 있었지만 지금 없는 워크플로우 ({count}개)",
|
|
197
|
+
"interactive.removed.message": "{filename} — 직접 지우신 것으로 보입니다. 다시 추가할까요?",
|
|
198
|
+
"interactive.removed.keep": "추가하지 않음 — 지운 상태 유지 (기본)",
|
|
199
|
+
"interactive.removed.restore": "다시 추가 — 최신 버전으로 설치",
|
|
200
|
+
"interactive.conflict.message": "내 수정과 업스트림 변경이 겹칩니다 ({type}) — 어떻게 할까요?",
|
|
201
|
+
"interactive.conflict.skip": "건너뛰기 — 기존 파일 유지 (기본)",
|
|
202
|
+
"interactive.conflict.backup": ".bak 백업 후 새 버전으로 교체",
|
|
203
|
+
"interactive.conflict.template": "기존 유지 + 새 버전을 .template.yaml로 참고 추가",
|
|
204
|
+
"interactive.notices.title": "이전 워크플로우 정리",
|
|
205
|
+
"interactive.summary.mode": "통합 모드 : {value}",
|
|
206
|
+
"interactive.summary.types": "프로젝트 타입 : {value}",
|
|
207
|
+
"interactive.summary.multi": " (멀티)",
|
|
208
|
+
"interactive.summary.version": "버전 : {value}",
|
|
209
|
+
"interactive.summary.branch": "기본 브랜치 : {value}",
|
|
210
|
+
"interactive.summary.envMode": "환경변수 방식 : {value}",
|
|
211
|
+
"interactive.summary.stores": "스토어 배포 대상 : {value}",
|
|
212
|
+
"interactive.summary.deployMode": "배포 모드 : {value}",
|
|
213
|
+
"interactive.summary.none": "없음",
|
|
214
|
+
"interactive.summary.semverAuto": "자동 버전 승격 : {value}",
|
|
215
|
+
"interactive.summary.copilotAi": "Copilot AI 요약 : {value}",
|
|
216
|
+
"interactive.summary.on": "켜짐",
|
|
217
|
+
"interactive.summary.off": "꺼짐",
|
|
218
|
+
"interactive.modeLabel.full": "전체 설치",
|
|
219
|
+
"interactive.modeLabel.version": "버전 관리만",
|
|
220
|
+
"interactive.modeLabel.workflows": "워크플로우만",
|
|
221
|
+
};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
// Korean message catalog. Merges the per-area parts (./ko/); keys must match en.js (checked by tests).
|
|
2
|
+
import cli from "./ko/cli.js";
|
|
3
|
+
import commands from "./ko/commands.js";
|
|
4
|
+
import ui from "./ko/ui.js";
|
|
5
|
+
import core from "./ko/core.js";
|
|
6
|
+
import core2 from "./ko/core2.js";
|
|
7
|
+
import copy from "./ko/copy.js";
|
|
8
|
+
|
|
9
|
+
export const PARTS = { cli, commands, ui, core, core2, copy };
|
|
10
|
+
export default Object.assign({}, cli, commands, ui, core, core2, copy);
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
// i18n entry: current-language state and t(key, params) lookup.
|
|
2
|
+
import { CATALOGS } from "./catalog/index.js";
|
|
3
|
+
import { CliError } from "../core/errors.js";
|
|
4
|
+
import {
|
|
5
|
+
SUPPORTED_LANGUAGES, DEFAULT_LANGUAGE, LANG_ENV_VAR, isSupportedLanguage, normalizeLanguage,
|
|
6
|
+
} from "./languages.js";
|
|
7
|
+
|
|
8
|
+
export { SUPPORTED_LANGUAGES, DEFAULT_LANGUAGE, LANG_ENV_VAR, isSupportedLanguage, normalizeLanguage } from "./languages.js";
|
|
9
|
+
|
|
10
|
+
let current = DEFAULT_LANGUAGE;
|
|
11
|
+
|
|
12
|
+
export const getLanguage = () => current;
|
|
13
|
+
|
|
14
|
+
// Unsupported codes are ignored so a bad value can never leave the module without a catalog.
|
|
15
|
+
export function setLanguage(lang) {
|
|
16
|
+
if (isSupportedLanguage(lang)) current = lang;
|
|
17
|
+
return current;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
// Look up `key` in the current language (or `lang` when given). A key missing from that
|
|
21
|
+
// catalog falls back to English; a key missing everywhere returns the key itself so the gap is visible.
|
|
22
|
+
// `{name}` placeholders are replaced from params; unknown placeholders are left as written.
|
|
23
|
+
export function t(key, params = {}, lang = current) {
|
|
24
|
+
const template = CATALOGS[lang]?.[key] ?? CATALOGS[DEFAULT_LANGUAGE][key] ?? key;
|
|
25
|
+
return template.replace(/\{(\w+)\}/g, (m, name) => (name in params ? String(params[name]) : m));
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// Resolve the effective language: flag -> env -> saved version.yml value -> default.
|
|
29
|
+
// An unsupported explicit value (flag, env) throws CliError: falling back silently would hide a typo.
|
|
30
|
+
// A saved value is not input for this run (the file may be hand-edited or written by a newer
|
|
31
|
+
// version), so an unknown one falls back to the default instead of blocking the install.
|
|
32
|
+
// sources: { flag?, env?, saved? } - raw values, empty/undefined = not set
|
|
33
|
+
export function resolveLanguage({ flag, env, saved } = {}) {
|
|
34
|
+
for (const [source, raw] of [["--lang", flag], [LANG_ENV_VAR, env]]) {
|
|
35
|
+
const v = normalizeLanguage(raw);
|
|
36
|
+
if (!v) continue;
|
|
37
|
+
if (!isSupportedLanguage(v)) {
|
|
38
|
+
throw new CliError(t("cli.lang.invalid", { value: String(raw).trim(), source, supported: SUPPORTED_LANGUAGES.join(", ") }, DEFAULT_LANGUAGE));
|
|
39
|
+
}
|
|
40
|
+
return v;
|
|
41
|
+
}
|
|
42
|
+
const s = normalizeLanguage(saved);
|
|
43
|
+
return isSupportedLanguage(s) ? s : DEFAULT_LANGUAGE;
|
|
44
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
// Language selection: --lang flag -> PROJECT_AUTO_WIZARD_LANG -> saved version.yml `language` -> default.
|
|
2
|
+
export const SUPPORTED_LANGUAGES = ["en", "ko"];
|
|
3
|
+
export const DEFAULT_LANGUAGE = "en";
|
|
4
|
+
export const LANG_ENV_VAR = "PROJECT_AUTO_WIZARD_LANG";
|
|
5
|
+
|
|
6
|
+
export const isSupportedLanguage = (v) => SUPPORTED_LANGUAGES.includes(v);
|
|
7
|
+
|
|
8
|
+
// Trim and lowercase so `--lang KO` and ` ko ` behave the same. Returns "" when unset.
|
|
9
|
+
export const normalizeLanguage = (v) => String(v ?? "").trim().toLowerCase();
|