@rch4com/agent-setup 1.9.0 → 1.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +199 -199
  3. package/install.mjs +163 -163
  4. package/lib/args.mjs +276 -276
  5. package/lib/bootstrap/adapter.mjs +96 -96
  6. package/lib/bootstrap/apply.mjs +380 -380
  7. package/lib/bootstrap/flow.mjs +140 -140
  8. package/lib/bootstrap/record.mjs +154 -154
  9. package/lib/bootstrap/templates.mjs +148 -148
  10. package/lib/bootstrap/text.mjs +19 -19
  11. package/lib/catalog.mjs +234 -234
  12. package/lib/claude-plugins.mjs +64 -64
  13. package/lib/clis.mjs +111 -111
  14. package/lib/context.mjs +66 -66
  15. package/lib/deps.mjs +17 -17
  16. package/lib/design-md/catalog.json +454 -454
  17. package/lib/design-md/catalog.mjs +266 -266
  18. package/lib/design-md/flow.mjs +192 -192
  19. package/lib/design-md/open.mjs +51 -51
  20. package/lib/design-md/providers/awesome-design-md.mjs +124 -124
  21. package/lib/design-md/providers/index.mjs +9 -9
  22. package/lib/design-md/scan.mjs +295 -295
  23. package/lib/engine.mjs +115 -115
  24. package/lib/gitignore.mjs +18 -18
  25. package/lib/i18n/catalog/en.mjs +426 -425
  26. package/lib/i18n/catalog/ko.mjs +411 -410
  27. package/lib/i18n/detect.mjs +39 -39
  28. package/lib/i18n/index.mjs +93 -93
  29. package/lib/items/mcp.codebase-memory.mjs +6 -6
  30. package/lib/items/mcp.notion.mjs +6 -6
  31. package/lib/items/mcp.supabase.mjs +6 -6
  32. package/lib/items/mcp.vercel.mjs +6 -6
  33. package/lib/items/plugin.mattpocock-skills.mjs +8 -8
  34. package/lib/items/plugin.ponytail.mjs +104 -104
  35. package/lib/items/skill.gsd.mjs +44 -44
  36. package/lib/items/skill.gstack.mjs +54 -54
  37. package/lib/items/skill.hallmark.mjs +10 -0
  38. package/lib/jsonfile.mjs +40 -40
  39. package/lib/status.mjs +93 -93
  40. package/lib/tomlfile.mjs +60 -60
  41. package/lib/tui/detail.mjs +127 -127
  42. package/lib/tui/progress.mjs +160 -160
  43. package/lib/tui/render.mjs +268 -268
  44. package/lib/tui/rows.mjs +317 -317
  45. package/lib/tui/run.mjs +396 -396
  46. package/lib/tui/state.mjs +249 -249
  47. package/lib/update.mjs +85 -85
  48. package/lib/width.mjs +115 -115
  49. package/package.json +36 -36
