Desenvolvimento Roblox com Rojo (Luau)

Desenvolve jogos Roblox em Luau com Rojo dentro da VM e publica por Open Cloud em um lugar de TESTE informado pelo usuário.

O que é Desenvolvimento Roblox com Rojo (Luau)?

Esta skill capacita agentes de IA a desenvolverem experiências Roblox diretamente em uma VM, usando a linguagem Luau e a ferramenta Rojo 7.7.1. O agente cria e organiza o código-fonte em arquivos simples dentro da VM (seguindo uma estrutura de projeto padronizada), compila esses arquivos em um arquivo de lugar Roblox (.rbxl) usando o comando `rojo build` e, sob demanda do usuário, faz o upload do lugar compilado para um local de teste específico no Roblox via API Open Cloud. A skill é projetada para operar exclusivamente com lugares de teste fornecidos pelo usuário (números universeId e placeId), garantindo que nenhum dado seja publicado acidentalmente em produção. A segurança é prioridade: chaves de API são armazenadas em um cofre de segredos e inseridas no comando `curl` apenas durante a execução, sem serem expostas no chat ou em logs. Além disso, a skill segue convenções de codificação Luau rigorosas (como `--!strict`, tipagem e separação de responsabilidades) e inclui listas de verificação para segurança de remotos, implementando validação de entrada, rate limiting e boas práticas de DataStore para proteger o jogo contra explorações do cliente.

Funciona com~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/ali-ali18/agent-skills/tree/HEAD/skills/roblox

Installed? Explore more Programação e Desenvolvimento skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

Perguntar na sua IA favorita

Abre um novo chat com esta habilidade de agente já pré-carregada.

Documentação

O que Desenvolvimento Roblox com Rojo (Luau) faz?

Você constrói experiências Roblox como arquivos simples dentro da VM, compila-os em um arquivo de lugar com Rojo e, apenas quando solicitado, faz o upload desse arquivo para um lugar de TESTE através do Roblox Open Cloud. Responda ao usuário no idioma dele (pt-BR por padrão).

0. Regras básicas

  • Nunca imprima, exiba, registre ou escreva uma chave de API. Use apenas o marcador de cofre {{secret:<nome>}} dentro de uma chamada shell; o runtime substitui o valor e o oculta na saída.
  • Publique SOMENTE no lugar de teste que o usuário forneceu (universeId + placeId). Nunca adivinhe ids e nunca reutilize ids de outra conversa. Se o usuário fornecer um lugar ativo/produção, pare e confirme a intenção.
  • O versionType padrão é Saved (uma nova versão no histórico de versões, não ao vivo). Use Published apenas quando o usuário pedir explicitamente para ir ao ar.
  • Faltando universeId, placeId ou nome do segredo? Pergunte com propose_questionnaire (um formulário curto). Faltando o segredo por completo? Chame secret_request (nome sugerido: ROBLOX_API_KEY). Nunca peça a chave no chat.

1. Instalar Rojo (uma vez por VM)

