oh-pi 0.1.67 → 0.1.69

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/dist/i18n.d.ts CHANGED
@@ -1,23 +1,12 @@
1
- export type Locale = "en" | "zh" | "fr";
1
+ import type { Locale } from "./types.js";
2
+ export type { Locale } from "./types.js";
2
3
  /**
3
4
  * 根据当前语言环境获取翻译文本,支持变量插值。
4
- * @param key - 翻译键名
5
- * @param vars - 可选的插值变量,用于替换文本中的 `{key}` 占位符
6
- * @returns 翻译后的字符串,若未找到则返回原始 key
7
5
  */
8
6
  export declare function t(key: string, vars?: Record<string, string | number>): string;
9
- /**
10
- * 设置当前语言环境。
11
- * @param locale - 目标语言代码
12
- */
7
+ /** 设置当前语言环境。 */
13
8
  export declare function setLocale(locale: Locale): void;
14
- /**
15
- * 获取当前语言环境。
16
- * @returns 当前的语言代码
17
- */
9
+ /** 获取当前语言环境。 */
18
10
  export declare function getLocale(): Locale;
19
- /**
20
- * 提示用户选择语言。若能从环境变量自动检测则直接使用,否则弹出交互选择。
21
- * @returns 用户选择或自动检测的语言代码
22
- */
11
+ /** 提示用户选择语言。若能从环境变量自动检测则直接使用,否则弹出交互选择。 */
23
12
  export declare function selectLanguage(): Promise<Locale>;
package/dist/i18n.js CHANGED
@@ -1,394 +1,9 @@
1
1
  import * as p from "@clack/prompts";
2
2
  import { execSync } from "node:child_process";
3
+ import { messages } from "./locales.js";
3
4
  let current = "en";
