⬆️ dsh-plugin-upgrade

September 22, 2026 · View on GitHub

⬆️ dsh-plugin-upgrade

  • Canal da loja 1024: rode npm i -g dsh1024 uma vez e depois dsh1024 plugin --profile web add dsh-plugin-upgrade (conta para o ranking de instalações do deepseek1024.com). Gitee

Habilidade de atualização de plugins para o DeepSeek Harness — um pacote, um índice de corredores, dois corredores fechados: 0.1.3-alpha.10.1.5-rc.1 (legAB) e 0.1.5-rc.20.1.6-alpha.2 (legC).

O scanner se encaminha sozinho: lê a faixa dsh declarada pelo repositório alvo (ou aceita --span) e então aplica o catálogo próprio daquele corredor, vinculado a evidências — as 20 costuras do legAB (perna A 0.1.3-alpha.10.1.5-alpha.1 mais perna B 0.1.5-alpha.10.1.5-rc.1) ou as 5 costuras do legC (E1E5). Um único ponto de entrada, para que uma metade de cliente que parou de montar em silêncio nunca seja confundida com «typecheck verde».

Repositório oficial. Este é o único repositório oficial de dsh-plugin-upgrade, mantido pela PerryLink. Ele substitui os dois pacotes retirados com versão travada dsh-plugin-upgrade (perna A) e dsh-plugin-upgrade-rc1 (perna B), e é o pacote no qual o corredor 0.1.5-rc.20.1.6-alpha.2 (perna C) foi incorporado — o nome dsh-plugin-upgrade-016 nunca chegou ao registro. Repositórios com o mesmo nome em outras contas não são afiliados.

License DSH plugin dsh-doctor DSH Market Node CI Version npm version npm downloads

English · 简体中文 · Español · Português · हिन्दी


Compatibilidade

SuperfícieEstado
HarnessDeepSeek Harness 0.1.5-rc.1 (tag dsh-v0.1.5-rc.1 = 183f08e9c6dd; passagem da perna A→B dsh-v0.1.5-alpha.1 = 5dda764ed3aa; início do corredor 0.1.3-alpha.1) e, para o legC, DeepSeek Harness 0.1.6-alpha.2 (tag dsh-v0.1.6-alpha.2). Faixa de peers @deepseek-ai/dsh-skill >=0.1.2-rc.1 <0.2.0 || >=0.1.5-alpha.1 <0.2.0 || >=0.1.6-0 <0.2.0, @deepseek-ai/cordis ^4.0.2, @deepseek-ai/schemastery ^3.18.2.
Node^22.19.0 || >=24.0.0
PlataformasOnde o Node rodar; o scanner só usa o sistema de arquivos e é neutro em relação à plataforma
ModeloModelos somente texto totalmente suportados; a habilidade é um Markdown, sem exigência de ferramentas ou visão
Índice de corredoresUm pacote, um ponto de entrada. lib/route.mjs guarda os corredores fechados e a CLI encaminha para o correspondente a partir da faixa declarada do repositório alvo (engines.dsh, os intervalos @deepseek-ai/dsh*); --span legAB|legC substitui o palpite e uma faixa não declarada recai no corredor mais antigo. Os dois catálogos nunca são fundidos: cada corredor mantém seu próprio array de costuras, cartão, evidências, fixtures e portão de paridade.
EscopoDois corredores fechados: legAB = 0.1.3-alpha.10.1.5-rc.1 (perna A + perna B), legC = 0.1.5-rc.20.1.6-alpha.2. Um corredor nunca se alarga: um salto que acrescenta uma costura é um corredor novo — um cartão novo e uma linha nova no índice, não um pacote novo.
PernasCada perna vive neste pacote: a perna A mantém as costuras S1S10 + M1, a perna B mantém C1, C2, C4, C5, H1H4, P1, e a perna C mantém E1E5 — cada uma com suas próprias evidências, seção de cartão, fixtures e caminho de rollback. Não há pacote irmão a instalar.
C3Aposentada: o cartão da perna B chamava de C3 o verde falso da linha de tipos desatualizada, que é o mesmo defeito da M1 da perna A. A fusão está registrada no cartão; --seams C3 não corresponde a nada.
Pacote anteriorNão monte o retirado dsh-plugin-upgrade no mesmo perfil: os dois registram a skill plugin-upgrade, então a segunda montagem colide nesse nome. Aquele pacote está obsoleto no npm e seu repositório foi retirado; este pacote substitui as suas duas pernas.