Versão fixada: Rojo 7.7.1 (verifique https://github.com/rojo-rbx/rojo/releases para versões 7.x mais recentes e informe o usuário antes de alterar a fixação). Instale o binário pré-compilado para Linux x86_64 na pasta home, sem necessidade de root:

mkdir -p "$HOME/.local/bin" && cd "$(mktemp -d)"
curl -fsSL -o rojo.zip https://github.com/rojo-rbx/rojo/releases/download/v7.7.1/rojo-7.7.1-linux-x86_64.zip
unzip -o rojo.zip && install -m 0755 rojo "$HOME/.local/bin/rojo"
export PATH="$HOME/.local/bin:$PATH"
rojo --version   # esperado: rojo 7.7.1

Verifique primeiro com command -v rojo; pule a instalação se já exibir 7.x. Em uma VM ARM use o ativo linux-aarch64. Alternativa quando um gerenciador de ferramentas já estiver presente: rokit add rojo-rbx/rojo && rokit install. Não execute instaladores de nenhuma outra URL.

2. Estrutura do projeto

my-game/
  default.project.json
  src/
    server/     -> ServerScriptService.Server   (código apenas do servidor)
    client/     -> StarterPlayer.StarterPlayerScripts.Client
    shared/     -> ReplicatedStorage.Shared      (módulos que ambos os lados podem usar)

default.project.json:

{
  "name": "my-game",
  "tree": {
    "$className": "DataModel",
    "ServerScriptService": { "Server": { "$path": "src/server" } },
    "ReplicatedStorage": { "Shared": { "$path": "src/shared" } },
    "StarterPlayer": {
      "$className": "StarterPlayer",
      "StarterPlayerScripts": { "Client": { "$path": "src/client" } }
    }
  }
}

Nomenclatura de arquivos que o Rojo entende: init.server.luau (um Script para a pasta), *.server.luau (Script), *.client.luau (LocalScript), *.luau simples (ModuleScript), init.luau (a pasta se torna um ModuleScript). Adicione um .gitignore com *.rbxl, *.rbxlx, Packages/. Crie o projeto apenas quando a pasta não tiver um default.project.json; nunca sobrescreva uma estrutura existente, adapte-se a ela.

3. Convenções de codificação

  • Luau com --!strict no topo de cada arquivo. Tipar assinaturas de funções e tabelas exportadas.
  • Uma responsabilidade por ModuleScript, retornando uma tabela. Sem globais, sem _G, sem shared. Use require com referências diretas (script.Parent.Module ou ReplicatedStorage.Shared.Module).
  • Mantenha pontos de entrada pequenos: um init.server.luau e um ponto de entrada do cliente que require serviços/controladores e os inicia em ordem.
  • Obtenha serviços no topo: local Players = game:GetService("Players"). Prefira task.wait, task.spawn, task.delay em vez de wait/spawn/delay. Desconecte conexões por jogador em Players.PlayerRemoving.
  • Nunca confie no cliente. O servidor possui o estado do jogo (moeda, inventário, dano, teletransportes, progressão). O cliente apenas envia intenção e renderiza resultados.

Lista de verificação de segurança para remotos

  • Crie instâncias de RemoteEvent/RemoteFunction sob ReplicatedStorage a partir do servidor com um nome fixo; nunca as crie a partir do cliente.
  • Em cada OnServerEvent/OnServerInvoke: valide quantidade e tipos de argumentos (typeof), restrinja intervalos, rejeite NaN/inf, limite comprimento de strings, verifique se o jogador tem permissão (cooldown, propriedade, distância, vida).
  • Limite de taxa por jogador (token bucket ou timestamp da última chamada). Um remoto nunca deve carregar um preço, valor de dano ou qualquer valor que o cliente possa escolher em seu benefício.
  • RemoteFunction: nunca use InvokeClient (um cliente malicioso pode travar a thread do servidor).
  • DataStore: envolva em pcall, repita com backoff, salve em PlayerRemoving e game:BindToClose; trave dados valiosos com sessão.
  • Segredos e botões de ajuste estão apenas em ServerScriptService/ServerStorage, nunca em ReplicatedStorage.

4. Compilação

rojo build default.project.json -o place.rbxl
ls -l place.rbxl

Corrija erros de compilação primeiro ($path ausente, JSON inválido, nomes duplicados). Não faça commit de place.rbxl. selene / stylua --check são opcionais; não os instale a menos que solicitado. Um lugar compilado apenas a partir de arquivos é um esqueleto de script: ativos, terreno e UI feitos no Studio estão no lugar que já existe, portanto, fazer upload SUBSTITUI o conteúdo da versão de destino. Este é exatamente o motivo pelo qual o destino deve ser um lugar de teste.

5. Publicar via Open Cloud (lugar de teste)

Endpoint (Publicação de Lugares Roblox Open Cloud, universos v1):

POST https://apis.roblox.com/universes/v1/{universeId}/places/{placeId}/versions?versionType=Saved|Published

  • Cabeçalho x-api-key: <chave>; Content-Type: application/octet-stream para .rbxl (binário), application/xml para .rbxlx.
  • Corpo: o arquivo de lugar bruto. Resposta de sucesso: { "versionNumber": 7 }.
  • A chave de API precisa da permissão universe-places com Escrita na experiência de destino (criada no Painel do Criador).
  • Apenas HTTPS. A API não atualiza alguns tipos de instância (EditableImage, EditableMesh, PartOperation, SurfaceAppearance, BaseWrap): informe ao usuário que publique esses itens pelo Studio.
  • Documentação: https://create.roblox.com/docs/en-us/cloud/guides/usage-place-publishing

Execute com o marcador de cofre (o marcador vai dentro do comando shell, nunca no texto da sua mensagem):

curl -sS -X POST \
  "https://apis.roblox.com/universes/v1/$UNIVERSE_ID/places/$PLACE_ID/versions?versionType=Saved" \
  -H "x-api-key: {{secret:ROBLOX_API_KEY}}" \
  -H "Content-Type: application/octet-stream" \
  --data-binary @place.rbxl

Substitua $UNIVERSE_ID e $PLACE_ID pelos números fornecidos pelo usuário, e o nome do segredo pelo nome real do cofre (secret_list mostra apenas nomes). Trate erros sem expor a chave: 401/403 = chave inválida ou sem a permissão/experiência; 404 = par universo/lugar errado; 400 = arquivo inválido (recompile); 429 = aguarde e tente novamente uma vez. Cite apenas o status HTTP e o corpo da resposta, que nunca contém a chave.

6. Relatório

Finalize cada tarefa com um breve relatório no idioma do usuário:

  1. O que mudou (arquivos e comportamento), em palavras simples.
  2. O resultado do rojo build e, se publicado, o versionNumber, o versionType usado e que foi para o lugar de teste <placeId>.
  3. Como testar no Studio: abra o lugar de teste, abra o Histórico de Versões para carregar a nova versão Saved, pressione Play (F5), e as coisas exatas para testar com as mensagens de Output esperadas.
  4. O que você NÃO fez (publicação ao vivo, ativos ou terreno que precisam do Studio).

7. Opção de sincronização local

Para edição ao vivo, o usuário pode executar rojo serve no próprio computador com o plugin Rojo Studio (https://rojo.space/docs/v7/getting-started/installation/). A VM não pode ser acessada pelo Studio do usuário, portanto, dentro da VM, mantenha-se no esquema de compilação com upload pelo Open Cloud.

Habilidades Relacionadas