@@ -1,410 +1,411 @@
1
- // 한국어 카탈로그. 키 집합은 en.mjs를 그대로 따른다.
2
- export default {
3
- 'locale.en': 'English',
4
- 'locale.ko': '한국어',
5
-
6
- 'error.notGitRepo': 'git 저장소 안에서 실행해야 합니다.',
7
- 'error.pathOutsideRepo': '저장소 밖의 경로에는 쓸 수 없습니다: {path}',
8
- 'error.pathUnresolvable': '경로를 확인할 수 없습니다: {path} ({code})',
9
- 'error.pathEscapesViaLink': '저장소 내부 경로가 외부 링크를 통해 이탈합니다: {path} -> {real}',
10
-
11
- 'usage.bootstrap': [
12
- '사용법: npx @rch4com/agent-setup bootstrap [--skill-mode auto|link|copy] [--dry-run]',
13
- ' node install.mjs bootstrap [옵션] # 저장소에 설치기를 두고 쓸 때',
14
- '',
15
- '옵션:',
16
- ' --skill-mode auto|link|copy 스킬 연결 방식을 지정합니다. (기본값: auto)',
17
- ' auto: 심볼릭 링크를 먼저 시도하고, 실패하면 복사로 전환합니다.',
18
- ' link: 심볼릭 링크만 시도합니다. 실패하면 오류로 종료합니다.',
19
- ' copy: 항상 복제본을 만듭니다.',
20
- ' --adopt 파일을 만들지 않고, 이미 있는 파일 중 이 버전의',
21
- ' 템플릿과 같은 것만 관리 대상으로 기록합니다.',
22
- ' --lang en|ko 이번 실행에 쓸 표시 언어입니다.',
23
- ' --dry-run 아무것도 바꾸지 않고 예정된 동작만 출력합니다.',
24
- ' -h, --help 이 도움말을 출력하고 종료합니다.',
25
- '',
26
- '런처로도 사용할 수 있습니다:',
27
- ' ./setup-agents.sh [옵션]',
28
- ' pwsh -File ./setup-agents.ps1 [옵션]',
29
- ' --tui (또는 -Tui)를 주면 의존성을 설치하고 대화형 화면을 엽니다.',
30
- ' 거기서 부트스트랩·에이전트·design.md를 한 목록에서 검색하고 고릅니다.',
31
- ],
32
- 'usage.root': [
33
- '사용법: npx @rch4com/agent-setup [옵션]',
34
- ' npx @rch4com/agent-setup bootstrap [옵션]',
35
- ' npx @rch4com/agent-setup update [옵션]',
36
- ' npx @rch4com/agent-setup status [옵션]',
37
- ' npx @rch4com/agent-setup design [옵션]',
38
- '',
39
- '저장소에 설치기를 두고 쓸 때는 npx @rch4com/agent-setup 자리에',
40
- 'node install.mjs 를 넣으면 됩니다.',
41
- '',
42
- '옵션이 없으면 대화형 화면을 엽니다 — 부트스트랩·에이전트·design.md를',
43
- '한 목록에서 검색하고 고릅니다.',
44
- '',
45
- '옵션:',
46
- ' --list 현재 설치 상태만 출력하고 종료합니다.',
47
- ' --set <목록> 쉼표로 구분한 항목을 목표 상태로 맞춥니다.',
48
- ' 전체 제거는 --set "" 로 명시하세요.',
49
- ' --skill-mode auto|link|copy 대화형 화면에서 실행하는 부트스트랩의 스킬',
50
- ' 연결 방식입니다. (기본값: auto)',
51
- ' --design-dir <경로> design.md 소스를 더합니다. <소스id>=<경로>',
52
- ' 형식도 받으며 반복 지정할 수 있습니다.',
53
- ' --lang en|ko 이번 실행에 쓸 표시 언어입니다.',
54
- ' --dry-run 아무것도 바꾸지 않고 예정된 동작만 출력합니다.',
55
- ' -h, --help 이 도움말을 출력하고 종료합니다.',
56
- '',
57
- '--list와 --set은 동작을 고르는 플래그라 함께 쓸 수 없습니다.',
58
- '',
59
- '서브커맨드 도움말: npx @rch4com/agent-setup bootstrap --help',
60
- ' npx @rch4com/agent-setup update --help',
61
- ' npx @rch4com/agent-setup status --help',
62
- ' npx @rch4com/agent-setup design --help',
63
- ],
64
- 'usage.design': [
65
- '사용법: npx @rch4com/agent-setup design [옵션]',
66
- ' node install.mjs design [옵션] # 저장소에 설치기를 두고 쓸 때',
67
- '',
68
- '옵션이 없으면 대화형 화면을 엽니다 — DESIGN.MD 섹션이 그 안에 있습니다.',
69
- '',
70
- '옵션:',
71
- ' --list 카탈로그와 설치 상태를 출력합니다.',
72
- ' --set <목록> 쉼표로 구분한 항목을 목표 상태로 맞춥니다.',
73
- ' 토큰은 <이름> 또는 <제공자>/<이름> 입니다.',
74
- ' 전체 제거는 --set "" 로 명시하세요.',
75
- ' --preview <목록> 미리보기를 엽니다.',
76
- ' --sync=installed 설치본을 원본 최신으로 다시 받습니다.',
77
- ' --sync=catalog 사용 가능 목록·카테고리를 소스에서 다시 만듭니다.',
78
- ' --sync=stale 설치본을 원본과 해시 비교합니다.',
79
- ' --design-dir <경로> design.md 소스를 더합니다. <소스id>=<경로>',
80
- ' 형식도 받으며 반복 지정할 수 있습니다.',
81
- ' --lang en|ko 이번 실행에 쓸 표시 언어입니다.',
82
- ' --dry-run 아무것도 바꾸지 않고 예정된 동작만 출력합니다.',
83
- ' -h, --help 이 도움말을 출력하고 종료합니다.',
84
- '',
85
- '--list, --set, --preview, --sync는 동작을 고르는 플래그라',
86
- '한 번에 하나만 지정할 수 있습니다.',
87
- ],
88
- 'usage.update': [
89
- '사용법: npx @rch4com/agent-setup update [옵션]',
90
- '',
91
- '설치 기록에 남은 해시와 대조해, 우리가 쓴 그대로인 관리 파일만',
92
- '최신 템플릿으로 갱신합니다. 사용자가 고친 파일은 건드리지 않고',
93
- '드리프트로 보고합니다.',
94
- '',
95
- '옵션:',
96
- ' --force 드리프트 파일까지 덮어씁니다. 워킹트리가 깨끗해야 합니다',
97
- ' (git이 유일한 되돌리기 수단이므로).',
98
- ' --lang en|ko 이번 실행에 쓸 표시 언어입니다.',
99
- ' --dry-run 아무것도 바꾸지 않고 예정된 동작만 출력합니다.',
100
- ' -h, --help 이 도움말을 출력하고 종료합니다.',
101
- ],
102
- 'usage.status': [
103
- '사용법: npx @rch4com/agent-setup status [옵션]',
104
- '',
105
- '설치 기록(의도) / 실제 저장소 상태(스캔) / 실행 중 도구 버전을',
106
- '나란히 보여줍니다. 아무것도 바꾸지 않습니다.',
107
- '',
108
- '옵션:',
109
- ' --json 기계가 읽을 형태로 출력합니다 (CI 판정용).',
110
- ' --lang en|ko 이번 실행에 쓸 표시 언어입니다.',
111
- ' -h, --help 이 도움말을 출력하고 종료합니다.',
112
- ],
113
-
114
- 'error.unknownArg': '알 수 없는 인자입니다: {token}\n\n{usage}',
115
- 'error.flagTakesNoValue': '{name}에는 값을 줄 수 없습니다: {token}\n\n{usage}',
116
- 'error.singleAction': '함께 쓸 수 없습니다: {given} — 동작 플래그는 한 번에 하나만 지정하세요.\n\n{usage}',
117
- 'error.badSkillMode': '--skill-mode는 {list} 중 하나여야 합니다: {value}\n\n{usage}',
118
- 'error.skillModeNeedsValue': '--skill-mode 뒤에 값이 필요합니다 ({list} 중 하나).\n\n{usage}',
119
- 'error.badLang': '--lang은 {list} 중 하나여야 합니다: {value}\n\n{usage}',
120
- 'error.langNeedsValue': '--lang 뒤에 값이 필요합니다 ({list} 중 하나).\n\n{usage}',
121
- 'error.needsValue': '{name} 뒤에 값이 필요합니다.',
122
- 'error.setNeedsValue': '--set 뒤에 항목 목록이 필요합니다. 전체 제거는 --set "" 로 명시하세요.',
123
- 'error.badSync': '--sync=installed|catalog|stale 형식으로 지정하세요.',
124
-
125
- 'status.installed': '설치됨',
126
- 'status.partial': '일부 설치됨',
127
- 'status.absent': '미설치',
128
-
129
- 'change.install': '설치',
130
- 'change.complete': '보완 설치',
131
- 'change.uninstall': '제거',
132
-
133
- 'apply.noChanges': '변경할 항목이 없습니다.',
134
- 'apply.finalState': '최종 상태:',
135
- 'apply.seeGitDiff': '설정 파일 변경 내용은 git diff로 확인할 수 있습니다.',
136
- 'error.unknownItem': '알 수 없는 항목: {id}',
137
-
138
- 'error.depsMissing': [
139
- '이 기능에는 의존성이 필요합니다. 다음 중 하나를 실행하세요:',
140
- ' ./setup-agents.sh --tui',
141
- ' npm install --prefix agent-installer',
142
- ],
143
-
144
- 'log.record.write': '설치 기록 기록: {path}',
145
- 'error.recordUnreadable': '{path}을 읽을 수 없습니다 ({code})',
146
- 'error.recordNotJson': '{path}을 읽을 수 없습니다 — JSON이 아닙니다 ({message})',
147
- 'error.recordVersion': '{path}의 형식 버전이 {found}입니다. 이 도구는 {expected}을 씁니다 — 도구를 올리거나 기록을 다시 만드세요.',
148
-
149
- 'log.repoRoot': '저장소 루트: {path}',
150
- 'log.noGlobalWrites': '글로벌 설정 경로는 읽거나 수정하지 않습니다.',
151
- 'log.dir.create': '디렉터리 생성: {path}',
152
- 'log.file.keep': '기존 파일 유지: {path}',
153
- 'log.file.create': '파일 생성: {path}',
154
- 'log.file.update': '파일 갱신: {path}',
155
- 'log.file.userEdited': '사용자 수정 — 건드리지 않음: {path}',
156
- 'log.block.keep': '관리 블록 확인: {path}',
157
- 'log.block.add': '관리 블록 추가: {path}',
158
- 'log.block.update': '관리 블록 갱신: {path}',
159
- 'log.block.missing': '관리 블록 없음 — 건드리지 않음: {path}',
160
- 'log.block.userEdited': '블록 사용자 수정 — 건드리지 않음: {path}',
161
- 'log.json.keep': '설정 키 확인: {path} — {key}',
162
- 'log.json.add': '설정 키 추가: {path} — {key}',
163
- 'log.ignore.keep': '.gitignore 항목 확인: {entries}',
164
- 'log.ignore.add': '.gitignore 항목 추가: {entries}',
165
- 'log.warn.unreadable': '경고: {path}을 읽을 수 없어 건너뜁니다 ({code})',
166
- 'log.warn.noRootObject': '경고: {path}에서 루트 객체를 찾지 못해 건너뜁니다',
167
- 'log.warn.ignoreShadowed': '경고: .gitignore의 "{parent}"가 디렉터리 전체를 제외해 "{entry}" 부정 항목이 무효화됩니다. "{parent}/*" 형태로 바꾸면 다시 포함됩니다.',
168
- 'log.skill.linkOk': '{tool} 스킬 링크 확인: {path}',
169
- 'log.skill.linkCreate': '{tool} 스킬 링크 생성: {path} -> {target}',
170
- 'log.skill.copyCreate': '{tool} 스킬 복제본 생성: {path}',
171
- 'log.skill.copySync': '{tool} 스킬 복제본 동기화: {path}',
172
- 'log.skill.plan': '{tool} 스킬 어댑터 생성 예정: {path} ({mode})',
173
- 'log.skill.warnForeignLink': '경고: {path} 경로가 다른 위치를 가리키는 링크입니다. 변경하지 않습니다.',
174
- 'log.skill.warnUnmanaged': '경고: {path} 경로가 이미 존재하며 agent-kit 관리 대상이 아닙니다. 변경하지 않습니다.',
175
- 'log.skill.linkFellBack': '경고: {tool} 링크 생성에 실패하여 복사 방식으로 전환합니다.',
176
-
177
- 'msg.readFailed': '읽기 실패',
178
- 'msg.noRootObject': '루트 객체 없음',
179
- 'msg.foreignLink': '다른 위치를 가리키는 링크',
180
- 'msg.unmanagedExisting': '관리 대상이 아닌 기존 항목',
181
- 'msg.noManagedBlock': '관리 블록 없음',
182
- 'msg.linkFailed': '링크 생성 실패: {message}',
183
-
184
- 'bootstrap.failures': '실패 {count}건:',
185
- 'bootstrap.done': '완료되었습니다.',
186
- 'bootstrap.sharedGuide': '공통 지침: AGENTS.md',
187
- 'bootstrap.sharedSkills': '공통 스킬: .agents/skills/',
188
- 'bootstrap.tools': '적용 도구: {list}',
189
- 'bootstrap.repoOnly': '도구별 설정은 모두 현재 저장소 안에만 생성되었습니다.',
190
- 'bootstrap.noOverwrite': '기존 설정 파일은 덮어쓰지 않았습니다.',
191
- 'bootstrap.record': '설치 기록: {path}',
192
-
193
- 'error.badSkillModeRuntime': '--skill-mode는 {list} 중 하나여야 합니다: {value}',
194
-
195
- // status·update 화면 문구. status.row.tool/files는 원본보다 공백을 늘려
196
- // items 블록(설치됨·기록에만·저장소에만)과 값 시작 열을 맞췄다 — 나머지는
197
- // 기존 status.mjs·update.mjs의 문구를 그대로 옮겼다.
198
- 'status.noRecord': '설치 기록이 없습니다.',
199
- 'status.noRecord.hint1': ' 이 저장소를 기록 체계로 끌어오려면 bootstrap --adopt 를 실행하세요.',
200
- 'status.noRecord.hint2': ' 파일을 만들지 않고, 템플릿과 같은 파일만 관리 대상으로 기록합니다.',
201
- 'status.row.tool': '도구 {version}',
202
- 'status.version.pinned': '{pinned} 고정 · 실행 중 {running}',
203
- 'status.version.latest': '{pinned} 고정 · 실행 중 {running} · 최신 {latest}',
204
- 'status.hint.update': ' → update로 고정 버전을 옮길 수 있습니다',
205
- 'status.row.files': '관리 파일 {total}개 중 {current} 최신 · {pending} 갱신 대기 · {drift} 사용자 수정',
206
- 'status.hint.pending': ' → update',
207
- 'status.hint.drift': ' → 사용자 수정 파일은 update가 건드리지 않습니다',
208
- 'status.row.items': '항목 설치됨 {list}',
209
- 'status.row.recordOnly': ' 기록에만 {list}',
210
- 'status.row.repoOnly': ' 저장소에만 {list}',
211
- 'status.none': '(없음)',
212
- 'update.versionMove': '고정 {pinned} → 실행 중 {running}',
213
- 'update.summary': '갱신 {updated}건 · 신규 {created}건 · 드리프트 {drift}건',
214
- 'update.driftHeader': '드리프트 (건드리지 않았습니다)',
215
- 'update.driftHint': '최신 템플릿을 반영하려면 update --force (워킹트리가 깨끗해야 합니다)',
216
- 'error.forceNeedsCleanTree': '--force는 워킹트리가 깨끗할 때만 쓸 수 있습니다. git이 유일한 되돌리기 수단이라 커밋되지 않은 변경 위에 덮어쓰면 복구할 수 없습니다.',
217
- 'error.noRecordForUpdate': '{path}이 없습니다. 이 저장소를 기록 체계로 끌어오려면 먼저 `bootstrap --adopt`를 실행하세요 — 파일을 만들지 않고 기록만 만듭니다.',
218
-
219
- // 항목 카탈로그 — 기존 원문을 그대로 옮긴다. en.mjs 쪽 주석 참고.
220
- 'item.unsupported.claudePlugin': 'Claude Code 전용 플러그인',
221
- 'item.unsupported.claudeSkill': 'Claude Code 스킬 설치본',
222
- 'item.unsupported.ponytailUser': '상류 설치 경로가 사용자 스코프입니다 (codex·copilot 플러그인, gemini 확장)',
223
- 'item.unsupported.ponytailRules': '플러그인 기구가 없습니다 — 규칙을 AGENTS.md에 직접 옮겨 적으세요',
224
- 'item.unsupported.upstreamNone': '상류에 공식 설치 경로가 없습니다',
225
- 'item.unsupported.superpowersSeparate': '상류가 하니스별 별도 설치로 지원합니다 — 이 항목은 Claude Code 플러그인만 배선합니다',
226
- 'item.unsupported.bkitPort': '상류가 별도 배포판(bkit-codex·bkit-gemini)으로 지원합니다 — 이 플러그인과 별개 설치이며, Gemini판은 Antigravity 승계 추정입니다',
227
- 'item.unsupported.impeccableJunction': '상류는 지원하지만 npx impeccable install이 공유 .agents/skills 연결을 끊어 플러그인 경로만 배선합니다',
228
- 'item.unsupported.gstackHost': '상류는 ./setup --host로 지원합니다 — 이 항목은 Claude Code에만 설치합니다',
229
- 'item.unsupported.gsdFlag': '상류는 런타임 플래그로 지원합니다 — 이 항목은 --claude로만 설치합니다',
230
- 'item.unsupported.gsdGemini': '상류가 Gemini CLI 지원을 제거했습니다(2026-06 종료) — Antigravity가 --antigravity로 승계합니다',
231
- 'item.mcp.partial': '등록됨: {present} / 누락: {missing}',
232
- 'item.plugin.partial': '배선됨: {present} / 누락: {missing}',
233
- 'item.plugin.deferred': '설정 기록됨 — 다음 Claude Code 실행 시 다운로드됩니다',
234
- 'item.scanFailed': '감지 실패: {message}',
235
- 'log.mcp.add': ' [dry-run] {cli} 설정에 {name} 등록',
236
- 'log.mcp.remove': ' [dry-run] {cli} 설정에서 {name} 제거',
237
- 'log.plugin.add': ' [dry-run] {cli} 설정에 플러그인 {name} 추가',
238
- 'log.plugin.remove': ' [dry-run] {cli} 설정에서 플러그인 {name} 제거',
239
-
240
- 'item.mcp.notion.note': '인증: 각 CLI 첫 사용 시 OAuth',
241
- 'item.mcp.vercel.note': '인증: 첫 사용 시 OAuth (승인된 클라이언트만 연결 가능)',
242
- 'item.mcp.supabase.note': '인증: OAuth 동적 등록. 프로젝트 고정이 필요하면 URL에 ?project_ref=<id> 추가',
243
- 'item.mcp.codebase-memory.note': 'PATH에 codebase-memory-mcp 바이너리 필요. 설치: https://github.com/DeusData/codebase-memory-mcp (install.sh / install.ps1)',
244
- 'item.mcp.graphify.note': 'PATH에 graphify-mcp 바이너리 필요. 설치: uv tool install "graphifyy[mcp]". graphify-out/graph.json을 읽으므로 /graphify .로 그래프를 먼저 만드세요',
245
- 'item.mcp.headroom.note': 'PATH에 headroom 바이너리 필요. 설치: uv tool install --python 3.13 "headroom-ai[proxy,mcp]". 프록시(headroom wrap)는 실행 방식이라 저장소 설정 대상이 아닙니다',
246
- 'item.plugin.superpowers.note': '공식 마켓플레이스 플러그인. 상류는 Codex·Antigravity 등 11개 하니스를 하니스별 설치로 지원합니다',
247
- 'item.plugin.mattpocock-skills.note': '엔지니어링·생산성 스킬 22종 (tdd, code-review, research 등)',
248
- 'item.plugin.ponytail.note': '군더더기 없는 코드 규칙 묶음. Claude Code 플러그인과 OpenCode plugin 항목을 저장소 범위로 배선합니다',
249
- 'item.plugin.ecc.note': '에이전트 하네스용 스킬·본능·메모리·보안 묶음. skills/에 281개가 들어 있어 공유 스킬 디렉터리에 복사하지 않고 플러그인으로 설치합니다',
250
- 'item.plugin.impeccable.note': 'AI 하네스용 디자인 언어. 플러그인 경로를 쓰는 이유는 npx impeccable install이 .claude/skills를 갈아치워 공유 .agents/skills 연결을 끊기 때문입니다',
251
- 'item.plugin.understand-anything.note': '코드베이스를 탐색 가능한 지식 그래프로 만듭니다. 다른 CLI용 스크립트는 ~/.understand-anything에 클론하는 사용자 스코프라 플러그인만 배선합니다',
252
- 'item.skill.caveman.note': '원시인 말투로 답해 출력 토큰을 줄입니다. 코드와 오류는 그대로 둡니다. /caveman으로 켜고 끕니다',
253
- 'item.skill.taste.note': '랜딩 페이지·포트폴리오·리디자인용 안티슬롭 프런트엔드 스킬 (스킬 이름: design-taste-frontend)',
254
- 'item.skill.karpathy.note': '과설계와 모호한 완료 기준을 줄이는 행동 지침',
255
- 'item.skill.gstack.note': '저장소 로컬 clone + setup (bash 필요, Windows는 Git Bash). 런타임 상태(~/.gstack)는 전역에 생길 수 있음.',
256
- 'item.skill.gsd.note': 'npx @opengsd/gsd-core 프로젝트 로컬 설치. 상류는 Codex·Antigravity 등 18개 런타임을 지원합니다(이 항목은 --claude)',
257
- // 커밋 템플릿은 CLI 배선이 아니라 저장소 규약이다 — en.mjs 쪽 주석 참고.
258
- 'item.config.gitmessage.en.note': '커밋 메시지를 영어로 씁니다. 템플릿을 놓고 git commit.template이 그것을 가리키게 하므로, 저장소의 모든 편집기와 도구에서 함께 열립니다',
259
- 'item.config.gitmessage.ko.note': '커밋 메시지를 한국어로 씁니다. 템플릿을 놓고 git commit.template이 그것을 가리키게 하므로, 저장소의 모든 편집기와 도구에서 함께 열립니다',
260
- 'item.gitmessage.unregistered': '파일은 놓였지만 commit.template이 아직 가리키지 않습니다',
261
- 'log.gitmessage.write': ' [dry-run] {path} 생성',
262
- 'log.gitmessage.remove': ' [dry-run] {path} 제거',
263
- 'error.gitmessageForeign': '{path}가 이미 있고 이 도구가 쓴 내용이 아닙니다. 손으로 쓴 템플릿은 덮어쓰지 않습니다 — 먼저 옮기거나 지우세요.',
264
- 'error.gitmessageConfig': 'git config commit.template 실패: {output}',
265
- 'error.exclusiveItems': '같은 파일을 쓰는 항목이라 하나만 고를 수 있습니다: {ids}',
266
- 'error.gstackClone': 'gstack clone 실패: {output}',
267
- 'error.gstackSetup': 'gstack setup 실패: {output}',
268
- 'error.gsdInstall': 'GSD 설치 실패: {output}',
269
- 'error.gsdUninstall': 'GSD 제거 실패: {output}',
270
- 'error.ponytailOpencodePlugin': '{file}: plugin 키가 배열이 아닙니다. 덮어쓰지 않고 그대로 둡니다 — "@dietrichgebert/ponytail"을 직접 추가하세요.',
271
- 'error.registrySkillInstall': '스킬 레지스트리 설치 실패 ({skill}): {output}',
272
- 'error.itemFieldMissing': '{file}: {field} 누락',
273
- 'error.itemReasonMissing': '{id}: 미지원 CLI \'{cli}\'의 사유(unsupported.{cli})가 필요합니다',
274
- 'error.shellQuote': '셸에 넘길 수 없는 큰따옴표가 인자에 있습니다: {value}',
275
-
276
- // TUI 탭 이름. en.mjs 쪽 주석 참고. PLUGIN·MCP·SKILL·DESIGN.MD는 형식·브랜드
277
- // 이름이라 번역하지 않는다 — 두 로케일에서 값이 같은 게 맞다.
278
- 'section.action': '작업',
279
- 'section.plugin': 'PLUGIN',
280
- 'section.mcp': 'MCP',
281
- 'section.skill': 'SKILL',
282
- 'section.config': 'CONFIG',
283
- 'section.design': 'DESIGN.MD',
284
-
285
- // TUI 목록·검토 화면 문구. en.mjs 쪽 주석 참고.
286
- 'tui.counts': '선택 {picked} / 전체 {total}',
287
- 'tui.search.prefix': '검색 › ',
288
- 'tui.search.placeholder': '타이핑하면 검색 · ↓ 로 목록',
289
- 'tui.empty.filtered': ' 이 탭에는 일치하는 항목이 없습니다. Tab으로 다른 탭을 보세요.',
290
- 'tui.empty.none': ' 항목이 없습니다.',
291
- 'tui.hint.search': '입력=검색어 ↓ 목록으로 Tab 탭이동 Esc 검색해제 Ctrl+F CLI Ctrl+D 상세',
292
- 'tui.hint.list': 'Space 선택 ↑↓ 이동 Tab 탭 Enter 실행/제출 Ctrl+A 전체 Ctrl+O 미리보기 Ctrl+F CLI Ctrl+D 상세',
293
- // 힌트 줄 오른쪽 끝의 고정 자리. en.mjs 쪽 주석 참고.
294
- 'tui.hint.quit': 'Ctrl+Q 종료',
295
- 'tui.review.title': '제출 검토 — 변경 {count}건',
296
- 'tui.review.more': ' …외 {count}건',
297
- 'tui.review.hint': 'Enter 적용 Esc 취소 Ctrl+Q 종료',
298
- 'tui.notItemRow': '이 행은 Enter로 실행합니다.',
299
- 'tui.noPreview': '이 항목은 미리보기를 제공하지 않습니다.',
300
- 'tui.opened': '열었습니다: {target}',
301
- 'tui.noChanges': '변경할 항목이 없습니다.',
302
- 'tui.submitCancelled': '제출을 취소했습니다.',
303
- 'tui.toggledAll': '{tab} 탭의 보이는 항목을 모두 선택했습니다.',
304
- 'tui.toggledNone': '{tab} 탭의 보이는 항목을 모두 해제했습니다.',
305
- // 배타 묶음에서 형제가 함께 꺼졌을 때. en.mjs 쪽 주석 참고.
306
- 'tui.exclusiveSwitched': '{kept}(으)로 바꿨습니다 — 같은 파일이라 {dropped}은(는) 해제했습니다.',
307
- 'tui.nonInteractive': '대화형 화면은 터미널에서만 열립니다. --list · --set 으로도 다룰 수 있습니다.',
308
- 'tui.pressAnyKey': '계속하려면 아무 키나 누르세요…',
309
- 'tui.confirmSuffix': ' [y/N] ',
310
-
311
- // 진행 화면(tui/progress.mjs) 문구. en.mjs 쪽 주석 참고.
312
- 'progress.title': '적용 중 — 변경 {count}건{suffix}',
313
- 'progress.counter': '{done}/{total} {percent}%',
314
- 'progress.elapsed': '{seconds}초',
315
- 'progress.elapsedMin': '{minutes}분{seconds}초',
316
- 'progress.running': '{seconds}초 경과',
317
- 'progress.more': ' …외 {count}건',
318
- 'progress.abortHint': 'Ctrl+C 중단 (현재 항목까지 마칩니다)',
319
- 'progress.aborted': '중단했습니다 — {count}건 건너뜀',
320
- 'progress.skipped': '건너뜀',
321
- 'progress.done': '끝났습니다 — 성공 {ok}건, 실패 {failed}건{skippedSuffix}',
322
- 'progress.plain': '[{index}/{total}] {action} {label}',
323
- 'progress.plainDone': ' {mark} {seconds}초',
324
-
325
- // 언어 행(action.language) 전용. en.mjs 쪽 주석 참고.
326
- 'tui.lang.saved': '{path}에 저장했습니다',
327
- 'tui.lang.dryRun': 'dry-run — 이번 세션에만 적용했습니다',
328
- 'tui.lang.saveFailed': '언어를 저장하지 못했습니다: {message}',
329
- 'tui.lang.overridden': '다음 실행에서는 --lang / AGENT_SETUP_LANG이 여전히 이깁니다.',
330
-
331
- // CLI 필터 표시. en.mjs 쪽 주석 참고.
332
- 'tui.filter.prefix': 'CLI › ',
333
- 'tui.filter.position': '{current}/{total}',
334
- 'tui.filter.empty': ' 이 탭에는 {cli}에 배선되는 항목이 없습니다.',
335
-
336
- 'item.location.user': '설치 위치: 사용자 글로벌',
337
- 'item.target': '대상 파일: {path}',
338
- // en.mjs 쪽 주석 참고.
339
- 'item.cliCoverage': 'CLI {covered}/{total}',
340
- 'item.unsupportedList': '미배선 {count}곳: {groups}',
341
- 'item.unsupportedGroup': '{clis} — {why}',
342
- 'detail.wired': '배선',
343
- 'detail.unwired': '미배선',
344
- 'detail.provider': '공급자',
345
- 'detail.preview': '미리보기',
346
- 'detail.target': '대상 파일',
347
- 'detail.scope.project': '저장소 스코프',
348
- 'detail.scope.user': '사용자 전역',
349
- 'detail.more': ' …외 {count}줄 — Ctrl+D로 펼치기',
350
- 'detail.empty': ' 커서를 항목 위에 올리면 상세가 보입니다.',
351
-
352
- // 상주 언어 행 — en.mjs 쪽 주석 참고.
353
- 'action.language.label': '언어',
354
- 'action.language.hint': '{current} · Enter로 변경',
355
- 'action.bootstrap.label': '부트스트랩 실행',
356
- 'action.bootstrap.hint': '지침 · 스킬 · 도구별 설정 · 파일 {total}개 중 {present}개 존재',
357
- 'action.sync.installed.label': '설치본 업데이트',
358
- 'action.sync.installed.hint': 'design.md 설치본을 원본 최신으로 다시 받는다',
359
- 'action.sync.catalog.label': '카탈로그 새로고침',
360
- 'action.sync.catalog.hint': 'design.md 목록·카테고리를 소스에서 다시 만든다',
361
- 'action.sync.stale.label': '오래된 항목 확인',
362
- 'action.sync.stale.hint': '설치본을 원본과 해시 비교한다',
363
-
364
- // design.md 서브시스템. en.mjs 쪽 주석 참고.
365
- 'category.other': '기타',
366
- 'category.local': '사내',
367
- // 항목 탭 안쪽의 성격 그룹. en.mjs 쪽 주석 참고.
368
- 'category.token': '토큰 절감',
369
- 'category.context': '코드 이해',
370
- 'category.style': '디자인 감각',
371
- 'category.flow': '작업 방식',
372
- // 헤더 하나가 무엇을 고르는 자리이고 규칙이 무엇인지 함께 말한다. en.mjs 쪽 주석 참고.
373
- 'category.commit': '커밋 메시지 템플릿 · .gitmessage.txt · 하나만 고릅니다',
374
- 'category.service': '외부 서비스',
375
- 'design.localSuffix': '{id} (로컬)',
376
- 'design.localTag': '로컬',
377
- 'design.unknownItem': ' 알 수 없는 항목: {token}',
378
- 'design.ambiguous': ' 중복된 이름 \'{token}\' — 제공자를 지정하세요: {options}',
379
- 'design.provider.count': ' {label}: {count}개',
380
- 'design.provider.failed': ' {label}: 실패 — {message}',
381
- 'design.catalog.empty': '가져온 항목이 없어 카탈로그를 갱신하지 않습니다.',
382
- 'design.catalog.planned': ' [dry-run] {total}개로 갱신 예정',
383
- 'design.catalog.updated': '카탈로그 갱신됨: {total}개',
384
- 'design.none': '설치된 design.md가 없습니다.',
385
- 'design.updated': ' ✔ 업데이트 {label}',
386
- 'design.updateFailed': ' ✖ 업데이트 {label} — {message}',
387
- 'design.sourceCheckFailed': ' ? {label}: 원본 확인 실패',
388
- 'design.allCurrent': '모든 설치본이 최신입니다.',
389
- 'design.staleList': '오래된 항목 {count}개: {names}',
390
- 'design.staleConfirm': '{count}개를 지금 업데이트할까요?',
391
- 'design.unknownSync': '알 수 없는 동기화 작업: {action}',
392
- 'design.write': ' [dry-run] design-md/{provider}/{name}/DESIGN.md 작성',
393
- 'design.remove': ' [dry-run] design-md/{provider}/{name} 제거',
394
- 'design.nameClash': ' design.md 이름이 겹쳐 \'{picked}\'로 구분합니다: {path}',
395
- 'design.sourceIdClash': ' design.md 소스 id가 겹쳐 \'{picked}\'로 사용합니다: {path}',
396
- 'design.noDesignFile': ' design.md 소스에 DESIGN.md가 없습니다: {path}',
397
- 'design.pathMissing': ' design.md 경로를 찾을 수 없습니다: {path}',
398
- 'design.noPreviewUrl': ' {label}: 미리보기 URL이 없습니다.',
399
- 'design.openFailed': ' {label}: 열기 실패 — 직접 여세요: {target}',
400
- 'design.notOpenable': '열 수 있는 대상이 아닙니다',
401
-
402
- 'error.catalogUnreadable': 'design.md 카탈로그를 읽을 수 없습니다: {path}\n{message}\n`design --sync=catalog`로 다시 만들 수 있습니다.',
403
- 'error.responseTooLarge': '응답이 상한({limit} 바이트)을 넘었습니다: {url}',
404
- 'error.badDesignId': '잘못된 design.md 식별자: {provider}/{name}',
405
- // resolveTokens(--set/--preview 토큰 해석)의 예외 전용 — design.ambiguous와
406
- // 같은 상황이지만 로그 줄이 아니라 최상위 예외라 들여쓰기가 없다.
407
- 'error.ambiguousDesignId': '중복된 이름 \'{token}\' — 제공자를 지정하세요: {options}',
408
- 'error.designDownload': '{provider}/{name}: DESIGN.md 다운로드 실패',
409
- 'error.readmeFetch': 'README 가져오기 실패: HTTP {status}',
410
- }
1
+ // 한국어 카탈로그. 키 집합은 en.mjs를 그대로 따른다.
2
+ export default {
3
+ 'locale.en': 'English',
4
+ 'locale.ko': '한국어',
5
+
6
+ 'error.notGitRepo': 'git 저장소 안에서 실행해야 합니다.',
7
+ 'error.pathOutsideRepo': '저장소 밖의 경로에는 쓸 수 없습니다: {path}',
8
+ 'error.pathUnresolvable': '경로를 확인할 수 없습니다: {path} ({code})',
9
+ 'error.pathEscapesViaLink': '저장소 내부 경로가 외부 링크를 통해 이탈합니다: {path} -> {real}',
10
+
11
+ 'usage.bootstrap': [
12
+ '사용법: npx @rch4com/agent-setup bootstrap [--skill-mode auto|link|copy] [--dry-run]',
13
+ ' node install.mjs bootstrap [옵션] # 저장소에 설치기를 두고 쓸 때',
14
+ '',
15
+ '옵션:',
16
+ ' --skill-mode auto|link|copy 스킬 연결 방식을 지정합니다. (기본값: auto)',
17
+ ' auto: 심볼릭 링크를 먼저 시도하고, 실패하면 복사로 전환합니다.',
18
+ ' link: 심볼릭 링크만 시도합니다. 실패하면 오류로 종료합니다.',
19
+ ' copy: 항상 복제본을 만듭니다.',
20
+ ' --adopt 파일을 만들지 않고, 이미 있는 파일 중 이 버전의',
21
+ ' 템플릿과 같은 것만 관리 대상으로 기록합니다.',
22
+ ' --lang en|ko 이번 실행에 쓸 표시 언어입니다.',
23
+ ' --dry-run 아무것도 바꾸지 않고 예정된 동작만 출력합니다.',
24
+ ' -h, --help 이 도움말을 출력하고 종료합니다.',
25
+ '',
26
+ '런처로도 사용할 수 있습니다:',
27
+ ' ./setup-agents.sh [옵션]',
28
+ ' pwsh -File ./setup-agents.ps1 [옵션]',
29
+ ' --tui (또는 -Tui)를 주면 의존성을 설치하고 대화형 화면을 엽니다.',
30
+ ' 거기서 부트스트랩·에이전트·design.md를 한 목록에서 검색하고 고릅니다.',
31
+ ],
32
+ 'usage.root': [
33
+ '사용법: npx @rch4com/agent-setup [옵션]',
34
+ ' npx @rch4com/agent-setup bootstrap [옵션]',
35
+ ' npx @rch4com/agent-setup update [옵션]',
36
+ ' npx @rch4com/agent-setup status [옵션]',
37
+ ' npx @rch4com/agent-setup design [옵션]',
38
+ '',
39
+ '저장소에 설치기를 두고 쓸 때는 npx @rch4com/agent-setup 자리에',
40
+ 'node install.mjs 를 넣으면 됩니다.',
41
+ '',
42
+ '옵션이 없으면 대화형 화면을 엽니다 — 부트스트랩·에이전트·design.md를',
43
+ '한 목록에서 검색하고 고릅니다.',
44
+ '',
45
+ '옵션:',
46
+ ' --list 현재 설치 상태만 출력하고 종료합니다.',
47
+ ' --set <목록> 쉼표로 구분한 항목을 목표 상태로 맞춥니다.',
48
+ ' 전체 제거는 --set "" 로 명시하세요.',
49
+ ' --skill-mode auto|link|copy 대화형 화면에서 실행하는 부트스트랩의 스킬',
50
+ ' 연결 방식입니다. (기본값: auto)',
51
+ ' --design-dir <경로> design.md 소스를 더합니다. <소스id>=<경로>',
52
+ ' 형식도 받으며 반복 지정할 수 있습니다.',
53
+ ' --lang en|ko 이번 실행에 쓸 표시 언어입니다.',
54
+ ' --dry-run 아무것도 바꾸지 않고 예정된 동작만 출력합니다.',
55
+ ' -h, --help 이 도움말을 출력하고 종료합니다.',
56
+ '',
57
+ '--list와 --set은 동작을 고르는 플래그라 함께 쓸 수 없습니다.',
58
+ '',
59
+ '서브커맨드 도움말: npx @rch4com/agent-setup bootstrap --help',
60
+ ' npx @rch4com/agent-setup update --help',
61
+ ' npx @rch4com/agent-setup status --help',
62
+ ' npx @rch4com/agent-setup design --help',
63
+ ],
64
+ 'usage.design': [
65
+ '사용법: npx @rch4com/agent-setup design [옵션]',
66
+ ' node install.mjs design [옵션] # 저장소에 설치기를 두고 쓸 때',
67
+ '',
68
+ '옵션이 없으면 대화형 화면을 엽니다 — DESIGN.MD 섹션이 그 안에 있습니다.',
69
+ '',
70
+ '옵션:',
71
+ ' --list 카탈로그와 설치 상태를 출력합니다.',
72
+ ' --set <목록> 쉼표로 구분한 항목을 목표 상태로 맞춥니다.',
73
+ ' 토큰은 <이름> 또는 <제공자>/<이름> 입니다.',
74
+ ' 전체 제거는 --set "" 로 명시하세요.',
75
+ ' --preview <목록> 미리보기를 엽니다.',
76
+ ' --sync=installed 설치본을 원본 최신으로 다시 받습니다.',
77
+ ' --sync=catalog 사용 가능 목록·카테고리를 소스에서 다시 만듭니다.',
78
+ ' --sync=stale 설치본을 원본과 해시 비교합니다.',
79
+ ' --design-dir <경로> design.md 소스를 더합니다. <소스id>=<경로>',
80
+ ' 형식도 받으며 반복 지정할 수 있습니다.',
81
+ ' --lang en|ko 이번 실행에 쓸 표시 언어입니다.',
82
+ ' --dry-run 아무것도 바꾸지 않고 예정된 동작만 출력합니다.',
83
+ ' -h, --help 이 도움말을 출력하고 종료합니다.',
84
+ '',
85
+ '--list, --set, --preview, --sync는 동작을 고르는 플래그라',
86
+ '한 번에 하나만 지정할 수 있습니다.',
87
+ ],
88
+ 'usage.update': [
89
+ '사용법: npx @rch4com/agent-setup update [옵션]',
90
+ '',
91
+ '설치 기록에 남은 해시와 대조해, 우리가 쓴 그대로인 관리 파일만',
92
+ '최신 템플릿으로 갱신합니다. 사용자가 고친 파일은 건드리지 않고',
93
+ '드리프트로 보고합니다.',
94
+ '',
95
+ '옵션:',
96
+ ' --force 드리프트 파일까지 덮어씁니다. 워킹트리가 깨끗해야 합니다',
97
+ ' (git이 유일한 되돌리기 수단이므로).',
98
+ ' --lang en|ko 이번 실행에 쓸 표시 언어입니다.',
99
+ ' --dry-run 아무것도 바꾸지 않고 예정된 동작만 출력합니다.',
100
+ ' -h, --help 이 도움말을 출력하고 종료합니다.',
101
+ ],
102
+ 'usage.status': [
103
+ '사용법: npx @rch4com/agent-setup status [옵션]',
104
+ '',
105
+ '설치 기록(의도) / 실제 저장소 상태(스캔) / 실행 중 도구 버전을',
106
+ '나란히 보여줍니다. 아무것도 바꾸지 않습니다.',
107
+ '',
108
+ '옵션:',
109
+ ' --json 기계가 읽을 형태로 출력합니다 (CI 판정용).',
110
+ ' --lang en|ko 이번 실행에 쓸 표시 언어입니다.',
111
+ ' -h, --help 이 도움말을 출력하고 종료합니다.',
112
+ ],
113
+
114
+ 'error.unknownArg': '알 수 없는 인자입니다: {token}\n\n{usage}',
115
+ 'error.flagTakesNoValue': '{name}에는 값을 줄 수 없습니다: {token}\n\n{usage}',
116
+ 'error.singleAction': '함께 쓸 수 없습니다: {given} — 동작 플래그는 한 번에 하나만 지정하세요.\n\n{usage}',
117
+ 'error.badSkillMode': '--skill-mode는 {list} 중 하나여야 합니다: {value}\n\n{usage}',
118
+ 'error.skillModeNeedsValue': '--skill-mode 뒤에 값이 필요합니다 ({list} 중 하나).\n\n{usage}',
119
+ 'error.badLang': '--lang은 {list} 중 하나여야 합니다: {value}\n\n{usage}',
120
+ 'error.langNeedsValue': '--lang 뒤에 값이 필요합니다 ({list} 중 하나).\n\n{usage}',
121
+ 'error.needsValue': '{name} 뒤에 값이 필요합니다.',
122
+ 'error.setNeedsValue': '--set 뒤에 항목 목록이 필요합니다. 전체 제거는 --set "" 로 명시하세요.',
123
+ 'error.badSync': '--sync=installed|catalog|stale 형식으로 지정하세요.',
124
+
125
+ 'status.installed': '설치됨',
126
+ 'status.partial': '일부 설치됨',
127
+ 'status.absent': '미설치',
128
+
129
+ 'change.install': '설치',
130
+ 'change.complete': '보완 설치',
131
+ 'change.uninstall': '제거',
132
+
133
+ 'apply.noChanges': '변경할 항목이 없습니다.',
134
+ 'apply.finalState': '최종 상태:',
135
+ 'apply.seeGitDiff': '설정 파일 변경 내용은 git diff로 확인할 수 있습니다.',
136
+ 'error.unknownItem': '알 수 없는 항목: {id}',
137
+
138
+ 'error.depsMissing': [
139
+ '이 기능에는 의존성이 필요합니다. 다음 중 하나를 실행하세요:',
140
+ ' ./setup-agents.sh --tui',
141
+ ' npm install --prefix agent-installer',
142
+ ],
143
+
144
+ 'log.record.write': '설치 기록 기록: {path}',
145
+ 'error.recordUnreadable': '{path}을 읽을 수 없습니다 ({code})',
146
+ 'error.recordNotJson': '{path}을 읽을 수 없습니다 — JSON이 아닙니다 ({message})',
147
+ 'error.recordVersion': '{path}의 형식 버전이 {found}입니다. 이 도구는 {expected}을 씁니다 — 도구를 올리거나 기록을 다시 만드세요.',
148
+
149
+ 'log.repoRoot': '저장소 루트: {path}',
150
+ 'log.noGlobalWrites': '글로벌 설정 경로는 읽거나 수정하지 않습니다.',
151
+ 'log.dir.create': '디렉터리 생성: {path}',
152
+ 'log.file.keep': '기존 파일 유지: {path}',
153
+ 'log.file.create': '파일 생성: {path}',
154
+ 'log.file.update': '파일 갱신: {path}',
155
+ 'log.file.userEdited': '사용자 수정 — 건드리지 않음: {path}',
156
+ 'log.block.keep': '관리 블록 확인: {path}',
157
+ 'log.block.add': '관리 블록 추가: {path}',
158
+ 'log.block.update': '관리 블록 갱신: {path}',
159
+ 'log.block.missing': '관리 블록 없음 — 건드리지 않음: {path}',
160
+ 'log.block.userEdited': '블록 사용자 수정 — 건드리지 않음: {path}',
161
+ 'log.json.keep': '설정 키 확인: {path} — {key}',
162
+ 'log.json.add': '설정 키 추가: {path} — {key}',
163
+ 'log.ignore.keep': '.gitignore 항목 확인: {entries}',
164
+ 'log.ignore.add': '.gitignore 항목 추가: {entries}',
165
+ 'log.warn.unreadable': '경고: {path}을 읽을 수 없어 건너뜁니다 ({code})',
166
+ 'log.warn.noRootObject': '경고: {path}에서 루트 객체를 찾지 못해 건너뜁니다',
167
+ 'log.warn.ignoreShadowed': '경고: .gitignore의 "{parent}"가 디렉터리 전체를 제외해 "{entry}" 부정 항목이 무효화됩니다. "{parent}/*" 형태로 바꾸면 다시 포함됩니다.',
168
+ 'log.skill.linkOk': '{tool} 스킬 링크 확인: {path}',
169
+ 'log.skill.linkCreate': '{tool} 스킬 링크 생성: {path} -> {target}',
170
+ 'log.skill.copyCreate': '{tool} 스킬 복제본 생성: {path}',
171
+ 'log.skill.copySync': '{tool} 스킬 복제본 동기화: {path}',
172
+ 'log.skill.plan': '{tool} 스킬 어댑터 생성 예정: {path} ({mode})',
173
+ 'log.skill.warnForeignLink': '경고: {path} 경로가 다른 위치를 가리키는 링크입니다. 변경하지 않습니다.',
174
+ 'log.skill.warnUnmanaged': '경고: {path} 경로가 이미 존재하며 agent-kit 관리 대상이 아닙니다. 변경하지 않습니다.',
175
+ 'log.skill.linkFellBack': '경고: {tool} 링크 생성에 실패하여 복사 방식으로 전환합니다.',
176
+
177
+ 'msg.readFailed': '읽기 실패',
178
+ 'msg.noRootObject': '루트 객체 없음',
179
+ 'msg.foreignLink': '다른 위치를 가리키는 링크',
180
+ 'msg.unmanagedExisting': '관리 대상이 아닌 기존 항목',
181
+ 'msg.noManagedBlock': '관리 블록 없음',
182
+ 'msg.linkFailed': '링크 생성 실패: {message}',
183
+
184
+ 'bootstrap.failures': '실패 {count}건:',
185
+ 'bootstrap.done': '완료되었습니다.',
186
+ 'bootstrap.sharedGuide': '공통 지침: AGENTS.md',
187
+ 'bootstrap.sharedSkills': '공통 스킬: .agents/skills/',
188
+ 'bootstrap.tools': '적용 도구: {list}',
189
+ 'bootstrap.repoOnly': '도구별 설정은 모두 현재 저장소 안에만 생성되었습니다.',
190
+ 'bootstrap.noOverwrite': '기존 설정 파일은 덮어쓰지 않았습니다.',
191
+ 'bootstrap.record': '설치 기록: {path}',
192
+
193
+ 'error.badSkillModeRuntime': '--skill-mode는 {list} 중 하나여야 합니다: {value}',
194
+
195
+ // status·update 화면 문구. status.row.tool/files는 원본보다 공백을 늘려
196
+ // items 블록(설치됨·기록에만·저장소에만)과 값 시작 열을 맞췄다 — 나머지는
197
+ // 기존 status.mjs·update.mjs의 문구를 그대로 옮겼다.
198
+ 'status.noRecord': '설치 기록이 없습니다.',
199
+ 'status.noRecord.hint1': ' 이 저장소를 기록 체계로 끌어오려면 bootstrap --adopt 를 실행하세요.',
200
+ 'status.noRecord.hint2': ' 파일을 만들지 않고, 템플릿과 같은 파일만 관리 대상으로 기록합니다.',
201
+ 'status.row.tool': '도구 {version}',
202
+ 'status.version.pinned': '{pinned} 고정 · 실행 중 {running}',
203
+ 'status.version.latest': '{pinned} 고정 · 실행 중 {running} · 최신 {latest}',
204
+ 'status.hint.update': ' → update로 고정 버전을 옮길 수 있습니다',
205
+ 'status.row.files': '관리 파일 {total}개 중 {current} 최신 · {pending} 갱신 대기 · {drift} 사용자 수정',
206
+ 'status.hint.pending': ' → update',
207
+ 'status.hint.drift': ' → 사용자 수정 파일은 update가 건드리지 않습니다',
208
+ 'status.row.items': '항목 설치됨 {list}',
209
+ 'status.row.recordOnly': ' 기록에만 {list}',
210
+ 'status.row.repoOnly': ' 저장소에만 {list}',
211
+ 'status.none': '(없음)',
212
+ 'update.versionMove': '고정 {pinned} → 실행 중 {running}',
213
+ 'update.summary': '갱신 {updated}건 · 신규 {created}건 · 드리프트 {drift}건',
214
+ 'update.driftHeader': '드리프트 (건드리지 않았습니다)',
215
+ 'update.driftHint': '최신 템플릿을 반영하려면 update --force (워킹트리가 깨끗해야 합니다)',
216
+ 'error.forceNeedsCleanTree': '--force는 워킹트리가 깨끗할 때만 쓸 수 있습니다. git이 유일한 되돌리기 수단이라 커밋되지 않은 변경 위에 덮어쓰면 복구할 수 없습니다.',
217
+ 'error.noRecordForUpdate': '{path}이 없습니다. 이 저장소를 기록 체계로 끌어오려면 먼저 `bootstrap --adopt`를 실행하세요 — 파일을 만들지 않고 기록만 만듭니다.',
218
+
219
+ // 항목 카탈로그 — 기존 원문을 그대로 옮긴다. en.mjs 쪽 주석 참고.
220
+ 'item.unsupported.claudePlugin': 'Claude Code 전용 플러그인',
221
+ 'item.unsupported.claudeSkill': 'Claude Code 스킬 설치본',
222
+ 'item.unsupported.ponytailUser': '상류 설치 경로가 사용자 스코프입니다 (codex·copilot 플러그인, gemini 확장)',
223
+ 'item.unsupported.ponytailRules': '플러그인 기구가 없습니다 — 규칙을 AGENTS.md에 직접 옮겨 적으세요',
224
+ 'item.unsupported.upstreamNone': '상류에 공식 설치 경로가 없습니다',
225
+ 'item.unsupported.superpowersSeparate': '상류가 하니스별 별도 설치로 지원합니다 — 이 항목은 Claude Code 플러그인만 배선합니다',
226
+ 'item.unsupported.bkitPort': '상류가 별도 배포판(bkit-codex·bkit-gemini)으로 지원합니다 — 이 플러그인과 별개 설치이며, Gemini판은 Antigravity 승계 추정입니다',
227
+ 'item.unsupported.impeccableJunction': '상류는 지원하지만 npx impeccable install이 공유 .agents/skills 연결을 끊어 플러그인 경로만 배선합니다',
228
+ 'item.unsupported.gstackHost': '상류는 ./setup --host로 지원합니다 — 이 항목은 Claude Code에만 설치합니다',
229
+ 'item.unsupported.gsdFlag': '상류는 런타임 플래그로 지원합니다 — 이 항목은 --claude로만 설치합니다',
230
+ 'item.unsupported.gsdGemini': '상류가 Gemini CLI 지원을 제거했습니다(2026-06 종료) — Antigravity가 --antigravity로 승계합니다',
231
+ 'item.mcp.partial': '등록됨: {present} / 누락: {missing}',
232
+ 'item.plugin.partial': '배선됨: {present} / 누락: {missing}',
233
+ 'item.plugin.deferred': '설정 기록됨 — 다음 Claude Code 실행 시 다운로드됩니다',
234
+ 'item.scanFailed': '감지 실패: {message}',
235
+ 'log.mcp.add': ' [dry-run] {cli} 설정에 {name} 등록',
236
+ 'log.mcp.remove': ' [dry-run] {cli} 설정에서 {name} 제거',
237
+ 'log.plugin.add': ' [dry-run] {cli} 설정에 플러그인 {name} 추가',
238
+ 'log.plugin.remove': ' [dry-run] {cli} 설정에서 플러그인 {name} 제거',
239
+
240
+ 'item.mcp.notion.note': '인증: 각 CLI 첫 사용 시 OAuth',
241
+ 'item.mcp.vercel.note': '인증: 첫 사용 시 OAuth (승인된 클라이언트만 연결 가능)',
242
+ 'item.mcp.supabase.note': '인증: OAuth 동적 등록. 프로젝트 고정이 필요하면 URL에 ?project_ref=<id> 추가',
243
+ 'item.mcp.codebase-memory.note': 'PATH에 codebase-memory-mcp 바이너리 필요. 설치: https://github.com/DeusData/codebase-memory-mcp (install.sh / install.ps1)',
244
+ 'item.mcp.graphify.note': 'PATH에 graphify-mcp 바이너리 필요. 설치: uv tool install "graphifyy[mcp]". graphify-out/graph.json을 읽으므로 /graphify .로 그래프를 먼저 만드세요',
245
+ 'item.mcp.headroom.note': 'PATH에 headroom 바이너리 필요. 설치: uv tool install --python 3.13 "headroom-ai[proxy,mcp]". 프록시(headroom wrap)는 실행 방식이라 저장소 설정 대상이 아닙니다',
246
+ 'item.plugin.superpowers.note': '공식 마켓플레이스 플러그인. 상류는 Codex·Antigravity 등 11개 하니스를 하니스별 설치로 지원합니다',
247
+ 'item.plugin.mattpocock-skills.note': '엔지니어링·생산성 스킬 22종 (tdd, code-review, research 등)',
248
+ 'item.plugin.ponytail.note': '군더더기 없는 코드 규칙 묶음. Claude Code 플러그인과 OpenCode plugin 항목을 저장소 범위로 배선합니다',
249
+ 'item.plugin.ecc.note': '에이전트 하네스용 스킬·본능·메모리·보안 묶음. skills/에 281개가 들어 있어 공유 스킬 디렉터리에 복사하지 않고 플러그인으로 설치합니다',
250
+ 'item.plugin.impeccable.note': 'AI 하네스용 디자인 언어. 플러그인 경로를 쓰는 이유는 npx impeccable install이 .claude/skills를 갈아치워 공유 .agents/skills 연결을 끊기 때문입니다',
251
+ 'item.plugin.understand-anything.note': '코드베이스를 탐색 가능한 지식 그래프로 만듭니다. 다른 CLI용 스크립트는 ~/.understand-anything에 클론하는 사용자 스코프라 플러그인만 배선합니다',
252
+ 'item.skill.caveman.note': '원시인 말투로 답해 출력 토큰을 줄입니다. 코드와 오류는 그대로 둡니다. /caveman으로 켜고 끕니다',
253
+ 'item.skill.taste.note': '랜딩 페이지·포트폴리오·리디자인용 안티슬롭 프런트엔드 스킬 (스킬 이름: design-taste-frontend)',
254
+ 'item.skill.hallmark.note': '네 가지 동사(신규 제작·audit·redesign·study)를 갖춘 안티 AI슬롭 디자인 스킬. 테마 21종과 슬롭 테스트 57종. 상류는 Cursor·Codex 경로도 안내하지만 공유 스킬 디렉터리 하나로 10개 CLI가 함께 봅니다',
255
+ 'item.skill.karpathy.note': '과설계와 모호한 완료 기준을 줄이는 행동 지침',
256
+ 'item.skill.gstack.note': '저장소 로컬 clone + setup (bash 필요, Windows는 Git Bash). 런타임 상태(~/.gstack)는 전역에 생길 수 있음.',
257
+ 'item.skill.gsd.note': 'npx @opengsd/gsd-core 프로젝트 로컬 설치. 상류는 Codex·Antigravity 등 18개 런타임을 지원합니다(이 항목은 --claude)',
258
+ // 커밋 템플릿은 CLI 배선이 아니라 저장소 규약이다 — en.mjs 쪽 주석 참고.
259
+ 'item.config.gitmessage.en.note': '커밋 메시지를 영어로 씁니다. 템플릿을 놓고 git commit.template이 그것을 가리키게 하므로, 저장소의 모든 편집기와 도구에서 함께 열립니다',
260
+ 'item.config.gitmessage.ko.note': '커밋 메시지를 한국어로 씁니다. 템플릿을 놓고 git commit.template이 그것을 가리키게 하므로, 저장소의 모든 편집기와 도구에서 함께 열립니다',
261
+ 'item.gitmessage.unregistered': '파일은 놓였지만 commit.template이 아직 가리키지 않습니다',
262
+ 'log.gitmessage.write': ' [dry-run] {path} 생성',
263
+ 'log.gitmessage.remove': ' [dry-run] {path} 제거',
264
+ 'error.gitmessageForeign': '{path}가 이미 있고 이 도구가 쓴 내용이 아닙니다. 손으로 쓴 템플릿은 덮어쓰지 않습니다 — 먼저 옮기거나 지우세요.',
265
+ 'error.gitmessageConfig': 'git config commit.template 실패: {output}',
266
+ 'error.exclusiveItems': '같은 파일을 쓰는 항목이라 하나만 고를 수 있습니다: {ids}',
267
+ 'error.gstackClone': 'gstack clone 실패: {output}',
268
+ 'error.gstackSetup': 'gstack setup 실패: {output}',
269
+ 'error.gsdInstall': 'GSD 설치 실패: {output}',
270
+ 'error.gsdUninstall': 'GSD 제거 실패: {output}',
271
+ 'error.ponytailOpencodePlugin': '{file}: plugin 키가 배열이 아닙니다. 덮어쓰지 않고 그대로 둡니다 — "@dietrichgebert/ponytail"을 직접 추가하세요.',
272
+ 'error.registrySkillInstall': '스킬 레지스트리 설치 실패 ({skill}): {output}',
273
+ 'error.itemFieldMissing': '{file}: {field} 누락',
274
+ 'error.itemReasonMissing': '{id}: 미지원 CLI \'{cli}\'의 사유(unsupported.{cli})가 필요합니다',
275
+ 'error.shellQuote': '셸에 넘길 수 없는 큰따옴표가 인자에 있습니다: {value}',
276
+
277
+ // TUI 탭 이름. en.mjs 쪽 주석 참고. PLUGIN·MCP·SKILL·DESIGN.MD는 형식·브랜드
278
+ // 이름이라 번역하지 않는다 — 두 로케일에서 값이 같은 게 맞다.
279
+ 'section.action': '작업',
280
+ 'section.plugin': 'PLUGIN',
281
+ 'section.mcp': 'MCP',
282
+ 'section.skill': 'SKILL',
283
+ 'section.config': 'CONFIG',
284
+ 'section.design': 'DESIGN.MD',
285
+
286
+ // TUI 목록·검토 화면 문구. en.mjs 쪽 주석 참고.
287
+ 'tui.counts': '선택 {picked} / 전체 {total}',
288
+ 'tui.search.prefix': '검색 › ',
289
+ 'tui.search.placeholder': '타이핑하면 검색 · ↓ 로 목록',
290
+ 'tui.empty.filtered': ' 이 탭에는 일치하는 항목이 없습니다. Tab으로 다른 탭을 보세요.',
291
+ 'tui.empty.none': ' 항목이 없습니다.',
292
+ 'tui.hint.search': '입력=검색어 ↓ 목록으로 Tab 탭이동 Esc 검색해제 Ctrl+F CLI Ctrl+D 상세',
293
+ 'tui.hint.list': 'Space 선택 ↑↓ 이동 Tab 탭 Enter 실행/제출 Ctrl+A 전체 Ctrl+O 미리보기 Ctrl+F CLI Ctrl+D 상세',
294
+ // 힌트 줄 오른쪽 끝의 고정 자리. en.mjs 쪽 주석 참고.
295
+ 'tui.hint.quit': 'Ctrl+Q 종료',
296
+ 'tui.review.title': '제출 검토 — 변경 {count}건',
297
+ 'tui.review.more': ' …외 {count}건',
298
+ 'tui.review.hint': 'Enter 적용 Esc 취소 Ctrl+Q 종료',
299
+ 'tui.notItemRow': '이 행은 Enter로 실행합니다.',
300
+ 'tui.noPreview': '이 항목은 미리보기를 제공하지 않습니다.',
301
+ 'tui.opened': '열었습니다: {target}',
302
+ 'tui.noChanges': '변경할 항목이 없습니다.',
303
+ 'tui.submitCancelled': '제출을 취소했습니다.',
304
+ 'tui.toggledAll': '{tab} 탭의 보이는 항목을 모두 선택했습니다.',
305
+ 'tui.toggledNone': '{tab} 탭의 보이는 항목을 모두 해제했습니다.',
306
+ // 배타 묶음에서 형제가 함께 꺼졌을 때. en.mjs 쪽 주석 참고.
307
+ 'tui.exclusiveSwitched': '{kept}(으)로 바꿨습니다 — 같은 파일이라 {dropped}은(는) 해제했습니다.',
308
+ 'tui.nonInteractive': '대화형 화면은 터미널에서만 열립니다. --list · --set 으로도 다룰 수 있습니다.',
309
+ 'tui.pressAnyKey': '계속하려면 아무 키나 누르세요…',
310
+ 'tui.confirmSuffix': ' [y/N] ',
311
+
312
+ // 진행 화면(tui/progress.mjs) 문구. en.mjs 쪽 주석 참고.
313
+ 'progress.title': '적용 중 — 변경 {count}건{suffix}',
314
+ 'progress.counter': '{done}/{total} {percent}%',
315
+ 'progress.elapsed': '{seconds}초',
316
+ 'progress.elapsedMin': '{minutes}분{seconds}초',
317
+ 'progress.running': '{seconds}초 경과',
318
+ 'progress.more': ' …외 {count}건',
319
+ 'progress.abortHint': 'Ctrl+C 중단 (현재 항목까지 마칩니다)',
320
+ 'progress.aborted': '중단했습니다 — {count}건 건너뜀',
321
+ 'progress.skipped': '건너뜀',
322
+ 'progress.done': '끝났습니다 — 성공 {ok}건, 실패 {failed}건{skippedSuffix}',
323
+ 'progress.plain': '[{index}/{total}] {action} {label}',
324
+ 'progress.plainDone': ' {mark} {seconds}초',
325
+
326
+ // 언어 행(action.language) 전용. en.mjs 쪽 주석 참고.
327
+ 'tui.lang.saved': '{path}에 저장했습니다',
328
+ 'tui.lang.dryRun': 'dry-run — 이번 세션에만 적용했습니다',
329
+ 'tui.lang.saveFailed': '언어를 저장하지 못했습니다: {message}',
330
+ 'tui.lang.overridden': '다음 실행에서는 --lang / AGENT_SETUP_LANG이 여전히 이깁니다.',
331
+
332
+ // CLI 필터 표시. en.mjs 쪽 주석 참고.
333
+ 'tui.filter.prefix': 'CLI › ',
334
+ 'tui.filter.position': '{current}/{total}',
335
+ 'tui.filter.empty': ' 이 탭에는 {cli}에 배선되는 항목이 없습니다.',
336
+
337
+ 'item.location.user': '설치 위치: 사용자 글로벌',
338
+ 'item.target': '대상 파일: {path}',
339
+ // en.mjs 쪽 주석 참고.
340
+ 'item.cliCoverage': 'CLI {covered}/{total}',
341
+ 'item.unsupportedList': '미배선 {count}곳: {groups}',
342
+ 'item.unsupportedGroup': '{clis} — {why}',
343
+ 'detail.wired': '배선',
344
+ 'detail.unwired': '미배선',
345
+ 'detail.provider': '공급자',
346
+ 'detail.preview': '미리보기',
347
+ 'detail.target': '대상 파일',
348
+ 'detail.scope.project': '저장소 스코프',
349
+ 'detail.scope.user': '사용자 전역',
350
+ 'detail.more': ' …외 {count}줄 — Ctrl+D로 펼치기',
351
+ 'detail.empty': ' 커서를 항목 위에 올리면 상세가 보입니다.',
352
+
353
+ // 상주 언어 행 — en.mjs 쪽 주석 참고.
354
+ 'action.language.label': '언어',
355
+ 'action.language.hint': '{current} · Enter로 변경',
356
+ 'action.bootstrap.label': '부트스트랩 실행',
357
+ 'action.bootstrap.hint': '지침 · 스킬 · 도구별 설정 · 파일 {total}개 중 {present}개 존재',
358
+ 'action.sync.installed.label': '설치본 업데이트',
359
+ 'action.sync.installed.hint': 'design.md 설치본을 원본 최신으로 다시 받는다',
360
+ 'action.sync.catalog.label': '카탈로그 새로고침',
361
+ 'action.sync.catalog.hint': 'design.md 목록·카테고리를 소스에서 다시 만든다',
362
+ 'action.sync.stale.label': '오래된 항목 확인',
363
+ 'action.sync.stale.hint': '설치본을 원본과 해시 비교한다',
364
+
365
+ // design.md 서브시스템. en.mjs 쪽 주석 참고.
366
+ 'category.other': '기타',
367
+ 'category.local': '사내',
368
+ // 항목 탭 안쪽의 성격 그룹. en.mjs 쪽 주석 참고.
369
+ 'category.token': '토큰 절감',
370
+ 'category.context': '코드 이해',
371
+ 'category.style': '디자인 감각',
372
+ 'category.flow': '작업 방식',
373
+ // 헤더 하나가 무엇을 고르는 자리이고 규칙이 무엇인지 함께 말한다. en.mjs 쪽 주석 참고.
374
+ 'category.commit': '커밋 메시지 템플릿 · .gitmessage.txt · 하나만 고릅니다',
375
+ 'category.service': '외부 서비스',
376
+ 'design.localSuffix': '{id} (로컬)',
377
+ 'design.localTag': '로컬',
378
+ 'design.unknownItem': ' 알 수 없는 항목: {token}',
379
+ 'design.ambiguous': ' 중복된 이름 \'{token}\' — 제공자를 지정하세요: {options}',
380
+ 'design.provider.count': ' {label}: {count}개',
381
+ 'design.provider.failed': ' {label}: 실패 — {message}',
382
+ 'design.catalog.empty': '가져온 항목이 없어 카탈로그를 갱신하지 않습니다.',
383
+ 'design.catalog.planned': ' [dry-run] {total}개로 갱신 예정',
384
+ 'design.catalog.updated': '카탈로그 갱신됨: {total}개',
385
+ 'design.none': '설치된 design.md가 없습니다.',
386
+ 'design.updated': ' ✔ 업데이트 {label}',
387
+ 'design.updateFailed': ' ✖ 업데이트 {label} — {message}',
388
+ 'design.sourceCheckFailed': ' ? {label}: 원본 확인 실패',
389
+ 'design.allCurrent': '모든 설치본이 최신입니다.',
390
+ 'design.staleList': '오래된 항목 {count}개: {names}',
391
+ 'design.staleConfirm': '{count}개를 지금 업데이트할까요?',
392
+ 'design.unknownSync': '알 수 없는 동기화 작업: {action}',
393
+ 'design.write': ' [dry-run] design-md/{provider}/{name}/DESIGN.md 작성',
394
+ 'design.remove': ' [dry-run] design-md/{provider}/{name} 제거',
395
+ 'design.nameClash': ' design.md 이름이 겹쳐 \'{picked}\'로 구분합니다: {path}',
396
+ 'design.sourceIdClash': ' design.md 소스 id가 겹쳐 \'{picked}\'로 사용합니다: {path}',
397
+ 'design.noDesignFile': ' design.md 소스에 DESIGN.md가 없습니다: {path}',
398
+ 'design.pathMissing': ' design.md 경로를 찾을 수 없습니다: {path}',
399
+ 'design.noPreviewUrl': ' {label}: 미리보기 URL이 없습니다.',
400
+ 'design.openFailed': ' {label}: 열기 실패 — 직접 여세요: {target}',
401
+ 'design.notOpenable': '열 수 있는 대상이 아닙니다',
402
+
403
+ 'error.catalogUnreadable': 'design.md 카탈로그를 읽을 수 없습니다: {path}\n{message}\n`design --sync=catalog`로 다시 만들 수 있습니다.',
404
+ 'error.responseTooLarge': '응답이 상한({limit} 바이트)을 넘었습니다: {url}',
405
+ 'error.badDesignId': '잘못된 design.md 식별자: {provider}/{name}',
406
+ // resolveTokens(--set/--preview 토큰 해석)의 예외 전용 — design.ambiguous와
407
+ // 같은 상황이지만 로그 줄이 아니라 최상위 예외라 들여쓰기가 없다.
408
+ 'error.ambiguousDesignId': '중복된 이름 \'{token}\' — 제공자를 지정하세요: {options}',
409
+ 'error.designDownload': '{provider}/{name}: DESIGN.md 다운로드 실패',
410
+ 'error.readmeFetch': 'README 가져오기 실패: HTTP {status}',
411
+ }