O que você recebe

Duas metades, um catálogo de costuras por corredor:

  • Uma habilidade de agente empacotada (plugin-upgrade) — o cartão do corredor fundido e um ciclo de corrigir-e-verificar. O corpo primeiro encaminha quem chama para a perna que corresponde à sua faixa de peers; o modelo só a carrega quando uma tarefa realmente precisa dela, e o pacote não contribui com nenhum parágrafo de prompt de sistema nem com nenhuma ferramenta.
  • Uma CLI sem dependências (dsh-plugin-upgrade-scan) — resolve o corredor e reporta fatos file:line das costuras daquele corredor: as vinte do legAB (S3, S8, S9, M1, S4, S5, S6, S7, S2, S1, S10, C1, C2, P1, C4, C5, H1, H2, H4, H3) relidas dos intervalos de tags do harness em 2026-09-09 (perna A) e 2026-09-10 (perna B), ou as cinco do legC (E1E5) medidas no dsh-v0.1.6-alpha.2 (2026-09-19). Sai com 1 em qualquer achado de severidade error, então entra direto no CI.

O objetivo é o modo de falha que este corredor existe para matar: a quebra deste intervalo é em grande parte silenciosa, pelas duas pontas. A linha de tipos pode estar desatualizada, então o repositório compila contra o catálogo antigo (costura M1), e o slot de cliente puro conversation foi removido sem alias enquanto ctx.slots.inject() só executa o callback quando a declaração existe — então uma metade de cliente que ainda aponta para ele para de montar sem erro, sem linha de log e sem build quebrado (costura C1). Três classes de quebra sobrevivem a typecheck + test:

  1. o portão local compila uma linha de tipos desatualizada — alias paths antigo, ou tipos de dev/test fixados em 0.1.5-alpha.* (costura M1);
  2. um escritor de log omite o campo stream exigido pelo V3, então a sessão é importada e depois se recusa a retomar (costura S3);
  3. os testes são simulados contra a forma antiga, então passam enquanto o host descarta a contribuição (costura C1).

Medição honesta: a varredura do workspace da perna B encontrou que as metades de cliente da família usam apenas 8 chaves de slot, e todas as 8 sobrevivem no rc.1 — para elas a quebra do rc.1 é latente, não real. Os plugins de cliente de terceiros que apontavam para a chave pura conversation são os que quebram, e quebram em silêncio. A varredura da perna A encontrou a textura oposta: 40 repositórios, 11 deles atingidos por M1, e corrigir o caminho desatualizado expôs erros reais de TypeScript em 3 repositórios que antes estavam «verdes».

Início rápido

# 1. instale o bundle no seu perfil
dsh plugin --profile web add dsh-plugin-upgrade

# 2. confirme que a linha montou
dsh --profile web --dump-config | grep -A3 'id: dsh-plugin-upgrade'

# 3. escaneie o plugin que você vai atualizar
npx dsh-plugin-upgrade-scan --repo ../my-plugin

Depois peça ao agente para usar a habilidade plugin-upgrade, ou conduza o ciclo você mesmo com o cartão que corresponde à sua faixa: skills/plugin-upgrade/references/v0.1.3-alpha.1-to-v0.1.5-rc.1.md (legAB — a perna A é a §1, a perna B é a §2, o índice de costuras fundido é a §3) ou skills/plugin-upgrade/references/v0.1.5-rc.2-to-v0.1.6-alpha.2.md (legC). O scanner escolhe o corredor por você; acrescente --span legC quando a faixa declarada for ambígua.

Instalação e desinstalação

dsh plugin --profile web add dsh-plugin-upgrade            # do npm
dsh plugin --profile web add "github:PerryLink/dsh-plugin-upgrade#main"   # do código-fonte
dsh plugin --profile web remove dsh-plugin-upgrade         # desinstalar (reversível)

Instalar o bundle apenas registra uma habilidade; remover a linha remove a habilidade. A CLI é um alvo npx normal e não precisa de perfil algum.

Configuração

Toda chave é opcional e fica no patch do perfil:

