# Solução de problemas
> Diagnostique módulos ausentes, workspaces duplicados, comandos que não aparecem e definições de prompt ou paginação não registradas.

- Área: Operação
- URL humana: https://ninenity.vercel.app/doc/solucao-de-problemas
- URL Markdown: https://ninenity.vercel.app/doc/markdown/solucao-de-problemas
- Pacotes e conceitos: MODULE_NOT_FOUND, Workspace, Registration

## Cannot find module @ninenity/...

O nome do import precisa combinar com o `name` do package e o workspace precisa estar mapeado pelo npm.

1. **Confira o pacote** — Abra o `package.json` da lib e confirme que `name` usa exatamente `@ninenity/nome`.
2. **Confira dependências** — O package consumidor deve listar a lib em `dependencies` ou o monorepo precisa expor o workspace.
3. **Reinstale links** — Execute `npm install` na raiz para recriar os links simbólicos em `node_modules/@ninenity`.
4. **Valide exports** — O `main`, `types` e `exports` da lib precisam apontar para arquivos que realmente existem após o build.

### checagens na raiz

```powershell

npm query .workspace
npm ls @ninenity/core @ninenity/componentbuilder
npm run build --workspace=@ninenity/core
```


> **Renomear imports não renomeia pacotes:** Trocar `@tefutaki/...` por `@ninenity/...` no código exige também atualizar `package.json`, lockfile e qualquer alias de TypeScript ou bundler.

## Multiple workspaces with the same name

O npm encontrou dois `package.json` com o mesmo campo `name` dentro dos padrões de workspace.

### localizar nomes duplicados

```powershell

Get-ChildItem -Recurse -Filter package.json |
  Where-Object { $_.FullName -notmatch 'node_modules' } |
  ForEach-Object {
    $package = Get-Content -Raw $_.FullName | ConvertFrom-Json
    [PSCustomObject]@{ Name = $package.name; Path = $_.DirectoryName }
  } |
  Group-Object Name |
  Where-Object Count -gt 1
```


Dê um nome único para cada app, mesmo que um seja apenas template. Por exemplo, `@ninenity/template-bot` e `@ninenity/example-bot`. Depois execute `npm install` na raiz para atualizar o lockfile.

## Slash funciona, prefixo não

Slash e prefix são registros separados, mesmo quando compartilham o executor.

- Confirme que existe uma chamada `Client.prefix()` para aquele nome.
- O Client precisa do intent `GuildMessages` e, para ler texto, `MessageContent`.
- Habilite Message Content Intent no Discord Developer Portal.
- Confira o prefixo configurado e se o bot pode ver/enviar mensagens no canal.
- Para subcomandos, confirme a sintaxe esperada pelo `PrefixCommandBuilder`.

### executor compartilhado

```text

const execute = async (interaction: InputCommandInteraction) => {
  await interaction.reply('Fluxo disponível em slash e prefixo.')
}

Client.slash({
  data: new SlashCommandBuilder().setName('prompt').setDescription('Abre o prompt.'),
  execute
})

Client.prefix({
  data: new PrefixCommandBuilder().setName('prompt'),
  execute
})
```


## Prompt ou paginator is not registered

A solicitação chegou antes de existir uma definição com o mesmo ID no namespace do Client.

| Causa | Correção |
| --- | --- |
| ID diferente | Compare exatamente `registerPrompt('id')` e `promptRequest('id')` |
| Arquivo fora do loader | Mova o registro para `Discord/Interactions` ou importe o módulo explicitamente |
| Arquivo não está no dist | Preserve a árvore `src/Discord` no build |
| Dois Clients | Registre a definição no mesmo Client que executa o comando |
| Exceção no módulo | Leia o primeiro erro do boot; a importação pode ter parado antes do registro |

### IDs alinhados

```text

// Discord/Interactions/Prompt.ts
Client.registerPrompt('example-prompt', promptPages)

// Discord/Commands/Prompt.ts
await interaction.promptRequest('example-prompt', { ephemeral: true })
```


## Mensagem Components V2 rejeitada

- Inclua `MessageFlags.IsComponentsV2` no payload final.
- Passe `template.document()` por `toDiscordMessagePayload()`.
- Não aninhe containers e não misture select com outros itens na mesma action row.
- Mantenha até 5 botões por linha, 10 itens por galeria e IDs interativos únicos.
- Botão de link usa URL e não deve ter `customId` ou callback.

### envio correto

```text

await interaction.reply({
  ...toDiscordMessagePayload(template.document()),
  flags: MessageFlags.IsComponentsV2 | MessageFlags.Ephemeral
})
```


## Ordem de diagnóstico

1. **Leia o primeiro erro** — Erros seguintes costumam ser consequência da primeira importação ou configuração inválida.
2. **Reduza para um módulo** — Teste um comando ou template mínimo para separar infraestrutura de regra de negócio.
3. **Valide TypeScript** — Execute o check do package antes de iniciar o runtime.
4. **Valide o build** — Confirme que os arquivos carregados existem na árvore compilada.
5. **Só então limpe cache** — Reinstalar tudo é último recurso; primeiro descubra qual contrato está quebrado.