4
- const messages = {
5
- en: {
6
- // welcome
7
- "welcome.title": "oh-pi — one-click setup for pi agent",
8
- "welcome.piDetected": "pi {version} detected",
9
- "welcome.piNotFound": "pi not found — will install",
10
- "welcome.envInfo": "{terminal} │ {os} │ Node {node}",
11
- "welcome.existingConfig": "Existing config found",
12
- "welcome.existingConfigDetail": "{count} files ({size}KB) at ~/.pi/agent/",
13
- "welcome.existingProviders": "Detected providers: {providers}",
14
- // language
15
- "lang.select": "Language / 语言 / Langue:",
16
- // mode
17
- "mode.select": "How would you like to set up pi?",
18
- "mode.quick": "🚀 Quick Setup",
19
- "mode.quickHint": "Recommended defaults, 3 steps",
20
- "mode.preset": "📦 Preset",
21
- "mode.presetHint": "Choose a pre-made configuration",
22
- "mode.custom": "🎛️ Custom",
23
- "mode.customHint": "Pick everything yourself",
24
- // provider
25
- "provider.select": "Select API providers",
26
- "provider.custom": "🔧 Custom endpoint",
27
- "provider.customHint": "Ollama, vLLM, LiteLLM, any OpenAI-compatible",
28
- "provider.foundEnv": "Found {env} in environment. Use it?",
29
- "provider.customEndpoint": "Custom endpoint for {label}? (proxy, Azure, etc.)",
30
- "provider.baseUrl": "Base URL for {label}:",
31
- "provider.useCustomUrl": "Use a custom endpoint for {label}? (proxy, self-hosted, etc.)",
32
- "provider.baseUrlPlaceholder": "https://your-proxy.example.com",
33
- "provider.baseUrlValidation": "Must be a valid URL",
34
- "provider.configured": "{label} configured",
35
- "provider.name": "Provider name:",
36
- "provider.namePlaceholder": "ollama",
37
- "provider.nameRequired": "Name required",
38
- "provider.baseUrlCustom": "Base URL:",
39
- "provider.baseUrlCustomPlaceholder": "http://localhost:11434",
40
- "provider.needsKey": "Requires API key?",
41
- "provider.apiKey": "API key for {label}:",
42
- "provider.apiKeyRequired": "API key cannot be empty",
43
- "provider.fetchingModels": "Fetching models from {source}",
44
- "provider.foundModels": "Found {count} models",
45
- "provider.noModels": "No models found via API",
46
- "provider.defaultModelList": "Using default model list",
47
- "provider.selectModel": "Default model for {label}:",
48
- "provider.modelName": "Model name for {label}:",
49
- "provider.modelNamePlaceholder": "llama3.1:8b",
50
- "provider.modelNameRequired": "Model name required",
51
- "provider.customConfigured": "{name} configured ({url})",
52
- "provider.configureCaps": "Configure model capabilities? (context window, multimodal, reasoning)",
53
- "provider.contextWindow": "Context window size (tokens):",
54
- "provider.contextWindowValidation": "Must be a number ≥ 1024",
55
- "provider.maxTokens": "Max output tokens:",
56
- "provider.maxTokensValidation": "Must be a number ≥ 256",
57
- "provider.multimodal": "Supports image input (multimodal)?",
58
- "provider.reasoning": "Supports extended thinking (reasoning)?",
59
- "provider.detected": "Existing providers detected: {list}",
60
- "provider.detectedSkip": "⏭ Skip — keep existing",
61
- "provider.detectedSkipHint": "Don't change provider config",
62
- "provider.detectedAdd": "➕ Add new providers",
63
- "provider.detectedAddHint": "Configure additional providers",
64
- // preset
65
- "preset.select": "Choose a preset:",
66
- "preset.full": "⚫ Full Power",
67
- "preset.fullHint": "All features, extensions, and skills enabled",
68
- "preset.clean": "✨ Clean",
69
- "preset.cleanHint": "Minimal setup, just the essentials",
70
- "preset.colony": "🐜 Colony",
71
- "preset.colonyHint": "Ant swarm multi-agent system",
72
- // theme
73
- "theme.select": "Choose a theme:",
74
- // keybindings
75
- "kb.select": "Keybinding scheme:",
76
- "kb.default": "⌨️ Default",
77
- "kb.defaultHint": "Pi standard keybindings",
78
- "kb.vim": "🟢 Vim",
79
- "kb.vimHint": "Alt+hjkl navigation",
80
- "kb.emacs": "🔵 Emacs",
81
- "kb.emacsHint": "Ctrl+pnbf navigation",
82
- // extensions
83
- "ext.select": "Select extensions:",
84
- // agents
85
- "agent.select": "AGENTS.md template:",
86
- "agent.general": "📋 General Developer",
87
- "agent.generalHint": "Universal coding guidelines",
88
- "agent.fullstack": "🏗️ Full-Stack Developer",
89
- "agent.fullstackHint": "Frontend + Backend + DB",
90
- "agent.security": "🔒 Security Researcher",
91
- "agent.securityHint": "Pentesting & audit",
92
- "agent.dataai": "🤖 Data & AI Engineer",
93
- "agent.dataaiHint": "MLOps & pipelines",
94
- "agent.colony": "🐜 Colony Operator",
95
- "agent.colonyHint": "Ant swarm multi-agent",
96
- // advanced
97
- "advanced.configure": "Configure advanced settings? (compaction threshold, etc.)",
98
- "advanced.compactThreshold": "Auto-compact when context reaches % of window (0-100):",
99
- "advanced.compactValidation": "Must be a number between 10 and 100",
100
- // confirm
101
- "confirm.title": "Configuration",
102
- "confirm.providers": "Providers:",
103
- "confirm.model": "Model:",
104
- "confirm.theme": "Theme:",
105
- "confirm.keybindings": "Keybindings:",
106
- "confirm.thinking": "Thinking:",
107
- "confirm.compaction": "Compaction:",
108
- "confirm.compactionValue": "{pct}% of context",
109
- "confirm.extensions": "Extensions:",
110
- "confirm.skills": "Skills:",
111
- "confirm.prompts": "Prompts:",
112
- "confirm.promptsValue": "{count} templates",
113
- "confirm.agents": "AGENTS.md:",
114
- "confirm.none": "none",
115
- "confirm.skipped": "(kept existing)",
116
- "confirm.changes": "⚠ Changes",
117
- "confirm.existingDetected": "Existing config detected. How to proceed?",
118
- "confirm.backup": "📦 Backup & apply",
119
- "confirm.backupHint": "Safe — backup first, then overwrite",
120
- "confirm.overwrite": "⚡ Overwrite",
121
- "confirm.overwriteHint": "Replace without backup",
122
- "confirm.cancel": "✖ Cancel",
123
- "confirm.cancelHint": "Keep current config",
124
- "confirm.noChanges": "No changes made.",
125
- "confirm.backingUp": "Backing up ~/.pi/agent/",
126
- "confirm.backedUp": "Backed up to {dir}",
127
- "confirm.apply": "Apply configuration?",
128
- "confirm.installingPi": "Installing pi-coding-agent",
129
- "confirm.piInstalled": "pi installed",
130
- "confirm.piFailed": "Failed: {error}",
131
- "confirm.piManual": "Run manually: npm install -g @mariozechner/pi-coding-agent",
132
- "confirm.writing": "Writing configuration",
133
- "confirm.applied": "Configuration applied",
134
- "confirm.installed": "✓ Installed",
135
- "confirm.run": "Run {cmd} to start coding!",
136
- // common
137
- "cancelled": "Cancelled.",
138
- "default": "default",
139
- },
140
- zh: {
141
- "welcome.title": "oh-pi — pi agent 一键配置",
142
- "welcome.piDetected": "检测到 pi {version}",
143
- "welcome.piNotFound": "未找到 pi — 将自动安装",
144
- "welcome.envInfo": "{terminal} │ {os} │ Node {node}",
145
- "welcome.existingConfig": "发现已有配置",
146
- "welcome.existingConfigDetail": "~/.pi/agent/ 下有 {count} 个文件 ({size}KB)",
147
- "welcome.existingProviders": "检测到已有 Provider: {providers}",
148
- "lang.select": "Language / 语言 / Langue:",
149
- "mode.select": "选择配置方式:",
150
- "mode.quick": "🚀 快速配置",
151
- "mode.quickHint": "推荐默认值,3 步完成",
152
- "mode.preset": "📦 预设方案",
153
- "mode.presetHint": "选择预制配置",
154
- "mode.custom": "🎛️ 自定义",
155
- "mode.customHint": "逐项自选",
156
- "provider.select": "选择 API 提供商",
157
- "provider.custom": "🔧 自定义端点",
158
- "provider.customHint": "Ollama、vLLM、LiteLLM 等 OpenAI 兼容接口",
159
- "provider.foundEnv": "在环境变量中找到 {env},是否使用?",
160
- "provider.customEndpoint": "为 {label} 设置自定义端点?(代理、Azure 等)",
161
- "provider.baseUrl": "{label} 的 Base URL:",
162
- "provider.useCustomUrl": "是否使用自定义端点?(代理、自托管等)",
163
- "provider.baseUrlPlaceholder": "https://your-proxy.example.com",
164
- "provider.baseUrlValidation": "必须是有效的 URL",
165
- "provider.configured": "{label} 配置完成",
166
- "provider.name": "提供商名称:",
167
- "provider.namePlaceholder": "ollama",
168
- "provider.nameRequired": "名称不能为空",
169
- "provider.baseUrlCustom": "Base URL:",
170
- "provider.baseUrlCustomPlaceholder": "http://localhost:11434",
171
- "provider.needsKey": "需要 API 密钥?",
172
- "provider.apiKey": "{label} 的 API 密钥:",
173
- "provider.apiKeyRequired": "API 密钥不能为空",
174
- "provider.fetchingModels": "正在从 {source} 获取模型列表",
175
- "provider.foundModels": "找到 {count} 个模型",
176
- "provider.noModels": "未通过 API 找到模型",
177
- "provider.defaultModelList": "使用默认模型列表",
178
- "provider.selectModel": "{label} 的默认模型:",
179
- "provider.modelName": "{label} 的模型名称:",
180
- "provider.modelNamePlaceholder": "llama3.1:8b",
181
- "provider.modelNameRequired": "模型名称不能为空",
182
- "provider.customConfigured": "{name} 配置完成 ({url})",
183
- "provider.configureCaps": "配置模型能力?(上下文窗口、多模态、推理)",
184
- "provider.contextWindow": "上下文窗口大小(tokens):",
185
- "provider.contextWindowValidation": "必须是 ≥ 1024 的数字",
186
- "provider.maxTokens": "最大输出 tokens:",
187
- "provider.maxTokensValidation": "必须是 ≥ 256 的数字",
188
- "provider.multimodal": "支持图片输入(多模态)?",
189
- "provider.reasoning": "支持扩展思考(推理)?",
190
- "provider.detected": "检测到已有 Provider: {list}",
191
- "provider.detectedSkip": "⏭ 跳过 — 保留现有配置",
192
- "provider.detectedSkipHint": "不修改 Provider 配置",
193
- "provider.detectedAdd": "➕ 添加新 Provider",
194
- "provider.detectedAddHint": "配置额外的 Provider",
195
- "preset.select": "选择预设方案:",
196
- "preset.full": "⚫ 全功能",
197
- "preset.fullHint": "所有功能,包括蚁群系统",
198
- "preset.clean": "🟢 简洁",
199
- "preset.cleanHint": "核心功能,无蚁群",
200
- "preset.colony": "🐜 蚁群",
201
- "preset.colonyHint": "多 Agent 协同系统",
202
- "theme.select": "选择主题:",
203
- "kb.select": "快捷键方案:",
204
- "kb.default": "⌨️ 默认",
205
- "kb.defaultHint": "Pi 标准快捷键",
206
- "kb.vim": "🟢 Vim",
207
- "kb.vimHint": "Alt+hjkl 导航",
208
- "kb.emacs": "🔵 Emacs",
209
- "kb.emacsHint": "Ctrl+pnbf 导航",
210
- "ext.select": "选择扩展:",
211
- "agent.select": "AGENTS.md 模板:",
212
- "agent.general": "📋 通用开发者",
213
- "agent.generalHint": "通用编码指南",
214
- "agent.fullstack": "🏗️ 全栈开发者",
215
- "agent.fullstackHint": "前端 + 后端 + 数据库",
216
- "agent.security": "🔒 安全研究员",
217
- "agent.securityHint": "渗透测试与审计",
218
- "agent.dataai": "🤖 数据与 AI 工程师",
219
- "agent.dataaiHint": "MLOps 与数据管道",
220
- "agent.colony": "🐜 蚁群指挥官",
221
- "agent.colonyHint": "蚁群多 Agent 协同",
222
- "advanced.configure": "配置高级选项?(压缩阈值等)",
223
- "advanced.compactThreshold": "上下文达到窗口的百分之几时自动压缩 (10-100):",
224
- "advanced.compactValidation": "必须是 10 到 100 之间的数字",
225
- "confirm.title": "配置摘要",
226
- "confirm.providers": "提供商:",
227
- "confirm.model": "模型:",
228
- "confirm.theme": "主题:",
229
- "confirm.keybindings": "快捷键:",
230
- "confirm.thinking": "思考:",
231
- "confirm.compaction": "压缩:",
232
- "confirm.compactionValue": "上下文的 {pct}%",
233
- "confirm.extensions": "扩展:",
234
- "confirm.skills": "技能:",
235
- "confirm.prompts": "模板:",
236
- "confirm.promptsValue": "{count} 个模板",
237
- "confirm.agents": "AGENTS.md:",
238
- "confirm.none": "无",
239
- "confirm.skipped": "(保留现有)",
240
- "confirm.changes": "⚠ 变更",
241
- "confirm.existingDetected": "检测到已有配置,如何处理?",
242
- "confirm.backup": "📦 备份后应用",
243
- "confirm.backupHint": "安全 — 先备份再覆盖",
244
- "confirm.overwrite": "⚡ 直接覆盖",
245
- "confirm.overwriteHint": "不备份直接替换",
246
- "confirm.cancel": "✖ 取消",
247
- "confirm.cancelHint": "保留当前配置",
248
- "confirm.noChanges": "未做任何更改。",
249
- "confirm.backingUp": "正在备份 ~/.pi/agent/",
250
- "confirm.backedUp": "已备份到 {dir}",
251
- "confirm.apply": "应用配置?",
252
- "confirm.installingPi": "正在安装 pi-coding-agent",
253
- "confirm.piInstalled": "pi 安装完成",
254
- "confirm.piFailed": "失败:{error}",
255
- "confirm.piManual": "请手动运行:npm install -g @mariozechner/pi-coding-agent",
256
- "confirm.writing": "正在写入配置",
257
- "confirm.applied": "配置已应用",
258
- "confirm.installed": "✓ 已安装",
259
- "confirm.run": "运行 {cmd} 开始编码!",
260
- "cancelled": "已取消。",
261
- "default": "默认",
262
- },
263
- fr: {
264
- "welcome.title": "oh-pi — configuration en un clic pour pi agent",
265
- "welcome.piDetected": "pi {version} détecté",
266
- "welcome.piNotFound": "pi non trouvé — installation en cours",
267
- "welcome.envInfo": "{terminal} │ {os} │ Node {node}",
268
- "welcome.existingConfig": "Configuration existante trouvée",
269
- "welcome.existingConfigDetail": "{count} fichiers ({size}Ko) dans ~/.pi/agent/",
270
- "welcome.existingProviders": "Fournisseurs détectés : {providers}",
271
- "lang.select": "Language / 语言 / Langue :",
272
- "mode.select": "Comment souhaitez-vous configurer pi ?",
273
- "mode.quick": "🚀 Configuration rapide",
274
- "mode.quickHint": "Valeurs par défaut recommandées, 3 étapes",
275
- "mode.preset": "📦 Préréglage",
276
- "mode.presetHint": "Choisir une configuration prédéfinie",
277
- "mode.custom": "🎛️ Personnalisé",
278
- "mode.customHint": "Tout choisir soi-même",
279
- "provider.select": "Sélectionner les fournisseurs API",
280
- "provider.custom": "🔧 Point d'accès personnalisé",
281
- "provider.customHint": "Ollama, vLLM, LiteLLM, tout compatible OpenAI",
282
- "provider.foundEnv": "{env} trouvé dans l'environnement. L'utiliser ?",
283
- "provider.customEndpoint": "Point d'accès personnalisé pour {label} ? (proxy, Azure, etc.)",
284
- "provider.baseUrl": "URL de base pour {label} :",
285
- "provider.useCustomUrl": "Utiliser un endpoint personnalisé pour {label} ? (proxy, auto-hébergé, etc.)",
286
- "provider.baseUrlPlaceholder": "https://your-proxy.example.com",
287
- "provider.baseUrlValidation": "Doit être une URL valide",
288
- "provider.configured": "{label} configuré",
289
- "provider.name": "Nom du fournisseur :",
290
- "provider.namePlaceholder": "ollama",
291
- "provider.nameRequired": "Nom requis",
292
- "provider.baseUrlCustom": "URL de base :",
293
- "provider.baseUrlCustomPlaceholder": "http://localhost:11434",
294
- "provider.needsKey": "Nécessite une clé API ?",
295
- "provider.apiKey": "Clé API pour {label} :",
296
- "provider.apiKeyRequired": "La clé API ne peut pas être vide",
297
- "provider.fetchingModels": "Récupération des modèles depuis {source}",
298
- "provider.foundModels": "{count} modèles trouvés",
299
- "provider.noModels": "Aucun modèle trouvé via l'API",
300
- "provider.defaultModelList": "Utilisation de la liste de modèles par défaut",
301
- "provider.selectModel": "Modèle par défaut pour {label} :",
302
- "provider.modelName": "Nom du modèle pour {label} :",
303
- "provider.modelNamePlaceholder": "llama3.1:8b",
304
- "provider.modelNameRequired": "Nom du modèle requis",
305
- "provider.customConfigured": "{name} configuré ({url})",
306
- "provider.configureCaps": "Configurer les capacités du modèle ? (fenêtre de contexte, multimodal, raisonnement)",
307
- "provider.contextWindow": "Taille de la fenêtre de contexte (tokens) :",
308
- "provider.contextWindowValidation": "Doit être un nombre ≥ 1024",
309
- "provider.maxTokens": "Tokens de sortie maximum :",
310
- "provider.maxTokensValidation": "Doit être un nombre ≥ 256",
311
- "provider.multimodal": "Prend en charge l'entrée d'images (multimodal) ?",
312
- "provider.reasoning": "Prend en charge la réflexion étendue (raisonnement) ?",
313
- "provider.detected": "Fournisseurs existants détectés : {list}",
314
- "provider.detectedSkip": "⏭ Passer — garder l'existant",
315
- "provider.detectedSkipHint": "Ne pas modifier la config des fournisseurs",
316
- "provider.detectedAdd": "➕ Ajouter de nouveaux fournisseurs",
317
- "provider.detectedAddHint": "Configurer des fournisseurs supplémentaires",
318
- "preset.select": "Choisir un préréglage :",
319
- "preset.full": "⚫ Complet",
320
- "preset.fullHint": "Toutes les extensions et compétences",
321
- "preset.clean": "🟢 Propre",
322
- "preset.cleanHint": "Configuration minimale, aucune extension",
323
- "preset.colony": "🐜 Colonie",
324
- "preset.colonyHint": "Mode essaim multi-agent de fourmis",
325
- "theme.select": "Choisir un thème :",
326
- "kb.select": "Schéma de raccourcis :",
327
- "kb.default": "⌨️ Par défaut",
328
- "kb.defaultHint": "Raccourcis standard Pi",
329
- "kb.vim": "🟢 Vim",
330
- "kb.vimHint": "Navigation Alt+hjkl",
331
- "kb.emacs": "🔵 Emacs",
332
- "kb.emacsHint": "Navigation Ctrl+pnbf",
333
- "ext.select": "Sélectionner les extensions :",
334
- "agent.select": "Modèle AGENTS.md :",
335
- "agent.general": "📋 Développeur général",
336
- "agent.generalHint": "Directives de codage universelles",
337
- "agent.fullstack": "🏗️ Développeur Full-Stack",
338
- "agent.fullstackHint": "Frontend + Backend + BDD",
339
- "agent.security": "🔒 Chercheur en sécurité",
340
- "agent.securityHint": "Pentest & audit",
341
- "agent.dataai": "🤖 Ingénieur Data & IA",
342
- "agent.dataaiHint": "MLOps & pipelines",
343
- "agent.colony": "🐜 Opérateur de colonie",
344
- "agent.colonyHint": "Essaim multi-agent",
345
- "advanced.configure": "Configurer les paramètres avancés ? (seuil de compaction, etc.)",
346
- "advanced.compactThreshold": "Compacter automatiquement quand le contexte atteint % de la fenêtre (10-100) :",
347
- "advanced.compactValidation": "Doit être un nombre entre 10 et 100",
348
- "confirm.title": "Configuration",
349
- "confirm.providers": "Fournisseurs :",
350
- "confirm.model": "Modèle :",
351
- "confirm.theme": "Thème :",
352
- "confirm.keybindings": "Raccourcis :",
353
- "confirm.thinking": "Réflexion :",
354
- "confirm.compaction": "Compaction :",
355
- "confirm.compactionValue": "{pct}% du contexte",
356
- "confirm.extensions": "Extensions :",
357
- "confirm.skills": "Compétences :",
358
- "confirm.prompts": "Modèles :",
359
- "confirm.promptsValue": "{count} modèles",
360
- "confirm.agents": "AGENTS.md :",
361
- "confirm.none": "aucun",
362
- "confirm.skipped": "(existant conservé)",
363
- "confirm.changes": "⚠ Modifications",
364
- "confirm.existingDetected": "Configuration existante détectée. Comment procéder ?",
365
- "confirm.backup": "📦 Sauvegarder & appliquer",
366
- "confirm.backupHint": "Sûr — sauvegarde d'abord, puis écrasement",
367
- "confirm.overwrite": "⚡ Écraser",
368
- "confirm.overwriteHint": "Remplacer sans sauvegarde",
369
- "confirm.cancel": "✖ Annuler",
370
- "confirm.cancelHint": "Garder la configuration actuelle",
371
- "confirm.noChanges": "Aucune modification effectuée.",
372
- "confirm.backingUp": "Sauvegarde de ~/.pi/agent/",
373
- "confirm.backedUp": "Sauvegardé dans {dir}",
374
- "confirm.apply": "Appliquer la configuration ?",
375
- "confirm.installingPi": "Installation de pi-coding-agent",
376
- "confirm.piInstalled": "pi installé",
377
- "confirm.piFailed": "Échec : {error}",
378
- "confirm.piManual": "Exécutez manuellement : npm install -g @mariozechner/pi-coding-agent",
379
- "confirm.writing": "Écriture de la configuration",
380
- "confirm.applied": "Configuration appliquée",
381
- "confirm.installed": "✓ Installé",
382
- "confirm.run": "Exécutez {cmd} pour commencer à coder !",
383
- "cancelled": "Annulé.",
384
- "default": "par défaut",
385
- },
386
- };
387
5
  /**
388
6
  * 根据当前语言环境获取翻译文本,支持变量插值。
389
- * @param key - 翻译键名
390
- * @param vars - 可选的插值变量,用于替换文本中的 `{key}` 占位符
391
- * @returns 翻译后的字符串,若未找到则返回原始 key
392
7
  */