ChavePadrãoSignificado
enabledtrueRegistra a habilidade empacotada. Use false para manter a dependência montada porém silenciosa.
skillNameplugin-upgradeDiretório sob skillsRoot a registrar, e o nome exibido no catálogo.
skillsRooto ./skills do próprio pacoteOnde vive <skillName>/SKILL.md. Aponte para o seu próprio cartão para reutilizar a infraestrutura.
userInvocabletrueSe uma pessoa pode invocar a habilidade pelo nome além do modelo.
- insert:
    - id: dsh-plugin-upgrade
      name: dsh-plugin-upgrade
      config:
        skillName: plugin-upgrade

O plugin monta de forma ruidosa: um SKILL.md ausente, um corpo vazio ou um frontmatter sem name fazem a montagem falhar em vez de registrar uma habilidade vazia.

Superfícies

Habilidadeplugin-upgrade (invocável pelo modelo e por pessoas por padrão). Corpo: tabela de encaminhamento por perna, as 8 regras rígidas e o ciclo de 6 passos. Referências: o cartão do corredor fundido. Scripts: o detector, enviado dentro do diretório da habilidade para que os caminhos relativos resolvam.

CLIdsh-plugin-upgrade-scan:

dsh-plugin-upgrade-scan [--repo <path>] [--span legAB|legC|<span>] [--json <out.json>] [--seams S3,C1,P1] [--quiet]
FlagSignificado
--repo <path>Repositório a escanear (padrão: diretório atual). Sua faixa dsh declarada escolhe o corredor.
--span legAB|legC|<span>Força um corredor em vez de adivinhar pela faixa declarada. Uma faixa desconhecida recai no legAB.
--json <out.json>Também grava o relatório legível por máquina (repo, scannedAt, files, hits[], bySeam).
--seams S3,C1,P1Restringe a costuras específicas do catálogo do corredor resolvido (os ids nunca são compartilhados entre corredores).
--quietSuprime a renderização humana (combine com --json).

Códigos de saída: 0 nenhum achado de severidade error · 1 ao menos um achado de severidade error · 2 uso ou falha do escaneamento. Um escaneamento limpo é necessário mas não suficiente — o critério de saída é um smoke real no host, mais uma ida-e-volta de retomada para escritores de log (perna A) e uma asserção em navegador real para a metade de cliente (perna B).

As vinte costuras do legAB

A ordem segue o catálogo em lib/scan.mjs (perna A primeiro, depois perna B), que também é a ordem à qual test/card.test.mjs fixa o cartão.

IdSeveridadeO que mudou no caminho até 0.1.5-rc.1
S3errorassistant/message ganhou um campo stream obrigatório (formato de sessão V3): um log escrito sem ele é importado com sucesso e depois se recusa a retomar (Session.fromRestore lança invalid settlement fields).
S8errorSessionHandle.read() retorna SessionHandleReadResult ({ eventState, events }) em vez do array de eventos; operações de array precisam desembrulhar .events.
S9errorA configuração de SystemPrompt renomeou personapersonaPrefix / personaSuffix. Substituir por includeHarnessIdentity: false não é equivalente — isso apaga o bloco de identidade do harness.
M1errorO portão local compila uma linha de tipos desatualizada: tipos de dev/test fixados em 0.1.5-alpha.*, ou um alias paths do tsconfig resolvendo para um diretório de checkout inexistente, fazem o TypeScript cair em silêncio nos tipos publicados. Portão verde, régua errada.
S4errortool/code-dispatch foi renomeado para tool/ptc-dispatch; o rótulo antigo não é mais reconhecido em sessões V3.
S5errorctx.agent foi removido: quem chama deve passar o Agent explicitamente (por exemplo, o segundo parâmetro de setup(agentCtx, agent)).
S6errorInbox é uma interface de tipo, não uma classe construível; as fixtures usam a forma oficial não suportada e o código de runtime lê agent.inbox.
S7warnSubprocessHandle.pid foi removido (só resta SubprocessTerminalHandle.pid); remova o campo das fixtures de teste.
S2warnEpochHeader.system foi removido: o prompt de sistema agora é o system/message do nó de superfície 0.
S1warnFormato de sessão V3 e nomes de log com sufixo de geração — a geração atual é session.v3.jsonl.zstd, então scripts que fixam session.jsonl.zstd falham em silêncio.
S10warnEventos de sessão escritos por plugins precisam passar pelo portão de adaptação fail-closed do host: Session.append não tem canal de escrita ignorable, então um append incondicional pode tornar uma sessão ilegível.
C1errorO slot de cliente puro conversation foi removido e substituído por main + main.conversation, sem alias. ctx.slots.inject() só dispara quando a declaração existe, então um plugin que aponta para ele para de montar em silêncio.
C2error@deepseek-ai/dsh-client-ui-sidebar-textpreview virou …-sidebar-documentpreview; o nome antigo sumiu e não há pacote shim.
P1errorA faixa de peers deve manter o segundo segmento: >=0.1.2-rc.1 <0.2.0 sozinho rejeita 0.1.5-rc.1 pela regra prerelease-tuple do npm semver (medido false no semver 7.8.5).
C4warnO rc.1 adicionou um modelo de painel principal global (main, sidebar.panellist, ctx.layout.selectPanel(MainPanelId | null)) e acrescentou a prop padrão usePanelInfo a quase todos os slots.
C5warnA pré-visualização de documentos migrou para o slot com chave sidebar.right.tab.document (DocumentContent); sidebar.right.pane.tab sobrevive, mas sua entrada pai passou a ser rightbar.session.
H1warnKNOWN_SESSION_EVENT_TYPES ganhou deliverables/presented e subagent/catalog: o vocabulário fail-closed cresceu.
H2warnA linha da nova ferramenta present ocupa a chave 'present' de tool.call.toolview, que no alpha.1 estava livre.
H4infoO catálogo consultivo padrão do adaptador DeepSeek agora começa com deepseek-flash (DeepSeek-V41-Flash).
H3infoNovas capacidades opcionais: ctx.sessionFeedback, ctx.layout.beginNavigation(), ctx.workspaces.openSession() / openWorkspace() / forkSession(). Listadas no cartão; deliberadamente sem detecção automática.

