claude-home 1.4.4 → 1.4.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/package.json +1 -1
  2. package/public/index.html +194 -193
  3. package/server.js +11 -2
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-home",
3
- "version": "1.4.4",
3
+ "version": "1.4.8",
4
4
  "description": "Web dashboard for Claude Code — browse sessions, manage skills, hooks, commands, and agents",
5
5
  "main": "server.js",
6
6
  "bin": {
package/public/index.html CHANGED
@@ -1488,6 +1488,19 @@
1488
1488
  Skills
1489
1489
  <span class="nav-count" x-show="toolSkills.length>0" x-text="toolSkills.length"></span>
1490
1490
  </div>
1491
+ <div class="nav-item" :class="{ active: view === 'commands' }" @click="view='commands';selectedSession=null;loadTools()">
1492
+ <span class="nav-icon">
1493
+ <svg width="16" height="16" viewBox="0 0 16 16" fill="none" stroke-width="1.5">
1494
+ <rect x="2" y="3" width="12" height="10"/>
1495
+ <polyline points="5,7 7,9 5,11"/><line x1="8" y1="11" x2="12" y2="11"/>
1496
+ </svg>
1497
+ </span>
1498
+ Commands
1499
+ <span class="nav-count" x-show="toolCommands.length>0" x-text="toolCommands.length"></span>
1500
+ </div>
1501
+ </div>
1502
+ <div class="nav-divider"></div>
1503
+ <div class="nav-section">
1491
1504
  <div class="nav-item" :class="{ active: view === 'memory' }" @click="view='memory';selectedSession=null;loadMemory()">
1492
1505
  <span class="nav-icon">
1493
1506
  <svg width="16" height="16" viewBox="0 0 16 16" fill="none" stroke-width="1.5">
@@ -1498,15 +1511,13 @@
1498
1511
  Memory
1499
1512
  <span class="nav-count" x-show="memoryFiles.length>0" x-text="memoryFiles.length"></span>
1500
1513
  </div>
1501
- <div class="nav-item" :class="{ active: view === 'commands' }" @click="view='commands';selectedSession=null;loadTools()">
1514
+ <div class="nav-item" :class="{ active: view === 'instructions' }" @click="view='instructions';selectedSession=null;loadConfig()">
1502
1515
  <span class="nav-icon">
1503
- <svg width="16" height="16" viewBox="0 0 16 16" fill="none" stroke-width="1.5">
1504
- <rect x="2" y="3" width="12" height="10"/>
1505
- <polyline points="5,7 7,9 5,11"/><line x1="8" y1="11" x2="12" y2="11"/>
1516
+ <svg width="16" height="16" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5">
1517
+ <path d="M3 2h10v12H3z"/><line x1="5.5" y1="5.5" x2="10.5" y2="5.5"/><line x1="5.5" y1="8" x2="10.5" y2="8"/><line x1="5.5" y1="10.5" x2="8.5" y2="10.5"/>
1506
1518
  </svg>
1507
1519
  </span>
1508
- Commands
1509
- <span class="nav-count" x-show="toolCommands.length>0" x-text="toolCommands.length"></span>
1520
+ Instructions
1510
1521
  </div>
1511
1522
  </div>
1512
1523
  <div class="nav-divider"></div>
@@ -1521,14 +1532,6 @@
1521
1532
  </span>
1522
1533
  Config
1523
1534
  </div>
1524
- <div class="nav-item" :class="{ active: view === 'instructions' }" @click="view='instructions';selectedSession=null;loadConfig()">
1525
- <span class="nav-icon">
1526
- <svg width="16" height="16" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5">
1527
- <path d="M3 2h10v12H3z"/><line x1="5.5" y1="5.5" x2="10.5" y2="5.5"/><line x1="5.5" y1="8" x2="10.5" y2="8"/><line x1="5.5" y1="10.5" x2="8.5" y2="10.5"/>
1528
- </svg>
1529
- </span>
1530
- Instructions
1531
- </div>
1532
1535
  <div class="nav-item" :class="{ active: view === 'permissions' }" @click="view='permissions';selectedSession=null;loadConfig()">
1533
1536
  <span class="nav-icon">
1534
1537
  <svg width="16" height="16" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5">
@@ -1703,7 +1706,7 @@
1703
1706
  </template>
1704
1707
  <span x-text="formatDate(sessions[0].modified)"></span>
1705
1708
  <span x-text="sessions[0].messageCount + ' msgs'"></span>
1706
- <button class="btn btn-primary btn-sm" style="margin-left:auto" :id="'resume-db'" :disabled="!sessions[0].resumable" :title="!sessions[0].resumable ? 'Archivo de sesión eliminado no se puede retomar' : 'Copiar comando para retomar esta sesión'" @click.stop="sessions[0].resumable && resumeSession(sessions[0].sessionId,'resume-db', sessions[0].projectPath)">Resume →</button>
1709
+ <button class="btn btn-primary btn-sm" style="margin-left:auto" :id="'resume-db'" :disabled="!sessions[0].resumable" :title="!sessions[0].resumable ? 'Session file deletedcannot resume' : 'Copy command to resume this session'" @click.stop="sessions[0].resumable && resumeSession(sessions[0].sessionId,'resume-db', sessions[0].projectPath)">Resume →</button>
1707
1710
  </div>
1708
1711
  </div>
1709
1712
  </template>
@@ -1792,11 +1795,11 @@
1792
1795
  <div x-show="sessionsTab==='list'" style="display:flex;align-items:center;gap:8px;padding:8px 20px;border-top:1px solid var(--rule);width:100%;flex-wrap:wrap">
1793
1796
  <input class="search-input" type="text" placeholder="Filter sessions…"
1794
1797
  x-model="filterText" @input.debounce.300ms="loadSessions()" style="flex:1;max-width:380px" />
1795
- <select class="filter-select" x-model="filterProject" @change="loadSessions(); loadBranches()">
1798
+ <select class="filter-select" x-model="filterProject" x-init="$nextTick(()=>{ $el.value = filterProject })" @change="loadSessions(); loadBranches()">
1796
1799
  <option value="">All projects</option>
1797
1800
  <template x-for="p in projects" :key="p.dirName"><option :value="p.dirName" x-text="shortProjectName(p.projectPath)"></option></template>
1798
1801
  </select>
1799
- <select class="filter-select" x-model="filterBranch" @change="loadSessions()">
1802
+ <select class="filter-select" x-model="filterBranch" x-init="$nextTick(()=>{ $el.value = filterBranch })" @change="loadSessions()">
1800
1803
  <option value="">All branches</option>
1801
1804
  <template x-for="b in branches" :key="b"><option :value="b" x-text="b"></option></template>
1802
1805
  </select>
@@ -1867,7 +1870,7 @@
1867
1870
  </div>
1868
1871
  </div>
1869
1872
  <div class="session-right">
1870
- <button class="session-resume-btn" :id="'resume-' + s.sessionId" :disabled="!s.resumable" :title="!s.resumable ? 'Archivo de sesión eliminado no se puede retomar' : 'Copiar comando para retomar esta sesión'" @click.stop="s.resumable && resumeSession(s.sessionId, 'resume-' + s.sessionId, s.projectPath)">Resume →</button>
1873
+ <button class="session-resume-btn" :id="'resume-' + s.sessionId" :disabled="!s.resumable" :title="!s.resumable ? 'Session file deletedcannot resume' : 'Copy command to resume this session'" @click.stop="s.resumable && resumeSession(s.sessionId, 'resume-' + s.sessionId, s.projectPath)">Resume →</button>
1871
1874
  </div>
1872
1875
  </div>
1873
1876
  </template>
@@ -1984,7 +1987,7 @@
1984
1987
  </div>
1985
1988
  <button class="btn btn-sm" style="background:var(--red-dim,#3a1a1a);color:var(--red);border:1px solid var(--red)" @click="deleteSession()" x-show="!deletingSession">Delete</button>
1986
1989
  <span x-show="deletingSession" style="font-size:12px;color:var(--ink-3)">Deleting…</span>
1987
- <button class="btn btn-primary btn-sm" id="resume-detail" :disabled="!sessionDetail?.resumable" :title="!sessionDetail?.resumable ? 'Archivo de sesión eliminado no se puede retomar' : 'Copiar comando para retomar esta sesión'" @click="sessionDetail?.resumable && resumeSession(selectedSession.sessionId, 'resume-detail', selectedSession.projectPath)">
1990
+ <button class="btn btn-primary btn-sm" id="resume-detail" :disabled="!sessionDetail?.resumable" :title="!sessionDetail?.resumable ? 'Session file deletedcannot resume' : 'Copy command to resume this session'" @click="sessionDetail?.resumable && resumeSession(selectedSession.sessionId, 'resume-detail', selectedSession.projectPath)">
1988
1991
  Resume →
1989
1992
  </button>
1990
1993
  <span x-show="exportMsg" x-text="exportMsg" style="font-size:12px;color:var(--green)" x-transition></span>
@@ -2260,7 +2263,7 @@
2260
2263
  <div class="empty"><div class="empty-mark"><svg width="18" height="18" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5"><rect x="2" y="2" width="12" height="12"/><line x1="5" y1="6" x2="11" y2="6"/><line x1="5" y1="9" x2="9" y2="9"/></svg></div>No plans found in ~/.claude/plans/</div>
2261
2264
  </template>
2262
2265
  <template x-if="!plansLoading && plans.length > 0 && filteredPlans().length === 0">
2263
- <div class="empty"><div class="empty-mark">—</div>Ningún plan coincide con "<span x-text="plansSearch"></span>"</div>
2266
+ <div class="empty"><div class="empty-mark">—</div>No plans match "<span x-text="plansSearch"></span>"</div>
2264
2267
  </template>
2265
2268
  <template x-if="!plansLoading && filteredPlans().length > 0">
2266
2269
  <div class="memory-layout">
@@ -2381,7 +2384,7 @@
2381
2384
  <button class="btn btn-outline btn-sm" @click="agentNew.open=!agentNew.open;agentNew.msg='';agentNew.slug='';agentNew.name='';agentNew.description='';agentNew.tools='';agentNew.color='';agentNew.content='';agentNew.scope=configProject?'project':'user';agentEdit.active=false" x-text="agentNew.open?'Cancelar':'+ Add agent'"></button>
2382
2385
  </div>
2383
2386
  <select class="filter-select" style="font-size:12px;max-width:260px" x-model="configProject">
2384
- <option value="">Solo scope usuario</option>
2387
+ <option value="">All projects (user scope only)</option>
2385
2388
  <template x-for="p in projects" :key="p.dirName">
2386
2389
  <option :value="p.dirName" x-text="shortProjectName(p.projectPath)"></option>
2387
2390
  </template>
@@ -2418,7 +2421,7 @@
2418
2421
  style="font-size:12px;padding:5px 8px;border:1px solid var(--rule-2);border-radius:4px;background:var(--white);font-family:monospace">
2419
2422
  <input type="text" x-model="agentNew.name" placeholder="Nombre visible"
2420
2423
  style="font-size:12px;padding:5px 8px;border:1px solid var(--rule-2);border-radius:4px;background:var(--white)">
2421
- <input type="text" x-model="agentNew.description" placeholder="Descripción breve"
2424
+ <input type="text" x-model="agentNew.description" placeholder="Brief description"
2422
2425
  style="font-size:12px;padding:5px 8px;border:1px solid var(--rule-2);border-radius:4px;background:var(--white)">
2423
2426
  <input type="text" x-model="agentNew.tools" placeholder="Tools (ej: Read, Write, Bash, Grep)"
2424
2427
  style="font-size:12px;padding:5px 8px;border:1px solid var(--rule-2);border-radius:4px;background:var(--white)">
@@ -2433,7 +2436,7 @@
2433
2436
  style="font-size:12px;padding:5px 8px;border:1px solid var(--rule-2);border-radius:4px;background:var(--white);resize:vertical;font-family:monospace"></textarea>
2434
2437
  <div style="display:flex;align-items:center;gap:8px">
2435
2438
  <button class="btn btn-primary btn-sm" @click="createAgent()" :disabled="agentNew.saving">
2436
- <span x-text="agentNew.saving?'Creando…':'Crear agente'"></span>
2439
+ <span x-text="agentNew.saving?'Creating…':'Create agent'"></span>
2437
2440
  </button>
2438
2441
  <span class="err-msg" x-show="agentNew.msg" x-text="agentNew.msg"></span>
2439
2442
  </div>
@@ -2495,7 +2498,7 @@
2495
2498
  <div style="display:flex;flex-direction:column;gap:8px;margin-top:8px;padding:12px;background:var(--canvas);border-radius:6px;border:1px solid var(--rule)">
2496
2499
  <input type="text" x-model="agentEdit.draftName" placeholder="Nombre visible"
2497
2500
  style="font-size:12px;padding:5px 8px;border:1px solid var(--rule-2);border-radius:4px;background:var(--white)">
2498
- <input type="text" x-model="agentEdit.draftDesc" placeholder="Descripción breve"
2501
+ <input type="text" x-model="agentEdit.draftDesc" placeholder="Brief description"
2499
2502
  style="font-size:12px;padding:5px 8px;border:1px solid var(--rule-2);border-radius:4px;background:var(--white)">
2500
2503
  <input type="text" x-model="agentEdit.draftTools" placeholder="Tools (ej: Read, Write, Bash)"
2501
2504
  style="font-size:12px;padding:5px 8px;border:1px solid var(--rule-2);border-radius:4px;background:var(--white)">
@@ -2510,7 +2513,7 @@
2510
2513
  style="font-size:12px;padding:5px 8px;border:1px solid var(--rule-2);border-radius:4px;background:var(--white);resize:vertical;font-family:monospace"></textarea>
2511
2514
  <div style="display:flex;align-items:center;gap:8px">
2512
2515
  <button class="btn btn-primary btn-sm" @click="saveAgent()" :disabled="agentEdit.saving">
2513
- <span x-text="agentEdit.saving?'Guardando…':'Guardar'"></span>
2516
+ <span x-text="agentEdit.saving?'Saving…':'Guardar'"></span>
2514
2517
  </button>
2515
2518
  <span x-show="agentEdit.msg" x-text="agentEdit.msg"
2516
2519
  :style="agentEdit.msg.startsWith('Error')?'color:var(--red);font-size:12px':'color:var(--green);font-size:12px'"></span>
@@ -2546,7 +2549,7 @@
2546
2549
  </template>
2547
2550
  <template x-if="view==='hooks'||view==='instructions'||view==='permissions'||view==='commands'||view==='skills'">
2548
2551
  <select class="filter-select" style="font-size:12px;max-width:260px" x-model="configProject">
2549
- <option value="">Solo scope usuario</option>
2552
+ <option value="">All projects (user scope only)</option>
2550
2553
  <template x-for="p in projects" :key="p.dirName">
2551
2554
  <option :value="p.dirName" x-text="shortProjectName(p.projectPath)"></option>
2552
2555
  </template>
@@ -2569,7 +2572,7 @@
2569
2572
  <template x-if="view==='commands'&&cliTab==='slash'">
2570
2573
  <div class="cli-cheatsheet">
2571
2574
  <table class="cli-cs-table">
2572
- <thead><tr><th>Comando</th><th>Propósito</th><th style="width:28px"></th></tr></thead>
2575
+ <thead><tr><th>Command</th><th>Purpose</th><th style="width:28px"></th></tr></thead>
2573
2576
  <tbody>
2574
2577
  <template x-for="(c, i) in sortedSlashCmds()" :key="c.cmd">
2575
2578
  <tr :class="pinnedSlashCmds.includes(c.cmd) ? 'slash-row-pinned' : ''"
@@ -2602,64 +2605,64 @@
2602
2605
  <div class="cli-cs-section">
2603
2606
  <div class="cli-cs-title">Comandos</div>
2604
2607
  <table class="cli-cs-table">
2605
- <thead><tr><th>Comando</th><th>Descripción</th></tr></thead>
2608
+ <thead><tr><th>Command</th><th>Description</th></tr></thead>
2606
2609
  <tbody>
2607
- <tr><td><code>claude</code></td><td>Iniciar sesión interactiva</td></tr>
2608
- <tr><td><code>claude "query"</code></td><td>Sesión con prompt inicial</td></tr>
2610
+ <tr><td><code>claude</code></td><td>Start interactive session</td></tr>
2611
+ <tr><td><code>claude "query"</code></td><td>Session with initial prompt</td></tr>
2609
2612
  <tr><td><code>claude -p "query"</code></td><td>Consulta no interactiva (SDK), luego sale</td></tr>
2610
2613
  <tr><td><code>cat file | claude -p "query"</code></td><td>Procesar contenido canalizado</td></tr>
2611
- <tr><td><code>claude -c</code></td><td>Continuar la conversación más reciente</td></tr>
2614
+ <tr><td><code>claude -c</code></td><td>Continue most recent conversation</td></tr>
2612
2615
  <tr><td><code>claude -c -p "query"</code></td><td>Continuar via SDK</td></tr>
2613
- <tr><td><code>claude -r "&lt;session&gt;" "query"</code></td><td>Reanudar sesión por ID o nombre</td></tr>
2614
- <tr><td><code>claude update</code></td><td>Actualizar a la última versión</td></tr>
2615
- <tr><td><code>claude auth login</code></td><td>Iniciar sesión en Anthropic</td></tr>
2616
- <tr><td><code>claude auth logout</code></td><td>Cerrar sesión</td></tr>
2617
- <tr><td><code>claude auth status</code></td><td>Estado de autenticación</td></tr>
2618
- <tr><td><code>claude agents</code></td><td>Listar subagents configurados</td></tr>
2619
- <tr><td><code>claude mcp</code></td><td>Configurar servidores MCP</td></tr>
2616
+ <tr><td><code>claude -r "&lt;session&gt;" "query"</code></td><td>Resume session por ID o nombre</td></tr>
2617
+ <tr><td><code>claude update</code></td><td>Update to latest version</td></tr>
2618
+ <tr><td><code>claude auth login</code></td><td>Sign in to Anthropic</td></tr>
2619
+ <tr><td><code>claude auth logout</code></td><td>Sign out</td></tr>
2620
+ <tr><td><code>claude auth status</code></td><td>Authentication status</td></tr>
2621
+ <tr><td><code>claude agents</code></td><td>List configured subagents</td></tr>
2622
+ <tr><td><code>claude mcp</code></td><td>Configure MCP servers</td></tr>
2620
2623
  </tbody>
2621
2624
  </table>
2622
2625
  </div>
2623
2626
  <div class="cli-cs-section">
2624
- <div class="cli-cs-title">Banderas de system prompt</div>
2627
+ <div class="cli-cs-title">System prompt flags</div>
2625
2628
  <table class="cli-cs-table">
2626
- <thead><tr><th>Bandera</th><th>Efecto</th></tr></thead>
2629
+ <thead><tr><th>Flag</th><th>Effect</th></tr></thead>
2627
2630
  <tbody>
2628
- <tr><td><code>--system-prompt "..."</code></td><td>Reemplaza todo el prompt predeterminado</td></tr>
2629
- <tr><td><code>--system-prompt-file ./file</code></td><td>Reemplaza con contenido de archivo</td></tr>
2630
- <tr><td><code>--append-system-prompt "..."</code></td><td>Añade al prompt predeterminado</td></tr>
2631
- <tr><td><code>--append-system-prompt-file ./file</code></td><td>Añade contenido de archivo al prompt</td></tr>
2631
+ <tr><td><code>--system-prompt "..."</code></td><td>Replaces the entire default system prompt</td></tr>
2632
+ <tr><td><code>--system-prompt-file ./file</code></td><td>Replaces with file content</td></tr>
2633
+ <tr><td><code>--append-system-prompt "..."</code></td><td>Appends to default system prompt</td></tr>
2634
+ <tr><td><code>--append-system-prompt-file ./file</code></td><td>Appends file content to system prompt</td></tr>
2632
2635
  </tbody>
2633
2636
  </table>
2634
2637
  </div>
2635
2638
  </div>
2636
2639
  <div>
2637
2640
  <div class="cli-cs-section">
2638
- <div class="cli-cs-title">Banderas más usadas</div>
2641
+ <div class="cli-cs-title">Common flags</div>
2639
2642
  <table class="cli-cs-table">
2640
- <thead><tr><th>Bandera</th><th>Descripción</th></tr></thead>
2643
+ <thead><tr><th>Flag</th><th>Description</th></tr></thead>
2641
2644
  <tbody>
2642
- <tr><td><code>--model &lt;alias|name&gt;</code></td><td>Modelo para esta sesión</td></tr>
2643
- <tr><td><code>--effort low|medium|high|max</code></td><td>Nivel de esfuerzo (solo sesión)</td></tr>
2644
- <tr><td><code>--permission-mode &lt;mode&gt;</code></td><td>Modo de permisos al arrancar</td></tr>
2645
- <tr><td><code>--add-dir &lt;path&gt;</code></td><td>Directorios adicionales accesibles</td></tr>
2646
- <tr><td><code>--name / -n &lt;name&gt;</code></td><td>Nombre para la sesión</td></tr>
2647
- <tr><td><code>--resume / -r &lt;id|name&gt;</code></td><td>Reanudar sesión específica</td></tr>
2648
- <tr><td><code>--continue / -c</code></td><td>Continuar última conversación</td></tr>
2649
- <tr><td><code>--print / -p</code></td><td>Modo no interactivo (SDK)</td></tr>
2650
- <tr><td><code>--output-format text|json|stream-json</code></td><td>Formato de salida (con -p)</td></tr>
2651
- <tr><td><code>--max-turns &lt;n&gt;</code></td><td>Limitar turnos del agente (con -p)</td></tr>
2652
- <tr><td><code>--max-budget-usd &lt;n&gt;</code></td><td>Límite de gasto en USD (con -p)</td></tr>
2653
- <tr><td><code>--allowedTools "Bash(cmd)"</code></td><td>Herramientas sin solicitar permiso</td></tr>
2654
- <tr><td><code>--disallowedTools "Edit"</code></td><td>Herramientas deshabilitadas</td></tr>
2655
- <tr><td><code>--append-system-prompt "..."</code></td><td>Añadir texto al system prompt</td></tr>
2656
- <tr><td><code>--system-prompt "..."</code></td><td>Reemplazar el system prompt</td></tr>
2657
- <tr><td><code>--verbose</code></td><td>Logging detallado turno a turno</td></tr>
2658
- <tr><td><code>--worktree / -w &lt;name&gt;</code></td><td>Arrancar en git worktree aislado</td></tr>
2659
- <tr><td><code>--dangerously-skip-permissions</code></td><td>Omitir todos los avisos de permiso</td></tr>
2660
- <tr><td><code>--bare</code></td><td>Modo mínimo: sin hooks, skills, MCP ni CLAUDE.md</td></tr>
2661
- <tr><td><code>--ide</code></td><td>Conectar al IDE automáticamente</td></tr>
2662
- <tr><td><code>--version / -v</code></td><td>Ver versión instalada</td></tr>
2645
+ <tr><td><code>--model &lt;alias|name&gt;</code></td><td>Model for this session</td></tr>
2646
+ <tr><td><code>--effort low|medium|high|max</code></td><td>Effort level (session only)</td></tr>
2647
+ <tr><td><code>--permission-mode &lt;mode&gt;</code></td><td>Permission mode at startup</td></tr>
2648
+ <tr><td><code>--add-dir &lt;path&gt;</code></td><td>Additional accessible directories</td></tr>
2649
+ <tr><td><code>--name / -n &lt;name&gt;</code></td><td>Name for the session</td></tr>
2650
+ <tr><td><code>--resume / -r &lt;id|name&gt;</code></td><td>Resume a specific session</td></tr>
2651
+ <tr><td><code>--continue / -c</code></td><td>Continue last conversation</td></tr>
2652
+ <tr><td><code>--print / -p</code></td><td>Non-interactive mode (SDK)</td></tr>
2653
+ <tr><td><code>--output-format text|json|stream-json</code></td><td>Output format (with -p)</td></tr>
2654
+ <tr><td><code>--max-turns &lt;n&gt;</code></td><td>Limit agent turns (with -p)</td></tr>
2655
+ <tr><td><code>--max-budget-usd &lt;n&gt;</code></td><td>Spending limit in USD (with -p)</td></tr>
2656
+ <tr><td><code>--allowedTools "Bash(cmd)"</code></td><td>Tools allowed without prompt</td></tr>
2657
+ <tr><td><code>--disallowedTools "Edit"</code></td><td>Disabled tools</td></tr>
2658
+ <tr><td><code>--append-system-prompt "..."</code></td><td>Append text to system prompt</td></tr>
2659
+ <tr><td><code>--system-prompt "..."</code></td><td>Replace the system prompt</td></tr>
2660
+ <tr><td><code>--verbose</code></td><td>Verbose turn-by-turn logging</td></tr>
2661
+ <tr><td><code>--worktree / -w &lt;name&gt;</code></td><td>Start in isolated git worktree</td></tr>
2662
+ <tr><td><code>--dangerously-skip-permissions</code></td><td>Skip all permission prompts</td></tr>
2663
+ <tr><td><code>--bare</code></td><td>Minimal mode: no hooks, skills, MCP or CLAUDE.md</td></tr>
2664
+ <tr><td><code>--ide</code></td><td>Connect to IDE automatically</td></tr>
2665
+ <tr><td><code>--version / -v</code></td><td>Show installed version</td></tr>
2663
2666
  </tbody>
2664
2667
  </table>
2665
2668
  </div>
@@ -2735,13 +2738,13 @@
2735
2738
  style="font-size:12px;padding:5px 8px;border:1px solid var(--rule-2);border-radius:4px;background:var(--white);font-family:monospace">
2736
2739
  <input type="text" x-model="skillNew.name" placeholder="Nombre visible (ej: Code Review)"
2737
2740
  style="font-size:12px;padding:5px 8px;border:1px solid var(--rule-2);border-radius:4px;background:var(--white)">
2738
- <input type="text" x-model="skillNew.description" placeholder="Descripción breve"
2741
+ <input type="text" x-model="skillNew.description" placeholder="Brief description"
2739
2742
  style="font-size:12px;padding:5px 8px;border:1px solid var(--rule-2);border-radius:4px;background:var(--white)">
2740
2743
  <textarea x-model="skillNew.content" rows="5" placeholder="# Contenido del SKILL.md&#10;&#10;Instrucciones para la skill…"
2741
2744
  style="font-size:12px;padding:5px 8px;border:1px solid var(--rule-2);border-radius:4px;background:var(--white);resize:vertical;font-family:monospace"></textarea>
2742
2745
  <div style="display:flex;align-items:center;gap:8px">
2743
2746
  <button class="btn btn-primary btn-sm" @click="createSkill()" :disabled="skillNew.saving">
2744
- <span x-text="skillNew.saving?'Creando…':'Crear skill'"></span>
2747
+ <span x-text="skillNew.saving?'Creating…':'Create skill'"></span>
2745
2748
  </button>
2746
2749
  <span class="err-msg" x-show="skillNew.msg" x-text="skillNew.msg"></span>
2747
2750
  </div>
@@ -2770,7 +2773,7 @@
2770
2773
  <!-- TAB: Marketplace -->
2771
2774
  <div x-show="skillsTab==='marketplace'" style="flex:1;overflow-y:auto">
2772
2775
  <template x-if="marketplaceLoading">
2773
- <div class="loading"><div class="spinner"></div> Cargando catálogo…</div>
2776
+ <div class="loading"><div class="spinner"></div> Loading catalog…</div>
2774
2777
  </template>
2775
2778
  <template x-if="!marketplaceLoading && marketplace.length===0">
2776
2779
  <div style="padding:14px;display:flex;flex-direction:column;gap:6px">
@@ -2782,7 +2785,7 @@
2782
2785
  </template>
2783
2786
  </div>
2784
2787
  </template>
2785
- <!-- Búsqueda -->
2788
+ <!-- Search -->
2786
2789
  <template x-if="!marketplaceLoading && marketplace.length>0">
2787
2790
  <div>
2788
2791
  <div style="padding:8px 10px;border-bottom:1px solid var(--rule);display:flex;flex-direction:column;gap:6px">
@@ -2853,12 +2856,12 @@
2853
2856
 
2854
2857
  <!-- TAB: Install from URL -->
2855
2858
  <div x-show="skillsTab==='url'" style="flex:1;overflow-y:auto;padding:14px;display:flex;flex-direction:column;gap:10px">
2856
- <div style="font-size:12px;color:var(--ink-2)">Pega la URL raw de un SKILL.md (GitHub raw, Gist):</div>
2857
- <input type="text" x-model="urlInstall.url" placeholder="https://raw.githubusercontent.com/…/SKILL.md"
2858
- style="font-size:12px;padding:5px 8px;border:1px solid var(--rule-2);border-radius:4px;background:var(--white)"
2859
+ <div style="font-size:12px;color:var(--ink-2);margin-bottom:6px">Paste a SKILL.md URL (GitHub, raw, Gist):</div>
2860
+ <input type="text" x-model="urlInstall.url" placeholder="https://github.com/…/SKILL.md"
2861
+ style="font-size:12px;padding:5px 8px;border:1px solid var(--rule-2);border-radius:4px;background:var(--white);width:100%;box-sizing:border-box;margin-bottom:8px"
2859
2862
  @keydown.enter="fetchFromUrl()">
2860
- <button class="btn btn-outline btn-sm" @click="fetchFromUrl()" :disabled="urlInstall.loading||!urlInstall.url">
2861
- <span x-text="urlInstall.loading?'Obteniendo…':'Fetch & Preview'"></span>
2863
+ <button class="btn btn-outline btn-sm" @click="fetchFromUrl()" :disabled="urlInstall.loading||!urlInstall.url" style="width:100%">
2864
+ <span x-text="urlInstall.loading?'Fetching…':'Fetch & Preview'"></span>
2862
2865
  </button>
2863
2866
  <span class="err-msg" x-show="urlInstall.msg&&urlInstall.msg.startsWith('Error')" x-text="urlInstall.msg"></span>
2864
2867
  <template x-if="urlInstall.preview">
@@ -2875,7 +2878,7 @@
2875
2878
  </template>
2876
2879
  </div>
2877
2880
  <button class="btn btn-primary btn-sm" @click="installFromUrl()" :disabled="urlInstall.loading">
2878
- <span x-text="urlInstall.loading?'Instalando…':'Instalar'"></span>
2881
+ <span x-text="urlInstall.loading?'Installing…':'Instalar'"></span>
2879
2882
  </button>
2880
2883
  <span x-show="urlInstall.msg" x-text="urlInstall.msg"
2881
2884
  :style="urlInstall.msg.startsWith('Error')?'color:var(--red);font-size:12px':'color:var(--green);font-size:12px'"></span>
@@ -2892,7 +2895,7 @@
2892
2895
  <template x-if="view==='skills'&&skillsTab==='marketplace'">
2893
2896
  <div>
2894
2897
  <template x-if="!marketplaceSelected">
2895
- <div class="memory-empty" style="color:var(--ink-3)"><svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5"><path d="M5 12h14M12 5l7 7-7 7"/></svg>Selecciona una skill</div>
2898
+ <div class="memory-empty" style="color:var(--ink-3)"><svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5"><path d="M5 12h14M12 5l7 7-7 7"/></svg>Select a skill</div>
2896
2899
  </template>
2897
2900
  <template x-if="marketplaceSelected">
2898
2901
  <div>
@@ -2912,7 +2915,7 @@
2912
2915
  </template>
2913
2916
  </div>
2914
2917
  <template x-if="marketplacePreviewLoading">
2915
- <div class="loading" style="padding:20px 0"><div class="spinner"></div> Cargando…</div>
2918
+ <div class="loading" style="padding:20px 0"><div class="spinner"></div> Loading…</div>
2916
2919
  </template>
2917
2920
  <template x-if="!marketplacePreviewLoading&&marketplacePreview">
2918
2921
  <div>
@@ -2926,7 +2929,7 @@
2926
2929
  </label>
2927
2930
  </template>
2928
2931
  <button class="btn btn-primary btn-sm" @click="installMarketplaceSkill()" :disabled="marketplaceInstalling||marketplaceInstalled[marketplaceSelected.slug]">
2929
- <span x-text="marketplaceInstalled[marketplaceSelected?.slug]?'Ya instalada':marketplaceInstalling?'Instalando…':'Instalar'"></span>
2932
+ <span x-text="marketplaceInstalled[marketplaceSelected?.slug]?'Already installed':marketplaceInstalling?'Installing…':'Instalar'"></span>
2930
2933
  </button>
2931
2934
  <span x-show="marketplaceInstallMsg" x-text="marketplaceInstallMsg"
2932
2935
  :style="marketplaceInstallMsg.startsWith('Error')?'color:var(--red);font-size:12px':'color:var(--green);font-size:12px'"></span>
@@ -2937,7 +2940,7 @@
2937
2940
  </template>
2938
2941
  </div>
2939
2942
  </template>
2940
- <!-- Install from URL: panel vacío (todo en la sidebar) -->
2943
+ <!-- Install from URL: empty panel (all content in sidebar) -->
2941
2944
  <template x-if="view==='skills'&&skillsTab==='url'">
2942
2945
  <div class="memory-empty" style="color:var(--ink-3)">
2943
2946
  <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5"><path d="M10 13a5 5 0 007.54.54l3-3a5 5 0 00-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 00-7.54-.54l-3 3a5 5 0 007.07 7.07l1.71-1.71"/></svg>
@@ -2945,9 +2948,8 @@
2945
2948
  </div>
2946
2949
  </template>
2947
2950
  <!-- My Skills panel -->
2948
- <template x-if="!(view==='skills'&&(skillsTab==='marketplace'||skillsTab==='url'))">
2949
- <template x-if="!selectedTool"><div class="memory-empty" style="color:var(--ink-3)"><svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5"><path d="M5 12h14M12 5l7 7-7 7"/></svg>Select a tool</div></template>
2950
- <template x-if="selectedTool">
2951
+ <template x-if="!(view==='skills'&&(skillsTab==='marketplace'||skillsTab==='url')) && !selectedTool"><div class="memory-empty" style="color:var(--ink-3)"><svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5"><path d="M5 12h14M12 5l7 7-7 7"/></svg>Select a tool</div></template>
2952
+ <template x-if="!(view==='skills'&&(skillsTab==='marketplace'||skillsTab==='url')) && selectedTool">
2951
2953
  <div>
2952
2954
  <div style="display:flex;align-items:flex-start;justify-content:space-between;gap:8px;margin-bottom:2px">
2953
2955
  <div class="memory-detail-title" x-text="selectedTool.name" style="margin-bottom:0"></div>
@@ -2970,13 +2972,13 @@
2970
2972
  <div style="display:flex;flex-direction:column;gap:8px;margin-top:8px;padding:12px;background:var(--canvas);border-radius:6px;border:1px solid var(--rule)">
2971
2973
  <input type="text" x-model="skillEdit.draftName" placeholder="Nombre visible"
2972
2974
  style="font-size:12px;padding:5px 8px;border:1px solid var(--rule-2);border-radius:4px;background:var(--white)">
2973
- <input type="text" x-model="skillEdit.draftDesc" placeholder="Descripción breve"
2975
+ <input type="text" x-model="skillEdit.draftDesc" placeholder="Brief description"
2974
2976
  style="font-size:12px;padding:5px 8px;border:1px solid var(--rule-2);border-radius:4px;background:var(--white)">
2975
2977
  <textarea x-model="skillEdit.draft" rows="12"
2976
2978
  style="font-size:12px;padding:5px 8px;border:1px solid var(--rule-2);border-radius:4px;background:var(--white);resize:vertical;font-family:monospace"></textarea>
2977
2979
  <div style="display:flex;align-items:center;gap:8px">
2978
2980
  <button class="btn btn-primary btn-sm" @click="saveSkill()" :disabled="skillEdit.saving">
2979
- <span x-text="skillEdit.saving?'Guardando…':'Guardar'"></span>
2981
+ <span x-text="skillEdit.saving?'Saving…':'Guardar'"></span>
2980
2982
  </button>
2981
2983
  <span x-show="skillEdit.msg" x-text="skillEdit.msg"
2982
2984
  :style="skillEdit.msg.startsWith('Error')?'color:var(--red);font-size:12px':'color:var(--green);font-size:12px'"></span>
@@ -2990,7 +2992,6 @@
2990
2992
  </div>
2991
2993
  </template>
2992
2994
  </div>
2993
- </template>
2994
2995
  </template><!-- /My Skills panel -->
2995
2996
  </div>
2996
2997
  </div>
@@ -3016,16 +3017,16 @@
3016
3017
  <div class="config-val" style="flex:1">
3017
3018
  <select class="settings-input" x-model="settingsDraft.model">
3018
3019
  <option value="">— select —</option>
3019
- <optgroup label="Aliases (apuntan siempre a la última versión)">
3020
- <option value="default">default — recomendado según tu plan</option>
3020
+ <optgroup label="Aliases (always point to latest)">
3021
+ <option value="default">default — recommended for your plan</option>
3021
3022
  <option value="sonnet">sonnet — Sonnet 4.6, tareas diarias</option>
3022
3023
  <option value="opus">opus — Opus 4.6, razonamiento complejo</option>
3023
- <option value="haiku">haiku — rápido y eficiente, tareas simples</option>
3024
- <option value="opusplan">opusplan — Opus en plan mode, Sonnet en ejecución</option>
3024
+ <option value="haiku">haiku — fast and efficient, simple tasks</option>
3025
+ <option value="opusplan">opusplan — Opus for planning, Sonnet for execution</option>
3025
3026
  <option value="sonnet[1m]">sonnet[1m] — Sonnet con contexto de 1M tokens</option>
3026
3027
  <option value="opus[1m]">opus[1m] — Opus con contexto de 1M tokens</option>
3027
3028
  </optgroup>
3028
- <optgroup label="Versiones específicas (fijadas)">
3029
+ <optgroup label="Specific versions (pinned)">
3029
3030
  <option value="claude-opus-4-6">claude-opus-4-6</option>
3030
3031
  <option value="claude-sonnet-4-6">claude-sonnet-4-6</option>
3031
3032
  <option value="claude-sonnet-4-5">claude-sonnet-4-5</option>
@@ -3033,8 +3034,8 @@
3033
3034
  <option value="claude-opus-4-5">claude-opus-4-5</option>
3034
3035
  </optgroup>
3035
3036
  </select>
3036
- <div x-show="settingsDraft.model === 'opusplan'" style="font-size:11px;color:var(--ink-3);margin-top:4px;padding:4px 8px;background:var(--canvas-2,#f5f5f5);border-left:2px solid var(--rule)">Modo híbrido: usa Opus para planificar (más razonamiento) y cambia a Sonnet automáticamente para ejecutar (más eficiente).</div>
3037
- <div style="font-size:11px;color:var(--ink-3);margin-top:4px">Solo afecta a sesiones nuevas. Las conversaciones activas mantienen el modelo con el que arrancaron.</div>
3037
+ <div x-show="settingsDraft.model === 'opusplan'" style="font-size:11px;color:var(--ink-3);margin-top:4px;padding:4px 8px;background:var(--canvas-2,#f5f5f5);border-left:2px solid var(--rule)">Hybrid mode: uses Opus for planning (more reasoning) and automatically switches to Sonnet for execution (more efficient).</div>
3038
+ <div style="font-size:11px;color:var(--ink-3);margin-top:4px">Only affects new sessions. Active conversations keep the model they started with.</div>
3038
3039
  </div>
3039
3040
  </div>
3040
3041
  <div class="config-row">
@@ -3042,8 +3043,8 @@
3042
3043
  <div class="config-val" style="flex:1">
3043
3044
  <select class="settings-input" x-model="settingsDraft.outputStyle">
3044
3045
  <option value="">Default</option>
3045
- <option value="Explanatory">Explanatory — explica el código mientras trabaja</option>
3046
- <option value="Learning">Learning — te pide que implementes pequeñas piezas (TODO(human))</option>
3046
+ <option value="Explanatory">Explanatory — explains code while working</option>
3047
+ <option value="Learning">Learning — asks you to implement small pieces (TODO(human))</option>
3047
3048
  <template x-for="s in (config.outputStyles || [])" :key="s.filename">
3048
3049
  <option :value="s.name" x-text="s.name + (s.description ? ' — ' + s.description : '')"></option>
3049
3050
  </template>
@@ -3056,7 +3057,7 @@
3056
3057
  <div class="config-val" style="flex:1">
3057
3058
  <select class="settings-input" x-model="settingsDraft.effortLevel">
3058
3059
  <option value="">auto (por defecto del modelo)</option>
3059
- <option value="low">low — rápido y económico, tareas simples</option>
3060
+ <option value="low">low — fast and cheap, simple tasks</option>
3060
3061
  <option value="medium">medium — equilibrio velocidad/razonamiento (recomendado)</option>
3061
3062
  <option value="high">high — razonamiento profundo, debugging complejo</option>
3062
3063
  </select>
@@ -3068,9 +3069,9 @@
3068
3069
  <div class="config-val" style="flex:1">
3069
3070
  <select class="settings-input" x-model="settingsDraft.defaultMode">
3070
3071
  <option value="">default — pide permiso en primer uso</option>
3071
- <option value="acceptEdits">acceptEdits — acepta ediciones de archivo automáticamente</option>
3072
+ <option value="acceptEdits">acceptEdits — automatically accepts file edits</option>
3072
3073
  <option value="plan">plan — solo analiza, no modifica ni ejecuta</option>
3073
- <option value="auto">auto — aprueba automáticamente con comprobaciones de seguridad</option>
3074
+ <option value="auto">auto — auto-approves with safety checks</option>
3074
3075
  <option value="bypassPermissions">bypassPermissions — omite todos los avisos (solo entornos aislados)</option>
3075
3076
  </select>
3076
3077
  </div>
@@ -3081,7 +3082,7 @@
3081
3082
  <select class="settings-input" x-model="settingsDraft.language">
3082
3083
  <option value="">— select —</option>
3083
3084
  <option value="english">English</option>
3084
- <option value="español">Español</option>
3085
+ <option value="español">Spanish</option>
3085
3086
  <option value="français">Français</option>
3086
3087
  <option value="deutsch">Deutsch</option>
3087
3088
  <option value="português">Português</option>
@@ -3211,12 +3212,12 @@
3211
3212
  <option>CwdChanged</option>
3212
3213
  <option>FileChanged</option>
3213
3214
  </select>
3214
- <div style="font-size:10.5px;color:var(--ink-3);margin-top:4px;line-height:1.4" x-text="{'PreToolUse':'Antes de ejecutar una tool. Exit 2 la cancela.','PostToolUse':'Después de que la tool completa. Recibe la respuesta en stdin.','SessionStart':'Al iniciar una sesión de Claude.','Stop':'Cuando Claude termina de responder. Ideal para notificaciones.','UserPromptSubmit':'Al enviar un mensaje. Puede modificar el prompt.','Notification':'Cuando Claude quiere mostrar una notificación.','CwdChanged':'Al cambiar el directorio de trabajo.','FileChanged':'Al modificar un archivo vigilado.'}[hookBuilder.event]"></div>
3215
+ <div style="font-size:10.5px;color:var(--ink-3);margin-top:4px;line-height:1.4" x-text="{'PreToolUse':'Before a tool executes. Exit code 2 cancels it.','PostToolUse':'After a tool completes. Receives the response on stdin.','SessionStart':'When a Claude session starts.','Stop':'When Claude finishes responding. Ideal for notifications.','UserPromptSubmit':'When a message is submitted. Can modify the prompt.','Notification':'When Claude wants to show a notification.','CwdChanged':'When the working directory changes.','FileChanged':'When a watched file is modified.'}[hookBuilder.event]"></div>
3215
3216
  </div>
3216
3217
  <div>
3217
3218
  <label style="font-size:11px;color:var(--ink-3);display:block;margin-bottom:4px">Matcher <span style="font-weight:400;color:var(--ink-4)">(tool name, optional)</span></label>
3218
3219
  <input type="text" x-model="hookBuilder.matcher" @input="hookBuilder._tpl=''" placeholder="Bash · Edit · Write · Read · *" style="width:100%;background:var(--canvas);border:1px solid var(--rule-2);color:var(--ink-1);padding:5px 8px;border-radius:4px;font-size:12px;box-sizing:border-box">
3219
- <div style="font-size:10.5px;color:var(--ink-3);margin-top:4px">Vacío = cualquier tool. Solo aplica a Pre/PostToolUse.</div>
3220
+ <div style="font-size:10.5px;color:var(--ink-3);margin-top:4px">Empty = any tool. Only applies to Pre/PostToolUse.</div>
3220
3221
  </div>
3221
3222
  </div>
3222
3223
 
@@ -3253,7 +3254,7 @@
3253
3254
  <template x-if="hookBuilder.type === 'prompt' || hookBuilder.type === 'agent'">
3254
3255
  <div>
3255
3256
  <label style="font-size:11px;color:var(--ink-3);display:block;margin-bottom:4px">Prompt</label>
3256
- <textarea x-model="hookBuilder.prompt" @input="hookBuilder._tpl=''" rows="3" placeholder="Instrucción para Claude al dispararse el evento…" style="width:100%;background:var(--canvas);border:1px solid var(--rule-2);color:var(--ink-1);padding:5px 8px;border-radius:4px;font-size:12px;box-sizing:border-box;resize:vertical"></textarea>
3257
+ <textarea x-model="hookBuilder.prompt" @input="hookBuilder._tpl=''" rows="3" placeholder="Instruction for Claude when the event fires…" style="width:100%;background:var(--canvas);border:1px solid var(--rule-2);color:var(--ink-1);padding:5px 8px;border-radius:4px;font-size:12px;box-sizing:border-box;resize:vertical"></textarea>
3257
3258
  </div>
3258
3259
  </template>
3259
3260
  </div>
@@ -3261,7 +3262,7 @@
3261
3262
  <!-- Scope selector (solo si hay proyecto seleccionado) -->
3262
3263
  <template x-if="configProject">
3263
3264
  <div>
3264
- <label style="font-size:11px;color:var(--ink-3);display:block;margin-bottom:6px">Guardar en</label>
3265
+ <label style="font-size:11px;color:var(--ink-3);display:block;margin-bottom:6px">Save to</label>
3265
3266
  <div style="display:flex;gap:16px;flex-wrap:wrap">
3266
3267
  <template x-for="sc in [{v:'user',d:'~/.claude/settings.json'},{v:'project',d:'.claude/settings.json'},{v:'local',d:'.claude/settings.local.json'}]" :key="sc.v">
3267
3268
  <label style="display:flex;align-items:center;gap:5px;cursor:pointer">
@@ -3424,12 +3425,12 @@
3424
3425
  <div style="padding:14px 16px;color:var(--ink-3);font-size:12px;display:flex;align-items:center;gap:8px"><div class="spinner" style="width:14px;height:14px;border-width:2px"></div> Escaneando sesiones…</div>
3425
3426
  </template>
3426
3427
  <template x-if="!hooksLogLoading && hooksLog && hooksLog.length === 0">
3427
- <div style="padding:12px 16px;color:var(--ink-3);font-size:12px">No hay registros de hooks en las sesiones<template x-if="configProject"> de este proyecto</template>.</div>
3428
+ <div style="padding:12px 16px;color:var(--ink-3);font-size:12px">No hook logs found in sessions<template x-if="configProject"> de este proyecto</template>.</div>
3428
3429
  </template>
3429
3430
  <template x-if="!hooksLogLoading && hooksLog && hooksLog.length > 0">
3430
3431
  <div>
3431
3432
  <div style="display:grid;grid-template-columns:1fr auto auto auto;gap:0;font-size:10px;font-weight:700;letter-spacing:.07em;text-transform:uppercase;color:var(--ink-3);padding:6px 16px;border-bottom:1px solid var(--rule)">
3432
- <span>Hook</span><span style="text-align:right;padding-right:16px">Disparos</span><span style="text-align:right;padding-right:16px">Sesiones</span><span style="text-align:right">Último</span>
3433
+ <span>Hook</span><span style="text-align:right;padding-right:16px">Fires</span><span style="text-align:right;padding-right:16px">Sessions</span><span style="text-align:right">Last</span>
3433
3434
  </div>
3434
3435
  <template x-for="(row, i) in hooksLog" :key="i">
3435
3436
  <div style="display:grid;grid-template-columns:1fr auto auto auto;align-items:center;padding:8px 16px;border-bottom:1px solid var(--canvas);font-size:12px">
@@ -3442,7 +3443,7 @@
3442
3443
  </div>
3443
3444
  </div>
3444
3445
  <span style="text-align:right;padding-right:16px;font-variant-numeric:tabular-nums;font-weight:600;color:var(--ink)" x-text="row.count"></span>
3445
- <span style="text-align:right;padding-right:16px;color:var(--ink-3)" x-text="row.sessionCount + (row.sessionCount===1?' sesión':' sesiones')"></span>
3446
+ <span style="text-align:right;padding-right:16px;color:var(--ink-3)" x-text="row.sessionCount + (row.sessionCount===1?' session':' sessions')"></span>
3446
3447
  <span style="text-align:right;color:var(--ink-3);white-space:nowrap" x-text="row.lastFired ? new Date(row.lastFired).toLocaleDateString('es', {day:'2-digit',month:'short',year:'numeric'}) : '—'"></span>
3447
3448
  </div>
3448
3449
  </template>
@@ -3500,7 +3501,7 @@
3500
3501
  <template x-if="instrNew.scope==='project'">
3501
3502
  <div style="display:flex;flex-direction:column;gap:6px">
3502
3503
  <select class="filter-select" x-model="instrNew.preset" style="font-size:12px">
3503
- <option value="CLAUDE.md">CLAUDE.md (raíz del proyecto)</option>
3504
+ <option value="CLAUDE.md">CLAUDE.md (project root)</option>
3504
3505
  <option value=".claude/CLAUDE.md">.claude/CLAUDE.md</option>
3505
3506
  <option value=".claude/CLAUDE.local.md">.claude/CLAUDE.local.md</option>
3506
3507
  <option value="custom">Ruta personalizada…</option>
@@ -3512,18 +3513,18 @@
3512
3513
  </div>
3513
3514
  </template>
3514
3515
  <template x-if="instrNew.scope==='user'">
3515
- <input type="text" x-model="instrNew.customName" placeholder="nombre del archivo, ej: project-rules.md (vacío = CLAUDE.md)"
3516
+ <input type="text" x-model="instrNew.customName" placeholder="file name, e.g.: project-rules.md (empty = CLAUDE.md)"
3516
3517
  style="width:100%;background:var(--canvas);border:1px solid var(--rule-2);color:var(--ink);padding:5px 8px;border-radius:4px;font-size:12px;box-sizing:border-box">
3517
3518
  </template>
3518
3519
  </div>
3519
3520
  <div>
3520
- <label style="font-size:11px;color:var(--ink-3);display:block;margin-bottom:5px">Contenido inicial</label>
3521
- <textarea x-model="instrNew.content" rows="6" placeholder="# Instrucciones&#10;&#10;Escribe aquí las instrucciones para Claude…"
3521
+ <label style="font-size:11px;color:var(--ink-3);display:block;margin-bottom:5px">Initial content</label>
3522
+ <textarea x-model="instrNew.content" rows="6" placeholder="# Instructions&#10;&#10;Write your instructions for Claude here…"
3522
3523
  style="width:100%;background:var(--canvas);border:1px solid var(--rule-2);color:var(--ink);padding:6px 10px;border-radius:4px;font-size:12px;font-family:'DM Sans',sans-serif;box-sizing:border-box;resize:vertical"></textarea>
3523
3524
  </div>
3524
3525
  <div style="display:flex;align-items:center;gap:8px">
3525
3526
  <button class="btn btn-primary btn-sm" @click="createClaudeMd()" :disabled="instrNew.saving">
3526
- <span x-text="instrNew.saving?'Guardando…':'Crear archivo'"></span>
3527
+ <span x-text="instrNew.saving?'Saving…':'Create file'"></span>
3527
3528
  </button>
3528
3529
  <span class="err-msg" x-show="instrNew.msg" x-text="instrNew.msg"></span>
3529
3530
  </div>
@@ -3594,7 +3595,7 @@
3594
3595
  <div class="perm-pipeline-arrow">→</div>
3595
3596
  <div class="perm-pipeline-step">
3596
3597
  <span class="perm-badge perm-badge-ask">ask</span>
3597
- <span class="perm-pipeline-desc">pide confirmación</span>
3598
+ <span class="perm-pipeline-desc">asks for confirmation</span>
3598
3599
  </div>
3599
3600
  <div class="perm-pipeline-arrow">→</div>
3600
3601
  <div class="perm-pipeline-step">
@@ -3615,7 +3616,7 @@
3615
3616
  <div class="rb-label">Tipo de permiso</div>
3616
3617
  <select class="rb-select" x-model="ruleBuilder.type">
3617
3618
  <option value="deny">deny — bloquear</option>
3618
- <option value="ask">ask — pedir confirmación</option>
3619
+ <option value="ask">ask — ask for confirmation</option>
3619
3620
  <option value="allow">allow — permitir siempre</option>
3620
3621
  </select>
3621
3622
  </div>
@@ -3624,7 +3625,7 @@
3624
3625
  <select class="rb-select" x-model="ruleBuilder.tool" @change="ruleBuilder.specifier='';ruleBuilder.pathType='./'">
3625
3626
  <option value="Bash">Bash — comandos de shell</option>
3626
3627
  <option value="Read">Read — lectura de archivos</option>
3627
- <option value="Edit">Edit — edición de archivos</option>
3628
+ <option value="Edit">Edit — file editing</option>
3628
3629
  <option value="Write">Write — escritura de archivos</option>
3629
3630
  <option value="WebFetch">WebFetch — peticiones web</option>
3630
3631
  <option value="MCP">MCP — herramientas MCP</option>
@@ -3637,66 +3638,66 @@
3637
3638
  <div>
3638
3639
  <template x-if="ruleBuilder.tool === 'Bash'">
3639
3640
  <div>
3640
- <div class="rb-label">Comando <span style="font-weight:400;text-transform:none;letter-spacing:0">— usa <code>*</code> como comodín. Vacío = cualquier comando</span></div>
3641
+ <div class="rb-label">Command <span style="font-weight:400;text-transform:none;letter-spacing:0">— use <code>*</code> as wildcard. Empty = any command</span></div>
3641
3642
  <input class="perm-add-input" style="width:100%" x-model="ruleBuilder.specifier"
3642
3643
  placeholder="npm run * / git commit * / * --help *"
3643
3644
  @keydown.enter="ruleBuilderAdd()" />
3644
3645
  <div style="font-size:11px;color:var(--ink-3);margin-top:5px;display:flex;flex-direction:column;gap:4px">
3645
- <span><code>Bash(ls *)</code> coincide con <code>ls -la</code> pero no con <code>lsof</code> — el espacio antes de <code>*</code> actúa como límite de palabra.</span>
3646
- <span>⚠️ Comandos con <code>&&</code>, <code>|</code> o redirecciones pueden ser bloqueados por la detección automática de patrones peligrosos, aunque estén en allow.</span>
3647
- <span>💡 Para comandos de una sola herramienta usa el prefijo sin encadenar: <code>npm publish *</code> en lugar de <code>cd /dir && npm publish</code>.</span>
3646
+ <span><code>Bash(ls *)</code> matches <code>ls -la</code> but not <code>lsof</code> — the space before <code>*</code> acts as a word boundary.</span>
3647
+ <span>⚠️ Commands with <code>&&</code>, <code>|</code> or redirects may be blocked by automatic dangerous-pattern detection, even if listed in allow.</span>
3648
+ <span>💡 For single-tool commands use the prefix without chaining: <code>npm publish *</code> instead of <code>cd /dir && npm publish</code>.</span>
3648
3649
  </div>
3649
3650
  </div>
3650
3651
  </template>
3651
3652
  <template x-if="['Read','Edit','Write'].includes(ruleBuilder.tool)">
3652
3653
  <div>
3653
- <div class="rb-label">Ruta <span style="font-weight:400;text-transform:none;letter-spacing:0">— vacío = cualquier archivo. <code>*</code> un nivel, <code>**</code> recursivo</span></div>
3654
+ <div class="rb-label">Path <span style="font-weight:400;text-transform:none;letter-spacing:0">— empty = any file. <code>*</code> one level, <code>**</code> recursive</span></div>
3654
3655
  <div style="display:flex;gap:6px">
3655
3656
  <select class="rb-select" x-model="ruleBuilder.pathType" style="flex-shrink:0">
3656
- <option value="./">./ desde donde lanzaste Claude</option>
3657
- <option value="/">/ raíz del proyecto</option>
3658
- <option value="~/">~/ tu carpeta de usuario</option>
3659
- <option value="//">// ruta absoluta del sistema</option>
3657
+ <option value="./">./ from where you launched Claude</option>
3658
+ <option value="/">/ project root</option>
3659
+ <option value="~/">~/ your home folder</option>
3660
+ <option value="//">// absolute system path</option>
3660
3661
  </select>
3661
3662
  <input class="perm-add-input" style="flex:1" x-model="ruleBuilder.specifier"
3662
3663
  placeholder=".env / src/**/*.ts / **"
3663
3664
  @keydown.enter="ruleBuilderAdd()" />
3664
3665
  </div>
3665
3666
  <div style="font-size:11px;color:var(--ink-3);margin-top:5px">
3666
- Ejemplo: <code>Read(~/.ssh/*)</code> bloquea la lectura de claves SSH. <code>Edit(/src/**/*.ts)</code> permite editar todo el TypeScript del proyecto.
3667
+ Example: <code>Read(~/.ssh/*)</code> blocks reading SSH keys. <code>Edit(/src/**/*.ts)</code> allows editing all TypeScript in the project.
3667
3668
  </div>
3668
3669
  </div>
3669
3670
  </template>
3670
3671
  <template x-if="ruleBuilder.tool === 'WebFetch'">
3671
3672
  <div>
3672
- <div class="rb-label">Dominio <span style="font-weight:400;text-transform:none;letter-spacing:0">— vacío = cualquier URL web</span></div>
3673
+ <div class="rb-label">Domain <span style="font-weight:400;text-transform:none;letter-spacing:0">— empty = any URL</span></div>
3673
3674
  <input class="perm-add-input" style="width:100%" x-model="ruleBuilder.specifier"
3674
3675
  placeholder="example.com"
3675
3676
  @keydown.enter="ruleBuilderAdd()" />
3676
3677
  <div style="font-size:11px;color:var(--ink-3);margin-top:5px">
3677
- Genera <code>WebFetch(domain:example.com)</code>. Solo filtra la herramienta WebFetch, no comandos <code>curl</code> de Bash.
3678
+ Generates <code>WebFetch(domain:example.com)</code>. Only filters the WebFetch tool, not <code>curl</code> commands in Bash.
3678
3679
  </div>
3679
3680
  </div>
3680
3681
  </template>
3681
3682
  <template x-if="ruleBuilder.tool === 'MCP'">
3682
3683
  <div>
3683
- <div class="rb-label">Servidor / herramienta <span style="font-weight:400;text-transform:none;letter-spacing:0">— formato: <code>servidor</code> o <code>servidor/herramienta</code></span></div>
3684
+ <div class="rb-label">Server / tool <span style="font-weight:400;text-transform:none;letter-spacing:0">— format: <code>server</code> or <code>server/tool</code></span></div>
3684
3685
  <input class="perm-add-input" style="width:100%" x-model="ruleBuilder.specifier"
3685
3686
  placeholder="puppeteer / puppeteer/navigate"
3686
3687
  @keydown.enter="ruleBuilderAdd()" />
3687
3688
  <div style="font-size:11px;color:var(--ink-3);margin-top:5px">
3688
- Genera <code>mcp__puppeteer</code> (todas las tools) o <code>mcp__puppeteer__navigate</code> (una concreta).
3689
+ Generates <code>mcp__puppeteer</code> (all tools) or <code>mcp__puppeteer__navigate</code> (a specific one).
3689
3690
  </div>
3690
3691
  </div>
3691
3692
  </template>
3692
3693
  <template x-if="ruleBuilder.tool === 'Agent'">
3693
3694
  <div>
3694
- <div class="rb-label">Nombre del agente <span style="font-weight:400;text-transform:none;letter-spacing:0">— vacío = cualquier subagente</span></div>
3695
+ <div class="rb-label">Agent name <span style="font-weight:400;text-transform:none;letter-spacing:0">— empty = any subagent</span></div>
3695
3696
  <input class="perm-add-input" style="width:100%" x-model="ruleBuilder.specifier"
3696
3697
  placeholder="Explore / Plan / my-custom-agent"
3697
3698
  @keydown.enter="ruleBuilderAdd()" />
3698
3699
  <div style="font-size:11px;color:var(--ink-3);margin-top:5px">
3699
- Genera <code>Agent(Explore)</code>. Útil para deshabilitar subagentes concretos.
3700
+ Generates <code>Agent(Explore)</code>. Useful to disable specific subagents.
3700
3701
  </div>
3701
3702
  </div>
3702
3703
  </template>
@@ -3706,7 +3707,7 @@
3706
3707
  <div style="display:flex;align-items:center;gap:8px">
3707
3708
  <span style="font-size:11px;color:var(--ink-3);flex-shrink:0">Regla generada:</span>
3708
3709
  <div class="rb-preview" x-text="ruleBuilderPreview() || '—'"></div>
3709
- <button class="btn btn-primary btn-sm" style="flex-shrink:0" @click="ruleBuilderAdd()">+ Añadir</button>
3710
+ <button class="btn btn-primary btn-sm" style="flex-shrink:0" @click="ruleBuilderAdd()">+ Add</button>
3710
3711
  </div>
3711
3712
  </div>
3712
3713
  </div>
@@ -3717,19 +3718,19 @@
3717
3718
  <div class="config-section-title" style="display:flex;align-items:center;gap:8px">
3718
3719
  <span :class="'perm-badge perm-badge-'+type" x-text="type"></span>
3719
3720
  <span style="font-weight:400;text-transform:none;letter-spacing:0;font-size:12px"
3720
- x-text="{'allow':'Claude actúa sin pedir confirmación','ask':'Claude pide confirmación cada vez','deny':'Claude no puede usar esta herramienta'}[type]"></span>
3721
- <span style="margin-left:auto;font-weight:400;color:var(--ink-3)" x-text="permsDraft[type].length + ' reglas'"></span>
3721
+ x-text="{'allow':'Claude acts without asking','ask':'Claude asks for confirmation every time','deny':'Claude cannot use this tool'}[type]"></span>
3722
+ <span style="margin-left:auto;font-weight:400;color:var(--ink-3)" x-text="permsDraft[type].length + ' rules'"></span>
3722
3723
  </div>
3723
3724
  <div style="padding:0 18px 14px">
3724
3725
  <template x-if="permsDraft[type].length === 0">
3725
- <div style="font-size:12px;color:var(--ink-3);padding:10px 0;font-style:italic">Sin reglasusa el constructor de arriba para añadir.</div>
3726
+ <div style="font-size:12px;color:var(--ink-3);padding:10px 0;font-style:italic">No rulesuse the builder above to add one.</div>
3726
3727
  </template>
3727
3728
  <template x-for="(rule, idx) in permsDraft[type]" :key="rule+idx">
3728
3729
  <div class="perm-rule-row" style="flex-direction:column;align-items:flex-start;gap:2px;padding:7px 8px">
3729
3730
  <div style="display:flex;align-items:center;width:100%;gap:6px">
3730
3731
  <span class="perm-tool-chip" x-text="ruleToolName(rule)"></span>
3731
3732
  <span class="perm-rule-humanized" x-text="humanizeRule(rule)"></span>
3732
- <button class="perm-rule-remove" @click="permsDraft[type].splice(idx,1)" title="Eliminar">×</button>
3733
+ <button class="perm-rule-remove" @click="permsDraft[type].splice(idx,1)" title="Remove">×</button>
3733
3734
  </div>
3734
3735
  <span class="perm-rule-raw" style="padding-left:2px" x-text="rule"></span>
3735
3736
  </div>
@@ -3803,10 +3804,10 @@
3803
3804
  <option value="project">project</option>
3804
3805
  <option value="reference">reference</option>
3805
3806
  </select>
3806
- <div class="memory-type-hint" x-show="memoryNew.type === 'user'">Información sobre el perfil del usuario: rol, experiencia, preferencias de trabajo.</div>
3807
- <div class="memory-type-hint" x-show="memoryNew.type === 'feedback'">Guía de comportamiento para Claude: qué hacer y qué evitar en este proyecto.</div>
3808
- <div class="memory-type-hint" x-show="memoryNew.type === 'project'">Contexto del proyecto en curso: decisiones, objetivos, deadlines, motivaciones.</div>
3809
- <div class="memory-type-hint" x-show="memoryNew.type === 'reference'">Punteros a recursos externos: boards, canales, repos, documentación.</div>
3807
+ <div class="memory-type-hint" x-show="memoryNew.type === 'user'">Information about the user profile: role, experience, work preferences.</div>
3808
+ <div class="memory-type-hint" x-show="memoryNew.type === 'feedback'">Behavioral guidance for Claude: what to do and what to avoid in this project.</div>
3809
+ <div class="memory-type-hint" x-show="memoryNew.type === 'project'">Ongoing project context: decisions, goals, deadlines, motivations.</div>
3810
+ <div class="memory-type-hint" x-show="memoryNew.type === 'reference'">Pointers to external resources: boards, channels, repos, documentation.</div>
3810
3811
  </div>
3811
3812
  </div>
3812
3813
  <div class="form-row">
@@ -3955,54 +3956,54 @@
3955
3956
  pinnedCommands: JSON.parse(localStorage.getItem('cm:pinnedCommands') || '[]'),
3956
3957
  pinnedSlashCmds: JSON.parse(localStorage.getItem('cm:pinnedSlashCmds') || '[]'),
3957
3958
  slashCmds: [
3958
- { cmd: '/add-dir <path>', desc: 'Agregar directorio de trabajo a la sesión' },
3959
- { cmd: '/agents', desc: 'Administrar configuraciones de subagents' },
3960
- { cmd: '/btw <question>', desc: 'Pregunta rápida sin añadir al contexto' },
3961
- { cmd: '/branch [name]', desc: 'Crear rama de conversación. Alias: /fork' },
3962
- { cmd: '/clear', desc: 'Borrar historial y liberar contexto. Alias: /reset, /new' },
3963
- { cmd: '/color [color|default]', desc: 'Color del prompt: red, blue, green, yellow, purple, orange, pink, cyan' },
3964
- { cmd: '/compact [instructions]', desc: 'Compactar conversación con instrucciones opcionales' },
3965
- { cmd: '/config', desc: 'Abrir Settings. Alias: /settings' },
3966
- { cmd: '/context', desc: 'Visualizar uso de contexto como cuadrícula de colores' },
3967
- { cmd: '/copy [N]', desc: 'Copiar última respuesta al portapapeles' },
3968
- { cmd: '/cost', desc: 'Estadísticas de uso de tokens y coste' },
3969
- { cmd: '/diff', desc: 'Visor de diferencias interactivo por turno' },
3970
- { cmd: '/doctor', desc: 'Diagnosticar instalación y configuración' },
3971
- { cmd: '/effort [low|medium|high|max|auto]', desc: 'Establecer nivel de esfuerzo del modelo' },
3972
- { cmd: '/exit', desc: 'Salir de la CLI. Alias: /quit' },
3973
- { cmd: '/export [filename]', desc: 'Exportar conversación actual como texto' },
3974
- { cmd: '/fast [on|off]', desc: 'Activar/desactivar fast mode' },
3975
- { cmd: '/feedback', desc: 'Enviar feedback. Alias: /bug' },
3976
- { cmd: '/help', desc: 'Mostrar ayuda y comandos disponibles' },
3977
- { cmd: '/hooks', desc: 'Ver configuraciones de hook' },
3978
- { cmd: '/ide', desc: 'Administrar integraciones de IDE' },
3979
- { cmd: '/init', desc: 'Inicializar proyecto con guía CLAUDE.md' },
3980
- { cmd: '/insights', desc: 'Informe de análisis de sesiones' },
3981
- { cmd: '/keybindings', desc: 'Abrir archivo de atajos de teclado' },
3982
- { cmd: '/login', desc: 'Iniciar sesión en Anthropic' },
3983
- { cmd: '/logout', desc: 'Cerrar sesión de Anthropic' },
3984
- { cmd: '/mcp', desc: 'Administrar conexiones MCP y OAuth' },
3985
- { cmd: '/memory', desc: 'Editar CLAUDE.md y gestionar auto-memory' },
3986
- { cmd: '/model [model]', desc: 'Seleccionar o cambiar modelo de IA' },
3987
- { cmd: '/permissions', desc: 'Ver/actualizar permisos. Alias: /allowed-tools' },
3988
- { cmd: '/plan [description]', desc: 'Entrar en plan mode (solo analiza, no ejecuta)' },
3989
- { cmd: '/plugin', desc: 'Administrar plugins de Claude Code' },
3990
- { cmd: '/pr-comments [PR]', desc: 'Obtener comentarios de un PR de GitHub' },
3991
- { cmd: '/release-notes', desc: 'Ver changelog completo' },
3992
- { cmd: '/rename [name]', desc: 'Renombrar la sesión actual' },
3993
- { cmd: '/resume [session]', desc: 'Reanudar conversación. Alias: /continue' },
3994
- { cmd: '/rewind', desc: 'Rebobinar a un punto anterior. Alias: /checkpoint' },
3995
- { cmd: '/sandbox', desc: 'Alternar sandbox mode' },
3996
- { cmd: '/security-review', desc: 'Analizar cambios para vulnerabilidades de seguridad' },
3997
- { cmd: '/skills', desc: 'Listar skills disponibles' },
3998
- { cmd: '/stats', desc: 'Visualizar uso diario y rachas' },
3999
- { cmd: '/status', desc: 'Ver versión, modelo, cuenta y conectividad' },
4000
- { cmd: '/statusline', desc: 'Configurar la status line del terminal' },
4001
- { cmd: '/tasks', desc: 'Listar y administrar tareas de fondo' },
4002
- { cmd: '/theme', desc: 'Cambiar tema de color' },
4003
- { cmd: '/usage', desc: 'Límites de uso del plan y rate limit' },
4004
- { cmd: '/vim', desc: 'Alternar modos Vim y Normal' },
4005
- { cmd: '/voice', desc: 'Activar dictado de voz (push to talk)' },
3959
+ { cmd: '/add-dir <path>', desc: 'Add working directory to session' },
3960
+ { cmd: '/agents', desc: 'Manage subagent configurations' },
3961
+ { cmd: '/btw <question>', desc: 'Quick question without adding to context' },
3962
+ { cmd: '/branch [name]', desc: 'Create conversation branch. Alias: /fork' },
3963
+ { cmd: '/clear', desc: 'Clear history and free context. Alias: /reset, /new' },
3964
+ { cmd: '/color [color|default]', desc: 'Prompt color: red, blue, green, yellow, purple, orange, pink, cyan' },
3965
+ { cmd: '/compact [instructions]', desc: 'Compact conversation with optional instructions' },
3966
+ { cmd: '/config', desc: 'Open Settings. Alias: /settings' },
3967
+ { cmd: '/context', desc: 'Visualize context usage as a color grid' },
3968
+ { cmd: '/copy [N]', desc: 'Copy last response to clipboard' },
3969
+ { cmd: '/cost', desc: 'Token usage and cost statistics' },
3970
+ { cmd: '/diff', desc: 'Interactive per-turn diff viewer' },
3971
+ { cmd: '/doctor', desc: 'Diagnose installation and configuration' },
3972
+ { cmd: '/effort [low|medium|high|max|auto]', desc: 'Set model effort level' },
3973
+ { cmd: '/exit', desc: 'Exit the CLI. Alias: /quit' },
3974
+ { cmd: '/export [filename]', desc: 'Export current conversation as text' },
3975
+ { cmd: '/fast [on|off]', desc: 'Toggle fast mode' },
3976
+ { cmd: '/feedback', desc: 'Send feedback. Alias: /bug' },
3977
+ { cmd: '/help', desc: 'Show help and available commands' },
3978
+ { cmd: '/hooks', desc: 'View hook configurations' },
3979
+ { cmd: '/ide', desc: 'Manage IDE integrations' },
3980
+ { cmd: '/init', desc: 'Initialize project with CLAUDE.md guide' },
3981
+ { cmd: '/insights', desc: 'Session analytics report' },
3982
+ { cmd: '/keybindings', desc: 'Open keybindings file' },
3983
+ { cmd: '/login', desc: 'Sign in to Anthropic' },
3984
+ { cmd: '/logout', desc: 'Sign out de Anthropic' },
3985
+ { cmd: '/mcp', desc: 'Manage MCP connections and OAuth' },
3986
+ { cmd: '/memory', desc: 'Edit CLAUDE.md and manage auto-memory' },
3987
+ { cmd: '/model [model]', desc: 'Select or change AI model' },
3988
+ { cmd: '/permissions', desc: 'View/update permissions. Alias: /allowed-tools' },
3989
+ { cmd: '/plan [description]', desc: 'Enter plan mode (analyzes only, no execution)' },
3990
+ { cmd: '/plugin', desc: 'Manage Claude Code plugins' },
3991
+ { cmd: '/pr-comments [PR]', desc: 'Fetch comments from a GitHub PR' },
3992
+ { cmd: '/release-notes', desc: 'View full changelog' },
3993
+ { cmd: '/rename [name]', desc: 'Rename current session' },
3994
+ { cmd: '/resume [session]', desc: 'Resume conversation. Alias: /continue' },
3995
+ { cmd: '/rewind', desc: 'Rewind to a previous point. Alias: /checkpoint' },
3996
+ { cmd: '/sandbox', desc: 'Toggle sandbox mode' },
3997
+ { cmd: '/security-review', desc: 'Analyze changes for security vulnerabilities' },
3998
+ { cmd: '/skills', desc: 'List available skills' },
3999
+ { cmd: '/stats', desc: 'Visualize daily usage and streaks' },
4000
+ { cmd: '/status', desc: 'View version, model, account and connectivity' },
4001
+ { cmd: '/statusline', desc: 'Configure the terminal status line' },
4002
+ { cmd: '/tasks', desc: 'List and manage background tasks' },
4003
+ { cmd: '/theme', desc: 'Change color theme' },
4004
+ { cmd: '/usage', desc: 'Plan usage limits and rate limit' },
4005
+ { cmd: '/vim', desc: 'Toggle Vim and Normal modes' },
4006
+ { cmd: '/voice', desc: 'Enable voice dictation (push to talk)' },
4006
4007
  ],
4007
4008
  sessionsTab: 'list',
4008
4009
  knowledgeTab: 'memory',
@@ -4472,7 +4473,7 @@
4472
4473
  },
