claude-settings-sync 0.3.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/LICENSE +21 -0
- package/README.ko.md +203 -0
- package/README.md +203 -0
- package/bin/claudesync.js +2 -0
- package/dist/chunk-45GTBXRR.js +145 -0
- package/dist/chunk-45GTBXRR.js.map +1 -0
- package/dist/chunk-BRTRPVT7.js +101 -0
- package/dist/chunk-BRTRPVT7.js.map +1 -0
- package/dist/chunk-VBOSEAEH.js +81 -0
- package/dist/chunk-VBOSEAEH.js.map +1 -0
- package/dist/chunk-XTJEVOK3.js +867 -0
- package/dist/chunk-XTJEVOK3.js.map +1 -0
- package/dist/cli.js +1693 -0
- package/dist/cli.js.map +1 -0
- package/dist/config-7KJ6CZMX.js +33 -0
- package/dist/config-7KJ6CZMX.js.map +1 -0
- package/dist/gist-AMKOY723.js +21 -0
- package/dist/gist-AMKOY723.js.map +1 -0
- package/dist/scanner-M3SQGNTI.js +11 -0
- package/dist/scanner-M3SQGNTI.js.map +1 -0
- package/package.json +42 -0
|
@@ -0,0 +1,867 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
userConfigPath
|
|
4
|
+
} from "./chunk-VBOSEAEH.js";
|
|
5
|
+
|
|
6
|
+
// src/utils/i18n.ts
|
|
7
|
+
import { existsSync, readFileSync, writeFileSync } from "fs";
|
|
8
|
+
var messages = {
|
|
9
|
+
// ── General ───────────────────────────────
|
|
10
|
+
"app.name": { ko: "claudesync", en: "claudesync" },
|
|
11
|
+
"app.description": {
|
|
12
|
+
ko: "Claude Code \uC124\uC815\uC744 GitHub Gist\uB85C \uB3D9\uAE30\uD654\uD569\uB2C8\uB2E4",
|
|
13
|
+
en: "Sync Claude Code settings via GitHub Gist"
|
|
14
|
+
},
|
|
15
|
+
// ── Auth ──────────────────────────────────
|
|
16
|
+
"auth.no_token": {
|
|
17
|
+
ko: "\uC778\uC99D \uC815\uBCF4\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4. `claudesync init`\uC744 \uBA3C\uC800 \uC2E4\uD589\uD558\uC138\uC694.",
|
|
18
|
+
en: "No auth found. Run `claudesync init` first."
|
|
19
|
+
},
|
|
20
|
+
"auth.token_saved": {
|
|
21
|
+
ko: "\uD1A0\uD070\uC774 \uC800\uC7A5\uB418\uC5C8\uC2B5\uB2C8\uB2E4.",
|
|
22
|
+
en: "Token saved."
|
|
23
|
+
},
|
|
24
|
+
"auth.device_prompt": {
|
|
25
|
+
ko: "\uC544\uB798 URL\uC744 \uBE0C\uB77C\uC6B0\uC800\uC5D0\uC11C \uC5F4\uACE0 \uCF54\uB4DC\uB97C \uC785\uB825\uD558\uC138\uC694:",
|
|
26
|
+
en: "Open the following URL and enter the code:"
|
|
27
|
+
},
|
|
28
|
+
"auth.waiting": {
|
|
29
|
+
ko: "\uC778\uC99D \uB300\uAE30 \uC911...",
|
|
30
|
+
en: "Waiting for authorization..."
|
|
31
|
+
},
|
|
32
|
+
"auth.success": {
|
|
33
|
+
ko: "\uC778\uC99D \uC131\uACF5!",
|
|
34
|
+
en: "Authentication successful!"
|
|
35
|
+
},
|
|
36
|
+
"auth.enter_token": {
|
|
37
|
+
ko: "GitHub Personal Access Token (gist \uC2A4\uCF54\uD504 \uD544\uC694): ",
|
|
38
|
+
en: "GitHub Personal Access Token (gist scope required): "
|
|
39
|
+
},
|
|
40
|
+
// ── Push ──────────────────────────────────
|
|
41
|
+
"push.scanning": {
|
|
42
|
+
ko: "\uC124\uC815 \uD30C\uC77C\uC744 \uC2A4\uCE94 \uC911...",
|
|
43
|
+
en: "Scanning settings files..."
|
|
44
|
+
},
|
|
45
|
+
"push.no_files": {
|
|
46
|
+
ko: "\uB3D9\uAE30\uD654\uD560 \uD30C\uC77C\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.",
|
|
47
|
+
en: "No files to sync."
|
|
48
|
+
},
|
|
49
|
+
"push.summary": {
|
|
50
|
+
ko: "\uBCC0\uACBD \uC694\uC57D:",
|
|
51
|
+
en: "Change summary:"
|
|
52
|
+
},
|
|
53
|
+
"push.confirm": {
|
|
54
|
+
ko: "\uC704 \uBCC0\uACBD\uC0AC\uD56D\uC744 Gist\uC5D0 \uC5C5\uB85C\uB4DC\uD558\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?",
|
|
55
|
+
en: "Upload these changes to Gist?"
|
|
56
|
+
},
|
|
57
|
+
"push.success": {
|
|
58
|
+
ko: "Gist\uC5D0 \uB3D9\uAE30\uD654 \uC644\uB8CC!",
|
|
59
|
+
en: "Synced to Gist!"
|
|
60
|
+
},
|
|
61
|
+
"push.cancelled": {
|
|
62
|
+
ko: "\uC5C5\uB85C\uB4DC\uAC00 \uCDE8\uC18C\uB418\uC5C8\uC2B5\uB2C8\uB2E4.",
|
|
63
|
+
en: "Upload cancelled."
|
|
64
|
+
},
|
|
65
|
+
"push.creating_gist": {
|
|
66
|
+
ko: "\uC0C8 Gist\uB97C \uC0DD\uC131 \uC911...",
|
|
67
|
+
en: "Creating new Gist..."
|
|
68
|
+
},
|
|
69
|
+
// ── Pull ──────────────────────────────────
|
|
70
|
+
"pull.fetching": {
|
|
71
|
+
ko: "Gist\uC5D0\uC11C \uC124\uC815\uC744 \uAC00\uC838\uC624\uB294 \uC911...",
|
|
72
|
+
en: "Fetching settings from Gist..."
|
|
73
|
+
},
|
|
74
|
+
"pull.no_changes": {
|
|
75
|
+
ko: "\uBCC0\uACBD\uC0AC\uD56D\uC774 \uC5C6\uC2B5\uB2C8\uB2E4. \uB85C\uCEEC\uACFC \uC6D0\uACA9\uC774 \uB3D9\uC77C\uD569\uB2C8\uB2E4.",
|
|
76
|
+
en: "No changes. Local and remote are identical."
|
|
77
|
+
},
|
|
78
|
+
"pull.confirm": {
|
|
79
|
+
ko: "\uC704 \uBCC0\uACBD\uC0AC\uD56D\uC744 \uB85C\uCEEC\uC5D0 \uC801\uC6A9\uD558\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?",
|
|
80
|
+
en: "Apply these changes locally?"
|
|
81
|
+
},
|
|
82
|
+
"pull.success": {
|
|
83
|
+
ko: "\uB85C\uCEEC \uC124\uC815\uC774 \uC5C5\uB370\uC774\uD2B8\uB418\uC5C8\uC2B5\uB2C8\uB2E4!",
|
|
84
|
+
en: "Local settings updated!"
|
|
85
|
+
},
|
|
86
|
+
"pull.cancelled": {
|
|
87
|
+
ko: "\uBCF5\uC6D0\uC774 \uCDE8\uC18C\uB418\uC5C8\uC2B5\uB2C8\uB2E4.",
|
|
88
|
+
en: "Restore cancelled."
|
|
89
|
+
},
|
|
90
|
+
// ── Diff ──────────────────────────────────
|
|
91
|
+
"diff.no_diff": {
|
|
92
|
+
ko: "\uCC28\uC774\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.",
|
|
93
|
+
en: "No differences found."
|
|
94
|
+
},
|
|
95
|
+
// ── Status ────────────────────────────────
|
|
96
|
+
"status.authenticated": {
|
|
97
|
+
ko: "\uC778\uC99D\uB428",
|
|
98
|
+
en: "Authenticated"
|
|
99
|
+
},
|
|
100
|
+
"status.not_authenticated": {
|
|
101
|
+
ko: "\uC778\uC99D \uC548\uB428",
|
|
102
|
+
en: "Not authenticated"
|
|
103
|
+
},
|
|
104
|
+
"status.gist_linked": {
|
|
105
|
+
ko: "Gist \uC5F0\uACB0\uB428",
|
|
106
|
+
en: "Gist linked"
|
|
107
|
+
},
|
|
108
|
+
"status.no_gist": {
|
|
109
|
+
ko: "Gist \uC5F0\uACB0 \uC548\uB428",
|
|
110
|
+
en: "No Gist linked"
|
|
111
|
+
},
|
|
112
|
+
// ── History ───────────────────────────────
|
|
113
|
+
"history.title": {
|
|
114
|
+
ko: "\uB3D9\uAE30\uD654 \uD788\uC2A4\uD1A0\uB9AC",
|
|
115
|
+
en: "Sync history"
|
|
116
|
+
},
|
|
117
|
+
"history.empty": {
|
|
118
|
+
ko: "\uD788\uC2A4\uD1A0\uB9AC\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.",
|
|
119
|
+
en: "No history found."
|
|
120
|
+
},
|
|
121
|
+
// ── Conflict ──────────────────────────────
|
|
122
|
+
"conflict.detected": {
|
|
123
|
+
ko: "\uCDA9\uB3CC\uC774 \uAC10\uC9C0\uB418\uC5C8\uC2B5\uB2C8\uB2E4:",
|
|
124
|
+
en: "Conflicts detected:"
|
|
125
|
+
},
|
|
126
|
+
"conflict.options": {
|
|
127
|
+
ko: "\uB85C\uCEEC \uC720\uC9C0 / \uC6D0\uACA9 \uC801\uC6A9 / diff \uBCF4\uAE30 / \uAC74\uB108\uB6F0\uAE30",
|
|
128
|
+
en: "Keep local / Use remote / Show diff / Skip"
|
|
129
|
+
},
|
|
130
|
+
// ── Errors ────────────────────────────────
|
|
131
|
+
"error.gist_not_found": {
|
|
132
|
+
ko: "Gist\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. ID\uB97C \uD655\uC778\uD558\uC138\uC694.",
|
|
133
|
+
en: "Gist not found. Check the ID."
|
|
134
|
+
},
|
|
135
|
+
"error.api_failed": {
|
|
136
|
+
ko: "GitHub API \uC694\uCCAD \uC2E4\uD328:",
|
|
137
|
+
en: "GitHub API request failed:"
|
|
138
|
+
},
|
|
139
|
+
"error.path_unsafe": {
|
|
140
|
+
ko: "\uC548\uC804\uD558\uC9C0 \uC54A\uC740 \uACBD\uB85C\uAC00 \uAC10\uC9C0\uB418\uC5C8\uC2B5\uB2C8\uB2E4:",
|
|
141
|
+
en: "Unsafe path detected:"
|
|
142
|
+
},
|
|
143
|
+
// ── Auto Sync ────────────────────────────────
|
|
144
|
+
"auto.title": {
|
|
145
|
+
ko: "\uC790\uB3D9 \uB3D9\uAE30\uD654 \uC124\uC815",
|
|
146
|
+
en: "Auto Sync Setup"
|
|
147
|
+
},
|
|
148
|
+
"auto.select_direction": {
|
|
149
|
+
ko: "push / pull \uC911 \uC120\uD0DD\uD558\uC138\uC694:",
|
|
150
|
+
en: "Select push or pull:"
|
|
151
|
+
},
|
|
152
|
+
"auto.direction_push": {
|
|
153
|
+
ko: "Push \u2014 \uC774 \uB514\uBC14\uC774\uC2A4\uC758 \uC124\uC815\uC744 Gist\uC5D0 \uC790\uB3D9 \uC5C5\uB85C\uB4DC",
|
|
154
|
+
en: "Push \u2014 auto-upload this device settings to Gist"
|
|
155
|
+
},
|
|
156
|
+
"auto.direction_pull": {
|
|
157
|
+
ko: "Pull \u2014 Gist\uC758 \uC124\uC815\uC744 \uC774 \uB514\uBC14\uC774\uC2A4\uC5D0 \uC790\uB3D9 \uB2E4\uC6B4\uB85C\uB4DC",
|
|
158
|
+
en: "Pull \u2014 auto-download Gist settings to this device"
|
|
159
|
+
},
|
|
160
|
+
"auto.primary_warning": {
|
|
161
|
+
ko: "\uD604\uC7AC Primary \uB514\uBC14\uC774\uC2A4: {machine} ({hostname}). \uC774 \uB514\uBC14\uC774\uC2A4\uB85C \uBCC0\uACBD\uD558\uBA74 \uAE30\uC874 \uB514\uBC14\uC774\uC2A4\uC758 auto push\uB294 \uBB34\uC2DC\uB429\uB2C8\uB2E4.",
|
|
162
|
+
en: "Current primary device: {machine} ({hostname}). Changing to this device will ignore the previous auto push."
|
|
163
|
+
},
|
|
164
|
+
"auto.select_conflict_policy": {
|
|
165
|
+
ko: "\uB85C\uCEEC \uD30C\uC77C\uC774 \uBCC0\uACBD\uB41C \uACBD\uC6B0 \uCC98\uB9AC \uBC29\uC2DD:",
|
|
166
|
+
en: "How to handle locally modified files:"
|
|
167
|
+
},
|
|
168
|
+
"auto.policy_overwrite": {
|
|
169
|
+
ko: "Overwrite \u2014 \uC6D0\uACA9\uC73C\uB85C \uB36E\uC5B4\uC4F0\uAE30",
|
|
170
|
+
en: "Overwrite \u2014 replace with remote"
|
|
171
|
+
},
|
|
172
|
+
"auto.policy_skip": {
|
|
173
|
+
ko: "Skip \u2014 \uB85C\uCEEC \uBCC0\uACBD \uD30C\uC77C\uC740 \uAC74\uB108\uB6F0\uAE30",
|
|
174
|
+
en: "Skip \u2014 skip locally modified files"
|
|
175
|
+
},
|
|
176
|
+
"auto.policy_backup": {
|
|
177
|
+
ko: "Backup \u2014 .bak \uBC31\uC5C5 \uD6C4 \uB36E\uC5B4\uC4F0\uAE30",
|
|
178
|
+
en: "Backup \u2014 backup to .bak then overwrite"
|
|
179
|
+
},
|
|
180
|
+
"auto.select_interval": {
|
|
181
|
+
ko: "\uB3D9\uAE30\uD654 \uC8FC\uAE30\uB97C \uC785\uB825\uD558\uC138\uC694 (\uC608: 5m, 1h, 30s, 1d):",
|
|
182
|
+
en: "Enter sync interval (e.g., 5m, 1h, 30s, 1d):"
|
|
183
|
+
},
|
|
184
|
+
"auto.interval_too_short": {
|
|
185
|
+
ko: "\uCD5C\uC18C \uC8FC\uAE30\uB294 1\uBD84(60\uCD08)\uC785\uB2C8\uB2E4.",
|
|
186
|
+
en: "Minimum interval is 1 minute (60 seconds)."
|
|
187
|
+
},
|
|
188
|
+
"auto.interval_invalid": {
|
|
189
|
+
ko: "\uC62C\uBC14\uB978 \uD615\uC2DD: \uC22B\uC790 + s/m/h/d (\uC608: 5m, 1h)",
|
|
190
|
+
en: "Valid format: number + s/m/h/d (e.g., 5m, 1h)"
|
|
191
|
+
},
|
|
192
|
+
"auto.select_categories": {
|
|
193
|
+
ko: "\uB3D9\uAE30\uD654\uD560 \uCE74\uD14C\uACE0\uB9AC\uB97C \uC120\uD0DD\uD558\uC138\uC694 (\uC27C\uD45C\uB85C \uAD6C\uBD84, \uBE48 \uC785\uB825=\uC804\uCCB4):",
|
|
194
|
+
en: "Select categories to sync (comma-separated, empty=all):"
|
|
195
|
+
},
|
|
196
|
+
"auto.select_encrypt": {
|
|
197
|
+
ko: "\uC554\uD638\uD654\uB97C \uD65C\uC131\uD654\uD558\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?",
|
|
198
|
+
en: "Enable encryption?"
|
|
199
|
+
},
|
|
200
|
+
"auto.enabled": {
|
|
201
|
+
ko: "\uC790\uB3D9 \uB3D9\uAE30\uD654\uAC00 \uD65C\uC131\uD654\uB418\uC5C8\uC2B5\uB2C8\uB2E4!",
|
|
202
|
+
en: "Auto sync enabled!"
|
|
203
|
+
},
|
|
204
|
+
"auto.disabled": {
|
|
205
|
+
ko: "\uC790\uB3D9 \uB3D9\uAE30\uD654\uAC00 \uBE44\uD65C\uC131\uD654\uB418\uC5C8\uC2B5\uB2C8\uB2E4.",
|
|
206
|
+
en: "Auto sync disabled."
|
|
207
|
+
},
|
|
208
|
+
"auto.not_configured": {
|
|
209
|
+
ko: "\uC790\uB3D9 \uB3D9\uAE30\uD654\uAC00 \uC124\uC815\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4. `claudesync auto`\uB97C \uC2E4\uD589\uD558\uC138\uC694.",
|
|
210
|
+
en: "Auto sync not configured. Run `claudesync auto`."
|
|
211
|
+
},
|
|
212
|
+
"auto.status_title": {
|
|
213
|
+
ko: "\uC790\uB3D9 \uB3D9\uAE30\uD654 \uC0C1\uD0DC",
|
|
214
|
+
en: "Auto Sync Status"
|
|
215
|
+
},
|
|
216
|
+
"auto.confirm_primary_change": {
|
|
217
|
+
ko: "Primary \uB514\uBC14\uC774\uC2A4\uB97C \uC774 \uBA38\uC2E0\uC73C\uB85C \uBCC0\uACBD\uD558\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?",
|
|
218
|
+
en: "Change primary device to this machine?"
|
|
219
|
+
},
|
|
220
|
+
"auto.lock_held": {
|
|
221
|
+
ko: "\uB3D9\uAE30\uD654\uAC00 \uC9C4\uD589 \uC911\uC785\uB2C8\uB2E4. \uC7A0\uC2DC \uD6C4 \uB2E4\uC2DC \uC2DC\uB3C4\uD558\uC138\uC694.",
|
|
222
|
+
en: "Sync in progress. Try again later."
|
|
223
|
+
},
|
|
224
|
+
// ── Config ───────────────────────────────────
|
|
225
|
+
"config.not_set": {
|
|
226
|
+
ko: "(\uC124\uC815 \uC548\uB428)",
|
|
227
|
+
en: "(not set)"
|
|
228
|
+
},
|
|
229
|
+
"config.invalid_lang": {
|
|
230
|
+
ko: "\uC9C0\uC6D0\uD558\uB294 \uC5B8\uC5B4: ko, en",
|
|
231
|
+
en: "Supported languages: ko, en"
|
|
232
|
+
},
|
|
233
|
+
"config.lang_saved": {
|
|
234
|
+
ko: "\uC5B8\uC5B4 \uC124\uC815\uC774 \uC800\uC7A5\uB418\uC5C8\uC2B5\uB2C8\uB2E4.",
|
|
235
|
+
en: "Language setting saved."
|
|
236
|
+
},
|
|
237
|
+
"config.unknown_key": {
|
|
238
|
+
ko: "\uC54C \uC218 \uC5C6\uB294 \uC124\uC815 \uD0A4\uC785\uB2C8\uB2E4. \uC0AC\uC6A9 \uAC00\uB2A5: lang",
|
|
239
|
+
en: "Unknown config key. Available: lang"
|
|
240
|
+
},
|
|
241
|
+
// ── Help ─────────────────────────────────────
|
|
242
|
+
"help.usage": {
|
|
243
|
+
ko: "\uC0AC\uC6A9\uBC95: claudesync <command> [options]",
|
|
244
|
+
en: "Usage: claudesync <command> [options]"
|
|
245
|
+
},
|
|
246
|
+
"help.commands": {
|
|
247
|
+
ko: "\uBA85\uB839\uC5B4:",
|
|
248
|
+
en: "Commands:"
|
|
249
|
+
},
|
|
250
|
+
"help.options": {
|
|
251
|
+
ko: "\uC635\uC158:",
|
|
252
|
+
en: "Options:"
|
|
253
|
+
},
|
|
254
|
+
"help.init": {
|
|
255
|
+
ko: "\uC778\uC99D \uC124\uC815 (OAuth Device Flow)",
|
|
256
|
+
en: "Set up authentication (OAuth Device Flow)"
|
|
257
|
+
},
|
|
258
|
+
"help.init_token": {
|
|
259
|
+
ko: "PAT \uC218\uB3D9 \uC785\uB825",
|
|
260
|
+
en: "Manual PAT input"
|
|
261
|
+
},
|
|
262
|
+
"help.link": {
|
|
263
|
+
ko: "\uAE30\uC874 Gist \uC5F0\uACB0",
|
|
264
|
+
en: "Link existing Gist"
|
|
265
|
+
},
|
|
266
|
+
"help.push": {
|
|
267
|
+
ko: "\uB85C\uCEEC \u2192 Gist \uC5C5\uB85C\uB4DC",
|
|
268
|
+
en: "Upload local \u2192 Gist"
|
|
269
|
+
},
|
|
270
|
+
"help.pull": {
|
|
271
|
+
ko: "Gist \u2192 \uB85C\uCEEC \uBCF5\uC6D0",
|
|
272
|
+
en: "Restore Gist \u2192 local"
|
|
273
|
+
},
|
|
274
|
+
"help.diff": {
|
|
275
|
+
ko: "\uB85C\uCEEC vs \uC6D0\uACA9 \uBE44\uAD50",
|
|
276
|
+
en: "Compare local vs remote"
|
|
277
|
+
},
|
|
278
|
+
"help.status": {
|
|
279
|
+
ko: "\uC778\uC99D/\uB3D9\uAE30\uD654 \uC0C1\uD0DC \uD655\uC778",
|
|
280
|
+
en: "Check auth/sync status"
|
|
281
|
+
},
|
|
282
|
+
"help.list": {
|
|
283
|
+
ko: "\uB3D9\uAE30\uD654 \uB300\uC0C1 \uB85C\uCEEC \uD30C\uC77C \uBAA9\uB85D",
|
|
284
|
+
en: "List local files to sync"
|
|
285
|
+
},
|
|
286
|
+
"help.history": {
|
|
287
|
+
ko: "Gist revision \uD788\uC2A4\uD1A0\uB9AC",
|
|
288
|
+
en: "Gist revision history"
|
|
289
|
+
},
|
|
290
|
+
"help.rollback": {
|
|
291
|
+
ko: "\uD2B9\uC815 \uBC84\uC804\uC73C\uB85C \uBCF5\uC6D0",
|
|
292
|
+
en: "Restore to specific version"
|
|
293
|
+
},
|
|
294
|
+
"help.auto": {
|
|
295
|
+
ko: "\uC790\uB3D9 \uB3D9\uAE30\uD654 \uC124\uC815 (\uC778\uD130\uB799\uD2F0\uBE0C)",
|
|
296
|
+
en: "Set up auto sync (interactive)"
|
|
297
|
+
},
|
|
298
|
+
"help.auto_disable": {
|
|
299
|
+
ko: "\uC790\uB3D9 \uB3D9\uAE30\uD654 \uD574\uC81C",
|
|
300
|
+
en: "Disable auto sync"
|
|
301
|
+
},
|
|
302
|
+
"help.auto_status": {
|
|
303
|
+
ko: "\uC790\uB3D9 \uB3D9\uAE30\uD654 \uC0C1\uD0DC \uD655\uC778",
|
|
304
|
+
en: "Check auto sync status"
|
|
305
|
+
},
|
|
306
|
+
"help.config": {
|
|
307
|
+
ko: "\uC124\uC815 \uAD00\uB9AC",
|
|
308
|
+
en: "Manage configuration"
|
|
309
|
+
},
|
|
310
|
+
"help.opt_message": {
|
|
311
|
+
ko: "push \uC2DC \uBA54\uC2DC\uC9C0 \uAE30\uB85D (history\uC5D0\uC11C \uD45C\uC2DC)",
|
|
312
|
+
en: "Record message on push (shown in history)"
|
|
313
|
+
},
|
|
314
|
+
"help.opt_only": {
|
|
315
|
+
ko: "\uCE74\uD14C\uACE0\uB9AC \uD544\uD130 (settings|instructions|hooks|skills|plugins|teams|ui)",
|
|
316
|
+
en: "Category filter (settings|instructions|hooks|skills|plugins|teams|ui)"
|
|
317
|
+
},
|
|
318
|
+
"help.opt_force": {
|
|
319
|
+
ko: "\uD655\uC778 \uC5C6\uC774 \uC2E4\uD589",
|
|
320
|
+
en: "Run without confirmation"
|
|
321
|
+
},
|
|
322
|
+
"help.opt_encrypt": {
|
|
323
|
+
ko: "\uC554\uD638\uD654 \uD65C\uC131\uD654",
|
|
324
|
+
en: "Enable encryption"
|
|
325
|
+
},
|
|
326
|
+
"help.opt_lang": {
|
|
327
|
+
ko: "\uC5B8\uC5B4 \uC124\uC815",
|
|
328
|
+
en: "Set language"
|
|
329
|
+
},
|
|
330
|
+
"help.opt_help": {
|
|
331
|
+
ko: "\uB3C4\uC6C0\uB9D0",
|
|
332
|
+
en: "Help"
|
|
333
|
+
},
|
|
334
|
+
"help.opt_version": {
|
|
335
|
+
ko: "\uBC84\uC804 \uC815\uBCF4",
|
|
336
|
+
en: "Version info"
|
|
337
|
+
},
|
|
338
|
+
// ── CLI ──────────────────────────────────────
|
|
339
|
+
"cli.link_usage": {
|
|
340
|
+
ko: "Usage: claudesync link <gist-id>",
|
|
341
|
+
en: "Usage: claudesync link <gist-id>"
|
|
342
|
+
},
|
|
343
|
+
"cli.rollback_usage": {
|
|
344
|
+
ko: "Usage: claudesync rollback <version>",
|
|
345
|
+
en: "Usage: claudesync rollback <version>"
|
|
346
|
+
},
|
|
347
|
+
"cli.list_empty": {
|
|
348
|
+
ko: "\uB3D9\uAE30\uD654 \uB300\uC0C1 \uD30C\uC77C \uC5C6\uC74C",
|
|
349
|
+
en: "No files to sync"
|
|
350
|
+
},
|
|
351
|
+
"cli.list_total": {
|
|
352
|
+
ko: "\uCD1D {count}\uAC1C \uD30C\uC77C",
|
|
353
|
+
en: "{count} files total"
|
|
354
|
+
},
|
|
355
|
+
"cli.unknown_command": {
|
|
356
|
+
ko: "\uC54C \uC218 \uC5C6\uB294 \uBA85\uB839\uC5B4: {command}",
|
|
357
|
+
en: "Unknown command: {command}"
|
|
358
|
+
},
|
|
359
|
+
// ── Terminal ─────────────────────────────────
|
|
360
|
+
"terminal.select_prompt": {
|
|
361
|
+
ko: "\uC120\uD0DD (1-{max}):",
|
|
362
|
+
en: "Choose (1-{max}):"
|
|
363
|
+
},
|
|
364
|
+
// ── Init ─────────────────────────────────────
|
|
365
|
+
"init.no_token_input": {
|
|
366
|
+
ko: "\uD1A0\uD070\uC774 \uC785\uB825\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4.",
|
|
367
|
+
en: "No token entered."
|
|
368
|
+
},
|
|
369
|
+
"init.gist_linked": {
|
|
370
|
+
ko: "Gist {id}\uC5D0 \uC5F0\uACB0\uB418\uC5C8\uC2B5\uB2C8\uB2E4.",
|
|
371
|
+
en: "Linked to Gist {id}."
|
|
372
|
+
},
|
|
373
|
+
"init.validating": {
|
|
374
|
+
ko: "\uD1A0\uD070 \uAC80\uC99D \uC911...",
|
|
375
|
+
en: "Validating token..."
|
|
376
|
+
},
|
|
377
|
+
"init.token_invalid": {
|
|
378
|
+
ko: "\uD1A0\uD070\uC774 \uC720\uD6A8\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. gist \uC2A4\uCF54\uD504\uAC00 \uC788\uB294\uC9C0 \uD655\uC778\uD558\uC138\uC694.",
|
|
379
|
+
en: "Token is invalid. Make sure it has the gist scope."
|
|
380
|
+
},
|
|
381
|
+
"init.searching_gist": {
|
|
382
|
+
ko: "\uAE30\uC874 claudesync Gist \uAC80\uC0C9 \uC911...",
|
|
383
|
+
en: "Searching for existing claudesync Gist..."
|
|
384
|
+
},
|
|
385
|
+
"init.gist_found": {
|
|
386
|
+
ko: "\uAE30\uC874 Gist\uB97C \uCC3E\uC558\uC2B5\uB2C8\uB2E4: {id}",
|
|
387
|
+
en: "Found existing Gist: {id}"
|
|
388
|
+
},
|
|
389
|
+
"init.no_gist": {
|
|
390
|
+
ko: "\uAE30\uC874 Gist\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4. `claudesync push`\uB85C \uC0C8\uB85C \uC0DD\uC131\uD558\uC138\uC694.",
|
|
391
|
+
en: "No existing Gist found. Run `claudesync push` to create one."
|
|
392
|
+
},
|
|
393
|
+
// ── Push (additional) ────────────────────────
|
|
394
|
+
"push.secret_found": {
|
|
395
|
+
ko: "{path}: {count}\uAC1C \uC758\uC2EC \uD56D\uBAA9 \uBC1C\uACAC",
|
|
396
|
+
en: "{path}: {count} suspicious item(s) found"
|
|
397
|
+
},
|
|
398
|
+
"push.no_changes": {
|
|
399
|
+
ko: "\uBCC0\uACBD\uC0AC\uD56D \uC5C6\uC74C. \uB85C\uCEEC\uACFC \uC6D0\uACA9\uC774 \uB3D9\uC77C\uD569\uB2C8\uB2E4.",
|
|
400
|
+
en: "No changes. Local and remote are identical."
|
|
401
|
+
},
|
|
402
|
+
"push.gist_not_found_creating": {
|
|
403
|
+
ko: "Gist\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. \uC0C8\uB85C \uC0DD\uC131\uD569\uB2C8\uB2E4.",
|
|
404
|
+
en: "Gist not found. Creating a new one."
|
|
405
|
+
},
|
|
406
|
+
"push.uploading_new": {
|
|
407
|
+
ko: "{count}\uAC1C \uD30C\uC77C\uC744 \uC0C8 Gist\uC5D0 \uC5C5\uB85C\uB4DC\uD569\uB2C8\uB2E4:",
|
|
408
|
+
en: "Uploading {count} file(s) to new Gist:"
|
|
409
|
+
},
|
|
410
|
+
// ── Pull (additional) ────────────────────────
|
|
411
|
+
"pull.no_gist": {
|
|
412
|
+
ko: "Gist\uAC00 \uC5F0\uACB0\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4. `claudesync push` \uB610\uB294 `claudesync link <id>`\uB97C \uBA3C\uC800 \uC2E4\uD589\uD558\uC138\uC694.",
|
|
413
|
+
en: "No Gist linked. Run `claudesync push` or `claudesync link <id>` first."
|
|
414
|
+
},
|
|
415
|
+
"pull.changes_heading": {
|
|
416
|
+
ko: "\uBCC0\uACBD\uC0AC\uD56D:",
|
|
417
|
+
en: "Changes:"
|
|
418
|
+
},
|
|
419
|
+
"pull.icon_added": {
|
|
420
|
+
ko: "+ \uCD94\uAC00",
|
|
421
|
+
en: "+ Add"
|
|
422
|
+
},
|
|
423
|
+
"pull.icon_modified": {
|
|
424
|
+
ko: "~ \uC218\uC815",
|
|
425
|
+
en: "~ Mod"
|
|
426
|
+
},
|
|
427
|
+
"pull.icon_deleted": {
|
|
428
|
+
ko: "- \uC0AD\uC81C",
|
|
429
|
+
en: "- Del"
|
|
430
|
+
},
|
|
431
|
+
"pull.diff_truncated": {
|
|
432
|
+
ko: "({count}\uC904 \uBCC0\uACBD \u2014 claudesync diff\uB85C \uC804\uCCB4 \uD655\uC778)",
|
|
433
|
+
en: "({count} lines changed \u2014 run claudesync diff to see full diff)"
|
|
434
|
+
},
|
|
435
|
+
"pull.skip_deleted": {
|
|
436
|
+
ko: "\uC2A4\uD0B5: {path} (\uC6D0\uACA9\uC5D0\uC11C \uC0AD\uC81C\uB428, \uB85C\uCEEC\uC740 \uC720\uC9C0)",
|
|
437
|
+
en: "Skipped: {path} (deleted on remote, kept locally)"
|
|
438
|
+
},
|
|
439
|
+
"pull.decrypt_failed": {
|
|
440
|
+
ko: "\uBCF5\uD638\uD654 \uC2E4\uD328: {path}",
|
|
441
|
+
en: "Decryption failed: {path}"
|
|
442
|
+
},
|
|
443
|
+
"pull.applied": {
|
|
444
|
+
ko: "{count}\uAC1C \uD30C\uC77C \uC801\uC6A9",
|
|
445
|
+
en: "{count} file(s) applied"
|
|
446
|
+
},
|
|
447
|
+
// ── Diff (additional) ────────────────────────
|
|
448
|
+
"diff.no_gist": {
|
|
449
|
+
ko: "Gist\uAC00 \uC5F0\uACB0\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4.",
|
|
450
|
+
en: "No Gist linked."
|
|
451
|
+
},
|
|
452
|
+
"diff.fetching": {
|
|
453
|
+
ko: "\uC6D0\uACA9 \uC124\uC815\uC744 \uAC00\uC838\uC624\uB294 \uC911...",
|
|
454
|
+
en: "Fetching remote settings..."
|
|
455
|
+
},
|
|
456
|
+
"diff.total": {
|
|
457
|
+
ko: "\uCD1D {count}\uAC1C \uD30C\uC77C\uC5D0 \uCC28\uC774\uAC00 \uC788\uC2B5\uB2C8\uB2E4.",
|
|
458
|
+
en: "{count} file(s) have differences."
|
|
459
|
+
},
|
|
460
|
+
// ── Status (additional) ──────────────────────
|
|
461
|
+
"status.title": {
|
|
462
|
+
ko: "claudesync \uC0C1\uD0DC",
|
|
463
|
+
en: "claudesync status"
|
|
464
|
+
},
|
|
465
|
+
"status.auth_label": {
|
|
466
|
+
ko: "\uC778\uC99D",
|
|
467
|
+
en: "Auth"
|
|
468
|
+
},
|
|
469
|
+
"status.gist_label": {
|
|
470
|
+
ko: "Gist",
|
|
471
|
+
en: "Gist"
|
|
472
|
+
},
|
|
473
|
+
"status.last_sync": {
|
|
474
|
+
ko: "\uB9C8\uC9C0\uB9C9 \uB3D9\uAE30\uD654:",
|
|
475
|
+
en: "Last sync:"
|
|
476
|
+
},
|
|
477
|
+
"status.machine": {
|
|
478
|
+
ko: "\uBA38\uC2E0",
|
|
479
|
+
en: "Machine"
|
|
480
|
+
},
|
|
481
|
+
"status.host": {
|
|
482
|
+
ko: "\uD638\uC2A4\uD2B8",
|
|
483
|
+
en: "Host"
|
|
484
|
+
},
|
|
485
|
+
"status.platform": {
|
|
486
|
+
ko: "\uD50C\uB7AB\uD3FC",
|
|
487
|
+
en: "Platform"
|
|
488
|
+
},
|
|
489
|
+
"status.time": {
|
|
490
|
+
ko: "\uC2DC\uAC04",
|
|
491
|
+
en: "Time"
|
|
492
|
+
},
|
|
493
|
+
"status.file_count": {
|
|
494
|
+
ko: "\uD30C\uC77C \uC218",
|
|
495
|
+
en: "Files"
|
|
496
|
+
},
|
|
497
|
+
"status.remote_files": {
|
|
498
|
+
ko: "\uC6D0\uACA9 \uD30C\uC77C: {count}\uAC1C",
|
|
499
|
+
en: "Remote files: {count}"
|
|
500
|
+
},
|
|
501
|
+
"status.gist_fetch_failed": {
|
|
502
|
+
ko: "Gist \uC870\uD68C \uC2E4\uD328 \u2014 \uB124\uD2B8\uC6CC\uD06C\uB97C \uD655\uC778\uD558\uC138\uC694",
|
|
503
|
+
en: "Failed to fetch Gist \u2014 check your network"
|
|
504
|
+
},
|
|
505
|
+
"status.current_machine": {
|
|
506
|
+
ko: "\uD604\uC7AC \uBA38\uC2E0",
|
|
507
|
+
en: "Current machine"
|
|
508
|
+
},
|
|
509
|
+
// ── History (additional) ─────────────────────
|
|
510
|
+
"history.no_gist": {
|
|
511
|
+
ko: "Gist\uAC00 \uC5F0\uACB0\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4.",
|
|
512
|
+
en: "No Gist linked."
|
|
513
|
+
},
|
|
514
|
+
"history.loading": {
|
|
515
|
+
ko: "\uCD5C\uADFC {count}\uAC1C \uB9AC\uBE44\uC804\uC758 \uBA54\uC2DC\uC9C0\uB97C \uBD88\uB7EC\uC624\uB294 \uC911...",
|
|
516
|
+
en: "Loading messages for {count} recent revision(s)..."
|
|
517
|
+
},
|
|
518
|
+
"history.more": {
|
|
519
|
+
ko: "... \uC678 {count}\uAC1C",
|
|
520
|
+
en: "... and {count} more"
|
|
521
|
+
},
|
|
522
|
+
"history.total": {
|
|
523
|
+
ko: "\uCD1D {count}\uAC1C \uB9AC\uBE44\uC804",
|
|
524
|
+
en: "{count} revision(s) total"
|
|
525
|
+
},
|
|
526
|
+
"history.rollback_hint": {
|
|
527
|
+
ko: "\uBCF5\uC6D0: claudesync rollback <version>",
|
|
528
|
+
en: "Restore: claudesync rollback <version>"
|
|
529
|
+
},
|
|
530
|
+
// ── Rollback ─────────────────────────────────
|
|
531
|
+
"rollback.no_gist": {
|
|
532
|
+
ko: "Gist\uAC00 \uC5F0\uACB0\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4.",
|
|
533
|
+
en: "No Gist linked."
|
|
534
|
+
},
|
|
535
|
+
"rollback.not_found": {
|
|
536
|
+
ko: "\uB9AC\uBE44\uC804 '{version}'\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. `claudesync history`\uB85C \uD655\uC778\uD558\uC138\uC694.",
|
|
537
|
+
en: "Revision '{version}' not found. Run `claudesync history` to check."
|
|
538
|
+
},
|
|
539
|
+
"rollback.restoring": {
|
|
540
|
+
ko: "\uB9AC\uBE44\uC804 {sha} ({date})\uC744 \uBCF5\uC6D0\uD569\uB2C8\uB2E4.",
|
|
541
|
+
en: "Restoring revision {sha} ({date})."
|
|
542
|
+
},
|
|
543
|
+
"rollback.target_heading": {
|
|
544
|
+
ko: "\uBCF5\uC6D0 \uB300\uC0C1:",
|
|
545
|
+
en: "Restore targets:"
|
|
546
|
+
},
|
|
547
|
+
"rollback.new_file": {
|
|
548
|
+
ko: "(\uC0C8 \uD30C\uC77C)",
|
|
549
|
+
en: "(new file)"
|
|
550
|
+
},
|
|
551
|
+
"rollback.decrypt_failed": {
|
|
552
|
+
ko: "\uBCF5\uD638\uD654 \uC2E4\uD328: {path}",
|
|
553
|
+
en: "Decryption failed: {path}"
|
|
554
|
+
},
|
|
555
|
+
"rollback.no_changes": {
|
|
556
|
+
ko: "\uD604\uC7AC \uC0C1\uD0DC\uC640 \uB3D9\uC77C\uD569\uB2C8\uB2E4.",
|
|
557
|
+
en: "Already at this state."
|
|
558
|
+
},
|
|
559
|
+
"rollback.files_changed": {
|
|
560
|
+
ko: "{count}\uAC1C \uD30C\uC77C\uC774 \uBCC0\uACBD\uB429\uB2C8\uB2E4.",
|
|
561
|
+
en: "{count} file(s) will be changed."
|
|
562
|
+
},
|
|
563
|
+
"rollback.confirm": {
|
|
564
|
+
ko: "\uBCF5\uC6D0\uD558\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?",
|
|
565
|
+
en: "Restore?"
|
|
566
|
+
},
|
|
567
|
+
"rollback.cancelled": {
|
|
568
|
+
ko: "\uBCF5\uC6D0\uC774 \uCDE8\uC18C\uB418\uC5C8\uC2B5\uB2C8\uB2E4.",
|
|
569
|
+
en: "Restore cancelled."
|
|
570
|
+
},
|
|
571
|
+
"rollback.success": {
|
|
572
|
+
ko: "\uB9AC\uBE44\uC804 {sha}\uB85C \uBCF5\uC6D0 \uC644\uB8CC!",
|
|
573
|
+
en: "Restored to revision {sha}!"
|
|
574
|
+
},
|
|
575
|
+
// ── Auto (additional) ────────────────────────
|
|
576
|
+
"auto.no_gist": {
|
|
577
|
+
ko: "Gist\uAC00 \uC5F0\uACB0\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4. `claudesync push` \uB610\uB294 `claudesync link <id>`\uB97C \uBA3C\uC800 \uC2E4\uD589\uD558\uC138\uC694.",
|
|
578
|
+
en: "No Gist linked. Run `claudesync push` or `claudesync link <id>` first."
|
|
579
|
+
},
|
|
580
|
+
"auto.setup_cancelled": {
|
|
581
|
+
ko: "\uC124\uC815\uC774 \uCDE8\uC18C\uB418\uC5C8\uC2B5\uB2C8\uB2E4.",
|
|
582
|
+
en: "Setup cancelled."
|
|
583
|
+
},
|
|
584
|
+
"auto.invalid_categories": {
|
|
585
|
+
ko: "\uC720\uD6A8\uD55C \uCE74\uD14C\uACE0\uB9AC\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4. \uC804\uCCB4 \uCE74\uD14C\uACE0\uB9AC\uB85C \uC124\uC815\uD569\uB2C8\uB2E4.",
|
|
586
|
+
en: "No valid categories. Using all categories."
|
|
587
|
+
},
|
|
588
|
+
"auto.scheduler_failed": {
|
|
589
|
+
ko: "\uC2A4\uCF00\uC904\uB7EC \uB4F1\uB85D \uC2E4\uD328: {error}",
|
|
590
|
+
en: "Scheduler registration failed: {error}"
|
|
591
|
+
},
|
|
592
|
+
"auto.primary_register_failed": {
|
|
593
|
+
ko: "Primary \uB514\uBC14\uC774\uC2A4 \uC815\uBCF4\uB97C Gist\uC5D0 \uB4F1\uB85D\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4. \uB2E4\uC74C auto push \uC2DC \uB4F1\uB85D\uB429\uB2C8\uB2E4.",
|
|
594
|
+
en: "Failed to register primary device to Gist. It will be registered on next auto push."
|
|
595
|
+
},
|
|
596
|
+
"auto.summary_direction": {
|
|
597
|
+
ko: "\uBC29\uD5A5",
|
|
598
|
+
en: "Direction"
|
|
599
|
+
},
|
|
600
|
+
"auto.summary_interval": {
|
|
601
|
+
ko: "\uC8FC\uAE30",
|
|
602
|
+
en: "Interval"
|
|
603
|
+
},
|
|
604
|
+
"auto.summary_categories": {
|
|
605
|
+
ko: "\uCE74\uD14C\uACE0\uB9AC",
|
|
606
|
+
en: "Categories"
|
|
607
|
+
},
|
|
608
|
+
"auto.summary_encrypt": {
|
|
609
|
+
ko: "\uC554\uD638\uD654",
|
|
610
|
+
en: "Encrypt"
|
|
611
|
+
},
|
|
612
|
+
"auto.summary_conflict": {
|
|
613
|
+
ko: "\uCDA9\uB3CC \uC815\uCC45",
|
|
614
|
+
en: "Conflict"
|
|
615
|
+
},
|
|
616
|
+
"auto.yes": {
|
|
617
|
+
ko: "\uC608",
|
|
618
|
+
en: "Yes"
|
|
619
|
+
},
|
|
620
|
+
"auto.no": {
|
|
621
|
+
ko: "\uC544\uB2C8\uC624",
|
|
622
|
+
en: "No"
|
|
623
|
+
},
|
|
624
|
+
// ── Auto Status (additional) ─────────────────
|
|
625
|
+
"auto.status_enabled": {
|
|
626
|
+
ko: "\uD65C\uC131",
|
|
627
|
+
en: "Enabled"
|
|
628
|
+
},
|
|
629
|
+
"auto.status_disabled": {
|
|
630
|
+
ko: "\uBE44\uD65C\uC131",
|
|
631
|
+
en: "Disabled"
|
|
632
|
+
},
|
|
633
|
+
"auto.interval_seconds": {
|
|
634
|
+
ko: "{n}\uCD08",
|
|
635
|
+
en: "{n}s"
|
|
636
|
+
},
|
|
637
|
+
"auto.interval_minutes": {
|
|
638
|
+
ko: "{n}\uBD84",
|
|
639
|
+
en: "{n}m"
|
|
640
|
+
},
|
|
641
|
+
"auto.interval_hours": {
|
|
642
|
+
ko: "{n}\uC2DC\uAC04",
|
|
643
|
+
en: "{n}h"
|
|
644
|
+
},
|
|
645
|
+
"auto.interval_days": {
|
|
646
|
+
ko: "{n}\uC77C",
|
|
647
|
+
en: "{n}d"
|
|
648
|
+
},
|
|
649
|
+
"auto.status_label": {
|
|
650
|
+
ko: "\uC0C1\uD0DC",
|
|
651
|
+
en: "Status"
|
|
652
|
+
},
|
|
653
|
+
"auto.created_label": {
|
|
654
|
+
ko: "\uC0DD\uC131\uC77C",
|
|
655
|
+
en: "Created"
|
|
656
|
+
},
|
|
657
|
+
"auto.primary_device_label": {
|
|
658
|
+
ko: "Primary \uB514\uBC14\uC774\uC2A4",
|
|
659
|
+
en: "Primary Device"
|
|
660
|
+
},
|
|
661
|
+
"auto.this_machine": {
|
|
662
|
+
ko: "(\uC774 \uBA38\uC2E0)",
|
|
663
|
+
en: "(this machine)"
|
|
664
|
+
},
|
|
665
|
+
"auto.since_label": {
|
|
666
|
+
ko: "\uB4F1\uB85D\uC77C",
|
|
667
|
+
en: "Since"
|
|
668
|
+
},
|
|
669
|
+
"auto.recent_logs_label": {
|
|
670
|
+
ko: "\uCD5C\uADFC \uB85C\uADF8",
|
|
671
|
+
en: "Recent Logs"
|
|
672
|
+
},
|
|
673
|
+
// ── Core errors ──────────────────────────────
|
|
674
|
+
"error.cli_not_found": {
|
|
675
|
+
ko: "claudesync CLI \uACBD\uB85C\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. \uAE00\uB85C\uBC8C \uC124\uCE58\uB97C \uAD8C\uC7A5\uD569\uB2C8\uB2E4: npm install -g claudesync",
|
|
676
|
+
en: "claudesync CLI path not found. Global install recommended: npm install -g claudesync"
|
|
677
|
+
},
|
|
678
|
+
"auth.device_url": {
|
|
679
|
+
ko: " URL: {url}",
|
|
680
|
+
en: " URL: {url}"
|
|
681
|
+
},
|
|
682
|
+
"auth.device_code": {
|
|
683
|
+
ko: " \uCF54\uB4DC: {code}",
|
|
684
|
+
en: " Code: {code}"
|
|
685
|
+
},
|
|
686
|
+
"auth.oauth_error": {
|
|
687
|
+
ko: "OAuth \uC624\uB958: {error}",
|
|
688
|
+
en: "OAuth error: {error}"
|
|
689
|
+
},
|
|
690
|
+
"auth.device_flow_timeout": {
|
|
691
|
+
ko: "Device flow \uC2DC\uAC04 \uCD08\uACFC",
|
|
692
|
+
en: "Device flow timed out"
|
|
693
|
+
},
|
|
694
|
+
"error.unsupported_platform": {
|
|
695
|
+
ko: "\uC9C0\uC6D0\uD558\uC9C0 \uC54A\uB294 \uD50C\uB7AB\uD3FC: {platform}",
|
|
696
|
+
en: "Unsupported platform: {platform}"
|
|
697
|
+
},
|
|
698
|
+
// ── Auto Run ─────────────────────────────────
|
|
699
|
+
"auto_run.failed": {
|
|
700
|
+
ko: "\uC790\uB3D9 {direction} \uC2E4\uD328: {message}",
|
|
701
|
+
en: "Auto {direction} failed: {message}"
|
|
702
|
+
},
|
|
703
|
+
"auto_run.push_synced": {
|
|
704
|
+
ko: "{count}\uAC1C \uD30C\uC77C \uB3D9\uAE30\uD654\uB428",
|
|
705
|
+
en: "{count} files synced"
|
|
706
|
+
},
|
|
707
|
+
"auto_run.pull_applied": {
|
|
708
|
+
ko: "{applied}\uAC1C \uD30C\uC77C \uC801\uC6A9",
|
|
709
|
+
en: "{applied} files applied"
|
|
710
|
+
},
|
|
711
|
+
"auto_run.pull_applied_skipped": {
|
|
712
|
+
ko: "{applied}\uAC1C \uD30C\uC77C \uC801\uC6A9, {skipped}\uAC1C \uAC74\uB108\uB700",
|
|
713
|
+
en: "{applied} files applied, {skipped} skipped"
|
|
714
|
+
}
|
|
715
|
+
};
|
|
716
|
+
var currentLang = "en";
|
|
717
|
+
function setLang(lang) {
|
|
718
|
+
currentLang = lang;
|
|
719
|
+
}
|
|
720
|
+
function t(key) {
|
|
721
|
+
return messages[key]?.[currentLang] ?? key;
|
|
722
|
+
}
|
|
723
|
+
function detectLang() {
|
|
724
|
+
const env = process.env.LANG || process.env.LANGUAGE || process.env.LC_ALL || "";
|
|
725
|
+
if (env.startsWith("ko")) return "ko";
|
|
726
|
+
return "en";
|
|
727
|
+
}
|
|
728
|
+
function loadLangConfig() {
|
|
729
|
+
const path = userConfigPath();
|
|
730
|
+
if (!existsSync(path)) return null;
|
|
731
|
+
try {
|
|
732
|
+
const data = JSON.parse(readFileSync(path, "utf-8"));
|
|
733
|
+
if (data.lang === "ko" || data.lang === "en") return data.lang;
|
|
734
|
+
return null;
|
|
735
|
+
} catch {
|
|
736
|
+
return null;
|
|
737
|
+
}
|
|
738
|
+
}
|
|
739
|
+
function saveLangConfig(lang) {
|
|
740
|
+
const path = userConfigPath();
|
|
741
|
+
let data = {};
|
|
742
|
+
if (existsSync(path)) {
|
|
743
|
+
try {
|
|
744
|
+
data = JSON.parse(readFileSync(path, "utf-8"));
|
|
745
|
+
} catch {
|
|
746
|
+
data = {};
|
|
747
|
+
}
|
|
748
|
+
}
|
|
749
|
+
data.lang = lang;
|
|
750
|
+
writeFileSync(path, JSON.stringify(data, null, 2), "utf-8");
|
|
751
|
+
}
|
|
752
|
+
|
|
753
|
+
// src/utils/terminal.ts
|
|
754
|
+
import { createInterface } from "readline";
|
|
755
|
+
var esc = (code) => `\x1B[${code}m`;
|
|
756
|
+
var reset = esc("0");
|
|
757
|
+
var c = {
|
|
758
|
+
bold: (s) => `${esc("1")}${s}${reset}`,
|
|
759
|
+
dim: (s) => `${esc("2")}${s}${reset}`,
|
|
760
|
+
red: (s) => `${esc("31")}${s}${reset}`,
|
|
761
|
+
green: (s) => `${esc("32")}${s}${reset}`,
|
|
762
|
+
yellow: (s) => `${esc("33")}${s}${reset}`,
|
|
763
|
+
blue: (s) => `${esc("34")}${s}${reset}`,
|
|
764
|
+
cyan: (s) => `${esc("36")}${s}${reset}`,
|
|
765
|
+
gray: (s) => `${esc("90")}${s}${reset}`
|
|
766
|
+
};
|
|
767
|
+
function info(msg) {
|
|
768
|
+
console.log(`${c.blue("\u2139")} ${msg}`);
|
|
769
|
+
}
|
|
770
|
+
function success(msg) {
|
|
771
|
+
console.log(`${c.green("\u2714")} ${msg}`);
|
|
772
|
+
}
|
|
773
|
+
function warn(msg) {
|
|
774
|
+
console.log(`${c.yellow("\u26A0")} ${msg}`);
|
|
775
|
+
}
|
|
776
|
+
function error(msg) {
|
|
777
|
+
console.error(`${c.red("\u2716")} ${msg}`);
|
|
778
|
+
}
|
|
779
|
+
function heading(msg) {
|
|
780
|
+
console.log(`
|
|
781
|
+
${c.bold(msg)}`);
|
|
782
|
+
}
|
|
783
|
+
function printDiff(filename, lines) {
|
|
784
|
+
console.log(`
|
|
785
|
+
${c.bold(filename)}`);
|
|
786
|
+
console.log(c.dim("\u2500".repeat(60)));
|
|
787
|
+
for (const line of lines) {
|
|
788
|
+
if (line.startsWith("+")) console.log(c.green(line));
|
|
789
|
+
else if (line.startsWith("-")) console.log(c.red(line));
|
|
790
|
+
else if (line.startsWith("@")) console.log(c.cyan(line));
|
|
791
|
+
else console.log(line);
|
|
792
|
+
}
|
|
793
|
+
}
|
|
794
|
+
async function confirm(message, defaultYes = true) {
|
|
795
|
+
const hint = defaultYes ? "[Y/n]" : "[y/N]";
|
|
796
|
+
const answer = await ask(`${message} ${c.dim(hint)} `);
|
|
797
|
+
if (answer.trim() === "") return defaultYes;
|
|
798
|
+
return answer.trim().toLowerCase().startsWith("y");
|
|
799
|
+
}
|
|
800
|
+
async function ask(question) {
|
|
801
|
+
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
802
|
+
return new Promise((resolve) => {
|
|
803
|
+
rl.question(question, (answer) => {
|
|
804
|
+
rl.close();
|
|
805
|
+
resolve(answer);
|
|
806
|
+
});
|
|
807
|
+
});
|
|
808
|
+
}
|
|
809
|
+
async function askHidden(question) {
|
|
810
|
+
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
811
|
+
return new Promise((resolve) => {
|
|
812
|
+
process.stdout.write(question);
|
|
813
|
+
const stdin = process.stdin;
|
|
814
|
+
const wasRaw = stdin.isRaw;
|
|
815
|
+
if (stdin.isTTY) stdin.setRawMode(true);
|
|
816
|
+
let input = "";
|
|
817
|
+
const onData = (ch) => {
|
|
818
|
+
const char = ch.toString("utf8");
|
|
819
|
+
if (char === "\n" || char === "\r") {
|
|
820
|
+
if (stdin.isTTY) stdin.setRawMode(wasRaw ?? false);
|
|
821
|
+
stdin.removeListener("data", onData);
|
|
822
|
+
process.stdout.write("\n");
|
|
823
|
+
rl.close();
|
|
824
|
+
resolve(input);
|
|
825
|
+
} else if (char === "") {
|
|
826
|
+
rl.close();
|
|
827
|
+
process.exit(1);
|
|
828
|
+
} else if (char === "\x7F") {
|
|
829
|
+
input = input.slice(0, -1);
|
|
830
|
+
} else {
|
|
831
|
+
input += char;
|
|
832
|
+
}
|
|
833
|
+
};
|
|
834
|
+
stdin.on("data", onData);
|
|
835
|
+
});
|
|
836
|
+
}
|
|
837
|
+
async function select(message, options) {
|
|
838
|
+
console.log(`
|
|
839
|
+
${message}`);
|
|
840
|
+
options.forEach((opt, i) => {
|
|
841
|
+
console.log(` ${c.bold(`${i + 1}.`)} ${opt}`);
|
|
842
|
+
});
|
|
843
|
+
const answer = await ask(`${c.dim(t("terminal.select_prompt").replace("{max}", String(options.length)))} `);
|
|
844
|
+
const idx = parseInt(answer.trim(), 10) - 1;
|
|
845
|
+
if (idx >= 0 && idx < options.length) return idx;
|
|
846
|
+
return 0;
|
|
847
|
+
}
|
|
848
|
+
|
|
849
|
+
export {
|
|
850
|
+
setLang,
|
|
851
|
+
t,
|
|
852
|
+
detectLang,
|
|
853
|
+
loadLangConfig,
|
|
854
|
+
saveLangConfig,
|
|
855
|
+
c,
|
|
856
|
+
info,
|
|
857
|
+
success,
|
|
858
|
+
warn,
|
|
859
|
+
error,
|
|
860
|
+
heading,
|
|
861
|
+
printDiff,
|
|
862
|
+
confirm,
|
|
863
|
+
ask,
|
|
864
|
+
askHidden,
|
|
865
|
+
select
|
|
866
|
+
};
|
|
867
|
+
//# sourceMappingURL=chunk-XTJEVOK3.js.map
|