S7, S2, S1, S10, C4, C5, H1, H2 e H4 são deliberadamente consultivas: têm correspondências legítimas (um repositório que já usa a API nova, um snapshot de documentação, a tabela de ids de modelo de um plugin, um ChildProcess.pid do Node), então o scanner as reporta como pistas para revisão manual, não como falhas. M1 e P1 são verificações estruturadas — resolvem package.json e tsconfig*.json em vez de casar texto — e H3 é somente-cartão: documentada, com paridade de id verificada e deliberadamente sem detector (CARD_ONLY = ['H3']).

As cinco costuras do legC (0.1.5-rc.20.1.6-alpha.2)

A ordem segue o catálogo em lib/scan-0.1.6.mjs, que também é a ordem à qual test/card.test.mjs fixa o cartão do legC. Aqui toda costura é error e todas são detectadas (CARD_ONLY = []).

IdSeveridadeO que mudou no caminho até 0.1.6-alpha.2
E1errorOs listeners de agent/created são despachados em série: um listener que lança — ou que faz trabalho lento — bloqueia a criação do agente por completo. Envolva o trabalho síncrono em try/catch e adie o resto com queueMicrotask/setImmediate ou a sua própria fila.
E2errorUm apply() assíncrono cujo primeiro await precede seus registros: tudo o que for registrado depois cai na janela de desmontagem e lança INACTIVE_EFFECT, enquanto o encerramento antigo continua rodando. Registre tudo antes do primeiro await, dentro de um único ctx.effect().
E3errorChaves de slot/estado removidas: settings.plugin.item virou o keyed→list plugins.item, e SessionListState.current sumiu — um cartão de configurações desaparece em silêncio (retorno antecipado por spec === undefined), e os casts de current continuam compilando enquanto o recurso está morto.
E4errorAPI de cliente removida: sessions.open / openSubagent / clear viraram retain / using / retainInfo.
E5errorLiterais de modelo removidos: deepseek-v4-flash* e deepseek-v4-vision-exp. O catálogo padrão de modelos encolheu de 4 para 2, e um id fora do catálogo passa como somente texto.

A mesma disciplina do legAB se aplica: um escaneamento limpo é necessário, não suficiente. A quebra do legC é silenciosa ou apenas em runtime (a linha de tipos publicada esconde as remoções), então o critério de saída continua sendo um smoke real no host em um DSH_HOME temporário, mais a ida-e-volta do escritor de logs e a asserção em navegador real onde se aplicarem.

