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.
Cannot find module @ninenity/...#
O nome do import precisa combinar com o name do package e o workspace precisa estar mapeado pelo npm.
- 1Confira o pacote
Abra o
package.jsonda lib e confirme quenameusa exatamente@ninenity/nome. - 2Confira dependências
O package consumidor deve listar a lib em
dependenciesou o monorepo precisa expor o workspace. - 3Reinstale links
Execute
npm installna raiz para recriar os links simbólicos emnode_modules/@ninenity. - 4Valide exports
O
main,typeseexportsda lib precisam apontar para arquivos que realmente existem após o build.
npm query .workspacenpm ls @ninenity/core @ninenity/componentbuildernpm run build --workspace=@ninenity/coreMultiple workspaces with the same name#
O npm encontrou dois package.json com o mesmo campo name dentro dos padrões de workspace.
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 1Dê 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
GuildMessagese, 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.
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 |
// Discord/Interactions/Prompt.tsClient.registerPrompt('example-prompt', promptPages)// Discord/Commands/Prompt.tsawait interaction.promptRequest('example-prompt', { ephemeral: true })Mensagem Components V2 rejeitada#
- Inclua
MessageFlags.IsComponentsV2no payload final. - Passe
template.document()portoDiscordMessagePayload(). - 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
customIdou callback.
await interaction.reply({ ...toDiscordMessagePayload(template.document()), flags: MessageFlags.IsComponentsV2 | MessageFlags.Ephemeral})Ordem de diagnóstico#
- 1Leia o primeiro erro
Erros seguintes costumam ser consequência da primeira importação ou configuração inválida.
- 2Reduza para um módulo
Teste um comando ou template mínimo para separar infraestrutura de regra de negócio.
- 3Valide TypeScript
Execute o check do package antes de iniciar o runtime.
- 4Valide o build
Confirme que os arquivos carregados existem na árvore compilada.
- 5Só então limpe cache
Reinstalar tudo é último recurso; primeiro descubra qual contrato está quebrado.