393
8
  export function t(key, vars) {
394
9
  let text = messages[current]?.[key] ?? messages.en[key] ?? key;
@@ -399,24 +14,13 @@ export function t(key, vars) {
399
14
  }
400
15
  return text;
401
16
  }
402
- /**
403
- * 设置当前语言环境。
404
- * @param locale - 目标语言代码
405
- */
17
+ /** 设置当前语言环境。 */
406
18
  export function setLocale(locale) { current = locale; }
407
- /**
408
- * 获取当前语言环境。
409
- * @returns 当前的语言代码
410
- */
19
+ /** 获取当前语言环境。 */
411
20
  export function getLocale() { return current; }
412
- /**
413
- * 从环境变量中检测用户语言环境。
414
- * 依次检查 LANG、LC_ALL、LANGUAGE,无法确定时返回 undefined。
415
- * @returns 检测到的语言代码,或 undefined
416
- */
21
+ /** 从环境变量中检测用户语言环境。 */
417
22
  function detectLocale() {
418
23
  let lang = (process.env.LANG ?? process.env.LC_ALL ?? process.env.LANGUAGE ?? "").toLowerCase();
419
- // Windows doesn't set LANG/LC_ALL — detect via OS locale
420
24
  if (!lang && process.platform === "win32") {
421
25
  try {
422
26
  lang = execSync("powershell -NoProfile -Command \"(Get-Culture).Name\"", { encoding: "utf8", timeout: 3000 }).trim().toLowerCase();
@@ -431,10 +35,7 @@ function detectLocale() {
431
35
  return "en";
432
36
  return undefined;
433
37
  }
434
- /**
435
- * 提示用户选择语言。若能从环境变量自动检测则直接使用,否则弹出交互选择。
436
- * @returns 用户选择或自动检测的语言代码
437
- */
38
+ /** 提示用户选择语言。若能从环境变量自动检测则直接使用,否则弹出交互选择。 */
438
39
  export async function selectLanguage() {
439
40
  const detected = detectLocale();
440
41
  if (detected) {
package/dist/index.js CHANGED
@@ -43,7 +43,7 @@ async function quickFlow(env) {
43
43
  providers,
44
44
  theme: "dark",
45
45
  keybindings: "default",
46
- extensions: ["safe-guard", "git-guard", "auto-session-name", "custom-footer", "compact-header", "auto-update"],
46
+ extensions: ["safe-guard", "git-guard", "auto-session-name", "custom-footer", "compact-header", "auto-update", "smart-compact"],
47
47
  prompts: ["review", "fix", "explain", "commit", "test"],
48
48
  agents: "general-developer",
49
49
  thinking: "medium",
@@ -0,0 +1,2 @@
1
+ import type { Locale } from "./types.js";
2
+ export declare const messages: Record<Locale, Record<string, string>>;