O que isto não cobre

  • Um salto além de todos os corredores daqui. O legAB termina no 0.1.5-rc.1 por construção: o salto do harness 0.1.5-rc.10.1.5-rc.2 não acrescentou nenhuma costura voltada a plugins (o pin de dev/test deste próprio pacote e a sonda de CI rodam na linha 0.1.5-rc.2, de modo que o catálogo do legAB é verificado contra esses tipos publicados), e o legC cobre 0.1.5-rc.20.1.6-alpha.2. Um salto posterior que acrescente uma costura não está coberto: um corredor é fechado, e alargar um cartão é pior do que acrescentar um. Ele ganha um cartão novo e uma linha nova no índice — não um pacote novo.
  • O salto 0.1.10.1.2. Use a habilidade de convergência da comunidade.
  • Repetir costuras entre pernas. A perna A é dona das costuras do formato de sessão (assistant/message.stream, SessionHandleReadResult, EpochHeader.system, ctx.agent, Inbox, SystemPrompt.persona, a geração de log V3) e a perna B não as repete — todo o diff de packages/core/session/src no intervalo da perna B são dois literais de tipo de evento acrescentados e uma linha de comentário. A seção de cartão de cada perna mantém sua própria declaração de escopo.
  • O caminho de atualização do usuário do DSH. Este pacote atualiza código-fonte de plugins, não a instalação do harness de um usuário.
  • Tokens de tema. docs/web-styling.md não tem nenhuma mudança no intervalo da perna B.
  • Prova. Um escaneamento limpo é uma hipótese. O critério de saída é um smoke real no host (DSH_HOME temporário, CLI alvo, plugin add <tarball>, --dump-config) mais uma ida-e-volta de retomada para escritores de log de sessão (perna A) e uma asserção em navegador real para cada achado do lado cliente (perna B).

Limites de segurança

  • Escaneamento somente leitura. A CLI nunca escreve dentro do repositório escaneado; --json grava apenas no caminho que você indicar.
  • Sem rede, sem shell. O scanner não importa nada além da biblioteca padrão do Node e nunca inicia um processo.
  • Sem segredos. Nada no pacote lê credenciais, tokens de ambiente ou dados de sessão.
  • Receita de smoke em sandbox. A verificação de host real do cartão usa um DSH_HOME de mkdtemp; nunca toca o seu ~/.dsh real.

Desenvolvimento

npm install                        # ou: pnpm install (o repositório inclui pnpm-lock.yaml)
npm test                           # node --test: scanner, paridade cartão<->catálogo, Cordis + SkillRegistry reais
npm run verify:self-contained      # todo import resolve dentro do pacote
npm run verify:artifacts           # o tarball leva a habilidade, a CLI e o patch, e exclui os testes
npm run check:readmes              # consistência dos READMEs em cinco idiomas
npm pack

O scanner tem um par de fixtures sintéticas por perna do legAB: fixtures/leg-a-bad-repo (as costuras de sessão/config da perna A, com toda costura de erro presente de propósito) com fixtures/leg-a-good-repo (adaptado), e fixtures/bad-repo (as costuras de slot de cliente da perna B) com fixtures/good-repo (adaptado) — além de um negativo ao vivo em um repositório da família já fixado no 0.1.5-rc.1, de modo que uma regressão no catálogo falha nesta suíte e não em um usuário a jusante. test/card.test.mjs afirma que o índice de cada cartão e seu próprio catálogo (lib/scan.mjs para o legAB, lib/scan-0.1.6.mjs para o legC) nomeiam exatamente os mesmos ids de costura com as mesmas severidades, que o CARD_ONLY do legAB é exatamente ['H3'] enquanto o do legC está vazio, e que os dois catálogos não compartilham nenhum id de costura — a regra de vinculação de evidência como portão de máquina, por corredor.

Tópicos

dsh, dsh-plugin, deepseek-harness, deepseek, cordis, plugin-upgrade, migration, skill, version-card, scanner, client-slots (espelham as keywords do package.json; dsh-plugin é o canal de visibilidade do ecossistema).

Este projeto é um dos 42 plugins de DeepSeek Harness mantidos por PerryLink. Se este ajuda você, os outros provavelmente também:

