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.pt.md CHANGED
@@ -1,291 +1,285 @@
1
- # dsh-claude-move
2
-
3
- **Mantenha seu histórico do Claude Code ao migrar para o DeepSeek Harness.** Uma única instalação copia cada sessão, memória, habilidade e `CLAUDE.md` do Claude para o DSH como sessões retomáveis — organizadas em um workspace `claudecode` dedicado (um workspace por projeto é opcional via config).
4
-
5
- `Somente cópia` · `Retomada sem interrupções` · `Workspaces por projeto` · `Sincronização ao vivo com o 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
- ![Cartão social do dsh-claude-move](assets/social-card.png)
17
-
18
- [English](README.md) | [中文](README.zh.md) | [Español](README.es.md) | Português | [हिन्दी](README.hi.md)
19
-
20
- > Prévia de desenvolvimento (0.1.0). Roteiro e design: [PLAN.md](PLAN.md) · histórico de mudanças: [CHANGELOG.md](CHANGELOG.md).
21
-
22
- ## ✨ Recursos
23
-
24
- - 🔍 **Descoberta automática** — localiza a raiz de dados do Claude (`$CLAUDE_CONFIG_DIR`, padrão `~/.claude`) e indexa cada projeto/sessão (título, marcas de tempo, contagens), estado do diretório e do git, memórias, habilidades, `CLAUDE.md` global e `settings.json` — com cache incremental que só relê arquivos alterados.
25
- - 📥 **Importação de histórico com fidelidade total** — sessões DSH equilibradas e retomáveis (`turn/start step/start user/message assistant/message → tool/call → tool/result → step/end → turn/end`), linhas malformadas com número de linha. Chamadas de ferramenta interrompidas são reparadas para que cada `tool_use` tenha exatamente um resultado (sem mais 400s permanentes ao retomar).
26
- - 🗂 **Um workspace `claudecode` (padrão)** toda sessão importada fica em um workspace "claudecode" dedicado, enraizado em uma pasta nova (`$DSH_HOME/claudecode` por padrão; a única coisa que o plugin cria). `workspaceMode: 'per-project'` restaura o agrupamento de um workspace por projeto.
27
- - 🔁 **Somente cópia e incremental** — nada é movido, reescrito ou excluído em nenhum lado. Reexecutar a importação apenas anexa os novos turnos à mesma sessão DSH; `force: true` salva uma cópia completa adicional com um novo id.
28
- - 🧠 **Contexto pessoal sempre atualizado** — memórias injetadas como seção ao vivo (projeto atual primeiro, `memoryScope`), habilidades do Claude como habilidades reais do DSH (global **e por projeto** `.claude/skills`, documentos que não são habilidades como `README.md` são ignorados), `CLAUDE.md` global + de projeto injetado cedo. Mesmo no workspace `claudecode`, o diretório original do projeto é lembrado para a resolução de memória/`CLAUDE.md`.
29
- - ⚡ **Sincronização ao vivo com o Claude Code** — continue usando o Claude Code em paralelo; cada reexecução traz apenas o que mudou.
30
- - 🖥 **Painel web e comandos de um passo** — `/claude-import-all`, `/resume-claude` e um painel de migração flutuante com progresso.
31
- - 🪄 **Assistente de migração de quatro fontes (0.2.1)** — um assistente `/move` mais as ferramentas `move_detect` / `move_preview` / `move_run` migram Claude Code, Codex, OpenCode e Hermes: memórias/instruções viram seções gerenciadas do `AGENTS.md`, skills viram skills reais do DSH, comandos slash viram comandos do DSH e sessões viram sessões retomáveis — com porta de aprovação, idempotente (`move.json`) e conflitos exibidos como diff, sem adivinhar.
32
- - 🛡 **Segurança em primeiro lugar** arquivos fonte estritamente somente leitura, logs do DSH append-only, segredos informados apenas por posição, registros de permissão contados mas nunca importados.
33
-
34
- ## 🚀 Início rápido
35
-
36
- ```sh
37
- # 1. Instalar
38
- dsh plugin --profile web add -w github:PerryLink/dsh-claude-move
39
- ```
40
-
41
- 2. Em qualquer sessão do DSH, rode um comando:
42
-
43
- ```
44
- /claude-import-all # varrer copiar todas as sessões do Claude relatório
45
- ```
46
-
47
- 3. Atualize uma vez a página web já aberta (o painel tem o botão «Atualizar lista de sessões») e clique em qualquer sessão importada para continuar. **Não é preciso reiniciar o DSH** — veja [Depois de importar](#-depois-de-importar).
48
-
49
- Prefere controle fino?
50
-
51
- ```
52
- claude_scan # índice estruturado de todos os projetos/sessões
53
- import_claude { path: "~/.claude/projects" } # um diretório de projeto (recursivo)
54
- import_claude { path: "all" } # tudo
55
- ```
56
-
57
- ## 🪄 Assistente de migração de quatro fontes
58
-
59
- ```text
60
- /move # assistente em um passo: detectar pré-visualizar executar relatar (as quatro fontes)
61
- move_detect # escaneia Claude Code / Codex / OpenCode / Hermes
62
- move_preview # plano por item: new | unchanged | changed | conflict (com diff) | unsupported
63
- move_run # executa após a porta de aprovação; resolução: skip | overwrite | rename | merge (skip por padrão, nunca adivinha)
64
- ```
65
-
66
- - **Fontes** Claude Code (`~/.claude`), Codex (`~/.codex`), OpenCode (raízes de dados + configuração), Hermes (raízes de skills/memória); cada fonte tem seu próprio parser e mapper.
67
- - **Mapeamento** — memórias/instruções → seções gerenciadas somente de acréscimo no `AGENTS.md` global do DSH (uma seção marcada por item); skills → skills reais do DSH (bundles `SKILL.md` copiados como estão, outros formatos convertidos); comandos slash → comandos registrados do DSH (os prompts são reconstruídos do `move.json` após reiniciar); sessões → sessões retomáveis do DSH (os mesmos importadores da fase 1).
68
- - **Idempotente** cada plano aplicado é registrado em `$DSH_HOME/claude-move/move.json` (`digest` / `targetDigest` / `appliedAt`); reexecuções pulam o que não mudou e `force` reaplica.
69
- - **Porta de aprovação** uma execução que for escrever algo pergunta primeiro ao `ctx.approval`; qualquer coisa diferente de `allowed-once` significa zero escritas.
70
-
71
- ## 🗂 O que é migrado
72
-
73
- ```
74
- ~/.claude (somente leitura)
75
- ├─ projects/*/*.jsonl ──→ sessões DSH retomáveis, agrupadas em um workspace "claudecode" (padrão)
76
- ├─ projects/*/memory/ ──→ seção de memória ao vivo do prompt do sistema (relida por requisição)
77
- ├─ skills/** ──→ habilidades reais do DSH
78
- └─ CLAUDE.md + settings ──→ seção inicial do prompt + sugestões de configuração (nunca auto-aplicadas)
79
- ```
80
-
81
- | No Claude Code | Aterrissa no DSH como |
82
- | --- | --- |
83
- | Transcrições de sessão (`projects/*/*.jsonl`) | Sessões DSH equilibradas e retomáveis — mapeamento fiel de `user`/`assistant`/`tool`/`thinking` com reparo de chamadas de ferramenta interrompidas — agrupadas em um workspace **`claudecode`** (padrão `$DSH_HOME/claudecode`) ou um workspace por projeto (`workspaceMode: 'per-project'`) |
84
- | Arquivos de memória (`projects/*/memory/*.md`) | Uma seção de contexto do prompt do sistema ao vivo, relida a cada requisição (`feedback > project > reference > user`) — o diretório original do projeto é lembrado mesmo dentro do workspace `claudecode` |
85
- | Habilidades (`~/.claude/skills/**`) | Habilidades reais do DSH (nomes kebab-case, colisões com sufixo, máximo 30 por padrão; `README.md`/`MEMORY.md` e arquivos sem descrição são ignorados) |
86
- | `CLAUDE.md` (global + por projeto) | Uma seção inicial do prompt; o arquivo do projeto vence |
87
- | `settings.json` | Sugestões de configuração do DSH com lista explícita de chaves não mapeáveis |
88
- | Estado do projeto (diretório, branch do git e arquivos modificados) | Visível no índice de varredura, nos selos do painel web e no handoff do `/resume-claude` |
89
-
90
- ## 📦 Instalação
91
-
92
- ```sh
93
- # Do GitHub
94
- dsh plugin --profile web add -w github:PerryLink/dsh-claude-move
95
-
96
- # Cópia local (desenvolvimento)
97
- dsh plugin --profile web add -w link:/path/to/dsh-claude-move
98
-
99
- # De um tarball empacotado
100
- dsh plugin --profile web add -w ./dsh-claude-move-0.1.0.tgz
101
- ```
102
-
103
- O pacote é ESM puro, sem etapa de build, então a instalação via Git dispensa o script `prepare` e a lista `allowBuilds`. Consulte o [guia oficial de empacotamento e instalação](https://deepseek-harness.github.io/deepseek-harness/develop/basic/publish).
104
-
105
- ## 🛠 Uso
106
-
107
- Chame as ferramentas em qualquer sessão com o plugin montado:
108
-
109
- ```
110
- claude_scan # varredura completa (cache incremental)
111
- claude_scan { path: "~/.claude/projects/<slug>" } # varredura parcial
112
- claude_scan { refresh: true } # ignora o cache e varre tudo de novo
113
-
114
- import_claude { path: "~/.claude/projects/<slug>/<sessionId>.jsonl" } # uma sessão
115
- import_claude { path: "~/.claude/projects" } # diretório (recursivo)
116
- import_claude { path: "all" } # tudo
117
- # Pode rodar de novo quando quiser: arquivos sem mudanças são pulados e transcrições que cresceram anexam apenas os novos turnos.
118
- import_claude { path: "...", force: true } # nova cópia completa como import-<src>-<n> (a cópia anterior é mantida)
119
- ```
120
-
121
- Comandos (disparados pelo usuário, sem turno do modelo):
122
-
123
- ```
124
- /claude-import-all # um passo: varrer importar tudo relatório injetar na sessão atual
125
- /resume-claude latest # continuar a sessão do Claude mais recente
126
- /resume-claude <sessionId> # pelo id de sessão de origem ou id import-<src>
127
- /resume-claude <palavra-chave> # busca títulos; múltiplos resultados são listados, nunca adivinhados
128
- /claude-move-reset # reinicia a cache do plugin (marcadores + mapa de importação); sessões importadas são mantidas
129
- ```
130
-
131
- Painel web: o botão flutuante **🐳 Claude 迁移** (canto inferior direito) abre o painel — árvore de projetos/sessões com selos de estado (não importado / importado / importado-com-turnos-novos / origem ausente / diretório inexistente / git sujo), filtro por palavra-chave, paginação, «Importar e continuar» + «Abrir sessão» + «Atualizar lista de sessões» por sessão, importação em lote com barra de progresso e cancelamento, e botão de reinício de cache. Os textos seguem o idioma do navegador (zh/en). Usa as rotas JSON `/api/claude-move/*` do próprio plugin, registradas no seam público `ctx.webServer`.
132
-
133
- - **Varredura**: retorna um índice JSON estruturado: projetos (slug/cwd/existência do diretório/branch do git e arquivos modificados), sessões (título/marcas de tempo/contagens/linhas malformadas), memórias, habilidades, CLAUDE.md global e settings.json; cada sessão carrega `import.status` (`none`/`imported`/`source-missing`) e `import.updatesPending` quando há turnos novos não sincronizados. `settingsSuggestions` contém a tradução do settings.json para o DSH e as chaves não mapeáveis (ver [COMPLIANCE.md](COMPLIANCE.md)).
134
- - **Importação**: mapeia mensagens user/assistant/tool/thinking com fidelidade total; chamadas de ferramenta interrompidas são reparadas (exatamente um resultado por `tool_use`), e o resultado é uma sessão equilibrada e retomável, vinculada ao workspace `claudecode` (padrão) ou ao workspace por projeto. Lotes são resumidos arquivo por arquivo (`imported`/`appended`/`already-imported`/`skipped`/`failed`), linhas malformadas carregam número de linha, segredos suspeitos são informados apenas por posição (arquivo:linha:tipo) e registros de permissão são contados, nunca importados. Importar nunca apaga nem reescreve nada: sessões existentes do DSH ficam intactas, cópias importadas anteriormente são mantidas e os arquivos fonte do Claude nunca são gravados.
135
- - **O contexto pessoal entra em vigor automaticamente** (sem ação de importação):
136
- - Memórias: `projects/*/memory/*.md` são injetados como seção dinâmica, relidos a cada requisição (memórias novas valem na hora), ordenados `feedback > project > reference > user`, limite de 8 KiB por padrão. Com `memoryScope: current-project` (padrão) só as memórias do projeto da sessão atual são injetadas (recai em todos os projetos quando o cwd não corresponde a nenhum); `all` injeta tudo com o projeto atual primeiro. Dentro do workspace `claudecode`, o plugin resolve o projeto original a partir do `sourceCwd` registrado.
137
- - Habilidades: `~/.claude/skills/**/SKILL.md` (mais arquivos planos `*.md`) e `.claude/skills/**` do projeto atual viram habilidades do DSH (nomes normalizados para kebab-case, colisões com sufixo, máximo 30; `README.md`/`MEMORY.md` e arquivos sem descrição são ignorados, para que nunca quebrem o carregamento de habilidades); o DSH cuida do catálogo e da ferramenta `skill`.
138
- - Instruções: o `~/.claude/CLAUDE.md` global mais o `.claude/CLAUDE.md` da sessão atual são injetados como uma seção inicial (o projeto vence; resolvido via `sourceCwd` dentro do workspace `claudecode`).
139
-
140
- ## ✅ Depois de importar
141
-
142
- **Não é preciso reiniciar o DSH.** As importações são gravadas de forma durável pelo serviço público `sessionPersistence` assim que terminam:
143
-
144
- - As listas do servidor (`session.list` / `workspace.list`, a CLI ou qualquer página recém-aberta) mostram imediatamente as sessões importadas sob o workspace **`claudecode`** (um por projeto com `workspaceMode: 'per-project'`).
145
- - O painel atualiza sozinho a lista de sessões da página já aberta (serviços de cliente do shell `sessions`/`workspaces`, detectados por capacidade) e oferece «Abrir sessão» por sessão importada; em shells antigos sem esses serviços recai no botão «Atualizar lista de sessões» / recarga da página as importações gravam sessões frias direto no serviço de persistência, então não emitem o frame ao vivo `host/session-added`; os grupos de workspaces, porém, atualizam ao vivo (`host/workspace-changed`).
146
- - As sessões importadas podem ser abertas, lidas e retomadas na hora — `/resume-claude`, ou clique na sessão da lista. O handoff informa o diretório original do projeto. Reexecutar a importação a qualquer momento apenas anexa os novos turnos às mesmas sessões.
147
-
148
- ## ⚙️ Configuração
149
-
150
- Tudo opcional e substituível no `cordis.yml`:
151
-
152
- ```yaml
153
- - id: claude-move
154
- name: dsh-claude-move
155
- config:
156
- claudeHome: null # padrão: $CLAUDE_CONFIG_DIR ou ~/.claude
157
- workspaceMode: claudecode # 'claudecode' (padrão: um workspace dedicado para todas as importações) | 'per-project' (um workspace por cwd de origem)
158
- claudecodeDir: null # pasta do workspace claudecode; padrão $DSH_HOME/claudecode (a única pasta que o plugin cria)
159
- scanGit: true # nível de sondagem git: true completo | 'branch' sem subprocessos | false
160
- gitTimeoutMs: 5000 # tempo limite do subprocesso git
161
- scanConcurrency: 8 # limite de concorrência da varredura de projetos
162
- maxTranscriptBytes: 67108864
163
- excludeProjects: [] # substrings de slug a ignorar, ex. ['demo-']
164
- enableMemory: true
165
- memoryMaxBytes: 8192
166
- memoryScope: current-project # 'current-project' o projeto atual | 'all' tudo, atual primeiro
167
- enableSkills: true
168
- maxSkills: 30
169
- extraSkillDirs: []
170
- enableInstructions: true
171
- resumeMaxChars: 2048 # limite de caracteres do resumo de transição
172
- resumeMode: inject # 'inject' resumo de transição | 'agents' ctx.agents.resume
173
- enableWebPanel: true # registrar as rotas do painel /api/claude-move/*
174
- importConcurrency: 4 # concorrência de leitura+conversão por lote (o salvamento segue sequencial)
175
- # Assistente de quatro fontes (0.2.1+):
176
- requireApproval: true # as escritas do assistente perguntam ao ctx.approval (apenas allowed-once)
177
- codexHome: null # por padrão: $CODEX_HOME ou ~/.codex
178
- opencodeDataHome: null # por padrão: diretório de dados XDG da plataforma/opencode
179
- opencodeConfigHome: null # por padrão: diretório de configuração XDG da plataforma/opencode
180
- hermesHome: null # por padrão: $HERMES_HOME ou ~/.hermes
181
- skillsDir: null # destino de skills do assistente; por padrão $DSH_HOME/skills
182
- agentsMdPath: null # destino de memórias/instruções; por padrão $DSH_HOME/AGENTS.md
183
- moveWorkspaceMode: per-source # 'per-source' | 'single' agrupamento de espaços de trabalho
184
- ```
185
-
186
- ## 🗑 Desinstalação
187
-
188
- Remova a linha `claude-move` dos bundles do perfil e reinicie o `dsh`. As sessões importadas permanecem no diretório de dados do DSH; o plugin apenas escreve seu cache (`$DSH_HOME/claude-move/`) e a pasta do workspace `claudecode`, e nunca toca os dados fonte do Claude.
189
-
190
- ## 🧭 Compatibilidade
191
-
192
- - Alvo: `dsh 0.1.0-rc.6` (perfil web); dependências peer fixadas em `0.1.0-rc.6`. Node `^22.19 || >=24`.
193
- - Última verificação **2026-08-13** no Windows (Node 22) contra `@deepseek-ai/dsh@0.1.0-rc.6`: instalação do zero via tarball, varredura real (40 projetos / 2387 sessões), importação real em lote 13/13 com reimportação idempotente 13/13, vínculo ao workspace e artefatos de persistência confirmados. macOS/Linux cobertos pela matriz CI (linux/macos/windows × Node 22).
194
- - Verificado **2026-08-14** contra o checkout atual do `deepseek-harness` (perfil web, backend de sessões JSONL+zstd, registro de workspaces real) em um home isolado: boot web completo com o plugin montado, varredura + importação total pelas rotas do painel, criação do workspace `claudecode` com sessões vinculadas, anexo incremental a uma sessão importada existente (seq contíguo, carrega limpo), reimportação segura após reinício e sessões DSH preexistentes intactas o tempo todo. Nenhuma sessão é jamais arquivada, apagada ou reescrita.
195
-
196
- ### Matriz de compatibilidade (apenas seams públicos)
197
-
198
- | Superfície | Uso | Fallback quando ausente |
199
- | --- | --- | --- |
200
- | Serviços host (`tools` / `sessionPersistence` / `workspaceRegistry` / `commands` / `systemPrompt` / `skills` / `webServer`) | usados onde listados | serviços opcionais registram-se reativamente via `internal/service`; `fs` ausente falha em voz alta |
201
- | `sessionPersistence.listSnapshots` / `readFrom`, `fs.streamText`, `ctx.jobs`, `ctx.agents.resume` | detectados por capacidade | `list()` / leitura completa com rejeição em voz alta / tabela de jobs própria / injeção do resumo |
202
- | Serviços de cliente do shell (`sessions.refresh/open`, `workspaces.refresh`) | detectados no apply do painel | recarga completa da página |
203
- | Novas capacidades da plataforma nunca são requisitos duros o plugin sempre inicia no rc.6. | | |
204
-
205
- ## 🔐 Permissões e dados
206
-
207
- - **Lê** `~/.claude` (transcrições, memórias, habilidades, CLAUDE.md, settings.json) estritamente somente leitura — e os diretórios de projeto para os quais importa (vínculo ao workspace no modo `per-project`).
208
- - **Escreve** os logs de sessão do DSH pelo serviço público `sessionPersistence` — apenas create + append, nunca apaga, reescreve ou arquiva sessões existentes — registros do registro de workspaces, seu próprio cache em `$DSH_HOME/claude-move/` (marcadores de varredura + mapa de importação), e a pasta do workspace `claudecode` (`$DSH_HOME/claudecode` por padrão; um simples `mkdir`, nunca qualquer exclusão).
209
- - **Nunca** modifica os arquivos fonte do Claude, toca dados de outros aplicativos nem acessa a rede.
210
- - **Nenhuma credencial** é lida ou transmitida; segredos suspeitos nas transcrições são informados apenas por posição.
211
-
212
- ## 🛡 Limites de segurança
213
-
214
- - Arquivos fonte são estritamente somente leitura; logs de sessão do DSH são append-only (apenas `create` + `append`).
215
- - Transcrições externas são entrada não confiável: nada nelas é executado; conteúdo system/developer/thinking nunca entra no resumo de transição.
216
- - Sem mudanças no motor do DSH, pacotes oficiais de UI ou apiproxy apenas serviços públicos (`sessionPersistence` / `workspaceRegistry` / `tools` / `commands` / `systemPrompt` / `skills` / `webServer`).
217
- - Segredos suspeitos são informados apenas por localização (nunca seu conteúdo); registros `permission`/`permission-mode`/`queue-operation` são contados, não importados.
218
-
219
- ## 🩺 Solução de problemas
220
-
221
- - Linha sem efeito: `dsh --profile <p> --dump-config` deve imprimir `# == dsh-claude-move`; execute `dsh plugin --profile <p> add -w ...` novamente.
222
- - A web inicia mas trava em silêncio: perfis novos inicializados por `dsh plugin add` contêm apenas `dsh-base` adicione `@deepseek-ai/dsh-web-app` em `dsh.profile.bundles`. Instalar no perfil `web` existente não precisa de nada.
223
- - Rotas do painel 404: são servidas quando `enableWebPanel: true` e um servidor web está composto; verifique o log de boot por fibras FAILED.
224
- - A importação falha com "transcript 过大": aumente `maxTranscriptBytes` ou importe esse arquivo individualmente.
225
- - A importação teve sucesso mas a barra lateral não mostra a nova sessão: a página já estava aberta — clique uma vez em «Atualizar lista de sessões» do painel (ou recarregue a página). Nunca é preciso reiniciar o DSH.
226
- - Logs: falhas de boot são impressas no console do `dsh`; o plugin registra erros com o prefixo `[claude-move]` para problemas de workspace/mapa de importação.
227
-
228
- ## 📚 Documentação
229
-
230
- - [PLAN.md](PLAN.md) conclusões da pesquisa e plano de implementação.
231
- - [ARCHITECTURE.md](ARCHITECTURE.md)diagrama de arquitetura e tabela completa de mapeamento de dados.
232
- - [COMPLIANCE.md](COMPLIANCE.md) auditoria cláusula por cláusula frente às restrições oficiais de plugins (repo e docs do deepseek-harness, [deepseek.com/harness](https://www.deepseek.com/harness/), a [documentação de desenvolvimento](https://deepseek-harness.github.io/deepseek-harness/develop/basic/), [Cordis](https://github.com/cordiverse/cordis) e o [paper do Cordis](https://github.com/cordiverse/paper)).
233
- - [OPTIMIZATION.md](OPTIMIZATION.md) — linhas de base medidas e candidatos de otimização ordenados.
234
- - [RELEASE.md](RELEASE.md) — checklist de release com evidência de aceitação.
235
- - [CHANGELOG.md](CHANGELOG.md) — o que mudou em cada versão.
236
-
237
- ## 🙏 Atribuição (componentes open source)
238
-
239
- Este projeto está licenciado sob a Apache License 2.0; os seguintes componentes sob MIT conservam suas próprias licenças (texto completo em [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md)):
240
-
241
- - Núcleo de conversão vendored de [Nwflower/dsh-chat-import](https://github.com/Nwflower/dsh-chat-import) (MIT).
242
- - Convenções de descoberta e modelo de segurança de [Demogorgon314/dsh-resume-plugin](https://github.com/Demogorgon314/dsh-resume-plugin) (MIT; seu `session_reader.py` tem origem Apache-2.0 — ver [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md)).
243
- - Padrões de injeção de memory/skills e análise de frontmatter de [YYTbit/dsh-plugin-claude-bridge](https://github.com/YYTbit/dsh-plugin-claude-bridge) (MIT).
244
-
245
- ## 🧑‍💻 Desenvolvimento
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 + estendido), discovery, import/report, context, settings
250
- ```
251
-
252
- O CI roda a suíte completa no Node 22 via GitHub Actions ([test.yml](.github/workflows/test.yml)).
253
-
254
- ## 🧠 Model Experience
255
-
256
- - A superfície visível ao modelo são as descrições/esquemas das duas ferramentas e suas saídas: `claude_scan` devolve o índice estruturado, `import_claude` devolve resumos por arquivo com posições de avisos. Os resultados das ferramentas são eles próprios eventos `tool/result` registrados, então tudo é reconstruível.
257
- - Nenhum texto oculto visível ao modelo; as seções memory/CLAUDE.md ficam registradas em `ctx.systemPrompt` (montagem do prompt, reconstruível a partir do log de sessão).
258
-
259
- ## ⚠️ Limitações conhecidas
260
-
261
- - Títulos vêm de `custom-title`/`ai-title`/primeiro prompt; registros `summary` do Claude não são usados como títulos.
262
- - Blocos `thinking` são mantidos no log importado como conteúdo `reasoning`, mas nunca entram no resumo de transição.
263
- - Chamadas de ferramenta interrompidas são reparadas com um resultado de erro sintético (nunca descartadas), então sessões com interrupções no meio do turno continuam retomáveis — o reparo é reportado no resultado da importação (`repaired.synthesized`).
264
- - Registros de permissão são contados, não importados; sugestões de presets de permissão do DSH são geradas nos relatórios.
265
- - Transcrições maiores que `maxTranscriptBytes` são importadas por streaming em blocos quando o host oferece `fs.streamText` (memória O(bloco)); sem essa superfície falham em voz alta em vez de importação parcial (fidelidade primeiro).
266
- - Registros `summary` do Claude são informados, mas não mapeados para nós de compactação do DSH (ver OPTIMIZATION.md); o histórico completo é importado como turnos originais.
267
- - Em `workspaceMode: 'per-project'`, sessões cujo diretório de origem foi excluído ainda importam, mas o vínculo ao workspace falha (ficam sem grupo; `workspace.attached: false` mais um `reason` no relatório). O workspace `claudecode` padrão não depende do diretório de origem, então essas sessões se vinculam normalmente nele.
268
- - Importações em lote interrompidas podem ser reexecutadas com segurança (idempotente, append-only): arquivos concluídos são pulados e os que cresceram anexam apenas os novos turnos.
269
- - Se uma transcrição foi truncada ou reiniciada no lugar (menos turnos que a importação registrada), a reimportação a pula e reporta `sourceShrunk`; use `force: true` para uma cópia completa nova.
270
- - O painel web é um painel flutuante sem build, dirigido pelas rotas JSON do próprio plugin; não usa o sistema interno de slots de UI do shell (mantido independente dos internals não documentados do rc.6).
271
-
272
- ## 🤝 Contribuir e dar feedback
273
-
274
- Issues e pull requests são bem-vindos — use os modelos fornecidos ([relato de bug](.github/ISSUE_TEMPLATE/bug-report.yml), [solicitação de recurso](.github/ISSUE_TEMPLATE/feature-request.yml)). Perguntas e discussões ficam nas [GitHub Discussions](https://github.com/PerryLink/dsh-claude-move/discussions) do repo. Reporte problemas de segurança em particular via GitHub Security Advisories (repo Settings → Security; veja [SECURITY.md](SECURITY.md)).
275
-
276
- ## 💛 Colaboradores
277
-
278
- Obrigado a todos que ajudaram a melhorar este plugin:
279
-
280
- - [OLDnana1](https://github.com/OLDnana1) análise da causa raiz da corrupção por chamadas de ferramenta interrompidas, que fazia as sessões importadas retornarem HTTP 400 permanentemente ao retomar ([#1](https://github.com/PerryLink/dsh-claude-move/issues/1)); corrigido na v0.2.0.
281
- - [GooodWei](https://github.com/GooodWei) identificou que `README.md` (e qualquer `.md` sem descrição) era registrado erroneamente como skill, quebrando todo o carregamento de skills do DSH ([#1](https://github.com/PerryLink/dsh-claude-move/issues/1)); corrigido na v0.2.0.
282
- - Os projetos MIT upstream reutilizados por este plugin são creditados em [Atribuição](#-attribution-open-source-components) e em [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md).
283
-
284
- ## 🔗 Links relacionados
285
-
286
- - DeepSeek Harness: [repo](https://github.com/deepseek-ai/deepseek-harness) · [site](https://www.deepseek.com/harness/) · [documentação de desenvolvimento](https://deepseek-harness.github.io/deepseek-harness/develop/basic/)
287
- - Ecossistema de plugins: [tópico `dsh`](https://github.com/topics/dsh) · [tópico `dsh-plugin`](https://github.com/topics/dsh-plugin) · [Discord](https://discord.gg/Ycq5dCaS4)
288
-
289
- ## 📄 Licença
290
-
291
- Apache License 2.0 — ver [LICENSE](LICENSE) e [NOTICE](NOTICE). Avisos de terceiros (incluindo o texto MIT dos componentes MIT) em [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md).
1
+ <div align="center">
2
+
3
+ # 🚚 dsh-claude-move
4
+
5
+ **Migre Claude Code, Codex, OpenCode e Hermes para o DeepSeek Harness copie sessões, memórias, habilidades, instruções e comandos de barra como sessões DSH retomáveis, somente-cópia e com aprovação.**
6
+
7
+ *Mantenha seu histórico do Claude Code ao migrar: uma única instalação, sessões retomáveis, sincronização em tempo real com um Claude Code em execução e um assistente de migração de quatro fontes.*
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
+ ## Compatibilidade
24
+
25
+ - Direcionado a `dsh 0.1.0-rc.6` (perfil web); peer dependencies fixadas em `0.1.0-rc.6`. Node `^22.19 || >=24`.
26
+ - Última verificação contra uma instalação nova de tarball: varredura real, importação em lote real (reimportação idempotente), anexo ao workspace e artefatos de persistência confirmados; macOS/Linux cobertos pela matriz de CI.
27
+
28
+ ### Matriz de compatibilidade (somente costuras públicas)
29
+
30
+ | Superfície | Uso | Fallback quando ausente |
31
+ |---|---|---|
32
+ | Serviços de host (`tools` / `sessionPersistence` / `workspaceRegistry` / `commands` / `systemPrompt` / `skills` / `webServer`) | obrigatório onde listado | serviços opcionais registram reativamente; `fs` ausente falha em voz alta |
33
+ | `sessionPersistence.listSnapshots` / `readFrom` / `fs` com capacidade `streamText` / `ctx.jobs` / `ctx.agents.resume` | detectado por recurso | `list()` / leitura de arquivo inteiro com rejeição em voz alta / mapa de jobs próprio / injeção de handoff |
34
+ | Serviços de shell do cliente (`sessions.refresh/open`, `workspaces.refresh`) | detectado por recurso ao aplicar o painel | recarga completa da página |
35
+ | Capacidades de plataforma mais novas nunca são requisitos rígidos — o plugin continua inicializável no rc.6. | | |
36
+
37
+ ## O que você recebe
38
+
39
+ 1. **Auto-descoberta** — `claude_scan` localiza a raiz de dados do Claude (`$CLAUDE_CONFIG_DIR`, fallback `~/.claude`) e indexa cada projeto/sessão, memória, habilidade, `CLAUDE.md` global e `settings.json`, com cache incremental e varredura paralela (`scanConcurrency`).
40
+ 2. **Importação de fidelidade total** — `import_claude` converte transcrições em sessões DSH balanceadas e retomáveis (`turn/start → step/start → user/message → assistant/message → tool/call → tool/result → step/end → turn/end`), repara chamadas de ferramenta interrompidas e importa por streaming em blocos transcrições maiores que `maxTranscriptBytes`.
41
+ 3. **Um único workspace `claudecode`** — cada sessão importada cai em um workspace dedicado (padrão `$DSH_HOME/claudecode`); `workspaceMode: 'per-project'` restaura o agrupamento de um workspace por projeto.
42
+ 4. **Somente-cópia e incremental** — nada é movido, reescrito ou excluído em nenhum dos lados; reexecutar apenas anexa os turnos novos (`force: true` salva uma cópia completa extra sob um novo id).
43
+ 5. **Contexto pessoal, sempre atualizado** — memórias injetadas como uma seção de prompt em tempo real, habilidades do Claude registradas como habilidades DSH reais (globais + de projeto), e o `CLAUDE.md` global + de projeto injetado cedo.
44
+ 6. **Assistente de migração de quatro fontes** `/move` mais `move_detect` / `move_preview` / `move_run` migram Claude Code, Codex, OpenCode e Hermes, com aprovação e idempotência (`move.json`).
45
+ 7. **Painel web e comandos** — `/claude-import-all`, `/resume-claude`, `/claude-move-reset` e um painel de migração flutuante.
46
+
47
+ ## Assistente de migração de quatro fontes
48
+
49
+ ```text
50
+ /move # assistente de um só passo: detectar → pré-visualizar → executar → relatar (as quatro fontes)
51
+ move_detect # varre Claude Code / Codex / OpenCode / Hermes
52
+ move_preview # plano por item: new | unchanged | changed | conflict (com diff) | unsupported
53
+ move_run # executa atrás da porta de aprovação; resolução de conflitos:
54
+ # skip | overwrite | rename | merge (padrão skip — nunca adivinha)
55
+ ```
56
+
57
+ - **Fontes** Claude Code (`~/.claude`), Codex (`~/.codex`), OpenCode (raízes de dados + config), Hermes (raízes de skills/memória); cada fonte tem seu próprio parser + mapper.
58
+ - **Mapeamento** — memórias/instruções → seções gerenciadas somente-anexáveis no `AGENTS.md` global do DSH (uma seção marcada por item); skills → skills DSH reais (pacotes `SKILL.md` copiados tal e qual, outros formatos convertidos); comandos de barra → comandos DSH registrados (reconstruídos a partir de `move.json` após reiniciar); sessões → sessões DSH retomáveis (os mesmos importadores da fase 1).
59
+ - **Idempotente** — cada plano aplicado é registrado em `$DSH_HOME/claude-move/move.json` (`digest` / `targetDigest` / `appliedAt`); reexecuções pulam itens inalterados e `force` os reaplica.
60
+ - **Com aprovação** uma execução que escreveria algo pergunta primeiro a `ctx.approval`; qualquer coisa diferente de `allowed-once` significa zero escritas.
61
+
62
+ ## Início rápido
63
+
64
+ ```sh
65
+ # 1. instale o bundle no seu perfil
66
+ dsh plugin --profile web add "github:PerryLink/dsh-claude-move#master"
67
+
68
+ # ou pelo npm (versões publicadas)
69
+ dsh plugin --profile web add dsh-claude-move
70
+
71
+ # 2. reinicie e verifique a linha
72
+ dsh --profile web --dump-config | grep -A4 'id: claude-move'
73
+ ```
74
+
75
+ Depois, em qualquer sessão DSH, execute um comando:
76
+
77
+ ```sh
78
+ /claude-import-all # varre copia cada sessão do Claude relata
79
+ ```
80
+
81
+ Não é preciso reiniciar o DSH após importar atualize a página web aberta uma vez e clique em qualquer sessão importada para continuar.
82
+
83
+ ## Instalar e desinstalar
84
+
85
+ - **Canal git** (último `master`): `dsh plugin --profile web add "github:PerryLink/dsh-claude-move#master"` ESM puro, sem etapa de `prepare` nem `allowBuilds`.
86
+ - **Canal npm** (versões publicadas): `dsh plugin --profile web add dsh-claude-move`.
87
+ - **Canal tarball**: `npm pack` neste repo e depois `dsh plugin --profile web add ./dsh-claude-move-<version>.tgz`.
88
+ - **Desinstalar**: remova a linha `claude-move` dos bundles do perfil e reinicie o `dsh`. As sessões importadas permanecem no diretório de dados do DSH; o plugin grava seu cache (`$DSH_HOME/claude-move/`) e a pasta do workspace `claudecode`, e nunca toca nos dados fonte do Claude.
89
+
90
+ ## O que é migrado
91
+
92
+ ```
93
+ ~/.claude (somente leitura)
94
+ ├─ projects/*/*.jsonl ──→ sessões DSH retomáveis, agrupadas em um workspace "claudecode" (padrão)
95
+ ├─ projects/*/memory/ ──→ seção de memória do system-prompt em tempo real (relida por requisição)
96
+ ├─ skills/** ──→ skills DSH reais
97
+ └─ CLAUDE.md + settings ──→ seção de prompt inicial + sugestões de configuração (nunca auto-aplicadas)
98
+ ```
99
+
100
+ | No Claude Code | Chega ao DSH como |
101
+ |---|---|
102
+ | Transcrições de sessão (`projects/*/*.jsonl`) | Sessões DSH balanceadas e retomáveis — mapeamento de fidelidade total de `user`/`assistant`/`tool`/`thinking` com reparo de chamadas de ferramenta interrompidas — agrupadas em um workspace **`claudecode`** ou uma por projeto |
103
+ | Arquivos de memória (`projects/*/memory/*.md`) | Uma seção de contexto do system-prompt em tempo real, relida a cada requisição (`feedback > project > reference > user`) |
104
+ | Skills (`~/.claude/skills/**`) | Skills DSH reais (nomes kebab-case, sufixos de colisão, máximo 30 por padrão; `README.md`/`MEMORY.md` e arquivos sem descrição são pulados) |
105
+ | `CLAUDE.md` (global + por projeto) | Uma seção de prompt inicial; o arquivo do projeto vence |
106
+ | `settings.json` | Sugestões de configuração DSH com uma lista explícita de chaves não mapeáveis |
107
+ | Estado do projeto (diretório, branch git e contagem de sujeira) | Mostrado no índice de varredura, nos selos do painel web e no handoff de `/resume-claude` |
108
+
109
+ ## Uso
110
+
111
+ Chame as ferramentas em qualquer sessão com o plugin montado:
112
+
113
+ ```
114
+ claude_scan # varredura completa (cache incremental)
115
+ claude_scan { path: "~/.claude/projects/<slug>" } # varredura parcial
116
+ claude_scan { refresh: true } # pula o cache, revê tudo
117
+ claude_scan { projectsLimit: 10, sessionsLimit: 5, fields: "brief" } # reduz a saída
118
+
119
+ import_claude { path: "~/.claude/projects/<slug>/<sessionId>.jsonl" } # uma sessão
120
+ import_claude { path: "~/.claude/projects" } # diretório (recursivo)
121
+ import_claude { path: "all" } # tudo
122
+ # Reexecute a qualquer momento: arquivos inalterados são pulados, transcrições crescidas anexam apenas os turnos novos.
123
+ # Arquivos acima de maxTranscriptBytes são importados por streaming em blocos (sem teto de memória).
124
+ import_claude { path: "...", force: true } # cópia completa nova (cópia anterior mantida)
125
+ ```
126
+
127
+ Comandos (acionados pelo usuário, sem turno do modelo):
128
+
129
+ ```
130
+ /claude-import-all # um só passo: varre → importa tudo → relata → injeta na sessão atual
131
+ /resume-claude latest # continua a sessão do Claude mais recente
132
+ /resume-claude <sessionId> # por id de sessão fonte ou id import-<src>
133
+ /resume-claude <keyword> # corresponde a títulos; múltiplas correspondências são listadas, nunca adivinhadas
134
+ /claude-move-reset # reinicia o cache do plugin (marcadores + mapa de importação); sessões importadas são mantidas
135
+ ```
136
+
137
+ Painel web: um painel de migração flutuante com a árvore de projetos/sessões, selos de status (não importado / importado / importado-com-turnos-novos / fonte ausente / diretório ausente / git sujo), filtro por palavra-chave, renderização paginada, "Importar e continuar" + "Abrir sessão" + "Atualizar lista de sessões" por sessão, importação em lote com barra de progresso em tempo real e cancelar, e um botão de reinício de cache. Os textos seguem o idioma do navegador (zh/en). Servido pelas rotas JSON `/api/claude-move/*` próprias do plugin na costura pública `ctx.webServer`.
138
+
139
+ ## Depois de importar
140
+
141
+ **Você não precisa reiniciar o DSH.** As importações chegam de forma durável pelo serviço público `sessionPersistence` no momento em que são concluídas:
142
+
143
+ - As listas do lado do servidor (RPCs `session.list` / `workspace.list`, a CLI, qualquer novo carregamento de página) mostram as sessões importadas sob o workspace **`claudecode`** imediatamente.
144
+ - O painel atualiza sozinho a lista de sessões da página aberta e oferece um botão **Abrir sessão** por sessão importada.
145
+ - As sessões importadas podem ser abertas, lidas e retomadas de imediato `/resume-claude`, ou clique na sessão na lista. Reexecutar a importação a qualquer momento sincroniza apenas os turnos novos nas mesmas sessões.
146
+
147
+ ## Configuração
148
+
149
+ Tudo opcional, anulável no cordis.yml.
150
+
151
+ | Chave | Padrão | Significado |
152
+ |---|---|---|
153
+ | `claudeHome` | `$CLAUDE_CONFIG_DIR` ou `~/.claude` | Raiz de dados do Claude |
154
+ | `workspaceMode` | `claudecode` | `claudecode` (um workspace dedicado) · `per-project` (um workspace por cwd fonte) |
155
+ | `claudecodeDir` | `$DSH_HOME/claudecode` | A pasta do workspace `claudecode` (a única pasta que o plugin cria) |
156
+ | `scanGit` | `true` | Nível de sondagem do git: `true` (completo) · `'branch'` (zero chamadas git) · `false` |
157
+ | `gitTimeoutMs` | `5000` | Timeout do subprocesso git |
158
+ | `scanConcurrency` | `8` | Limite de varredura paralela de projetos |
159
+ | `maxTranscriptBytes` | `67108864` | Limiar de importação por streaming (em blocos acima) |
160
+ | `excludeProjects` | `[]` | Substrings de slug a pular |
161
+ | `enableMemory` | `true` | Injeta memórias como seção de prompt em tempo real |
162
+ | `memoryMaxBytes` | `8192` | Limite da seção de memória |
163
+ | `memoryScope` | `current-project` | `current-project` · `all` (projeto atual primeiro) |
164
+ | `enableSkills` | `true` | Registra habilidades do Claude como habilidades DSH |
165
+ | `maxSkills` | `30` | Limite de quantidade de habilidades |
166
+ | `extraSkillDirs` | `[]` | Diretórios de habilidades extras |
167
+ | `enableInstructions` | `true` | Injeta `CLAUDE.md` global + de projeto |
168
+ | `resumeMaxChars` | `2048` | Limite de caracteres do resumo de handoff |
169
+ | `resumeMode` | `inject` | `inject` (resumo de handoff) · `agents` (ctx.agents.resume) |
170
+ | `enableWebPanel` | `true` | Registra as rotas do painel `/api/claude-move/*` |
171
+ | `importConcurrency` | `4` | Leitura + conversão em paralelo por lote |
172
+ | `requireApproval` | `true` | Escritas do assistente pedem `ctx.approval` (somente allowed-once) |
173
+ | `codexHome` | `$CODEX_HOME` ou `~/.codex` | Raiz de dados do Codex |
174
+ | `opencodeDataHome` | dir de dados XDG da plataforma/opencode | Raiz de dados do OpenCode |
175
+ | `opencodeConfigHome` | dir de config XDG da plataforma/opencode | Raiz de config do OpenCode |
176
+ | `hermesHome` | `$HERMES_HOME` ou `~/.hermes` | Raiz de dados do Hermes |
177
+ | `skillsDir` | `$DSH_HOME/skills` | Destino de skills do assistente |
178
+ | `agentsMdPath` | `$DSH_HOME/AGENTS.md` | Destino de memória/instruções do assistente |
179
+ | `moveWorkspaceMode` | `per-source` | Agrupamento de workspace para importações do assistente: `per-source` · `single` |
180
+
181
+ ## Ferramentas e superfícies
182
+
183
+ | Superfície | Tipo | Notas |
184
+ |---|---|---|
185
+ | `claude_scan` | ferramenta | Índice estruturado de projetos/sessões/memórias/habilidades/ajustes |
186
+ | `import_claude` | ferramenta | Importa uma sessão, um diretório ou `all` (incremental; `force` para cópia nova) |
187
+ | `move_detect` / `move_preview` / `move_run` | ferramentas | Assistente de quatro fontes: varrer, plano por item com diffs, executar após aprovação |
188
+ | `/claude-import-all` | comando | Varre importa tudo relata |
189
+ | `/resume-claude` | comando | Continua uma sessão do Claude (latest, id ou palavra-chave) |
190
+ | `/claude-move-reset` | comando | Reinicia o cache do plugin (sessões importadas mantidas) |
191
+ | `/move` | comando | Assistente de quatro fontes de um só passo |
192
+ | Painel web de migração | cliente | Painel flutuante com progresso, cancelamento, paginação, abrir sessão |
193
+
194
+ ## Permissões e dados
195
+
196
+ - **Permissões**: o manifesto do workshop declara `filesystem:read` e `filesystem:write`.
197
+ - **Lê** `~/.claude` (transcrições, memórias, habilidades, `CLAUDE.md`, `settings.json`) — estritamente somente leitura — e os diretórios de projeto para os quais importa.
198
+ - **Grava** logs de sessão DSH via o serviço público `sessionPersistence` (somente create + append, nunca exclui/reescreve/arquiva), registros do workspace-registry, seu cache sob `$DSH_HOME/claude-move/` e a pasta do workspace `claudecode`.
199
+ - **Nunca** modifica arquivos fonte do Claude, toca dados de outros aplicativos nem acessa a rede. **Nenhuma** credencial é lida ou transmitida.
200
+
201
+ ## Limites de segurança
202
+
203
+ - **Arquivos fonte são somente leitura; logs DSH são somente-append** (somente `create` + `append`).
204
+ - **Transcrições externas são entrada não confiável** — nada nelas é executado; conteúdo system/developer/thinking nunca entra no handoff de retomada.
205
+ - **Somente serviços públicos** — `sessionPersistence` / `workspaceRegistry` / `tools` / `commands` / `systemPrompt` / `skills` / `webServer`; sem mudanças no motor ou na UI.
206
+ - **Segredos relatados apenas por posição** (file:line:kind); registros `permission`/`permission-mode`/`queue-operation` são contados, não importados.
207
+ - **Escritas do assistente com aprovação**qualquer coisa diferente de `allowed-once` significa zero escritas.
208
+
209
+ ## Limitações conhecidas
210
+
211
+ - Títulos vêm de `custom-title`/`ai-title`/primeiro prompt; registros `summary` do Claude são relatados mas não mapeados para nós de compactação DSH (sintetizar uma transação de compactação válida fabricaria seu intervalo de seq e sua mensagem de checkpoint).
212
+ - Blocos `thinking` são mantidos como conteúdo `reasoning`, mas nunca entram no handoff de retomada.
213
+ - Chamadas de ferramenta interrompidas são reparadas com um resultado de erro sintético (nunca descartadas), relatado como `repaired.synthesized`.
214
+ - Registros da classe de permissões são contados, não importados; sugestões de permissões predefinidas DSH são geradas nos relatórios.
215
+ - Em hosts sem uma superfície de streaming `fs.streamText`, transcrições maiores que `maxTranscriptBytes` falham em voz alta em vez de importar parcialmente.
216
+ - Em `workspaceMode: 'per-project'`, sessões cujo diretório fonte foi excluído ainda importam, mas o anexo ao workspace falha (ficam desagrupadas; `workspace.attached: false` mais um `reason`). O workspace `claudecode` padrão não depende do diretório fonte.
217
+ - Se uma transcrição foi truncada ou reiniciada no lugar (menos turnos que a importação registrada), a reimportação a pula e relata `sourceShrunk`; use `force: true` para uma cópia completa nova.
218
+ - O painel web é um painel flutuante sem build dirigido pelas próprias rotas JSON do plugin; ele não usa o sistema de slots de UI interno do shell.
219
+
220
+ ## Experiência do modelo
221
+
222
+ - A superfície visível ao modelo são as descrições/esquemas das duas ferramentas e suas saídas: `claude_scan` retorna o índice estruturado, `import_claude` retorna resumos por arquivo com posições dos avisos. Os resultados das ferramentas são eles próprios registrados como eventos `tool/result`, de modo que tudo é reconstruível.
223
+ - Nenhum texto oculto visível ao modelo; as seções de memória/`CLAUDE.md` são registradas em `ctx.systemPrompt` (montagem de prompt, reconstruível a partir do log de sessão).
224
+
225
+ ## Solução de problemas
226
+
227
+ - Linha sem efeito: `dsh --profile <p> --dump-config` deve imprimir `# == dsh-claude-move`; reexecute `dsh plugin --profile <p> add ...`.
228
+ - A web inicializa mas trava em silêncio: perfis novos inicializados por `dsh plugin add` contêm apenas `dsh-base` — adicione `@deepseek-ai/dsh-web-app` a `dsh.profile.bundles`. Instalar no perfil `web` existente não precisa de nada.
229
+ - Rotas do painel 404: elas são servidas apenas quando `enableWebPanel: true` e um servidor web está composto; verifique o log de inicialização em busca de fibers FAILED.
230
+ - A importação falha com "transcript 过大": aumente `maxTranscriptBytes` ou importe esse arquivo individualmente.
231
+ - A importação teve sucesso, mas a barra lateral não mostra nenhuma sessão nova: a página já estava aberta clique uma vez no botão de atualizar do painel (ou recarregue a página). Nunca é preciso reiniciar o DSH.
232
+ - Logs: falhas de inicialização são impressas no console do `dsh`; o plugin registra erros com prefixo `[claude-move]` para problemas de workspace/mapa de importação.
233
+
234
+ ## Atribuição (componentes de código aberto)
235
+
236
+ Este projeto está licenciado sob a Apache License 2.0; os seguintes componentes licenciados sob MIT mantêm suas próprias licenças (texto completo em [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md)):
237
+
238
+ - Núcleo de conversão vendored de [Nwflower/dsh-chat-import](https://github.com/Nwflower/dsh-chat-import) (MIT).
239
+ - Convenções de descoberta e modelo de segurança de [Demogorgon314/dsh-resume-plugin](https://github.com/Demogorgon314/dsh-resume-plugin) (MIT).
240
+ - Padrões de injeção de memória/skills e análise de frontmatter de [YYTbit/dsh-plugin-claude-bridge](https://github.com/YYTbit/dsh-plugin-claude-bridge) (MIT).
241
+
242
+ ## Desenvolvimento
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
+ A CI executa a suíte completa no Node 22 em Linux/macOS/Windows via GitHub Actions ([test.yml](.github/workflows/test.yml)).
250
+
251
+ ## Tópicos
252
+
253
+ `deepseek-harness`, `dsh-plugin`, `claude-code`, `migration`, `session-import`, `resume`
254
+
255
+ ## Contribuidores
256
+
257
+ - [@PerryLink](https://github.com/PerryLink) criador e mantenedor: o pipeline de importação, o assistente de migração de quatro fontes, o painel web, a documentação, CI/CD e releases.
258
+ - [@OLDnana1](https://github.com/OLDnana1) — análise de causa raiz da corrupção de chamadas de ferramenta interrompidas que fazia as sessões importadas retornarem permanentemente HTTP 400 ao retomar.
259
+ - [@GooodWei](https://github.com/GooodWei) identificou que `README.md` (e qualquer `.md` sem descrição) era registrado incorretamente como habilidade, o que quebrava o carregamento de habilidades do DSH.
260
+
261
+ ## Família de Plugins DSH PerryLink
262
+
263
+ Este projeto é um dos plugins do DeepSeek Harness mantidos por [PerryLink](https://github.com/PerryLink). Se este lhe ajuda, os outros provavelmente também ajudarão:
264
+
265
+ | Plugin | Uma linha |
266
+ |---|---|
267
+ | [dsh-mcp-panel](https://github.com/PerryLink/dsh-mcp-panel) | Painel de runtime MCP somente leitura: comando /mcp + aba Settings com status, ferramentas e erros |
268
+ | [dsh-doublecheck](https://github.com/PerryLink/dsh-doublecheck) | Guarda de disciplina de engenharia: sabatina de requisitos, portões de teste, revisão de adversário |
269
+ | [dsh-background-agents](https://github.com/PerryLink/dsh-background-agents) | Agentes filhos em segundo plano duráveis com uma barra lateral de Web UI, mensagens e interrupção |
270
+ | [dsh-lsp-actions](https://github.com/PerryLink/dsh-lsp-actions) | Diagnósticos LSP, formatação, completação, ações de código e renomeação sobre language servers |
271
+ | [dsh-output-styles](https://github.com/PerryLink/dsh-output-styles) | Troca de estilo em runtime equivalente a outputStyles do Claude Code |
272
+ | [dsh-checkpoint-rewind](https://github.com/PerryLink/dsh-checkpoint-rewind) | Equivalente a /rewind do Claude Code: snapshots, forks de sessão, restauração de um só passo |
273
+ | [dsh-permission-rules](https://github.com/PerryLink/dsh-permission-rules) | Regras de permissão declarativas allow/deny/ask estilo Claude Code com auditoria |
274
+ | [dsh-auto-review](https://github.com/PerryLink/dsh-auto-review) | Auto-revisão de segundo modelo na cadeia de aprovação, fail-closed por padrão |
275
+ | [dsh-memento](https://github.com/PerryLink/dsh-memento) | Memória entre sessões com aprovação: costura ctx.memory + SQLite + ferramenta de memória |
276
+ | [dsh-skill-pack-security](https://github.com/PerryLink/dsh-skill-pack-security) | Pacote de skills de auditoria de segurança: varredura de segredos, revisão de dependências e cadeia de suprimentos |
277
+ | [dsh-session-pin](https://github.com/PerryLink/dsh-session-pin) | Fixa sessões na barra lateral web com ordenação durável |
278
+ | [dsh-composer-history](https://github.com/PerryLink/dsh-composer-history) | Histórico de entrada estilo terminal para o composer web: setas, busca Ctrl+R |
279
+ | [dsh-github](https://github.com/PerryLink/dsh-github) | Integração de PR/issues do GitHub para DSH, cada escrita gated por aprovação |
280
+ | [dsh-plugin-guide](https://github.com/PerryLink/dsh-plugin-guide) | Base de conhecimento de desenvolvimento de plugins como skill de agente sob demanda |
281
+ | **[dsh-claude-move](https://github.com/PerryLink/dsh-claude-move)** | Migra sessões, memória, skills e CLAUDE.md do Claude Code para o DSH |
282
+
283
+ ## Licença
284
+
285
+ [Apache License 2.0](LICENSE) © 2026 dsh-claude-move contributors