agent-toggle 0.1.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.md +146 -0
- package/dist/agents/_skills.js +15 -0
- package/dist/agents/_toml.js +66 -0
- package/dist/agents/antigravity.js +68 -0
- package/dist/agents/claude/index.js +31 -0
- package/dist/agents/claude/mcp.js +164 -0
- package/dist/agents/claude/paths.js +32 -0
- package/dist/agents/claude/plugins.js +82 -0
- package/dist/agents/claude/settings.js +43 -0
- package/dist/agents/claude/skills.js +75 -0
- package/dist/agents/codex.js +53 -0
- package/dist/agents/copilot.js +72 -0
- package/dist/agents/cursor.js +32 -0
- package/dist/agents/devin.js +41 -0
- package/dist/agents/droid.js +48 -0
- package/dist/agents/gemini.js +51 -0
- package/dist/agents/grok.js +107 -0
- package/dist/agents/index.js +41 -0
- package/dist/agents/more.js +483 -0
- package/dist/agents/others.js +192 -0
- package/dist/agents/qwen.js +46 -0
- package/dist/core/generic.js +334 -0
- package/dist/core/groups.js +94 -0
- package/dist/core/i18n.js +832 -0
- package/dist/core/jsonio.js +136 -0
- package/dist/core/logo.js +128 -0
- package/dist/core/stash.js +21 -0
- package/dist/core/toml.js +138 -0
- package/dist/core/types.js +4 -0
- package/dist/core/yaml.js +31 -0
- package/dist/index.js +467 -0
- package/package.json +57 -0
|
@@ -0,0 +1,832 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import os from "node:os";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
export const LANGS = { en: "English", fr: "Français", es: "Español", de: "Deutsch" };
|
|
5
|
+
// Not imported from jsonio.ts: jsonio depends on this module.
|
|
6
|
+
const configFile = path.join(os.homedir(), ".agent-toggle", "config.json");
|
|
7
|
+
// ---------------------------------------------------------------- catalogs
|
|
8
|
+
const en = {
|
|
9
|
+
"scope.user": "User",
|
|
10
|
+
"scope.project": "Project (shared)",
|
|
11
|
+
"scope.local": "Project (local)",
|
|
12
|
+
"scope.projectShort": "Project",
|
|
13
|
+
"scope.userProject": "User + Project",
|
|
14
|
+
"section.mcp": "MCP servers",
|
|
15
|
+
"section.plugins": "Plugins / extensions",
|
|
16
|
+
"section.skills": "Skills",
|
|
17
|
+
"section.hooks": "Hooks",
|
|
18
|
+
"section.commands": "Commands",
|
|
19
|
+
"section.agents": "Agents / subagents",
|
|
20
|
+
"title.codexPrompts": "Prompts (/prompts:…)",
|
|
21
|
+
"title.hookFiles": "Hooks (files)",
|
|
22
|
+
"title.hookSettings": "Hooks (settings.json)",
|
|
23
|
+
"title.droids": "Droids (subagents)",
|
|
24
|
+
"title.kiroPrompts": "Prompts (@name)",
|
|
25
|
+
"group.web": "Web search & scraping",
|
|
26
|
+
"group.docs": "Documentation & code",
|
|
27
|
+
"group.browser": "Browser & debugging",
|
|
28
|
+
"group.data": "Data, backend & cloud",
|
|
29
|
+
"group.apps": "App generation",
|
|
30
|
+
"group.design": "Design & UI prototyping",
|
|
31
|
+
"group.media": "Generative media (image, video, audio)",
|
|
32
|
+
"group.productivity": "Productivity & documents",
|
|
33
|
+
"group.comms": "Communication & email",
|
|
34
|
+
"group.pm": "Project management",
|
|
35
|
+
"group.other": "Other",
|
|
36
|
+
"group.user": "User",
|
|
37
|
+
"group.project": "Project",
|
|
38
|
+
"group.installed": "Installed",
|
|
39
|
+
"group.builtin": "Built-in",
|
|
40
|
+
"group.custom": "Custom",
|
|
41
|
+
"group.global": "Global",
|
|
42
|
+
"group.others": "Others",
|
|
43
|
+
"group.overrides": "Other overrides (plugins, bundled…)",
|
|
44
|
+
"state.enabled": "enabled",
|
|
45
|
+
"state.disabled": "disabled",
|
|
46
|
+
"change.toggle": "{what} → {state}",
|
|
47
|
+
"change.toggleAt": "{what} → {state} ({where})",
|
|
48
|
+
"change.stashed": "{what} → set aside",
|
|
49
|
+
"change.unstashed": "{what} → removed from the stash",
|
|
50
|
+
"change.removedFrom": "{what} → removed from {where}",
|
|
51
|
+
"change.restoredIn": "{what} → restored in {where}",
|
|
52
|
+
"change.approved": "{what} → approved",
|
|
53
|
+
"change.rejected": "{what} → rejected",
|
|
54
|
+
"hint.stash": "stash",
|
|
55
|
+
"hint.link": "link",
|
|
56
|
+
"hint.local": "local",
|
|
57
|
+
"hint.project": "project",
|
|
58
|
+
"hint.user": "user",
|
|
59
|
+
"hint.notFound": "not found on disk",
|
|
60
|
+
"hint.notInstalled": "not installed",
|
|
61
|
+
"hint.otherSource": "other source",
|
|
62
|
+
"hint.noLongerDetected": "(no longer detected)",
|
|
63
|
+
"hint.claudeaiConnector": "claude.ai connector",
|
|
64
|
+
"hint.disabledIn": "disabled in {n}/{total} projects",
|
|
65
|
+
"hint.allProjects": "all projects",
|
|
66
|
+
"label.allHooks": "All hooks of this scope",
|
|
67
|
+
"label.allHooksShort": "All hooks",
|
|
68
|
+
"label.claudeaiConnectors": "claude.ai connectors",
|
|
69
|
+
"label.dryRun": "dry run",
|
|
70
|
+
"label.error": "Error",
|
|
71
|
+
"label.none": "none",
|
|
72
|
+
"label.noKind": "no kind",
|
|
73
|
+
"label.nothingManageable": "nothing manageable",
|
|
74
|
+
"label.enable": "enable ",
|
|
75
|
+
"label.disable": "disable",
|
|
76
|
+
"note.nativeFlag": "native switch: {flag}",
|
|
77
|
+
"note.nativeList": "native switch: list {list}",
|
|
78
|
+
"note.noNativeStash": "no native switch: removed and restored through the stash",
|
|
79
|
+
"note.hookStash": "disabled hook = removed and kept in the stash",
|
|
80
|
+
"note.movedTo": "disabled = moved to {dir}",
|
|
81
|
+
"note.list": "list {list}",
|
|
82
|
+
"note.allSources": "all sources",
|
|
83
|
+
"note.grokPlugins": "grok plugin enable|disable (writes [plugins] enabled/disabled in ~/.grok/config.toml)",
|
|
84
|
+
"note.grokSkills": "Project skills are disabled here too: only the user config accepts [skills].",
|
|
85
|
+
"note.linkMoved": "No native switch: the link is moved. a skills sync script would recreate it.",
|
|
86
|
+
"note.dirMoved": "No native per-skill switch: the directory is moved.",
|
|
87
|
+
"note.sharedSkillsMoved": "No native per-skill switch: the directory (or link) is moved. Beware, .agents/skills is shared with other agents.",
|
|
88
|
+
"note.copilotMcpUnion": "At repository level the list adds up: a project can disable, not re-enable.",
|
|
89
|
+
"note.copilotBuiltinAgents": "subagents.disabledSubagents also accepts built-in agents: add their name by hand if needed.",
|
|
90
|
+
"note.devinMcp": "disabled: true (same as devin mcp disable) · MCP servers imported from Cursor/Claude are disabled there",
|
|
91
|
+
"note.qwenUnion": "Lists add up across scopes: a project cannot re-enable a skill disabled at user level.",
|
|
92
|
+
"note.noFile": "no file",
|
|
93
|
+
"note.opencodeAgents": "agent.<name>.disable = true (also works for build, plan, general, explore)",
|
|
94
|
+
"note.claudeMcpUser": "User: servers defined in ~/.claude.json are removed/restored (stash).\nPlugins and claude.ai connectors have no global per-server switch:\nthey are disabled in every project known to ~/.claude.json.",
|
|
95
|
+
"note.claudeMcpProject": "Project: disabledMcpServers list of this project in ~/.claude.json (same as /mcp).",
|
|
96
|
+
"note.claudePlugins": "enabledPlugins — precedence: local > project > user. \"synced\" plugins come from claude.ai.",
|
|
97
|
+
"note.claudeSkills": "skillOverrides: \"off\" hides the skill. Plugin skills are managed through their plugin.",
|
|
98
|
+
"notes.codex.trust": "The project config (.codex/config.toml) is only read when the project is \"trusted\".",
|
|
99
|
+
"notes.codex.hookTrust": "A re-enabled hook is appended at the end: Codex may ask to trust it again.",
|
|
100
|
+
"notes.grok.compat": "Grok also reads Claude/Cursor/Codex MCP servers, hooks and skills ([compat.<tool>] in config.toml).",
|
|
101
|
+
"notes.grok.trust": "The project config .grok/config.toml only applies in a \"trusted\" folder.",
|
|
102
|
+
"notes.cursor.plugins": "Cursor plugins: can only be toggled from the IDE (Customize panel).",
|
|
103
|
+
"notes.devin.plugins": "Devin plugins: no enable/disable (install/remove only).",
|
|
104
|
+
"notes.gemini.extensions": "Extensions: gemini extensions enable|disable (not handled here).",
|
|
105
|
+
"notes.qwen.extensions": "Extensions: qwen extensions enable|disable (not handled here).",
|
|
106
|
+
"notes.amp.plugins": "Amp hooks, commands and agents live in plugins: disabling the plugin disables them.",
|
|
107
|
+
"notes.opencode.hooks": "OpenCode hooks: through plugins only.",
|
|
108
|
+
"notes.crush.format": "Only the crush.json format is handled; a crushrc file takes precedence over it.",
|
|
109
|
+
"notes.warp.state": "Warp keeps the state of its MCP servers, workflows and rules inside the app (SQLite, Warp Drive).",
|
|
110
|
+
"notes.warp.none": "No file can be safely edited: nothing is managed here.",
|
|
111
|
+
"notes.claude.skills": "Skills: official skillOverrides setting (files do not move).",
|
|
112
|
+
"notes.claude.connectors": "claude.ai connectors: global disableClaudeAiConnectors switch (dedicated menu).",
|
|
113
|
+
"title.mods": "Mods (plugins)",
|
|
114
|
+
"title.extensions": "Extensions",
|
|
115
|
+
"title.promptTemplates": "Prompt templates",
|
|
116
|
+
"title.workflows": "Workflows (slash commands)",
|
|
117
|
+
"note.strictSchema": "no native switch, and unknown keys are rejected: removed and restored through the stash",
|
|
118
|
+
"note.traeAllow": "allow_mcp_servers is an allow-list: only the checked servers start.",
|
|
119
|
+
"notes.junie.native": "Junie disables MCP servers and skills from /mcp and /skills, but where that choice is stored is not documented: agent-toggle removes/moves the item instead.",
|
|
120
|
+
"notes.amazonq.legacy": "Amazon Q Developer CLI is no longer maintained and became Kiro CLI, which still reads the project's .amazonq/ folder.",
|
|
121
|
+
"notes.letta.mcp": "Letta stores MCP servers per agent (agents[].mcpServers) without a disable flag: use /mcp in Letta.",
|
|
122
|
+
"notes.pi.noMcp": "Pi has no native MCP support (only through community packages).",
|
|
123
|
+
"notes.windsurf.devin": "Windsurf became Devin Desktop, whose MCP file is shared with Devin CLI (see the Devin CLI entry).",
|
|
124
|
+
"notes.aider.none": "Aider has no MCP, plugins, skills, hooks or subagents: nothing to toggle.",
|
|
125
|
+
"notes.plandex.none": "Plandex has no MCP, plugins, skills, hooks or subagents: nothing to toggle.",
|
|
126
|
+
"notes.goose.plugins": "Goose skills, hooks and subagents come from plugins: disabling the plugin disables them.",
|
|
127
|
+
"notes.continue.maintenance": "Continue is in maintenance mode (2.0.0 is the last release).",
|
|
128
|
+
"notes.iflow.discontinued": "iFlow CLI was shut down on 2026-04-17.",
|
|
129
|
+
"notes.qodo.deprecated": "Qodo Command is deprecated (replaced by the Qodo Agentic Toolbox); only the project mcp.json is handled.",
|
|
130
|
+
"notes.vibe.trust": "The project config .vibe/config.toml only loads in trusted folders.",
|
|
131
|
+
"err.badJson": "Unreadable JSON: {file}",
|
|
132
|
+
"err.badToml": "Unreadable TOML: {file} ({msg})",
|
|
133
|
+
"err.badYaml": "Unreadable YAML: {file} ({msg})",
|
|
134
|
+
"err.destExists": "Destination already exists: {path}",
|
|
135
|
+
"err.failed": "failed",
|
|
136
|
+
"err.badScope": "Unknown scope: {scope} (user | project | local | both | all)",
|
|
137
|
+
"err.nothingForKind": "{agent}: nothing to manage for \"{kind}\" ({kinds})",
|
|
138
|
+
"err.badLang": "Unknown language: {lang} ({langs})",
|
|
139
|
+
"err.notFound": "Not found: {ids} (see \"agent-toggle list {agent} {kind}\")",
|
|
140
|
+
"err.unknownCommand": "Unknown command: {cmd}",
|
|
141
|
+
"err.unknownAgent": "Unknown agent: {id} — {agents}",
|
|
142
|
+
"usage.list": "list <agent|all> <kind>",
|
|
143
|
+
"usage.toggle": "{cmd} <agent> <kind> <id...>",
|
|
144
|
+
"usage.claudeai": "claudeai on | off",
|
|
145
|
+
"msg.noChange": "No change.",
|
|
146
|
+
"msg.currentLang": "Language: {lang}",
|
|
147
|
+
"msg.langSaved": "Language saved: {lang}",
|
|
148
|
+
"msg.groupsFile": "MCP groups: {file}",
|
|
149
|
+
"msg.nothingToChange": "Nothing to change.",
|
|
150
|
+
"msg.changesCount": "{n} change(s)",
|
|
151
|
+
"msg.noItems": "No \"{title}\" items at this scope.",
|
|
152
|
+
"msg.noMcp": "No MCP server at this scope.",
|
|
153
|
+
"msg.interrupted": "Interrupted.",
|
|
154
|
+
"msg.outroChanged": "Restart the affected agents to apply the changes.\nBackups: {dir}",
|
|
155
|
+
"msg.bye": "Bye.",
|
|
156
|
+
"prompt.listKeys": "(space: toggle · enter: confirm · Esc: back)",
|
|
157
|
+
"prompt.simulate": "Simulate?",
|
|
158
|
+
"prompt.apply": "Apply?",
|
|
159
|
+
"prompt.escBack": "(Esc: back)",
|
|
160
|
+
"prompt.scope": "scope?",
|
|
161
|
+
"prompt.category": "category?",
|
|
162
|
+
"prompt.action": "Action?",
|
|
163
|
+
"prompt.projectDir": "Project folder",
|
|
164
|
+
"claudeai.status": "User: {user} · This project (local): {local}\nA single connector is disabled per project from \"MCP servers\" (names \"claude.ai …\").\nAdding or removing them from the account is done at {url}.",
|
|
165
|
+
"claudeai.off": "disabled",
|
|
166
|
+
"claudeai.on": "enabled",
|
|
167
|
+
"claudeai.inherited": "inherited",
|
|
168
|
+
"claudeai.userOff": "Disable all connectors (user)",
|
|
169
|
+
"claudeai.userOn": "Restore the connectors (user)",
|
|
170
|
+
"claudeai.localOff": "Disable all connectors in this project",
|
|
171
|
+
"claudeai.localOn": "Restore the connectors in this project",
|
|
172
|
+
"claudeai.open": "Manage the connectors on claude.ai",
|
|
173
|
+
"claudeai.openHint": "opens the browser",
|
|
174
|
+
"claudeai.globalHint": "global switch",
|
|
175
|
+
"menu.crossMcp": "MCP servers — all agents",
|
|
176
|
+
"menu.crossMcpHint": "cross view, grouped by function",
|
|
177
|
+
"menu.project": "Project",
|
|
178
|
+
"menu.homeDir": "home folder",
|
|
179
|
+
"menu.changeProject": "Change project",
|
|
180
|
+
"menu.language": "Language",
|
|
181
|
+
"menu.quit": "Quit",
|
|
182
|
+
"help": `agent-toggle — enable/disable MCP servers, plugins, skills, hooks, commands and agents
|
|
183
|
+
of every AI agent CLI installed ({agents})
|
|
184
|
+
|
|
185
|
+
Usage:
|
|
186
|
+
agent-toggle interactive menu
|
|
187
|
+
agent-toggle agents [--all] detected agents (--all: every supported agent)
|
|
188
|
+
agent-toggle list <agent|all> <kind> status of the items (kind: {kinds})
|
|
189
|
+
agent-toggle enable <agent> <kind> <id...> enable
|
|
190
|
+
agent-toggle disable <agent> <kind> <id...> disable
|
|
191
|
+
agent-toggle claudeai on|off claude.ai connectors (Claude Code)
|
|
192
|
+
agent-toggle groups writes ~/.agent-toggle/groups.json (MCP groups)
|
|
193
|
+
agent-toggle lang [code] shows or saves the interface language
|
|
194
|
+
|
|
195
|
+
Options:
|
|
196
|
+
-p, --project <dir> targeted project (default: current directory)
|
|
197
|
+
-s, --scope <scope> user | project | local | both (user+project) | all
|
|
198
|
+
-n, --dry-run shows the changes without writing anything
|
|
199
|
+
-a, --all agents: also list supported agents that are not installed
|
|
200
|
+
-l, --lang <{langs}> interface language for this run`,
|
|
201
|
+
};
|
|
202
|
+
const fr = {
|
|
203
|
+
"scope.user": "Utilisateur",
|
|
204
|
+
"scope.project": "Projet (partagé)",
|
|
205
|
+
"scope.local": "Projet (local)",
|
|
206
|
+
"scope.projectShort": "Projet",
|
|
207
|
+
"scope.userProject": "Utilisateur + Projet",
|
|
208
|
+
"section.mcp": "Serveurs MCP",
|
|
209
|
+
"section.plugins": "Plugins / extensions",
|
|
210
|
+
"section.skills": "Skills",
|
|
211
|
+
"section.hooks": "Hooks",
|
|
212
|
+
"section.commands": "Commandes",
|
|
213
|
+
"section.agents": "Agents / sous-agents",
|
|
214
|
+
"title.codexPrompts": "Prompts (/prompts:…)",
|
|
215
|
+
"title.hookFiles": "Hooks (fichiers)",
|
|
216
|
+
"title.hookSettings": "Hooks (settings.json)",
|
|
217
|
+
"title.droids": "Droids (sous-agents)",
|
|
218
|
+
"title.kiroPrompts": "Prompts (@nom)",
|
|
219
|
+
"group.web": "Recherche web & scraping",
|
|
220
|
+
"group.docs": "Documentation & code",
|
|
221
|
+
"group.browser": "Navigateur & débogage",
|
|
222
|
+
"group.data": "Données, backend & cloud",
|
|
223
|
+
"group.apps": "Génération d'applications",
|
|
224
|
+
"group.design": "Design & prototypage UI",
|
|
225
|
+
"group.media": "Médias génératifs (image, vidéo, audio)",
|
|
226
|
+
"group.productivity": "Productivité & documents",
|
|
227
|
+
"group.comms": "Communication & e-mail",
|
|
228
|
+
"group.pm": "Gestion de projet",
|
|
229
|
+
"group.other": "Autres",
|
|
230
|
+
"group.user": "Utilisateur",
|
|
231
|
+
"group.project": "Projet",
|
|
232
|
+
"group.installed": "Installés",
|
|
233
|
+
"group.builtin": "Intégrés",
|
|
234
|
+
"group.custom": "Personnalisés",
|
|
235
|
+
"group.global": "Global",
|
|
236
|
+
"group.others": "Autres",
|
|
237
|
+
"group.overrides": "Autres overrides (plugins, bundled…)",
|
|
238
|
+
"state.enabled": "activé",
|
|
239
|
+
"state.disabled": "désactivé",
|
|
240
|
+
"change.toggle": "{what} → {state}",
|
|
241
|
+
"change.toggleAt": "{what} → {state} ({where})",
|
|
242
|
+
"change.stashed": "{what} → mis de côté",
|
|
243
|
+
"change.unstashed": "{what} → retiré du stash",
|
|
244
|
+
"change.removedFrom": "{what} → retiré de {where}",
|
|
245
|
+
"change.restoredIn": "{what} → restauré dans {where}",
|
|
246
|
+
"change.approved": "{what} → approuvé",
|
|
247
|
+
"change.rejected": "{what} → refusé",
|
|
248
|
+
"hint.stash": "stash",
|
|
249
|
+
"hint.link": "lien",
|
|
250
|
+
"hint.local": "local",
|
|
251
|
+
"hint.project": "projet",
|
|
252
|
+
"hint.user": "utilisateur",
|
|
253
|
+
"hint.notFound": "introuvable sur disque",
|
|
254
|
+
"hint.notInstalled": "non installé",
|
|
255
|
+
"hint.otherSource": "autre source",
|
|
256
|
+
"hint.noLongerDetected": "(n'est plus détecté)",
|
|
257
|
+
"hint.claudeaiConnector": "connecteur claude.ai",
|
|
258
|
+
"hint.disabledIn": "coupé dans {n}/{total} projets",
|
|
259
|
+
"hint.allProjects": "tous les projets",
|
|
260
|
+
"label.allHooks": "Tous les hooks de cette portée",
|
|
261
|
+
"label.allHooksShort": "Tous les hooks",
|
|
262
|
+
"label.claudeaiConnectors": "Connecteurs claude.ai",
|
|
263
|
+
"label.dryRun": "simulation",
|
|
264
|
+
"label.error": "Erreur",
|
|
265
|
+
"label.none": "aucun",
|
|
266
|
+
"label.noKind": "aucun type",
|
|
267
|
+
"label.nothingManageable": "rien de gérable",
|
|
268
|
+
"label.enable": "activer ",
|
|
269
|
+
"label.disable": "désactiver",
|
|
270
|
+
"note.nativeFlag": "interrupteur natif : {flag}",
|
|
271
|
+
"note.nativeList": "interrupteur natif : liste {list}",
|
|
272
|
+
"note.noNativeStash": "pas d'interrupteur natif : retrait et restauration via le stash",
|
|
273
|
+
"note.hookStash": "hook désactivé = retiré et gardé dans le stash",
|
|
274
|
+
"note.movedTo": "désactivé = déplacé dans {dir}",
|
|
275
|
+
"note.list": "liste {list}",
|
|
276
|
+
"note.allSources": "toutes sources",
|
|
277
|
+
"note.grokPlugins": "grok plugin enable|disable (écrit [plugins] enabled/disabled dans ~/.grok/config.toml)",
|
|
278
|
+
"note.grokSkills": "Les skills projet se coupent aussi ici : seule la config utilisateur accepte [skills].",
|
|
279
|
+
"note.linkMoved": "Pas d'interrupteur natif : le lien est déplacé. un script de synchronisation des skills le recréerait.",
|
|
280
|
+
"note.dirMoved": "Pas d'interrupteur natif par skill : le dossier est déplacé.",
|
|
281
|
+
"note.sharedSkillsMoved": "Pas d'interrupteur natif par skill : le dossier (ou lien) est déplacé. Attention, .agents/skills est partagé avec d'autres agents.",
|
|
282
|
+
"note.copilotMcpUnion": "Au niveau dépôt la liste s'additionne : un projet peut couper, pas réactiver.",
|
|
283
|
+
"note.copilotBuiltinAgents": "subagents.disabledSubagents accepte aussi les agents intégrés : ajoutez leur nom à la main si besoin.",
|
|
284
|
+
"note.devinMcp": "disabled: true (équivalent de devin mcp disable) · les MCP importés de Cursor/Claude se coupent chez eux",
|
|
285
|
+
"note.qwenUnion": "Les listes s'additionnent entre portées : un projet ne peut pas réactiver un skill coupé côté utilisateur.",
|
|
286
|
+
"note.noFile": "aucun fichier",
|
|
287
|
+
"note.opencodeAgents": "agent.<nom>.disable = true (fonctionne aussi pour build, plan, general, explore)",
|
|
288
|
+
"note.claudeMcpUser": "Utilisateur : les serveurs définis dans ~/.claude.json sont retirés/restaurés (stash).\nPlugins et connecteurs claude.ai n'ont pas d'interrupteur global par serveur :\nils sont désactivés dans tous les projets connus de ~/.claude.json.",
|
|
289
|
+
"note.claudeMcpProject": "Projet : liste disabledMcpServers de ce projet dans ~/.claude.json (équivalent de /mcp).",
|
|
290
|
+
"note.claudePlugins": "enabledPlugins — priorité : local > projet > utilisateur. Les plugins « synced » viennent de claude.ai.",
|
|
291
|
+
"note.claudeSkills": "skillOverrides : \"off\" masque le skill. Les skills des plugins se gèrent via le plugin.",
|
|
292
|
+
"notes.codex.trust": "La config projet (.codex/config.toml) n'est lue que si le projet est « trusted ».",
|
|
293
|
+
"notes.codex.hookTrust": "Un hook réactivé est ajouté en fin de liste : Codex peut redemander de lui faire confiance.",
|
|
294
|
+
"notes.grok.compat": "Grok lit aussi les MCP, hooks et skills de Claude/Cursor/Codex ([compat.<outil>] dans config.toml).",
|
|
295
|
+
"notes.grok.trust": "La config projet .grok/config.toml ne s'applique que dans un dossier « trusted ».",
|
|
296
|
+
"notes.cursor.plugins": "Plugins Cursor : activables seulement depuis l'IDE (panneau Customize).",
|
|
297
|
+
"notes.devin.plugins": "Plugins Devin : pas d'activation/désactivation (seulement install/remove).",
|
|
298
|
+
"notes.gemini.extensions": "Extensions : gemini extensions enable|disable (non géré ici).",
|
|
299
|
+
"notes.qwen.extensions": "Extensions : qwen extensions enable|disable (non géré ici).",
|
|
300
|
+
"notes.amp.plugins": "Hooks, commandes et agents Amp vivent dans les plugins : couper le plugin les coupe.",
|
|
301
|
+
"notes.opencode.hooks": "Hooks OpenCode : uniquement via les plugins.",
|
|
302
|
+
"notes.crush.format": "Seul le format crush.json est géré ; un fichier crushrc a priorité sur lui.",
|
|
303
|
+
"notes.warp.state": "Warp garde l'état de ses MCP, workflows et règles dans l'application (SQLite, Warp Drive).",
|
|
304
|
+
"notes.warp.none": "Aucun fichier modifiable sans risque : rien n'est géré ici.",
|
|
305
|
+
"notes.claude.skills": "Skills : setting officiel skillOverrides (les fichiers ne bougent pas).",
|
|
306
|
+
"notes.claude.connectors": "Connecteurs claude.ai : interrupteur global disableClaudeAiConnectors (menu dédié).",
|
|
307
|
+
"title.mods": "Mods (plugins)",
|
|
308
|
+
"title.extensions": "Extensions",
|
|
309
|
+
"title.promptTemplates": "Modèles de prompts",
|
|
310
|
+
"title.workflows": "Workflows (commandes slash)",
|
|
311
|
+
"note.strictSchema": "pas d'interrupteur natif et les clés inconnues sont refusées : retrait et restauration via le stash",
|
|
312
|
+
"note.traeAllow": "allow_mcp_servers est une liste blanche : seuls les serveurs cochés démarrent.",
|
|
313
|
+
"notes.junie.native": "Junie désactive MCP et skills depuis /mcp et /skills, mais l'endroit où ce choix est stocké n'est pas documenté : agent-toggle retire ou déplace l'élément à la place.",
|
|
314
|
+
"notes.amazonq.legacy": "Amazon Q Developer CLI n'est plus maintenu et est devenu Kiro CLI, qui lit toujours le dossier .amazonq/ du projet.",
|
|
315
|
+
"notes.letta.mcp": "Letta range les serveurs MCP par agent (agents[].mcpServers) sans drapeau de désactivation : utilisez /mcp dans Letta.",
|
|
316
|
+
"notes.pi.noMcp": "Pi n'a pas de support MCP natif (seulement via des paquets communautaires).",
|
|
317
|
+
"notes.windsurf.devin": "Windsurf est devenu Devin Desktop, dont le fichier MCP est partagé avec Devin CLI (voir l'entrée Devin CLI).",
|
|
318
|
+
"notes.aider.none": "Aider n'a ni MCP, ni plugins, ni skills, ni hooks, ni sous-agents : rien à basculer.",
|
|
319
|
+
"notes.plandex.none": "Plandex n'a ni MCP, ni plugins, ni skills, ni hooks, ni sous-agents : rien à basculer.",
|
|
320
|
+
"notes.goose.plugins": "Les skills, hooks et sous-agents de Goose viennent des plugins : couper le plugin les coupe.",
|
|
321
|
+
"notes.continue.maintenance": "Continue est en mode maintenance (la 2.0.0 est la dernière version).",
|
|
322
|
+
"notes.iflow.discontinued": "iFlow CLI a été arrêté le 2026-04-17.",
|
|
323
|
+
"notes.qodo.deprecated": "Qodo Command est obsolète (remplacé par la Qodo Agentic Toolbox) ; seul le mcp.json du projet est géré.",
|
|
324
|
+
"notes.vibe.trust": "La config projet .vibe/config.toml n'est chargée que dans les dossiers « trusted ».",
|
|
325
|
+
"err.badJson": "JSON illisible : {file}",
|
|
326
|
+
"err.badToml": "TOML illisible : {file} ({msg})",
|
|
327
|
+
"err.badYaml": "YAML illisible : {file} ({msg})",
|
|
328
|
+
"err.destExists": "Destination déjà présente : {path}",
|
|
329
|
+
"err.failed": "échec",
|
|
330
|
+
"err.badScope": "Portée inconnue : {scope} (user | project | local | both | all)",
|
|
331
|
+
"err.nothingForKind": "{agent} : rien à gérer pour « {kind} » ({kinds})",
|
|
332
|
+
"err.badLang": "Langue inconnue : {lang} ({langs})",
|
|
333
|
+
"err.notFound": "Introuvable : {ids} (voir « agent-toggle list {agent} {kind} »)",
|
|
334
|
+
"err.unknownCommand": "Commande inconnue : {cmd}",
|
|
335
|
+
"err.unknownAgent": "Agent inconnu : {id} — {agents}",
|
|
336
|
+
"usage.list": "list <agent|all> <type>",
|
|
337
|
+
"usage.toggle": "{cmd} <agent> <type> <id...>",
|
|
338
|
+
"usage.claudeai": "claudeai on | off",
|
|
339
|
+
"msg.noChange": "Aucun changement.",
|
|
340
|
+
"msg.currentLang": "Langue : {lang}",
|
|
341
|
+
"msg.langSaved": "Langue enregistrée : {lang}",
|
|
342
|
+
"msg.groupsFile": "Groupes MCP : {file}",
|
|
343
|
+
"msg.nothingToChange": "Rien à changer.",
|
|
344
|
+
"msg.changesCount": "{n} changement(s)",
|
|
345
|
+
"msg.noItems": "Aucun élément « {title} » à cette portée.",
|
|
346
|
+
"msg.noMcp": "Aucun serveur MCP à cette portée.",
|
|
347
|
+
"msg.interrupted": "Interrompu.",
|
|
348
|
+
"msg.outroChanged": "Relancez les agents concernés pour prendre en compte les changements.\nSauvegardes : {dir}",
|
|
349
|
+
"msg.bye": "À bientôt.",
|
|
350
|
+
"prompt.listKeys": "(espace : cocher · entrée : valider · Échap : retour)",
|
|
351
|
+
"prompt.simulate": "Simuler ?",
|
|
352
|
+
"prompt.apply": "Appliquer ?",
|
|
353
|
+
"prompt.escBack": "(Échap : retour)",
|
|
354
|
+
"prompt.scope": "portée ?",
|
|
355
|
+
"prompt.category": "catégorie ?",
|
|
356
|
+
"prompt.action": "Action ?",
|
|
357
|
+
"prompt.projectDir": "Dossier du projet",
|
|
358
|
+
"claudeai.status": "Utilisateur : {user} · Ce projet (local) : {local}\nUn connecteur précis se coupe par projet depuis « Serveurs MCP » (noms « claude.ai … »).\nLes ajouter ou les retirer du compte se fait sur {url}.",
|
|
359
|
+
"claudeai.off": "coupés",
|
|
360
|
+
"claudeai.on": "actifs",
|
|
361
|
+
"claudeai.inherited": "hérités",
|
|
362
|
+
"claudeai.userOff": "Couper tous les connecteurs (utilisateur)",
|
|
363
|
+
"claudeai.userOn": "Rétablir les connecteurs (utilisateur)",
|
|
364
|
+
"claudeai.localOff": "Couper tous les connecteurs dans ce projet",
|
|
365
|
+
"claudeai.localOn": "Rétablir les connecteurs dans ce projet",
|
|
366
|
+
"claudeai.open": "Gérer les connecteurs sur claude.ai",
|
|
367
|
+
"claudeai.openHint": "ouvre le navigateur",
|
|
368
|
+
"claudeai.globalHint": "interrupteur global",
|
|
369
|
+
"menu.crossMcp": "Serveurs MCP — tous les agents",
|
|
370
|
+
"menu.crossMcpHint": "vue croisée, groupée par fonction",
|
|
371
|
+
"menu.project": "Projet",
|
|
372
|
+
"menu.homeDir": "dossier personnel",
|
|
373
|
+
"menu.changeProject": "Changer de projet",
|
|
374
|
+
"menu.language": "Langue",
|
|
375
|
+
"menu.quit": "Quitter",
|
|
376
|
+
"help": `agent-toggle — active/désactive MCP, plugins, skills, hooks, commandes et agents
|
|
377
|
+
de tous les CLI d'agents IA installés ({agents})
|
|
378
|
+
|
|
379
|
+
Usage :
|
|
380
|
+
agent-toggle menu interactif
|
|
381
|
+
agent-toggle agents [--all] agents détectés (--all : tous les agents pris en charge)
|
|
382
|
+
agent-toggle list <agent|all> <type> état des éléments (type : {kinds})
|
|
383
|
+
agent-toggle enable <agent> <type> <id...> activer
|
|
384
|
+
agent-toggle disable <agent> <type> <id...> désactiver
|
|
385
|
+
agent-toggle claudeai on|off connecteurs claude.ai (Claude Code)
|
|
386
|
+
agent-toggle groups écrit ~/.agent-toggle/groups.json (groupes MCP)
|
|
387
|
+
agent-toggle lang [code] affiche ou enregistre la langue de l'interface
|
|
388
|
+
|
|
389
|
+
Options :
|
|
390
|
+
-p, --project <dossier> projet ciblé (défaut : dossier courant)
|
|
391
|
+
-s, --scope <portée> user | project | local | both (user+project) | all
|
|
392
|
+
-n, --dry-run affiche les changements sans rien écrire
|
|
393
|
+
-a, --all agents : liste aussi les agents pris en charge non installés
|
|
394
|
+
-l, --lang <{langs}> langue de l'interface pour cette exécution`,
|
|
395
|
+
};
|
|
396
|
+
const es = {
|
|
397
|
+
"scope.user": "Usuario",
|
|
398
|
+
"scope.project": "Proyecto (compartido)",
|
|
399
|
+
"scope.local": "Proyecto (local)",
|
|
400
|
+
"scope.projectShort": "Proyecto",
|
|
401
|
+
"scope.userProject": "Usuario + Proyecto",
|
|
402
|
+
"section.mcp": "Servidores MCP",
|
|
403
|
+
"section.plugins": "Plugins / extensiones",
|
|
404
|
+
"section.skills": "Skills",
|
|
405
|
+
"section.hooks": "Hooks",
|
|
406
|
+
"section.commands": "Comandos",
|
|
407
|
+
"section.agents": "Agentes / subagentes",
|
|
408
|
+
"title.codexPrompts": "Prompts (/prompts:…)",
|
|
409
|
+
"title.hookFiles": "Hooks (archivos)",
|
|
410
|
+
"title.hookSettings": "Hooks (settings.json)",
|
|
411
|
+
"title.droids": "Droids (subagentes)",
|
|
412
|
+
"title.kiroPrompts": "Prompts (@nombre)",
|
|
413
|
+
"group.web": "Búsqueda web y scraping",
|
|
414
|
+
"group.docs": "Documentación y código",
|
|
415
|
+
"group.browser": "Navegador y depuración",
|
|
416
|
+
"group.data": "Datos, backend y nube",
|
|
417
|
+
"group.apps": "Generación de aplicaciones",
|
|
418
|
+
"group.design": "Diseño y prototipado de UI",
|
|
419
|
+
"group.media": "Medios generativos (imagen, vídeo, audio)",
|
|
420
|
+
"group.productivity": "Productividad y documentos",
|
|
421
|
+
"group.comms": "Comunicación y correo",
|
|
422
|
+
"group.pm": "Gestión de proyectos",
|
|
423
|
+
"group.other": "Otros",
|
|
424
|
+
"group.user": "Usuario",
|
|
425
|
+
"group.project": "Proyecto",
|
|
426
|
+
"group.installed": "Instalados",
|
|
427
|
+
"group.builtin": "Integrados",
|
|
428
|
+
"group.custom": "Personalizados",
|
|
429
|
+
"group.global": "Global",
|
|
430
|
+
"group.others": "Otros",
|
|
431
|
+
"group.overrides": "Otros overrides (plugins, bundled…)",
|
|
432
|
+
"state.enabled": "activado",
|
|
433
|
+
"state.disabled": "desactivado",
|
|
434
|
+
"change.toggle": "{what} → {state}",
|
|
435
|
+
"change.toggleAt": "{what} → {state} ({where})",
|
|
436
|
+
"change.stashed": "{what} → apartado",
|
|
437
|
+
"change.unstashed": "{what} → retirado del stash",
|
|
438
|
+
"change.removedFrom": "{what} → retirado de {where}",
|
|
439
|
+
"change.restoredIn": "{what} → restaurado en {where}",
|
|
440
|
+
"change.approved": "{what} → aprobado",
|
|
441
|
+
"change.rejected": "{what} → rechazado",
|
|
442
|
+
"hint.stash": "stash",
|
|
443
|
+
"hint.link": "enlace",
|
|
444
|
+
"hint.local": "local",
|
|
445
|
+
"hint.project": "proyecto",
|
|
446
|
+
"hint.user": "usuario",
|
|
447
|
+
"hint.notFound": "no encontrado en disco",
|
|
448
|
+
"hint.notInstalled": "no instalado",
|
|
449
|
+
"hint.otherSource": "otra fuente",
|
|
450
|
+
"hint.noLongerDetected": "(ya no se detecta)",
|
|
451
|
+
"hint.claudeaiConnector": "conector de claude.ai",
|
|
452
|
+
"hint.disabledIn": "desactivado en {n}/{total} proyectos",
|
|
453
|
+
"hint.allProjects": "todos los proyectos",
|
|
454
|
+
"label.allHooks": "Todos los hooks de este ámbito",
|
|
455
|
+
"label.allHooksShort": "Todos los hooks",
|
|
456
|
+
"label.claudeaiConnectors": "Conectores de claude.ai",
|
|
457
|
+
"label.dryRun": "simulación",
|
|
458
|
+
"label.error": "Error",
|
|
459
|
+
"label.none": "ninguno",
|
|
460
|
+
"label.noKind": "ningún tipo",
|
|
461
|
+
"label.nothingManageable": "nada gestionable",
|
|
462
|
+
"label.enable": "activar ",
|
|
463
|
+
"label.disable": "desactivar",
|
|
464
|
+
"note.nativeFlag": "interruptor nativo: {flag}",
|
|
465
|
+
"note.nativeList": "interruptor nativo: lista {list}",
|
|
466
|
+
"note.noNativeStash": "sin interruptor nativo: se retira y se restaura mediante el stash",
|
|
467
|
+
"note.hookStash": "hook desactivado = retirado y guardado en el stash",
|
|
468
|
+
"note.movedTo": "desactivado = movido a {dir}",
|
|
469
|
+
"note.list": "lista {list}",
|
|
470
|
+
"note.allSources": "todas las fuentes",
|
|
471
|
+
"note.grokPlugins": "grok plugin enable|disable (escribe [plugins] enabled/disabled en ~/.grok/config.toml)",
|
|
472
|
+
"note.grokSkills": "Las skills del proyecto también se desactivan aquí: solo la configuración de usuario acepta [skills].",
|
|
473
|
+
"note.linkMoved": "Sin interruptor nativo: se mueve el enlace. un script de sincronización de skills lo volvería a crear.",
|
|
474
|
+
"note.dirMoved": "Sin interruptor nativo por skill: se mueve la carpeta.",
|
|
475
|
+
"note.sharedSkillsMoved": "Sin interruptor nativo por skill: se mueve la carpeta (o el enlace). Atención, .agents/skills se comparte con otros agentes.",
|
|
476
|
+
"note.copilotMcpUnion": "A nivel de repositorio la lista se suma: un proyecto puede desactivar, no reactivar.",
|
|
477
|
+
"note.copilotBuiltinAgents": "subagents.disabledSubagents también acepta los agentes integrados: añada su nombre a mano si hace falta.",
|
|
478
|
+
"note.devinMcp": "disabled: true (equivale a devin mcp disable) · los MCP importados de Cursor/Claude se desactivan allí",
|
|
479
|
+
"note.qwenUnion": "Las listas se suman entre ámbitos: un proyecto no puede reactivar una skill desactivada a nivel de usuario.",
|
|
480
|
+
"note.noFile": "ningún archivo",
|
|
481
|
+
"note.opencodeAgents": "agent.<nombre>.disable = true (también funciona para build, plan, general, explore)",
|
|
482
|
+
"note.claudeMcpUser": "Usuario: los servidores definidos en ~/.claude.json se retiran/restauran (stash).\nLos plugins y los conectores de claude.ai no tienen interruptor global por servidor:\nse desactivan en todos los proyectos conocidos de ~/.claude.json.",
|
|
483
|
+
"note.claudeMcpProject": "Proyecto: lista disabledMcpServers de este proyecto en ~/.claude.json (equivale a /mcp).",
|
|
484
|
+
"note.claudePlugins": "enabledPlugins — prioridad: local > proyecto > usuario. Los plugins «synced» vienen de claude.ai.",
|
|
485
|
+
"note.claudeSkills": "skillOverrides: \"off\" oculta la skill. Las skills de los plugins se gestionan con el plugin.",
|
|
486
|
+
"notes.codex.trust": "La configuración del proyecto (.codex/config.toml) solo se lee si el proyecto es «trusted».",
|
|
487
|
+
"notes.codex.hookTrust": "Un hook reactivado se añade al final: Codex puede volver a pedir confianza.",
|
|
488
|
+
"notes.grok.compat": "Grok también lee los MCP, hooks y skills de Claude/Cursor/Codex ([compat.<herramienta>] en config.toml).",
|
|
489
|
+
"notes.grok.trust": "La configuración del proyecto .grok/config.toml solo se aplica en una carpeta «trusted».",
|
|
490
|
+
"notes.cursor.plugins": "Plugins de Cursor: solo se activan desde el IDE (panel Customize).",
|
|
491
|
+
"notes.devin.plugins": "Plugins de Devin: sin activar/desactivar (solo install/remove).",
|
|
492
|
+
"notes.gemini.extensions": "Extensiones: gemini extensions enable|disable (no gestionado aquí).",
|
|
493
|
+
"notes.qwen.extensions": "Extensiones: qwen extensions enable|disable (no gestionado aquí).",
|
|
494
|
+
"notes.amp.plugins": "Los hooks, comandos y agentes de Amp viven en los plugins: desactivar el plugin los desactiva.",
|
|
495
|
+
"notes.opencode.hooks": "Hooks de OpenCode: solo mediante plugins.",
|
|
496
|
+
"notes.crush.format": "Solo se gestiona el formato crush.json; un archivo crushrc tiene prioridad sobre él.",
|
|
497
|
+
"notes.warp.state": "Warp guarda el estado de sus MCP, workflows y reglas dentro de la aplicación (SQLite, Warp Drive).",
|
|
498
|
+
"notes.warp.none": "Ningún archivo se puede editar sin riesgo: aquí no se gestiona nada.",
|
|
499
|
+
"notes.claude.skills": "Skills: setting oficial skillOverrides (los archivos no se mueven).",
|
|
500
|
+
"notes.claude.connectors": "Conectores de claude.ai: interruptor global disableClaudeAiConnectors (menú dedicado).",
|
|
501
|
+
"title.mods": "Mods (plugins)",
|
|
502
|
+
"title.extensions": "Extensiones",
|
|
503
|
+
"title.promptTemplates": "Plantillas de prompts",
|
|
504
|
+
"title.workflows": "Workflows (comandos slash)",
|
|
505
|
+
"note.strictSchema": "sin interruptor nativo y las claves desconocidas se rechazan: se retira y se restaura mediante el stash",
|
|
506
|
+
"note.traeAllow": "allow_mcp_servers es una lista de permitidos: solo arrancan los servidores marcados.",
|
|
507
|
+
"notes.junie.native": "Junie desactiva MCP y skills desde /mcp y /skills, pero no está documentado dónde se guarda esa elección: agent-toggle retira o mueve el elemento en su lugar.",
|
|
508
|
+
"notes.amazonq.legacy": "Amazon Q Developer CLI ya no se mantiene y pasó a ser Kiro CLI, que sigue leyendo la carpeta .amazonq/ del proyecto.",
|
|
509
|
+
"notes.letta.mcp": "Letta guarda los servidores MCP por agente (agents[].mcpServers) sin indicador de desactivación: use /mcp en Letta.",
|
|
510
|
+
"notes.pi.noMcp": "Pi no tiene soporte MCP nativo (solo mediante paquetes de la comunidad).",
|
|
511
|
+
"notes.windsurf.devin": "Windsurf pasó a ser Devin Desktop, cuyo archivo MCP se comparte con Devin CLI (vea la entrada Devin CLI).",
|
|
512
|
+
"notes.aider.none": "Aider no tiene MCP, plugins, skills, hooks ni subagentes: nada que activar o desactivar.",
|
|
513
|
+
"notes.plandex.none": "Plandex no tiene MCP, plugins, skills, hooks ni subagentes: nada que activar o desactivar.",
|
|
514
|
+
"notes.goose.plugins": "Las skills, hooks y subagentes de Goose vienen de los plugins: desactivar el plugin los desactiva.",
|
|
515
|
+
"notes.continue.maintenance": "Continue está en modo mantenimiento (la 2.0.0 es la última versión).",
|
|
516
|
+
"notes.iflow.discontinued": "iFlow CLI se cerró el 2026-04-17.",
|
|
517
|
+
"notes.qodo.deprecated": "Qodo Command está obsoleto (sustituido por Qodo Agentic Toolbox); solo se gestiona el mcp.json del proyecto.",
|
|
518
|
+
"notes.vibe.trust": "La configuración del proyecto .vibe/config.toml solo se carga en carpetas «trusted».",
|
|
519
|
+
"err.badJson": "JSON ilegible: {file}",
|
|
520
|
+
"err.badToml": "TOML ilegible: {file} ({msg})",
|
|
521
|
+
"err.badYaml": "YAML ilegible: {file} ({msg})",
|
|
522
|
+
"err.destExists": "El destino ya existe: {path}",
|
|
523
|
+
"err.failed": "error",
|
|
524
|
+
"err.badScope": "Ámbito desconocido: {scope} (user | project | local | both | all)",
|
|
525
|
+
"err.nothingForKind": "{agent}: nada que gestionar para «{kind}» ({kinds})",
|
|
526
|
+
"err.badLang": "Idioma desconocido: {lang} ({langs})",
|
|
527
|
+
"err.notFound": "No encontrado: {ids} (vea «agent-toggle list {agent} {kind}»)",
|
|
528
|
+
"err.unknownCommand": "Comando desconocido: {cmd}",
|
|
529
|
+
"err.unknownAgent": "Agente desconocido: {id} — {agents}",
|
|
530
|
+
"usage.list": "list <agente|all> <tipo>",
|
|
531
|
+
"usage.toggle": "{cmd} <agente> <tipo> <id...>",
|
|
532
|
+
"usage.claudeai": "claudeai on | off",
|
|
533
|
+
"msg.noChange": "Ningún cambio.",
|
|
534
|
+
"msg.currentLang": "Idioma: {lang}",
|
|
535
|
+
"msg.langSaved": "Idioma guardado: {lang}",
|
|
536
|
+
"msg.groupsFile": "Grupos MCP: {file}",
|
|
537
|
+
"msg.nothingToChange": "Nada que cambiar.",
|
|
538
|
+
"msg.changesCount": "{n} cambio(s)",
|
|
539
|
+
"msg.noItems": "Ningún elemento «{title}» en este ámbito.",
|
|
540
|
+
"msg.noMcp": "Ningún servidor MCP en este ámbito.",
|
|
541
|
+
"msg.interrupted": "Interrumpido.",
|
|
542
|
+
"msg.outroChanged": "Reinicie los agentes afectados para aplicar los cambios.\nCopias de seguridad: {dir}",
|
|
543
|
+
"msg.bye": "Hasta luego.",
|
|
544
|
+
"prompt.listKeys": "(espacio: marcar · intro: confirmar · Esc: volver)",
|
|
545
|
+
"prompt.simulate": "¿Simular?",
|
|
546
|
+
"prompt.apply": "¿Aplicar?",
|
|
547
|
+
"prompt.escBack": "(Esc: volver)",
|
|
548
|
+
"prompt.scope": "¿ámbito?",
|
|
549
|
+
"prompt.category": "¿categoría?",
|
|
550
|
+
"prompt.action": "¿Acción?",
|
|
551
|
+
"prompt.projectDir": "Carpeta del proyecto",
|
|
552
|
+
"claudeai.status": "Usuario: {user} · Este proyecto (local): {local}\nUn conector concreto se desactiva por proyecto desde «Servidores MCP» (nombres «claude.ai …»).\nAñadirlos o quitarlos de la cuenta se hace en {url}.",
|
|
553
|
+
"claudeai.off": "desactivados",
|
|
554
|
+
"claudeai.on": "activos",
|
|
555
|
+
"claudeai.inherited": "heredados",
|
|
556
|
+
"claudeai.userOff": "Desactivar todos los conectores (usuario)",
|
|
557
|
+
"claudeai.userOn": "Restablecer los conectores (usuario)",
|
|
558
|
+
"claudeai.localOff": "Desactivar todos los conectores en este proyecto",
|
|
559
|
+
"claudeai.localOn": "Restablecer los conectores en este proyecto",
|
|
560
|
+
"claudeai.open": "Gestionar los conectores en claude.ai",
|
|
561
|
+
"claudeai.openHint": "abre el navegador",
|
|
562
|
+
"claudeai.globalHint": "interruptor global",
|
|
563
|
+
"menu.crossMcp": "Servidores MCP — todos los agentes",
|
|
564
|
+
"menu.crossMcpHint": "vista cruzada, agrupada por función",
|
|
565
|
+
"menu.project": "Proyecto",
|
|
566
|
+
"menu.homeDir": "carpeta personal",
|
|
567
|
+
"menu.changeProject": "Cambiar de proyecto",
|
|
568
|
+
"menu.language": "Idioma",
|
|
569
|
+
"menu.quit": "Salir",
|
|
570
|
+
"help": `agent-toggle — activa/desactiva servidores MCP, plugins, skills, hooks, comandos y agentes
|
|
571
|
+
de todas las CLI de agentes de IA instaladas ({agents})
|
|
572
|
+
|
|
573
|
+
Uso:
|
|
574
|
+
agent-toggle menú interactivo
|
|
575
|
+
agent-toggle agents [--all] agentes detectados (--all: todos los agentes compatibles)
|
|
576
|
+
agent-toggle list <agente|all> <tipo> estado de los elementos (tipo: {kinds})
|
|
577
|
+
agent-toggle enable <agente> <tipo> <id...> activar
|
|
578
|
+
agent-toggle disable <agente> <tipo> <id...> desactivar
|
|
579
|
+
agent-toggle claudeai on|off conectores de claude.ai (Claude Code)
|
|
580
|
+
agent-toggle groups escribe ~/.agent-toggle/groups.json (grupos MCP)
|
|
581
|
+
agent-toggle lang [código] muestra o guarda el idioma de la interfaz
|
|
582
|
+
|
|
583
|
+
Opciones:
|
|
584
|
+
-p, --project <carpeta> proyecto de destino (por defecto: carpeta actual)
|
|
585
|
+
-s, --scope <ámbito> user | project | local | both (user+project) | all
|
|
586
|
+
-n, --dry-run muestra los cambios sin escribir nada
|
|
587
|
+
-a, --all agents: lista también los agentes compatibles no instalados
|
|
588
|
+
-l, --lang <{langs}> idioma de la interfaz para esta ejecución`,
|
|
589
|
+
};
|
|
590
|
+
const de = {
|
|
591
|
+
"scope.user": "Benutzer",
|
|
592
|
+
"scope.project": "Projekt (geteilt)",
|
|
593
|
+
"scope.local": "Projekt (lokal)",
|
|
594
|
+
"scope.projectShort": "Projekt",
|
|
595
|
+
"scope.userProject": "Benutzer + Projekt",
|
|
596
|
+
"section.mcp": "MCP-Server",
|
|
597
|
+
"section.plugins": "Plugins / Erweiterungen",
|
|
598
|
+
"section.skills": "Skills",
|
|
599
|
+
"section.hooks": "Hooks",
|
|
600
|
+
"section.commands": "Befehle",
|
|
601
|
+
"section.agents": "Agenten / Subagenten",
|
|
602
|
+
"title.codexPrompts": "Prompts (/prompts:…)",
|
|
603
|
+
"title.hookFiles": "Hooks (Dateien)",
|
|
604
|
+
"title.hookSettings": "Hooks (settings.json)",
|
|
605
|
+
"title.droids": "Droids (Subagenten)",
|
|
606
|
+
"title.kiroPrompts": "Prompts (@Name)",
|
|
607
|
+
"group.web": "Websuche & Scraping",
|
|
608
|
+
"group.docs": "Dokumentation & Code",
|
|
609
|
+
"group.browser": "Browser & Debugging",
|
|
610
|
+
"group.data": "Daten, Backend & Cloud",
|
|
611
|
+
"group.apps": "App-Generierung",
|
|
612
|
+
"group.design": "Design & UI-Prototyping",
|
|
613
|
+
"group.media": "Generative Medien (Bild, Video, Audio)",
|
|
614
|
+
"group.productivity": "Produktivität & Dokumente",
|
|
615
|
+
"group.comms": "Kommunikation & E-Mail",
|
|
616
|
+
"group.pm": "Projektmanagement",
|
|
617
|
+
"group.other": "Sonstige",
|
|
618
|
+
"group.user": "Benutzer",
|
|
619
|
+
"group.project": "Projekt",
|
|
620
|
+
"group.installed": "Installiert",
|
|
621
|
+
"group.builtin": "Integriert",
|
|
622
|
+
"group.custom": "Benutzerdefiniert",
|
|
623
|
+
"group.global": "Global",
|
|
624
|
+
"group.others": "Sonstige",
|
|
625
|
+
"group.overrides": "Weitere Overrides (Plugins, bundled…)",
|
|
626
|
+
"state.enabled": "aktiviert",
|
|
627
|
+
"state.disabled": "deaktiviert",
|
|
628
|
+
"change.toggle": "{what} → {state}",
|
|
629
|
+
"change.toggleAt": "{what} → {state} ({where})",
|
|
630
|
+
"change.stashed": "{what} → beiseitegelegt",
|
|
631
|
+
"change.unstashed": "{what} → aus dem Stash entfernt",
|
|
632
|
+
"change.removedFrom": "{what} → aus {where} entfernt",
|
|
633
|
+
"change.restoredIn": "{what} → in {where} wiederhergestellt",
|
|
634
|
+
"change.approved": "{what} → genehmigt",
|
|
635
|
+
"change.rejected": "{what} → abgelehnt",
|
|
636
|
+
"hint.stash": "Stash",
|
|
637
|
+
"hint.link": "Link",
|
|
638
|
+
"hint.local": "lokal",
|
|
639
|
+
"hint.project": "Projekt",
|
|
640
|
+
"hint.user": "Benutzer",
|
|
641
|
+
"hint.notFound": "nicht auf der Festplatte gefunden",
|
|
642
|
+
"hint.notInstalled": "nicht installiert",
|
|
643
|
+
"hint.otherSource": "andere Quelle",
|
|
644
|
+
"hint.noLongerDetected": "(nicht mehr erkannt)",
|
|
645
|
+
"hint.claudeaiConnector": "claude.ai-Connector",
|
|
646
|
+
"hint.disabledIn": "in {n}/{total} Projekten deaktiviert",
|
|
647
|
+
"hint.allProjects": "alle Projekte",
|
|
648
|
+
"label.allHooks": "Alle Hooks dieses Bereichs",
|
|
649
|
+
"label.allHooksShort": "Alle Hooks",
|
|
650
|
+
"label.claudeaiConnectors": "claude.ai-Connectors",
|
|
651
|
+
"label.dryRun": "Probelauf",
|
|
652
|
+
"label.error": "Fehler",
|
|
653
|
+
"label.none": "keine",
|
|
654
|
+
"label.noKind": "kein Typ",
|
|
655
|
+
"label.nothingManageable": "nichts verwaltbar",
|
|
656
|
+
"label.enable": "aktivieren ",
|
|
657
|
+
"label.disable": "deaktivieren",
|
|
658
|
+
"note.nativeFlag": "nativer Schalter: {flag}",
|
|
659
|
+
"note.nativeList": "nativer Schalter: Liste {list}",
|
|
660
|
+
"note.noNativeStash": "kein nativer Schalter: Entfernen und Wiederherstellen über den Stash",
|
|
661
|
+
"note.hookStash": "deaktivierter Hook = entfernt und im Stash aufbewahrt",
|
|
662
|
+
"note.movedTo": "deaktiviert = verschoben nach {dir}",
|
|
663
|
+
"note.list": "Liste {list}",
|
|
664
|
+
"note.allSources": "alle Quellen",
|
|
665
|
+
"note.grokPlugins": "grok plugin enable|disable (schreibt [plugins] enabled/disabled in ~/.grok/config.toml)",
|
|
666
|
+
"note.grokSkills": "Projekt-Skills werden auch hier deaktiviert: nur die Benutzerkonfiguration akzeptiert [skills].",
|
|
667
|
+
"note.linkMoved": "Kein nativer Schalter: der Link wird verschoben. ein Skript zur Skill-Synchronisierung würde ihn neu anlegen.",
|
|
668
|
+
"note.dirMoved": "Kein nativer Schalter pro Skill: der Ordner wird verschoben.",
|
|
669
|
+
"note.sharedSkillsMoved": "Kein nativer Schalter pro Skill: der Ordner (oder Link) wird verschoben. Achtung, .agents/skills wird mit anderen Agenten geteilt.",
|
|
670
|
+
"note.copilotMcpUnion": "Auf Repository-Ebene addiert sich die Liste: ein Projekt kann deaktivieren, aber nicht reaktivieren.",
|
|
671
|
+
"note.copilotBuiltinAgents": "subagents.disabledSubagents akzeptiert auch integrierte Agenten: ihren Namen bei Bedarf von Hand hinzufügen.",
|
|
672
|
+
"note.devinMcp": "disabled: true (entspricht devin mcp disable) · aus Cursor/Claude importierte MCP-Server werden dort deaktiviert",
|
|
673
|
+
"note.qwenUnion": "Die Listen addieren sich über die Bereiche: ein Projekt kann einen auf Benutzerebene deaktivierten Skill nicht reaktivieren.",
|
|
674
|
+
"note.noFile": "keine Datei",
|
|
675
|
+
"note.opencodeAgents": "agent.<Name>.disable = true (funktioniert auch für build, plan, general, explore)",
|
|
676
|
+
"note.claudeMcpUser": "Benutzer: die in ~/.claude.json definierten Server werden entfernt/wiederhergestellt (Stash).\nPlugins und claude.ai-Connectors haben keinen globalen Schalter pro Server:\nsie werden in allen in ~/.claude.json bekannten Projekten deaktiviert.",
|
|
677
|
+
"note.claudeMcpProject": "Projekt: Liste disabledMcpServers dieses Projekts in ~/.claude.json (entspricht /mcp).",
|
|
678
|
+
"note.claudePlugins": "enabledPlugins — Vorrang: lokal > Projekt > Benutzer. „synced“-Plugins stammen von claude.ai.",
|
|
679
|
+
"note.claudeSkills": "skillOverrides: \"off\" blendet den Skill aus. Plugin-Skills werden über ihr Plugin verwaltet.",
|
|
680
|
+
"notes.codex.trust": "Die Projektkonfiguration (.codex/config.toml) wird nur gelesen, wenn das Projekt „trusted“ ist.",
|
|
681
|
+
"notes.codex.hookTrust": "Ein reaktivierter Hook wird am Ende angefügt: Codex fragt eventuell erneut nach Vertrauen.",
|
|
682
|
+
"notes.grok.compat": "Grok liest auch MCP-Server, Hooks und Skills von Claude/Cursor/Codex ([compat.<Tool>] in config.toml).",
|
|
683
|
+
"notes.grok.trust": "Die Projektkonfiguration .grok/config.toml gilt nur in einem „trusted“-Ordner.",
|
|
684
|
+
"notes.cursor.plugins": "Cursor-Plugins: nur in der IDE umschaltbar (Bereich Customize).",
|
|
685
|
+
"notes.devin.plugins": "Devin-Plugins: kein Aktivieren/Deaktivieren (nur install/remove).",
|
|
686
|
+
"notes.gemini.extensions": "Erweiterungen: gemini extensions enable|disable (hier nicht verwaltet).",
|
|
687
|
+
"notes.qwen.extensions": "Erweiterungen: qwen extensions enable|disable (hier nicht verwaltet).",
|
|
688
|
+
"notes.amp.plugins": "Amp-Hooks, -Befehle und -Agenten stecken in Plugins: das Plugin zu deaktivieren deaktiviert sie.",
|
|
689
|
+
"notes.opencode.hooks": "OpenCode-Hooks: nur über Plugins.",
|
|
690
|
+
"notes.crush.format": "Nur das Format crush.json wird verwaltet; eine crushrc-Datei hat Vorrang davor.",
|
|
691
|
+
"notes.warp.state": "Warp speichert den Zustand seiner MCP-Server, Workflows und Regeln in der App (SQLite, Warp Drive).",
|
|
692
|
+
"notes.warp.none": "Keine Datei lässt sich gefahrlos bearbeiten: hier wird nichts verwaltet.",
|
|
693
|
+
"notes.claude.skills": "Skills: offizielle Einstellung skillOverrides (Dateien bleiben, wo sie sind).",
|
|
694
|
+
"notes.claude.connectors": "claude.ai-Connectors: globaler Schalter disableClaudeAiConnectors (eigenes Menü).",
|
|
695
|
+
"title.mods": "Mods (Plugins)",
|
|
696
|
+
"title.extensions": "Erweiterungen",
|
|
697
|
+
"title.promptTemplates": "Prompt-Vorlagen",
|
|
698
|
+
"title.workflows": "Workflows (Slash-Befehle)",
|
|
699
|
+
"note.strictSchema": "kein nativer Schalter, unbekannte Schlüssel werden abgelehnt: Entfernen und Wiederherstellen über den Stash",
|
|
700
|
+
"note.traeAllow": "allow_mcp_servers ist eine Positivliste: nur die ausgewählten Server starten.",
|
|
701
|
+
"notes.junie.native": "Junie deaktiviert MCP-Server und Skills über /mcp und /skills, der Speicherort dieser Wahl ist aber nicht dokumentiert: agent-toggle entfernt oder verschiebt das Element stattdessen.",
|
|
702
|
+
"notes.amazonq.legacy": "Amazon Q Developer CLI wird nicht mehr gepflegt und wurde zu Kiro CLI, das den Ordner .amazonq/ des Projekts weiterhin liest.",
|
|
703
|
+
"notes.letta.mcp": "Letta speichert MCP-Server pro Agent (agents[].mcpServers) ohne Deaktivierungs-Flag: verwenden Sie /mcp in Letta.",
|
|
704
|
+
"notes.pi.noMcp": "Pi hat keine native MCP-Unterstützung (nur über Community-Pakete).",
|
|
705
|
+
"notes.windsurf.devin": "Windsurf wurde zu Devin Desktop, dessen MCP-Datei mit Devin CLI geteilt wird (siehe Eintrag Devin CLI).",
|
|
706
|
+
"notes.aider.none": "Aider hat weder MCP, Plugins, Skills, Hooks noch Subagenten: nichts umzuschalten.",
|
|
707
|
+
"notes.plandex.none": "Plandex hat weder MCP, Plugins, Skills, Hooks noch Subagenten: nichts umzuschalten.",
|
|
708
|
+
"notes.goose.plugins": "Skills, Hooks und Subagenten von Goose stammen aus Plugins: das Plugin zu deaktivieren deaktiviert sie.",
|
|
709
|
+
"notes.continue.maintenance": "Continue ist im Wartungsmodus (2.0.0 ist die letzte Version).",
|
|
710
|
+
"notes.iflow.discontinued": "iFlow CLI wurde am 2026-04-17 eingestellt.",
|
|
711
|
+
"notes.qodo.deprecated": "Qodo Command ist veraltet (ersetzt durch die Qodo Agentic Toolbox); nur die mcp.json des Projekts wird verwaltet.",
|
|
712
|
+
"notes.vibe.trust": "Die Projektkonfiguration .vibe/config.toml wird nur in „trusted“-Ordnern geladen.",
|
|
713
|
+
"err.badJson": "Unlesbares JSON: {file}",
|
|
714
|
+
"err.badToml": "Unlesbares TOML: {file} ({msg})",
|
|
715
|
+
"err.badYaml": "Unlesbares YAML: {file} ({msg})",
|
|
716
|
+
"err.destExists": "Ziel existiert bereits: {path}",
|
|
717
|
+
"err.failed": "fehlgeschlagen",
|
|
718
|
+
"err.badScope": "Unbekannter Bereich: {scope} (user | project | local | both | all)",
|
|
719
|
+
"err.nothingForKind": "{agent}: nichts zu verwalten für „{kind}“ ({kinds})",
|
|
720
|
+
"err.badLang": "Unbekannte Sprache: {lang} ({langs})",
|
|
721
|
+
"err.notFound": "Nicht gefunden: {ids} (siehe „agent-toggle list {agent} {kind}“)",
|
|
722
|
+
"err.unknownCommand": "Unbekannter Befehl: {cmd}",
|
|
723
|
+
"err.unknownAgent": "Unbekannter Agent: {id} — {agents}",
|
|
724
|
+
"usage.list": "list <Agent|all> <Typ>",
|
|
725
|
+
"usage.toggle": "{cmd} <Agent> <Typ> <ID...>",
|
|
726
|
+
"usage.claudeai": "claudeai on | off",
|
|
727
|
+
"msg.noChange": "Keine Änderung.",
|
|
728
|
+
"msg.currentLang": "Sprache: {lang}",
|
|
729
|
+
"msg.langSaved": "Sprache gespeichert: {lang}",
|
|
730
|
+
"msg.groupsFile": "MCP-Gruppen: {file}",
|
|
731
|
+
"msg.nothingToChange": "Nichts zu ändern.",
|
|
732
|
+
"msg.changesCount": "{n} Änderung(en)",
|
|
733
|
+
"msg.noItems": "Keine „{title}“-Elemente in diesem Bereich.",
|
|
734
|
+
"msg.noMcp": "Kein MCP-Server in diesem Bereich.",
|
|
735
|
+
"msg.interrupted": "Abgebrochen.",
|
|
736
|
+
"msg.outroChanged": "Starten Sie die betroffenen Agenten neu, damit die Änderungen wirksam werden.\nSicherungen: {dir}",
|
|
737
|
+
"msg.bye": "Bis bald.",
|
|
738
|
+
"prompt.listKeys": "(Leertaste: auswählen · Enter: bestätigen · Esc: zurück)",
|
|
739
|
+
"prompt.simulate": "Simulieren?",
|
|
740
|
+
"prompt.apply": "Anwenden?",
|
|
741
|
+
"prompt.escBack": "(Esc: zurück)",
|
|
742
|
+
"prompt.scope": "Bereich?",
|
|
743
|
+
"prompt.category": "Kategorie?",
|
|
744
|
+
"prompt.action": "Aktion?",
|
|
745
|
+
"prompt.projectDir": "Projektordner",
|
|
746
|
+
"claudeai.status": "Benutzer: {user} · Dieses Projekt (lokal): {local}\nEin einzelner Connector wird pro Projekt unter „MCP-Server“ deaktiviert (Namen „claude.ai …“).\nHinzufügen oder Entfernen im Konto erfolgt auf {url}.",
|
|
747
|
+
"claudeai.off": "deaktiviert",
|
|
748
|
+
"claudeai.on": "aktiv",
|
|
749
|
+
"claudeai.inherited": "geerbt",
|
|
750
|
+
"claudeai.userOff": "Alle Connectors deaktivieren (Benutzer)",
|
|
751
|
+
"claudeai.userOn": "Connectors wiederherstellen (Benutzer)",
|
|
752
|
+
"claudeai.localOff": "Alle Connectors in diesem Projekt deaktivieren",
|
|
753
|
+
"claudeai.localOn": "Connectors in diesem Projekt wiederherstellen",
|
|
754
|
+
"claudeai.open": "Connectors auf claude.ai verwalten",
|
|
755
|
+
"claudeai.openHint": "öffnet den Browser",
|
|
756
|
+
"claudeai.globalHint": "globaler Schalter",
|
|
757
|
+
"menu.crossMcp": "MCP-Server — alle Agenten",
|
|
758
|
+
"menu.crossMcpHint": "Gesamtansicht, nach Funktion gruppiert",
|
|
759
|
+
"menu.project": "Projekt",
|
|
760
|
+
"menu.homeDir": "Benutzerordner",
|
|
761
|
+
"menu.changeProject": "Projekt wechseln",
|
|
762
|
+
"menu.language": "Sprache",
|
|
763
|
+
"menu.quit": "Beenden",
|
|
764
|
+
"help": `agent-toggle — aktiviert/deaktiviert MCP-Server, Plugins, Skills, Hooks, Befehle und Agenten
|
|
765
|
+
aller installierten KI-Agenten-CLIs ({agents})
|
|
766
|
+
|
|
767
|
+
Verwendung:
|
|
768
|
+
agent-toggle interaktives Menü
|
|
769
|
+
agent-toggle agents [--all] erkannte Agenten (--all: alle unterstützten Agenten)
|
|
770
|
+
agent-toggle list <Agent|all> <Typ> Status der Elemente (Typ: {kinds})
|
|
771
|
+
agent-toggle enable <Agent> <Typ> <ID...> aktivieren
|
|
772
|
+
agent-toggle disable <Agent> <Typ> <ID...> deaktivieren
|
|
773
|
+
agent-toggle claudeai on|off claude.ai-Connectors (Claude Code)
|
|
774
|
+
agent-toggle groups schreibt ~/.agent-toggle/groups.json (MCP-Gruppen)
|
|
775
|
+
agent-toggle lang [Code] zeigt oder speichert die Sprache der Oberfläche
|
|
776
|
+
|
|
777
|
+
Optionen:
|
|
778
|
+
-p, --project <Ordner> Zielprojekt (Standard: aktueller Ordner)
|
|
779
|
+
-s, --scope <Bereich> user | project | local | both (user+project) | all
|
|
780
|
+
-n, --dry-run zeigt die Änderungen, ohne etwas zu schreiben
|
|
781
|
+
-a, --all agents: listet auch unterstützte, nicht installierte Agenten
|
|
782
|
+
-l, --lang <{langs}> Sprache der Oberfläche für diesen Aufruf`,
|
|
783
|
+
};
|
|
784
|
+
const CATALOGS = { en, fr, es, de };
|
|
785
|
+
// ---------------------------------------------------------------- API
|
|
786
|
+
let current = "en";
|
|
787
|
+
export function isLang(v) {
|
|
788
|
+
return typeof v === "string" && v in LANGS;
|
|
789
|
+
}
|
|
790
|
+
export function setLang(l) {
|
|
791
|
+
current = l;
|
|
792
|
+
}
|
|
793
|
+
export function getLang() {
|
|
794
|
+
return current;
|
|
795
|
+
}
|
|
796
|
+
/** Translates a key, interpolating {name} placeholders; falls back to English. */
|
|
797
|
+
export function t(key, vars) {
|
|
798
|
+
const text = CATALOGS[current][key] ?? en[key] ?? key;
|
|
799
|
+
return vars ? text.replace(/\{(\w+)\}/g, (m, k) => (k in vars ? String(vars[k]) : m)) : text;
|
|
800
|
+
}
|
|
801
|
+
function savedLang() {
|
|
802
|
+
try {
|
|
803
|
+
const lang = JSON.parse(fs.readFileSync(configFile, "utf8")).lang;
|
|
804
|
+
return isLang(lang) ? lang : undefined;
|
|
805
|
+
}
|
|
806
|
+
catch {
|
|
807
|
+
return undefined;
|
|
808
|
+
}
|
|
809
|
+
}
|
|
810
|
+
/** Precedence: --lang flag > AGENT_TOGGLE_LANG > saved config > English. */
|
|
811
|
+
export function resolveLang(flag) {
|
|
812
|
+
if (flag !== undefined) {
|
|
813
|
+
if (!isLang(flag))
|
|
814
|
+
throw new Error(t("err.badLang", { lang: flag, langs: Object.keys(LANGS).join(", ") }));
|
|
815
|
+
return flag;
|
|
816
|
+
}
|
|
817
|
+
const env = process.env.AGENT_TOGGLE_LANG;
|
|
818
|
+
if (isLang(env))
|
|
819
|
+
return env;
|
|
820
|
+
return savedLang() ?? "en";
|
|
821
|
+
}
|
|
822
|
+
/** Persists the language (a UI preference: written even in dry-run mode). */
|
|
823
|
+
export function saveLang(l) {
|
|
824
|
+
let cfg = {};
|
|
825
|
+
try {
|
|
826
|
+
cfg = JSON.parse(fs.readFileSync(configFile, "utf8"));
|
|
827
|
+
}
|
|
828
|
+
catch { /* no config yet */ }
|
|
829
|
+
cfg.lang = l;
|
|
830
|
+
fs.mkdirSync(path.dirname(configFile), { recursive: true });
|
|
831
|
+
fs.writeFileSync(configFile, JSON.stringify(cfg, null, 2) + "\n", "utf8");
|
|
832
|
+
}
|