PluginOne-liner
dsh-auto-reviewSecond-model auto-review on the approval chain, fail-closed by default
dsh-autotierAutomatic strong/cheap model-tier routing with deterministic risk guards and a /tier command
dsh-background-agentsDurable background child agents with a Web UI sidebar, messaging and interrupt
dsh-budgetCost governance for DeepSeek Harness: budgets, carbon, and latency in one panel.
dsh-catalogDSH Desktop Market standard catalog source for the PerryLink family
dsh-cert-mcpRead-only MCP server exposing the certification registry: grades, snapshots and five-dimension evidence
dsh-checkpoint-rewindUnified session + workspace + config checkpoints with one-shot /rewind
dsh-claude-moveMigrate Claude Code, Codex, OpenCode and Hermes sessions, memories and skills into DSH
dsh-clickCross-platform native desktop control for DeepSeek Harness — Windows first.
dsh-composer-historyTerminal-style input history for the web composer: arrows, Ctrl+R search
dsh-data-qualityDeterministic dataset profiling, cleaning and citation verification
dsh-defendPrompt-injection, jailbreak, and secret-leak defense for DeepSeek Harness.
dsh-doublecheckEngineering-discipline guard: requirements grill, test gates, adversary review
dsh-drawUnified static-image generation routing for DeepSeek Harness.
dsh-fastRead-only performance diagnostics: load, spill, compaction and cache hit rate
dsh-fund-researchChinese mutual-fund research with sealed, traceable source snapshots
dsh-githubGitHub PR/issue/CI integration with every write approval-gated
dsh-industry-researchIndustry and company research pack: chain map, policy timeline, company cards
dsh-kitOne-command starter pack that installs the core family
dsh-libraryLocal document knowledge base with hybrid search and citation-aware injection
dsh-local-aiLocal Ollama model discovery and task-based routing with cloud fallback
dsh-lsp-actionsLSP diagnostics, formatting, completion, code actions, symbols and rename
dsh-maskPII masking at the model boundary with a host-side restore table
dsh-mcp-panelMCP management console: /mcp command, Settings tab and trial calls
dsh-mementoApproval-gated cross-session memory protocol (ctx.memory + SQLite)
dsh-observeOpenTelemetry and Langfuse telemetry export from the session event stream
dsh-output-stylesRuntime-switchable model output styles
dsh-permission-rulesDeclarative allow/deny/ask rules plus a process-level network policy
dsh-plugin-certificationCommunity certification registry with repro-checkable grades and badges
dsh-plugin-doctorZero-dependency static + sandbox smoke detector for DSH plugins
dsh-plugin-guidePlugin-dev knowledge base, agent skill and the dsh-plugin-dev CLI toolchain
dsh-plugin-kitShared zero-runtime-dependency toolkit for the PerryLink DSH plugins
dsh-plugin-portalZero-dependency static portal rendering the whole plugin family as one page
dsh-reachMulti-channel approval/question bridge: WeChat, Telegram, Feishu + a session console
dsh-research-reportVerifiable research reports: evidence ledger, manifest seal, per-claim verdicts
dsh-scoreMulti-dimensional plugin quality scoring with an evidence-backed leaderboard
dsh-session-pinPin sessions and workspaces in the Web sidebar with per-pin colors
dsh-session-syncGit-backed cross-device session synchronization with keep-both merges
dsh-skill-pack-securitySecurity-audit skill pack plus the plugin_vet supply-chain gate
dsh-talkVoice-first session loop: speech-to-text input and text-to-speech replies
dsh-team-roomsCross-session team rooms: shared message bus, task board and timeline
dsh-test-driveIsolated install-and-smoke test drives with a pass/fail matrix
dsh-ticktickTickTick/Dida365 task bridge: session-header panel plus eleven agent tools
dsh-translateVendor parameter translation and deterministic JSON repair
dsh-layaLaya typed decisions (noul/choice/score) as a first-class Cordis service and model-visible tools

Parte da família de plugins DSH da PerryLink — mais de 40 repositórios cobrindo sessões, memória, permissões, entrega, observabilidade e ferramentas de desenvolvimento. Explore o catálogo em perrylink-dsh-catalog.perrylink.workers.dev ou no tópico dsh-plugin.

Licença

Apache-2.0 — veja LICENSE. As dependências de instalação e suas licenças estão em THIRD_PARTY_NOTICES.md; nada é empacotado.