4473
4474
 
4474
4475
  async deleteClaudeMd(f) {
4475
- if (!confirm(`¿Eliminar ${f.filename}?`)) return;
4476
+ if (!confirm(`Delete ${f.filename}?`)) return;
4476
4477
  try {
4477
4478
  const body = f._path ? { filePath: f._path } : { filename: f.filename };
4478
4479
  const r = await fetch('/api/config/claude-md', { method: 'DELETE', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(body) });
@@ -4555,7 +4556,7 @@
4555
4556
  },
4556
4557
 
4557
4558
  async deleteAgent(a) {
4558
- if (!confirm(`¿Eliminar el agente "${a.name}"?`)) return;
4559
+ if (!confirm(`Delete el agente "${a.name}"?`)) return;
4559
4560
  try {
4560
4561
  const projectPath = this.projects?.find(p => p.dirName === this.configProject)?.projectPath || '';
4561
4562
  const r = await fetch('/api/tools/agents/' + encodeURIComponent(a.slug), {
@@ -4618,7 +4619,7 @@
4618
4619
  },
4619
4620
 
4620
4621
  async deleteSkill(t) {
4621
- if (!confirm(`¿Eliminar la skill "${t.name}"?`)) return;
4622
+ if (!confirm(`Delete la skill "${t.name}"?`)) return;
4622
4623
  try {
4623
4624
  const projectPath = this.projects?.find(p => p.dirName === this.configProject)?.projectPath || '';
4624
4625
  const r = await fetch('/api/tools/skills/' + encodeURIComponent(t.slug), {
@@ -5160,7 +5161,7 @@
5160
5161
  this.marketplaceInstalled = { ...this.marketplaceInstalled, [p.slug]: true };
5161
5162
  this.toolCommands = []; this.toolSkills = [];
5162
5163
  await this.loadTools();
5163
- this.marketplaceInstallMsg = '¡Instalada! Disponible en "My Skills".';
5164
+ this.marketplaceInstallMsg = 'Installed! Available in "My Skills".';
5164
5165
  } catch (e) { this.marketplaceInstallMsg = 'Error: ' + e.message; }
5165
5166
  this.marketplaceInstalling = false;
5166
5167
  },
@@ -5192,7 +5193,7 @@
5192
5193
  });
5193
5194
  const d = await r.json();
5194
5195
  if (!r.ok) throw new Error(d.error);
5195
- u.msg = '¡Instalada! Disponible en "My Skills".';
5196
+ u.msg = 'Installed! Available in "My Skills".';
5196
5197
  u.preview = null; u.url = ''; u.slug = '';
5197
5198
  this.toolCommands = []; this.toolSkills = [];
5198
5199
  await this.loadTools();
package/server.js CHANGED
@@ -1294,19 +1294,28 @@ app.get('/api/marketplace/check-installed', (req, res) => {
1294
1294
  res.json(result);
1295
1295
  });
1296
1296
 
1297
+ function normalizeSkillUrl(url) {
1298
+ // Convert GitHub blob URLs to raw URLs:
1299
+ // https://github.com/{owner}/{repo}/blob/{branch}/{path} → https://raw.githubusercontent.com/{owner}/{repo}/{branch}/{path}
1300
+ const blobMatch = url.match(/^https:\/\/github\.com\/([^/]+\/[^/]+)\/blob\/(.+)$/);
1301
+ if (blobMatch) return `https://raw.githubusercontent.com/${blobMatch[1]}/${blobMatch[2]}`;
1302
+ return url;
1303
+ }
1304
+
1297
1305
  // GET /api/marketplace/fetch-url
1298
1306
  app.get('/api/marketplace/fetch-url', async (req, res) => {
1299
1307
  const { url } = req.query;
1300
1308
  if (!url) return res.status(400).json({ error: 'url requerida' });
1301
1309
 
1310
+ const normalizedUrl = normalizeSkillUrl(url);
1302
1311
  let parsed;
1303
- try { parsed = new URL(url); } catch { return res.status(400).json({ error: 'URL inválida' }); }
1312
+ try { parsed = new URL(normalizedUrl); } catch { return res.status(400).json({ error: 'URL inválida' }); }
1304
1313
  if (parsed.protocol !== 'https:') return res.status(400).json({ error: 'Solo se permiten URLs HTTPS' });
1305
1314
  if (!URL_WHITELIST.includes(parsed.hostname)) return res.status(400).json({ error: `Dominio no permitido. Dominios aceptados: ${URL_WHITELIST.join(', ')}` });
1306
1315
  if (!parsed.pathname.endsWith('.md')) return res.status(400).json({ error: 'La URL debe apuntar a un archivo .md' });
1307
1316
 
1308
1317
  try {
1309
- const raw = await fetchRemote(url);
1318
+ const raw = await fetchRemote(normalizedUrl);
1310
1319
  if (raw.length > 200_000) return res.status(400).json({ error: 'Archivo demasiado grande' });
1311
1320
  const { meta, content } = parseFrontmatter(raw);
1312
1321
  const parts = parsed.pathname.split('/');