dsh-claude-move 0.2.2 → 0.2.3

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/README.es.md CHANGED
@@ -1,291 +1,285 @@
1
- # dsh-claude-move
2
-
3
- **Conserva tu historial de Claude Code al pasarte a DeepSeek Harness.** Una sola instalación copia cada sesión, memoria, habilidad y `CLAUDE.md` de Claude a DSH como sesiones reanudables — agrupadas en un espacio de trabajo dedicado `claudecode` (un espacio de trabajo por proyecto es opcional).
4
-
5
- `Solo copia` · `Reanudación sin interrupciones` · `Workspaces por proyecto` · `Sincronización en vivo con Claude Code`
6
-
7
- [![Test](https://github.com/PerryLink/dsh-claude-move/actions/workflows/test.yml/badge.svg)](https://github.com/PerryLink/dsh-claude-move/actions/workflows/test.yml)
8
- [![npm version](https://img.shields.io/npm/v/dsh-claude-move)](https://www.npmjs.com/package/dsh-claude-move)
9
- [![npm downloads](https://img.shields.io/npm/dm/dsh-claude-move)](https://www.npmjs.com/package/dsh-claude-move)
10
- [![Node ^22.19 || >=24](https://img.shields.io/static/v1?label=node&message=%5E22.19%20%7C%7C%20%3E%3D24&color=2f7d4f)](https://nodejs.org)
11
- [![License: Apache-2.0](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](LICENSE)
12
- [![Topic: dsh](https://img.shields.io/badge/topic-dsh-3fb950)](https://github.com/topics/dsh)
13
- [![Topic: dsh-plugin](https://img.shields.io/badge/topic-dsh--plugin-3fb950)](https://github.com/topics/dsh-plugin)
14
- [![PRs welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](https://github.com/PerryLink/dsh-claude-move/issues)
15
-
16
- ![Tarjeta social de dsh-claude-move](assets/social-card.png)
17
-
18
- [English](README.md) | [中文](README.zh.md) | Español | [Português](README.pt.md) | [हिन्दी](README.hi.md)
19
-
20
- > Vista previa de desarrollo (0.1.0). Hoja de ruta y diseño: [PLAN.md](PLAN.md) · historial de cambios: [CHANGELOG.md](CHANGELOG.md).
21
-
22
- ## ✨ Características
23
-
24
- - 🔍 **Descubrimiento automático** — localiza la raíz de datos de Claude (`$CLAUDE_CONFIG_DIR`, por defecto `~/.claude`) e indexa cada proyecto/sesión (título, marcas de tiempo, recuentos), estado de directorio y git, memorias, habilidades, `CLAUDE.md` global y `settings.json` — con caché incremental que solo relee archivos modificados.
25
- - 📥 **Importación de historial con fidelidad total** — sesiones DSH equilibradas y reanudables (`turn/start → step/start → user/message → assistant/message → tool/call → tool/result → step/end → turn/end`), líneas malformadas con número de línea. Las llamadas a herramientas interrumpidas se reparan para que cada `tool_use` tenga exactamente un resultado (adiós a los 400 permanentes al reanudar).
26
- - 🗂 **Un espacio de trabajo `claudecode` (por defecto)** cada sesión importada aterriza en un espacio de trabajo "claudecode" dedicado, enraizado en una carpeta nueva (`$DSH_HOME/claudecode` por defecto; lo único que el plugin crea jamás). `workspaceMode: 'per-project'` restaura la agrupación de un espacio de trabajo por proyecto.
27
- - 🔁 **Solo copia e incremental** — nada se mueve, reescribe ni elimina en ningún lado. Reejecutar la importación solo añade los turnos nuevos a la misma sesión DSH; `force: true` guarda una copia completa adicional con un id nuevo.
28
- - 🧠 **Contexto personal siempre actualizado** — memorias inyectadas como sección en vivo (proyecto actual primero, `memoryScope`), habilidades de Claude registradas como habilidades reales de DSH (global **y de proyecto** `.claude/skills`, se omiten documentos que no son habilidades como `README.md`), `CLAUDE.md` global + de proyecto inyectado temprano. Incluso con el espacio de trabajo `claudecode`, se recuerda el directorio del proyecto original para resolver memory/`CLAUDE.md`.
29
- - ⚡ **Sincronización en vivo con Claude Code** — sigue usando Claude Code en paralelo; cada reejecución trae solo lo que cambió.
30
- - 🖥 **Panel web y comandos de un paso** — `/claude-import-all`, `/resume-claude` y un panel de migración flotante con progreso.
31
- - 🪄 **Asistente de migración de cuatro fuentes (0.2.1)** — un asistente `/move` más las herramientas `move_detect` / `move_preview` / `move_run` migran Claude Code, Codex, OpenCode y Hermes: memorias/instrucciones se convierten en secciones gestionadas de `AGENTS.md`, las skills en skills reales de DSH, los comandos slash en comandos de DSH y las sesiones en sesiones reanudables — con puerta de aprobación, idempotente (`move.json`) y conflictos mostrados como diff, sin adivinar.
32
- - 🛡 **Seguridad primero** archivos fuente estrictamente de solo lectura, logs de DSH append-only, secretos informados solo por posición, registros de permisos contados pero nunca importados.
33
-
34
- ## 🚀 Inicio rápido
35
-
36
- ```sh
37
- # 1. Instalar
38
- dsh plugin --profile web add -w github:PerryLink/dsh-claude-move
39
- ```
40
-
41
- 2. En cualquier sesión de DSH, ejecuta un comando:
42
-
43
- ```
44
- /claude-import-all # escanear copiar todas las sesiones de Claude informe
45
- ```
46
-
47
- 3. Refresca una vez la página web ya abierta (el panel tiene el botón «Refrescar lista de sesiones») y pulsa cualquier sesión importada para continuar. **No hace falta reiniciar DSH** — ver [Después de importar](#-después-de-importar).
48
-
49
- ¿Prefieres control fino?
50
-
51
- ```
52
- claude_scan # índice estructurado de todos los proyectos/sesiones
53
- import_claude { path: "~/.claude/projects" } # un directorio de proyecto (recursivo)
54
- import_claude { path: "all" } # todo
55
- ```
56
-
57
- ## 🪄 Asistente de migración de cuatro fuentes
58
-
59
- ```text
60
- /move # asistente en un paso: detectar previsualizar ejecutar informar (las cuatro fuentes)
61
- move_detect # escanea Claude Code / Codex / OpenCode / Hermes
62
- move_preview # plan por elemento: new | unchanged | changed | conflict (con diff) | unsupported
63
- move_run # ejecuta tras la puerta de aprobación; resolución: skip | overwrite | rename | merge (skip por defecto, nunca adivina)
64
- ```
65
-
66
- - **Fuentes** Claude Code (`~/.claude`), Codex (`~/.codex`), OpenCode (raíces de datos + configuración), Hermes (raíces de skills/memoria); cada fuente tiene su propio parser y mapper.
67
- - **Mapeo** — memorias/instrucciones → secciones gestionadas de solo anexado en el `AGENTS.md` global de DSH (una sección marcada por elemento); skills → skills reales de DSH (bundles `SKILL.md` copiados tal cual, otros formatos convertidos); comandos slash → comandos registrados de DSH (sus prompts se reconstruyen desde `move.json` tras reiniciar); sesiones → sesiones reanudables de DSH (los mismos importadores de la fase 1).
68
- - **Idempotente** cada plan aplicado se registra en `$DSH_HOME/claude-move/move.json` (`digest` / `targetDigest` / `appliedAt`); las reejecuciones omiten lo que no cambió y `force` lo vuelve a aplicar.
69
- - **Puerta de aprobación** una ejecución que vaya a escribir algo pregunta primero a `ctx.approval`; cualquier cosa distinta de `allowed-once` significa cero escrituras.
70
-
71
- ## 🗂 Qué se migra
72
-
73
- ```
74
- ~/.claude (solo lectura)
75
- ├─ projects/*/*.jsonl ──→ sesiones DSH reanudables, agrupadas en un workspace "claudecode" (por defecto)
76
- ├─ projects/*/memory/ ──→ sección de memoria en vivo del prompt del sistema (releída por petición)
77
- ├─ skills/** ──→ habilidades reales de DSH
78
- └─ CLAUDE.md + settings ──→ sección temprana del prompt + sugerencias de configuración (nunca auto-aplicadas)
79
- ```
80
-
81
- | En Claude Code | Aterriza en DSH como |
82
- | --- | --- |
83
- | Transcripciones de sesión (`projects/*/*.jsonl`) | Sesiones DSH equilibradas y reanudables — mapeo fiel de `user`/`assistant`/`tool`/`thinking` con reparación de llamadas a herramientas interrumpidas — agrupadas en un **espacio de trabajo `claudecode`** (por defecto `$DSH_HOME/claudecode`) o un espacio de trabajo por proyecto (`workspaceMode: 'per-project'`) |
84
- | Archivos de memoria (`projects/*/memory/*.md`) | Una sección de contexto del prompt del sistema en vivo, releída en cada petición (`feedback > project > reference > user`) — el directorio del proyecto original se recuerda incluso dentro del espacio de trabajo `claudecode` |
85
- | Habilidades (`~/.claude/skills/**`) | Habilidades reales de DSH (nombres kebab-case, colisiones con sufijo, máximo 30 por defecto; se omiten `README.md`/`MEMORY.md` y los archivos sin descripción) |
86
- | `CLAUDE.md` (global + por proyecto) | Una sección temprana del prompt; el archivo del proyecto gana |
87
- | `settings.json` | Sugerencias de configuración de DSH con lista explícita de claves no mapeables |
88
- | Estado del proyecto (directorio, rama de git y archivos modificados) | Visible en el índice de escaneo, en las insignias del panel web y en el traspaso `/resume-claude` |
89
-
90
- ## 📦 Instalación
91
-
92
- ```sh
93
- # Desde GitHub
94
- dsh plugin --profile web add -w github:PerryLink/dsh-claude-move
95
-
96
- # Copia local (desarrollo)
97
- dsh plugin --profile web add -w link:/path/to/dsh-claude-move
98
-
99
- # Desde un tarball empaquetado
100
- dsh plugin --profile web add -w ./dsh-claude-move-0.1.0.tgz
101
- ```
102
-
103
- El paquete es ESM puro y no tiene paso de compilación, así que la instalación desde Git no necesita script `prepare` ni la lista `allowBuilds`. Consulta la [guía oficial de empaquetado e instalación](https://deepseek-harness.github.io/deepseek-harness/develop/basic/publish).
104
-
105
- ## 🛠 Uso
106
-
107
- Invoca las herramientas en cualquier sesión con el plugin montado:
108
-
109
- ```
110
- claude_scan # escaneo completo (caché incremental)
111
- claude_scan { path: "~/.claude/projects/<slug>" } # escaneo parcial
112
- claude_scan { refresh: true } # ignora la caché y vuelve a escanear todo
113
-
114
- import_claude { path: "~/.claude/projects/<slug>/<sessionId>.jsonl" } # una sesión
115
- import_claude { path: "~/.claude/projects" } # directorio (recursivo)
116
- import_claude { path: "all" } # todo
117
- # Puedes volver a ejecutarlo cuando quieras: los archivos sin cambios se omiten y las transcripciones que crecieron solo añaden los turnos nuevos.
118
- import_claude { path: "...", force: true } # copia completa nueva como import-<src>-<n> (la copia anterior se conserva)
119
- ```
120
-
121
- Comandos (disparados por el usuario, sin turno del modelo):
122
-
123
- ```
124
- /claude-import-all # un paso: escanear importar todo informe inyectar en la sesión actual
125
- /resume-claude latest # continuar la sesión de Claude más reciente
126
- /resume-claude <sessionId> # por id de sesión de origen o id import-<src>
127
- /resume-claude <palabra clave> # busca títulos; los múltiples resultados se listan, nunca se adivinan
128
- /claude-move-reset # reinicia la caché del plugin (marcadores + mapa de importación); las sesiones importadas se conservan
129
- ```
130
-
131
- Panel web: el botón flotante **🐳 Claude 迁移** (abajo a la derecha) abre el panel — árbol de proyectos/sesiones con insignias de estado (sin importar / importado / importado-con-turnos-nuevos / origen faltante / directorio inexistente / git sucio), filtro por palabra clave, paginación, «Importar y continuar» + «Abrir sesión» + «Refrescar lista de sesiones» por sesión, importación por lotes con barra de progreso y cancelación, y botón de reinicio de caché. Los textos siguen el idioma del navegador (zh/en). Usa las rutas JSON `/api/claude-move/*` propias del plugin, registradas en el seam público `ctx.webServer`.
132
-
133
- - **Escaneo**: devuelve un índice JSON estructurado: proyectos (slug/cwd/existencia del directorio/rama de git y archivos modificados), sesiones (título/marcas de tiempo/recuentos/líneas malformadas), memorias, habilidades, CLAUDE.md global y settings.json; cada sesión lleva `import.status` (`none`/`imported`/`source-missing`) y `import.updatesPending` cuando hay turnos nuevos sin sincronizar. `settingsSuggestions` contiene la traducción a DSH del settings.json y las claves no mapeables (ver [COMPLIANCE.md](COMPLIANCE.md)).
134
- - **Importación**: mapea mensajes user/assistant/tool/thinking con fidelidad total; las llamadas a herramientas interrumpidas se reparan (exactamente un resultado por `tool_use`), y el resultado es una sesión equilibrada y reanudable, vinculada al espacio de trabajo `claudecode` (por defecto) o a su espacio de trabajo por proyecto. Los lotes se resumen archivo por archivo (`imported`/`appended`/`already-imported`/`skipped`/`failed`), las líneas malformadas llevan número de línea, los posibles secretos se informan solo por posición (archivo:línea:tipo) y los registros de permisos se cuentan pero nunca se importan. Importar nunca borra ni reescribe nada: las sesiones existentes de DSH quedan intactas, las copias importadas anteriormente se conservan y los archivos fuente de Claude nunca se escriben.
135
- - **El contexto personal se aplica automáticamente** (sin acción de importación):
136
- - Memorias: `projects/*/memory/*.md` se inyectan como sección dinámica, se releen en cada petición (las memorias nuevas surten efecto al instante), orden `feedback > project > reference > user`, límite de 8 KiB por defecto. Con `memoryScope: current-project` (por defecto) solo se inyectan las memorias del proyecto de la sesión actual (se recurre a todos los proyectos cuando el cwd no coincide con ninguno); `all` inyecta todo con el proyecto actual primero. Dentro del espacio de trabajo `claudecode`, el plugin resuelve el proyecto original a partir del `sourceCwd` registrado.
137
- - Habilidades: `~/.claude/skills/**/SKILL.md` (más archivos planos `*.md`) y `.claude/skills/**` del proyecto actual se convierten en habilidades de DSH (nombres normalizados a kebab-case, colisiones con sufijo, máximo 30; se omiten `README.md`/`MEMORY.md` y los archivos sin descripción para que nunca rompan la carga de habilidades); DSH se encarga del catálogo y de la herramienta `skill`.
138
- - Instrucciones: el `~/.claude/CLAUDE.md` global más el `.claude/CLAUDE.md` de la sesión actual se inyectan como una sección temprana (el proyecto gana; se resuelve vía `sourceCwd` dentro del espacio de trabajo `claudecode`).
139
-
140
- ## ✅ Después de importar
141
-
142
- **No hace falta reiniciar DSH.** Las importaciones se guardan de forma duradera a través del servicio público `sessionPersistence` en cuanto terminan:
143
-
144
- - Las listas del servidor (`session.list` / `workspace.list`, la CLI o cualquier página recién abierta) muestran de inmediato las sesiones importadas bajo el **espacio de trabajo `claudecode`** (uno por proyecto con `workspaceMode: 'per-project'`).
145
- - El panel refresca él mismo la lista de sesiones de la página ya abierta (servicios de cliente del shell `sessions`/`workspaces`, detectados por capacidad) y ofrece «Abrir sesión» por cada sesión importada; en shells antiguos sin esos servicios se recurre al botón «Refrescar lista de sesiones» / recarga de página — las importaciones escriben sesiones frías directamente en el servicio de persistencia, así que no emiten el frame en vivo `host/session-added`; los grupos de espacios de trabajo sí se actualizan en vivo (`host/workspace-changed`).
146
- - Las sesiones importadas pueden abrirse, leerse y reanudarse al momento — `/resume-claude`, o pulsa la sesión en la lista. El traspaso indica el directorio del proyecto original. Reejecutar la importación en cualquier momento solo añade los turnos nuevos a las mismas sesiones.
147
-
148
- ## ⚙️ Configuración
149
-
150
- Todo opcional y reemplazable en `cordis.yml`:
151
-
152
- ```yaml
153
- - id: claude-move
154
- name: dsh-claude-move
155
- config:
156
- claudeHome: null # por defecto: $CLAUDE_CONFIG_DIR o ~/.claude
157
- workspaceMode: claudecode # 'claudecode' (por defecto: un espacio de trabajo dedicado para todas las importaciones) | 'per-project' (un espacio de trabajo por cwd de origen)
158
- claudecodeDir: null # carpeta del espacio de trabajo claudecode; por defecto $DSH_HOME/claudecode (la única carpeta que el plugin crea jamás)
159
- scanGit: true # nivel de sondeo git: true completo | 'branch' sin subprocesos | false
160
- gitTimeoutMs: 5000 # tiempo límite del subproceso git
161
- scanConcurrency: 8 # límite de concurrencia del escaneo de proyectos
162
- maxTranscriptBytes: 67108864
163
- excludeProjects: [] # subcadenas de slug a omitir, p. ej. ['demo-']
164
- enableMemory: true
165
- memoryMaxBytes: 8192
166
- memoryScope: current-project # 'current-project' solo el proyecto actual | 'all' todo, actual primero
167
- enableSkills: true
168
- maxSkills: 30
169
- extraSkillDirs: []
170
- enableInstructions: true
171
- resumeMaxChars: 2048 # límite de caracteres del resumen de traspaso
172
- resumeMode: inject # 'inject' resumen de traspaso | 'agents' ctx.agents.resume
173
- enableWebPanel: true # registrar las rutas del panel /api/claude-move/*
174
- importConcurrency: 4 # concurrencia de lectura+conversión por lote (el guardado sigue secuencial)
175
- # Asistente de cuatro fuentes (0.2.1+):
176
- requireApproval: true # las escrituras del asistente preguntan a ctx.approval (solo allowed-once)
177
- codexHome: null # por defecto: $CODEX_HOME o ~/.codex
178
- opencodeDataHome: null # por defecto: directorio de datos XDG de la plataforma/opencode
179
- opencodeConfigHome: null # por defecto: directorio de configuración XDG de la plataforma/opencode
180
- hermesHome: null # por defecto: $HERMES_HOME o ~/.hermes
181
- skillsDir: null # destino de skills del asistente; por defecto $DSH_HOME/skills
182
- agentsMdPath: null # destino de memorias/instrucciones; por defecto $DSH_HOME/AGENTS.md
183
- moveWorkspaceMode: per-source # 'per-source' | 'single' agrupación de espacios de trabajo
184
- ```
185
-
186
- ## 🗑 Desinstalación
187
-
188
- Quita la fila `claude-move` de los bundles del perfil y reinicia `dsh`. Las sesiones importadas permanecen en el directorio de datos de DSH; el plugin solo escribe su caché (`$DSH_HOME/claude-move/`) y la carpeta del espacio de trabajo `claudecode`, y nunca toca los datos fuente de Claude.
189
-
190
- ## 🧭 Compatibilidad
191
-
192
- - Objetivo: `dsh 0.1.0-rc.6` (perfil web); dependencias peer fijadas a `0.1.0-rc.6`. Node `^22.19 || >=24`.
193
- - Última verificación **2026-08-13** en Windows (Node 22) contra `@deepseek-ai/dsh@0.1.0-rc.6`: instalación desde cero del tarball, escaneo real (40 proyectos / 2387 sesiones), importación real por lotes 13/13 con reimportación idempotente 13/13, vínculo al espacio de trabajo y artefactos de persistencia confirmados. macOS/Linux cubiertos por la matriz CI (linux/macos/windows × Node 22).
194
- - Verificado **2026-08-14** contra el checkout actual de `deepseek-harness` (perfil web, backend de sesiones JSONL+zstd, registro de espacios de trabajo real) en un home aislado: arranque web completo con el plugin montado, escaneo + importación total por las rutas del panel, creación del espacio de trabajo `claudecode` con sesiones vinculadas, anexo incremental a una sesión importada existente (seq contiguo, carga limpia), reimportación segura tras reinicio y sesiones DSH preexistentes intactas durante todo el proceso. Ninguna sesión se archiva, borra o reescribe jamás.
195
-
196
- ### Matriz de compatibilidad (solo seams públicos)
197
-
198
- | Superficie | Uso | Respaldo cuando falta |
199
- | --- | --- | --- |
200
- | Servicios host (`tools` / `sessionPersistence` / `workspaceRegistry` / `commands` / `systemPrompt` / `skills` / `webServer`) | usados donde se listan | los servicios opcionales se registran reactivamente vía `internal/service`; falta de `fs` falla en voz alta |
201
- | `sessionPersistence.listSnapshots` / `readFrom`, `fs.streamText`, `ctx.jobs`, `ctx.agents.resume` | detectados por capacidad | `list()` / lectura completa con rechazo en voz alta / mapa de trabajos propio / inyección del resumen |
202
- | Servicios de cliente del shell (`sessions.refresh/open`, `workspaces.refresh`) | detectados en el apply del panel | recarga completa de la página |
203
- | Las capacidades nuevas de la plataforma nunca son requisitos duros el plugin siempre arranca en rc.6. | | |
204
-
205
- ## 🔐 Permisos y datos
206
-
207
- - **Lee** `~/.claude` (transcripciones, memorias, habilidades, CLAUDE.md, settings.json)estrictamente solo lectura — y los directorios de proyecto a los que importa (vínculo al espacio de trabajo en modo `per-project`).
208
- - **Escribe** los registros de sesión de DSH mediante el servicio público `sessionPersistence` — solo create + append, nunca borra, reescribe ni archiva sesiones existentes — registros del registro de espacios de trabajo, su propia caché bajo `$DSH_HOME/claude-move/` (marcadores de escaneo + mapa de importación), y la carpeta del espacio de trabajo `claudecode` (`$DSH_HOME/claudecode` por defecto; un simple `mkdir`, nunca ninguna eliminación).
209
- - **Nunca** modifica los archivos fuente de Claude, toca datos de otras aplicaciones ni accede a la red.
210
- - **Ninguna credencial** se lee ni transmite; los posibles secretos en las transcripciones se informan solo por posición.
211
-
212
- ## 🛡 Límites de seguridad
213
-
214
- - Los archivos fuente son estrictamente de solo lectura; los registros de sesión de DSH son append-only (solo `create` + `append`).
215
- - Las transcripciones externas son entrada no confiable: nada de ellas se ejecuta; el contenido system/developer/thinking nunca entra en el resumen de traspaso.
216
- - Sin cambios al motor de DSH, paquetes oficiales de UI ni apiproxy solo servicios públicos (`sessionPersistence` / `workspaceRegistry` / `tools` / `commands` / `systemPrompt` / `skills` / `webServer`).
217
- - Los posibles secretos se informan solo por ubicación (nunca su contenido); los registros `permission`/`permission-mode`/`queue-operation` se cuentan, no se importan.
218
-
219
- ## 🩺 Solución de problemas
220
-
221
- - Fila sin efecto: `dsh --profile <p> --dump-config` debe imprimir `# == dsh-claude-move`; vuelve a ejecutar `dsh plugin --profile <p> add -w ...`.
222
- - La web arranca pero se cuelga en silencio: los perfiles nuevos que inicializa `dsh plugin add` solo contienen `dsh-base` añade `@deepseek-ai/dsh-web-app` a `dsh.profile.bundles`. Instalar en el perfil `web` existente no necesita nada.
223
- - Rutas del panel 404: solo se sirven cuando `enableWebPanel: true` y hay un servidor web compuesto; revisa el registro de arranque por fibras FAILED.
224
- - La importación falla con "transcript 过大": sube `maxTranscriptBytes` o importa ese archivo individualmente.
225
- - La importación tuvo éxito pero la barra lateral no muestra la sesión nueva: la página ya estaba abierta — pulsa «Refrescar lista de sesiones» del panel (o recarga la página) una vez. Nunca hace falta reiniciar DSH.
226
- - Registros: los fallos de arranque se imprimen en la consola de `dsh`; el plugin registra errores con el prefijo `[claude-move]` para problemas de espacios de trabajo/mapa de importación.
227
-
228
- ## 📚 Documentación
229
-
230
- - [PLAN.md](PLAN.md) conclusiones de investigación y plan de implementación.
231
- - [ARCHITECTURE.md](ARCHITECTURE.md)diagrama de arquitectura y tabla completa de mapeo de datos.
232
- - [COMPLIANCE.md](COMPLIANCE.md) auditoría cláusula por cláusula frente a las restricciones oficiales de plugins (repo y docs de deepseek-harness, [deepseek.com/harness](https://www.deepseek.com/harness/), la [documentación de desarrollo](https://deepseek-harness.github.io/deepseek-harness/develop/basic/), [Cordis](https://github.com/cordiverse/cordis) y el [paper de Cordis](https://github.com/cordiverse/paper)).
233
- - [OPTIMIZATION.md](OPTIMIZATION.md) — líneas base medidas y candidatos de optimización ordenados.
234
- - [RELEASE.md](RELEASE.md) — lista de verificación de release con evidencia de aceptación.
235
- - [CHANGELOG.md](CHANGELOG.md) — qué cambió en cada versión.
236
-
237
- ## 🙏 Atribución (componentes open source)
238
-
239
- Este proyecto está licenciado bajo la Apache License 2.0; los siguientes componentes bajo MIT conservan sus propias licencias (texto completo en [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md)):
240
-
241
- - Núcleo de conversión vendored de [Nwflower/dsh-chat-import](https://github.com/Nwflower/dsh-chat-import) (MIT).
242
- - Convenciones de descubrimiento y modelo de seguridad de [Demogorgon314/dsh-resume-plugin](https://github.com/Demogorgon314/dsh-resume-plugin) (MIT; su `session_reader.py` tiene un origen Apache-2.0 — ver [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md)).
243
- - Patrones de inyección de memory/skills y análisis de frontmatter de [YYTbit/dsh-plugin-claude-bridge](https://github.com/YYTbit/dsh-plugin-claude-bridge) (MIT).
244
-
245
- ## 🧑‍💻 Desarrollo
246
-
247
- ```sh
248
- npm install # peer deps: @deepseek-ai/cordis, @deepseek-ai/dsh-tools@0.1.0-rc.6, @deepseek-ai/schemastery
249
- npm test # node --test: convert (vendored + extendido), discovery, import/report, context, settings
250
- ```
251
-
252
- CI ejecuta la suite completa en Node 22 vía GitHub Actions ([test.yml](.github/workflows/test.yml)).
253
-
254
- ## 🧠 Model Experience
255
-
256
- - La superficie visible al modelo son las descripciones/esquemas de las dos herramientas y sus salidas: `claude_scan` devuelve el índice estructurado, `import_claude` devuelve resúmenes por archivo con posiciones de avisos. Los resultados de las herramientas son a su vez eventos `tool/result` registrados, así que todo es reconstruible.
257
- - No hay texto oculto visible al modelo; las secciones memory/CLAUDE.md están registradas en `ctx.systemPrompt` (ensamblado del prompt, reconstruible desde el registro de sesión).
258
-
259
- ## ⚠️ Limitaciones conocidas
260
-
261
- - Los títulos vienen de `custom-title`/`ai-title`/primer prompt; los registros `summary` de Claude no se usan como títulos.
262
- - Los bloques `thinking` se conservan en el registro importado como contenido `reasoning`, pero nunca entran en el resumen de traspaso.
263
- - Las llamadas a herramientas interrumpidas se reparan con un resultado de error sintético (nunca se descartan), de modo que las sesiones con interrupciones a mitad de turno siguen siendo reanudables — la reparación se informa en el resultado de la importación (`repaired.synthesized`).
264
- - Los registros de permisos se cuentan, no se importan; las sugerencias de presets de permisos de DSH se generan en los informes.
265
- - Las transcripciones mayores que `maxTranscriptBytes` se importan por streaming en fragmentos cuando el host ofrece `fs.streamText` (memoria O(fragmento)); sin esa superficie se falla en voz alta en vez de importar parcialmente (fidelidad primero).
266
- - Los registros `summary` de Claude se informan pero no se mapean a nodos de compresión DSH (ver OPTIMIZATION.md); el historial completo se importa como turnos originales.
267
- - En `workspaceMode: 'per-project'`, las sesiones cuyo directorio de origen se eliminó aún se importan, pero el vínculo al espacio de trabajo falla (quedan sin agrupar; `workspace.attached: false` más un `reason` en el informe). El espacio de trabajo `claudecode` por defecto no depende del directorio de origen, así que esas sesiones se vinculan con normalidad allí.
268
- - Las importaciones por lotes interrumpidas pueden reejecutarse con seguridad (idempotente, append-only): los archivos terminados se omiten y los que crecieron solo añaden los turnos nuevos.
269
- - Si una transcripción fue truncada o reiniciada en su lugar (menos turnos que la importación registrada), la reimportación la omite e informa `sourceShrunk`; usa `force: true` para una copia completa nueva.
270
- - El panel web es un panel flotante sin build impulsado por las rutas JSON propias del plugin; no usa el sistema interno de slots de UI del shell (se mantiene independiente de los internals no documentados de rc.6).
271
-
272
- ## 🤝 Contribuir y dar feedback
273
-
274
- Issues y pull requests son bienvenidos — usa las plantillas provistas ([reporte de bug](.github/ISSUE_TEMPLATE/bug-report.yml), [solicitud de función](.github/ISSUE_TEMPLATE/feature-request.yml)). Las preguntas y discusiones viven en las [GitHub Discussions](https://github.com/PerryLink/dsh-claude-move/discussions) del repo. Reporta problemas de seguridad de forma privada mediante GitHub Security Advisories (repo Settings → Security; ver [SECURITY.md](SECURITY.md)).
275
-
276
- ## 💛 Colaboradores
277
-
278
- Gracias a todos los que ayudaron a mejorar este plugin:
279
-
280
- - [OLDnana1](https://github.com/OLDnana1) análisis de la causa raíz de la corrupción por llamadas a herramientas interrumpidas, que hacía que las sesiones importadas devolvieran permanentemente HTTP 400 al reanudar ([#1](https://github.com/PerryLink/dsh-claude-move/issues/1)); corregido en v0.2.0.
281
- - [GooodWei](https://github.com/GooodWei) identificó que `README.md` (y cualquier `.md` sin descripción) se registraba erróneamente como skill, rompiendo toda la carga de skills de DSH ([#1](https://github.com/PerryLink/dsh-claude-move/issues/1)); corregido en v0.2.0.
282
- - Los proyectos MIT upstream que este plugin reutiliza se acreditan en [Atribución](#-attribution-open-source-components) y en [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md).
283
-
284
- ## 🔗 Enlaces relacionados
285
-
286
- - DeepSeek Harness: [repo](https://github.com/deepseek-ai/deepseek-harness) · [sitio](https://www.deepseek.com/harness/) · [documentación de desarrollo](https://deepseek-harness.github.io/deepseek-harness/develop/basic/)
287
- - Ecosistema de plugins: [topic `dsh`](https://github.com/topics/dsh) · [topic `dsh-plugin`](https://github.com/topics/dsh-plugin) · [Discord](https://discord.gg/Ycq5dCaS4)
288
-
289
- ## 📄 Licencia
290
-
291
- Apache License 2.0 — ver [LICENSE](LICENSE) y [NOTICE](NOTICE). Avisos de terceros (incluido el texto MIT de los componentes MIT) en [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md).
1
+ <div align="center">
2
+
3
+ # 🚚 dsh-claude-move
4
+
5
+ **Migra Claude Code, Codex, OpenCode y Hermes a DeepSeek Harness — copia sesiones, memorias, habilidades, instrucciones y comandos de barra como sesiones DSH reanudables, solo-copia y con aprobación.**
6
+
7
+ *Conserva tu historial de Claude Code al cambiarte: una sola instalación, sesiones reanudables, sincronización en vivo con un Claude Code en marcha y un asistente de migración de cuatro fuentes.*
8
+
9
+ [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](LICENSE)
10
+ [![DSH plugin](https://img.shields.io/badge/dsh-plugin-✅-green)](https://github.com/topics/dsh-plugin)
11
+ [![Node](https://img.shields.io/badge/node-%5E22.19%20%7C%7C%20%3E%3D24-brightgreen.svg)](#)
12
+ [![CI](https://img.shields.io/github/actions/workflow/status/PerryLink/dsh-claude-move/test.yml?branch=master&label=CI)](https://github.com/PerryLink/dsh-claude-move/actions)
13
+ [![Version](https://img.shields.io/github/v/tag/PerryLink/dsh-claude-move?label=version)](https://github.com/PerryLink/dsh-claude-move/releases)
14
+ [![npm version](https://img.shields.io/npm/v/dsh-claude-move)](https://www.npmjs.com/package/dsh-claude-move)
15
+ [![npm downloads](https://img.shields.io/npm/dm/dsh-claude-move)](https://www.npmjs.com/package/dsh-claude-move)
16
+
17
+ [English](README.md) · [简体中文](README.zh.md) · [Español](README.es.md) · [Português](README.pt.md) · [हिन्दी](README.hi.md)
18
+
19
+ </div>
20
+
21
+ ---
22
+
23
+ ## Compatibilidad
24
+
25
+ - Dirigido a `dsh 0.1.0-rc.6` (perfil web); peer dependencies fijadas a `0.1.0-rc.6`. Node `^22.19 || >=24`.
26
+ - Última verificación con una instalación nueva desde tarball: escaneo real, importación por lotes real (reimportación idempotente), adjuntado al workspace y artefactos de persistencia confirmados; macOS/Linux cubiertos por la matriz de CI.
27
+
28
+ ### Matriz de compatibilidad (solo costuras públicas)
29
+
30
+ | Superficie | Uso | Respaldo cuando falta |
31
+ |---|---|---|
32
+ | Servicios de host (`tools` / `sessionPersistence` / `workspaceRegistry` / `commands` / `systemPrompt` / `skills` / `webServer`) | obligatorio donde se indica | los servicios opcionales se registran reactivamente; la falta de `fs` falla en voz alta |
33
+ | `sessionPersistence.listSnapshots` / `readFrom` / `fs` con capacidad `streamText` / `ctx.jobs` / `ctx.agents.resume` | detectado por característica | `list()` / lectura de archivo completo con rechazo en voz alta / mapa de jobs propio / inyección de traspaso |
34
+ | Servicios de shell del cliente (`sessions.refresh/open`, `workspaces.refresh`) | detectado por característica al aplicar el panel | recarga completa de la página |
35
+ | Las capacidades de plataforma más nuevas nunca son requisitos estrictos — el plugin sigue arrancando en rc.6. | | |
36
+
37
+ ## Qué obtienes
38
+
39
+ 1. **Auto-descubrimiento** — `claude_scan` localiza la raíz de datos de Claude (`$CLAUDE_CONFIG_DIR`, con fallback a `~/.claude`) e indexa cada proyecto/sesión, memoria, habilidad, `CLAUDE.md` global y `settings.json`, con caché incremental y escaneo paralelo (`scanConcurrency`).
40
+ 2. **Importación con fidelidad total** — `import_claude` convierte las transcripciones en sesiones DSH balanceadas y reanudables (`turn/start → step/start → user/message → assistant/message → tool/call → tool/result → step/end → turn/end`), repara llamadas a herramientas interrumpidas e importa por streaming en trozos las transcripciones mayores que `maxTranscriptBytes`.
41
+ 3. **Un solo workspace `claudecode`** — cada sesión importada cae en un workspace dedicado (por defecto `$DSH_HOME/claudecode`); `workspaceMode: 'per-project'` restaura la agrupación de un workspace por proyecto.
42
+ 4. **Solo-copia e incremental** — nada se mueve, reescribe ni elimina en ninguno de los dos lados; reejecutar solo añade los turnos nuevos (`force: true` guarda una copia completa adicional con un id nuevo).
43
+ 5. **Contexto personal, siempre fresco** — las memorias se inyectan como una sección de prompt en vivo, las habilidades de Claude se registran como habilidades DSH reales (globales + a nivel de proyecto), y el `CLAUDE.md` global + de proyecto se inyecta temprano.
44
+ 6. **Asistente de migración de cuatro fuentes** `/move` más `move_detect` / `move_preview` / `move_run` migran Claude Code, Codex, OpenCode y Hermes, con aprobación e idempotencia (`move.json`).
45
+ 7. **Panel web y comandos** — `/claude-import-all`, `/resume-claude`, `/claude-move-reset` y un panel de migración flotante.
46
+
47
+ ## Asistente de migración de cuatro fuentes
48
+
49
+ ```text
50
+ /move # asistente de un solo paso: detectar → previsualizar → ejecutar → informar (las cuatro fuentes)
51
+ move_detect # escanea Claude Code / Codex / OpenCode / Hermes
52
+ move_preview # plan por ítem: new | unchanged | changed | conflict (con diff) | unsupported
53
+ move_run # ejecuta tras la puerta de aprobación; resolución de conflictos:
54
+ # skip | overwrite | rename | merge (por defecto skip — nunca adivina)
55
+ ```
56
+
57
+ - **Fuentes** Claude Code (`~/.claude`), Codex (`~/.codex`), OpenCode (raíces de datos + config), Hermes (raíces de skills/memoria); cada fuente tiene su propio parser + mapper.
58
+ - **Mapeo** — memorias/instrucciones → secciones gestionadas solo-anexables en el `AGENTS.md` global de DSH (una sección marcada por ítem); skills → skills DSH reales (los paquetes `SKILL.md` se copian tal cual, otros formatos se convierten); comandos de barra → comandos DSH registrados (reconstruidos desde `move.json` tras un reinicio); sesiones → sesiones DSH reanudables (los mismos importadores que la fase 1).
59
+ - **Idempotente** — cada plan aplicado se registra en `$DSH_HOME/claude-move/move.json` (`digest` / `targetDigest` / `appliedAt`); las reejecuciones omiten los ítems sin cambios y `force` los vuelve a aplicar.
60
+ - **Con aprobación** una ejecución que escribiría algo pregunta primero a `ctx.approval`; cualquier cosa distinta de `allowed-once` significa cero escrituras.
61
+
62
+ ## Inicio rápido
63
+
64
+ ```sh
65
+ # 1. instala el bundle en tu perfil
66
+ dsh plugin --profile web add "github:PerryLink/dsh-claude-move#master"
67
+
68
+ # o desde npm (versiones publicadas)
69
+ dsh plugin --profile web add dsh-claude-move
70
+
71
+ # 2. reinicia y verifica la fila
72
+ dsh --profile web --dump-config | grep -A4 'id: claude-move'
73
+ ```
74
+
75
+ Luego, en cualquier sesión DSH, ejecuta un comando:
76
+
77
+ ```sh
78
+ /claude-import-all # escanea copia cada sesión de Claude informa
79
+ ```
80
+
81
+ No es necesario reiniciar DSH después de importar — refresca la página web abierta una vez y haz clic en cualquier sesión importada para continuar.
82
+
83
+ ## Instalación y desinstalación
84
+
85
+ - **Canal git** (último `master`): `dsh plugin --profile web add "github:PerryLink/dsh-claude-move#master"` ESM puro, sin paso de `prepare` ni `allowBuilds`.
86
+ - **Canal npm** (versiones publicadas): `dsh plugin --profile web add dsh-claude-move`.
87
+ - **Canal tarball**: `npm pack` en este repo y luego `dsh plugin --profile web add ./dsh-claude-move-<version>.tgz`.
88
+ - **Desinstalación**: elimina la fila `claude-move` de los bundles del perfil y reinicia `dsh`. Las sesiones importadas permanecen en el directorio de datos de DSH; el plugin solo escribe su caché (`$DSH_HOME/claude-move/`) y la carpeta del workspace `claudecode`, y nunca toca los datos fuente de Claude.
89
+
90
+ ## Qué se migra
91
+
92
+ ```
93
+ ~/.claude (solo lectura)
94
+ ├─ projects/*/*.jsonl ──→ sesiones DSH reanudables, agrupadas en un workspace "claudecode" (por defecto)
95
+ ├─ projects/*/memory/ ──→ sección de memoria del system-prompt en vivo (se relee por petición)
96
+ ├─ skills/** ──→ skills DSH reales
97
+ └─ CLAUDE.md + settings ──→ sección de prompt temprana + sugerencias de configuración (nunca se auto-aplican)
98
+ ```
99
+
100
+ | En Claude Code | Llega a DSH como |
101
+ |---|---|
102
+ | Transcripciones de sesión (`projects/*/*.jsonl`) | Sesiones DSH balanceadas y reanudables — mapeo con fidelidad total de `user`/`assistant`/`tool`/`thinking` con reparación de llamadas a herramientas interrumpidas — agrupadas en un workspace **`claudecode`** o una por proyecto |
103
+ | Archivos de memoria (`projects/*/memory/*.md`) | Una sección de contexto del system-prompt en vivo, releída en cada petición (`feedback > project > reference > user`) |
104
+ | Skills (`~/.claude/skills/**`) | Skills DSH reales (nombres kebab-case, sufijos de colisión, máximo 30 por defecto; `README.md`/`MEMORY.md` y archivos sin descripción se omiten) |
105
+ | `CLAUDE.md` (global + por proyecto) | Una sección de prompt temprana; gana el archivo del proyecto |
106
+ | `settings.json` | Sugerencias de configuración DSH con una lista explícita de claves no mapeables |
107
+ | Estado del proyecto (directorio, rama git y conteo de cambios) | Se muestra en el índice de escaneo, las insignias del panel web y el traspaso de `/resume-claude` |
108
+
109
+ ## Uso
110
+
111
+ Llama a las herramientas en cualquier sesión con el plugin montado:
112
+
113
+ ```
114
+ claude_scan # escaneo completo (caché incremental)
115
+ claude_scan { path: "~/.claude/projects/<slug>" } # escaneo parcial
116
+ claude_scan { refresh: true } # omite la caché, reescanea todo
117
+ claude_scan { projectsLimit: 10, sessionsLimit: 5, fields: "brief" } # recorta la salida
118
+
119
+ import_claude { path: "~/.claude/projects/<slug>/<sessionId>.jsonl" } # una sesión
120
+ import_claude { path: "~/.claude/projects" } # directorio (recursivo)
121
+ import_claude { path: "all" } # todo
122
+ # Reejecuta en cualquier momento: los archivos sin cambios se omiten, las transcripciones crecidas solo añaden los turnos nuevos.
123
+ # Los archivos mayores que maxTranscriptBytes se importan por streaming en trozos (sin techo de memoria).
124
+ import_claude { path: "...", force: true } # copia completa nueva (se conserva la copia anterior)
125
+ ```
126
+
127
+ Comandos (activados por el usuario, sin turno del modelo):
128
+
129
+ ```
130
+ /claude-import-all # un solo paso: escanear → importar todo → informar → inyectar en la sesión actual
131
+ /resume-claude latest # continúa la sesión de Claude más reciente
132
+ /resume-claude <sessionId> # por id de sesión fuente o id import-<src>
133
+ /resume-claude <keyword> # coincide con títulos; varias coincidencias se listan, nunca se adivina
134
+ /claude-move-reset # reinicia la caché del plugin (marcadores + mapa de importación); las sesiones importadas se conservan
135
+ ```
136
+
137
+ Panel web: un panel de migración flotante con el árbol de proyectos/sesiones, insignias de estado (no importado / importado / importado-con-turnos-nuevos / fuente ausente / directorio ausente / git sucio), filtro por palabra clave, renderizado paginado, "Importar y continuar" + "Abrir sesión" + "Refrescar lista de sesiones" por sesión, importación por lotes con barra de progreso en vivo y cancelar, y un botón de reinicio de caché. Los textos siguen el idioma del navegador (zh/en). Servido a través de las rutas JSON `/api/claude-move/*` propias del plugin en la costura pública `ctx.webServer`.
138
+
139
+ ## Después de importar
140
+
141
+ **No necesitas reiniciar DSH.** Las importaciones aterrizan de forma duradera a través del servicio público `sessionPersistence` en el momento en que se completan:
142
+
143
+ - Las listas del lado del servidor (RPCs `session.list` / `workspace.list`, la CLI, cualquier carga de página nueva) muestran las sesiones importadas bajo el workspace **`claudecode`** de inmediato.
144
+ - El panel refresca por mismo la lista de sesiones de la página ya abierta y ofrece un botón **Abrir sesión** por cada sesión importada.
145
+ - Las sesiones importadas pueden abrirse, leerse y reanudarse de inmediato `/resume-claude`, o haz clic en la sesión de la lista. Reejecutar la importación en cualquier momento sincroniza solo los turnos nuevos en las mismas sesiones.
146
+
147
+ ## Configuración
148
+
149
+ Todo opcional, anulable en cordis.yml.
150
+
151
+ | Clave | Por defecto | Significado |
152
+ |---|---|---|
153
+ | `claudeHome` | `$CLAUDE_CONFIG_DIR` o `~/.claude` | Raíz de datos de Claude |
154
+ | `workspaceMode` | `claudecode` | `claudecode` (un workspace dedicado) · `per-project` (un workspace por cwd fuente) |
155
+ | `claudecodeDir` | `$DSH_HOME/claudecode` | La carpeta del workspace `claudecode` (la única carpeta que el plugin crea) |
156
+ | `scanGit` | `true` | Nivel de sondeo de git: `true` (completo) · `'branch'` (cero llamadas a git) · `false` |
157
+ | `gitTimeoutMs` | `5000` | Timeout del subproceso de git |
158
+ | `scanConcurrency` | `8` | Límite de escaneo paralelo de proyectos |
159
+ | `maxTranscriptBytes` | `67108864` | Umbral de importación por streaming (troceado por encima) |
160
+ | `excludeProjects` | `[]` | Subcadenas de slug a omitir |
161
+ | `enableMemory` | `true` | Inyecta memorias como una sección de prompt en vivo |
162
+ | `memoryMaxBytes` | `8192` | Límite de la sección de memoria |
163
+ | `memoryScope` | `current-project` | `current-project` · `all` (el proyecto actual primero) |
164
+ | `enableSkills` | `true` | Registra habilidades de Claude como habilidades DSH |
165
+ | `maxSkills` | `30` | Límite de cantidad de habilidades |
166
+ | `extraSkillDirs` | `[]` | Directorios de habilidades adicionales |
167
+ | `enableInstructions` | `true` | Inyecta `CLAUDE.md` global + de proyecto |
168
+ | `resumeMaxChars` | `2048` | Límite de caracteres del resumen de traspaso |
169
+ | `resumeMode` | `inject` | `inject` (resumen de traspaso) · `agents` (ctx.agents.resume) |
170
+ | `enableWebPanel` | `true` | Registra las rutas del panel `/api/claude-move/*` |
171
+ | `importConcurrency` | `4` | Lectura + conversión en paralelo por lote |
172
+ | `requireApproval` | `true` | Las escrituras del asistente preguntan `ctx.approval` (solo allowed-once) |
173
+ | `codexHome` | `$CODEX_HOME` o `~/.codex` | Raíz de datos de Codex |
174
+ | `opencodeDataHome` | dir de datos XDG de la plataforma/opencode | Raíz de datos de OpenCode |
175
+ | `opencodeConfigHome` | dir de config XDG de la plataforma/opencode | Raíz de config de OpenCode |
176
+ | `hermesHome` | `$HERMES_HOME` o `~/.hermes` | Raíz de datos de Hermes |
177
+ | `skillsDir` | `$DSH_HOME/skills` | Destino de habilidades del asistente |
178
+ | `agentsMdPath` | `$DSH_HOME/AGENTS.md` | Destino de memoria/instrucciones del asistente |
179
+ | `moveWorkspaceMode` | `per-source` | Agrupación de workspace para importaciones del asistente: `per-source` · `single` |
180
+
181
+ ## Herramientas y superficies
182
+
183
+ | Superficie | Tipo | Notas |
184
+ |---|---|---|
185
+ | `claude_scan` | herramienta | Índice estructurado de proyectos/sesiones/memorias/habilidades/ajustes |
186
+ | `import_claude` | herramienta | Importa una sesión, un directorio o `all` (incremental; `force` para una copia nueva) |
187
+ | `move_detect` / `move_preview` / `move_run` | herramientas | Asistente de cuatro fuentes: escanear, plan por ítem con diffs, ejecutar tras la aprobación |
188
+ | `/claude-import-all` | comando | Escanea importa todo informa |
189
+ | `/resume-claude` | comando | Continúa una sesión de Claude (latest, id o palabra clave) |
190
+ | `/claude-move-reset` | comando | Reinicia la caché del plugin (las sesiones importadas se conservan) |
191
+ | `/move` | comando | Asistente de cuatro fuentes de un solo paso |
192
+ | Panel web de migración | cliente | Panel flotante con progreso, cancelación, paginación, abrir sesión |
193
+
194
+ ## Permisos y datos
195
+
196
+ - **Permisos**: el manifiesto del workshop declara `filesystem:read` y `filesystem:write`.
197
+ - **Lee** `~/.claude` (transcripciones, memorias, habilidades, `CLAUDE.md`, `settings.json`) — estrictamente de solo lectura — y los directorios de proyecto a los que importa.
198
+ - **Escribe** logs de sesión DSH a través del servicio público `sessionPersistence` (solo create + append, nunca elimina/reescribe/archiva), registros del workspace-registry, su caché bajo `$DSH_HOME/claude-move/` y la carpeta del workspace `claudecode`.
199
+ - **Nunca** modifica archivos fuente de Claude, toca datos de otras aplicaciones ni accede a la red. **No** se leen ni transmiten credenciales.
200
+
201
+ ## Límites de seguridad
202
+
203
+ - **Los archivos fuente son de solo lectura; los logs DSH son solo-append** (solo `create` + `append`).
204
+ - **Las transcripciones externas son entrada no confiable** — nada en ellas se ejecuta; el contenido system/developer/thinking nunca entra en el traspaso de reanudación.
205
+ - **Solo servicios públicos** — `sessionPersistence` / `workspaceRegistry` / `tools` / `commands` / `systemPrompt` / `skills` / `webServer`; sin cambios en el motor ni en la UI.
206
+ - **Los secretos se informan solo por posición** (file:line:kind); los registros `permission`/`permission-mode`/`queue-operation` se cuentan, no se importan.
207
+ - **Las escrituras del asistente van con aprobación**cualquier cosa distinta de `allowed-once` significa cero escrituras.
208
+
209
+ ## Limitaciones conocidas
210
+
211
+ - Los títulos provienen de `custom-title`/`ai-title`/primer prompt; los registros `summary` de Claude se informan pero no se mapean a nodos de compactación DSH (sintetizar una transacción de compactación válida fabricaría su rango de seq y su mensaje de checkpoint).
212
+ - Los bloques `thinking` se conservan como contenido `reasoning`, pero nunca entran en el traspaso de reanudación.
213
+ - Las llamadas a herramientas interrumpidas se reparan con un resultado de error sintético (nunca se descartan), informado como `repaired.synthesized`.
214
+ - Los registros de clase de permisos se cuentan, no se importan; las sugerencias de permisos predefinidos DSH se generan en los informes.
215
+ - En hosts sin una superficie de streaming `fs.streamText`, las transcripciones mayores que `maxTranscriptBytes` fallan en voz alta en lugar de importar parcialmente.
216
+ - En `workspaceMode: 'per-project'`, las sesiones cuyo directorio fuente fue eliminado aún se importan, pero el adjuntado al workspace falla (quedan sin agrupar; `workspace.attached: false` más un `reason`). El workspace `claudecode` por defecto no depende del directorio fuente.
217
+ - Si una transcripción fue truncada o reiniciada en el lugar (menos turnos que la importación registrada), la reimportación la omite e informa `sourceShrunk`; usa `force: true` para una copia completa nueva.
218
+ - El panel web es un panel flotante sin build dirigido por las propias rutas JSON del plugin; no usa el sistema de slots de UI interno del shell.
219
+
220
+ ## Experiencia del modelo
221
+
222
+ - La superficie visible para el modelo son las descripciones/esquemas de las dos herramientas y sus salidas: `claude_scan` devuelve el índice estructurado, `import_claude` devuelve resúmenes por archivo con posiciones de las advertencias. Los resultados de las herramientas se registran a su vez como eventos `tool/result`, de modo que todo es reconstruible.
223
+ - No hay texto oculto visible para el modelo; las secciones de memoria/`CLAUDE.md` se registran en `ctx.systemPrompt` (ensamblado de prompt, reconstruible desde el log de sesión).
224
+
225
+ ## Solución de problemas
226
+
227
+ - Fila sin efecto: `dsh --profile <p> --dump-config` debería imprimir `# == dsh-claude-move`; vuelve a ejecutar `dsh plugin --profile <p> add ...`.
228
+ - La web arranca pero se cuelga en silencio: los perfiles nuevos inicializados por `dsh plugin add` contienen solo `dsh-base` — añade `@deepseek-ai/dsh-web-app` a `dsh.profile.bundles`. Instalar en el perfil `web` existente no necesita nada.
229
+ - Rutas del panel 404: se sirven solo cuando `enableWebPanel: true` y hay un servidor web compuesto; revisa el log de arranque en busca de fibers FAILED.
230
+ - La importación falla con "transcript 过大": sube `maxTranscriptBytes` o importa ese archivo individualmente.
231
+ - La importación tuvo éxito pero la barra lateral no muestra ninguna sesión nueva: la página ya estaba abierta haz clic una vez en el botón de refrescar del panel (o recarga la página). Nunca es necesario reiniciar DSH.
232
+ - Logs: los fallos de arranque se imprimen en la consola de `dsh`; el plugin registra errores con prefijo `[claude-move]` para problemas de workspace/mapa de importación.
233
+
234
+ ## Atribución (componentes de código abierto)
235
+
236
+ Este proyecto está licenciado bajo la Apache License 2.0; los siguientes componentes con licencia MIT conservan sus propias licencias (texto completo en [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md)):
237
+
238
+ - Núcleo de conversión vendored de [Nwflower/dsh-chat-import](https://github.com/Nwflower/dsh-chat-import) (MIT).
239
+ - Convenciones de descubrimiento y modelo de seguridad de [Demogorgon314/dsh-resume-plugin](https://github.com/Demogorgon314/dsh-resume-plugin) (MIT).
240
+ - Patrones de inyección de memoria/skills y análisis de frontmatter de [YYTbit/dsh-plugin-claude-bridge](https://github.com/YYTbit/dsh-plugin-claude-bridge) (MIT).
241
+
242
+ ## Desarrollo
243
+
244
+ ```sh
245
+ npm install # peer deps: @deepseek-ai/dsh-tools@0.1.0-rc.6, @deepseek-ai/cordis, schemastery
246
+ npm test # node --test test/*.test.mjs
247
+ ```
248
+
249
+ CI ejecuta la suite completa en Node 22 en Linux/macOS/Windows a través de GitHub Actions ([test.yml](.github/workflows/test.yml)).
250
+
251
+ ## Temas
252
+
253
+ `deepseek-harness`, `dsh-plugin`, `claude-code`, `migration`, `session-import`, `resume`
254
+
255
+ ## Contribuidores
256
+
257
+ - [@PerryLink](https://github.com/PerryLink) creador y mantenedor: el pipeline de importación, el asistente de migración de cuatro fuentes, el panel web, la documentación, CI/CD y releases.
258
+ - [@OLDnana1](https://github.com/OLDnana1) — análisis de causa raíz de la corrupción de llamadas a herramientas interrumpidas que hacía que las sesiones importadas devolvieran permanentemente HTTP 400 al reanudar.
259
+ - [@GooodWei](https://github.com/GooodWei) identificó que `README.md` (y cualquier `.md` sin descripción) se registraba mal como habilidad, lo que rompía la carga de habilidades de DSH.
260
+
261
+ ## Familia de plugins DSH de PerryLink
262
+
263
+ Este proyecto es uno de los plugins de DeepSeek Harness mantenidos por [PerryLink](https://github.com/PerryLink). Si este te ayuda, es probable que los demás también lo hagan:
264
+
265
+ | Plugin | Una línea |
266
+ |---|---|
267
+ | [dsh-mcp-panel](https://github.com/PerryLink/dsh-mcp-panel) | Panel de runtime MCP de solo lectura: comando /mcp + pestaña Settings con estado, herramientas y errores |
268
+ | [dsh-doublecheck](https://github.com/PerryLink/dsh-doublecheck) | Guardia de disciplina de ingeniería: interrogatorio de requisitos, puertas de prueba, revisión de adversario |
269
+ | [dsh-background-agents](https://github.com/PerryLink/dsh-background-agents) | Agentes hijos en segundo plano duraderos con una barra lateral de Web UI, mensajería e interrupción |
270
+ | [dsh-lsp-actions](https://github.com/PerryLink/dsh-lsp-actions) | Diagnósticos LSP, formato, completado, acciones de código y renombrado sobre language servers |
271
+ | [dsh-output-styles](https://github.com/PerryLink/dsh-output-styles) | Cambio de estilo en runtime equivalente a outputStyles de Claude Code |
272
+ | [dsh-checkpoint-rewind](https://github.com/PerryLink/dsh-checkpoint-rewind) | Equivalente a /rewind de Claude Code: snapshots, forks de sesión, restauración de un solo paso |
273
+ | [dsh-permission-rules](https://github.com/PerryLink/dsh-permission-rules) | Reglas de permisos declarativas allow/deny/ask estilo Claude Code con auditoría |
274
+ | [dsh-auto-review](https://github.com/PerryLink/dsh-auto-review) | Auto-revisión de segundo modelo en la cadena de aprobación, fail-closed por defecto |
275
+ | [dsh-memento](https://github.com/PerryLink/dsh-memento) | Memoria entre sesiones con aprobación: costura ctx.memory + SQLite + herramienta de memoria |
276
+ | [dsh-skill-pack-security](https://github.com/PerryLink/dsh-skill-pack-security) | Pack de skills de auditoría de seguridad: escaneo de secretos, revisión de dependencias y cadena de suministro |
277
+ | [dsh-session-pin](https://github.com/PerryLink/dsh-session-pin) | Fija sesiones en la barra lateral web con orden duradero |
278
+ | [dsh-composer-history](https://github.com/PerryLink/dsh-composer-history) | Historial de entrada estilo terminal para el composer web: flechas, búsqueda Ctrl+R |
279
+ | [dsh-github](https://github.com/PerryLink/dsh-github) | Integración de PR/issues de GitHub para DSH, cada escritura gated por aprobación |
280
+ | [dsh-plugin-guide](https://github.com/PerryLink/dsh-plugin-guide) | Base de conocimiento de desarrollo de plugins como skill de agente bajo demanda |
281
+ | **[dsh-claude-move](https://github.com/PerryLink/dsh-claude-move)** | Migra sesiones, memoria, skills y CLAUDE.md de Claude Code a DSH |
282
+
283
+ ## Licencia
284
+
285
+ [Apache License 2.0](LICENSE) © 2026 dsh-claude-move contributors