Monorepo de regras, presets e condições para sistemas de RPG de mesa. Pensado pra ser consumido por painéis de mesa e VTTs leves — agnóstico de UI. Usado em produção pelo GM Control Room.
Cada sistema é um pacote npm publicado independentemente — você instala só os que sua mesa usa.
| Pacote | Versão | Sistema | Licença do conteúdo |
|---|---|---|---|
@lippelt/srd-core |
Contrato + registro | MIT | |
@lippelt/srd-dnd-3.5 |
D&D 3.5 — SRD 3.5 | OGL 1.0a (WotC) | |
@lippelt/srd-dnd5e-2014 |
D&D 5e (2014) — SRD 5.1 | CC-BY 4.0 (WotC) | |
@lippelt/srd-dnd5e-2024 |
D&D 5e (2024) — SRD 5.2 | CC-BY 4.0 (WotC) | |
@lippelt/srd-pathfinder-1e |
Pathfinder 1e — PRD | OGL 1.0a (Paizo) | |
@lippelt/srd-pathfinder-2e |
Pathfinder 2e — PRD | ORC License (Paizo) | |
@lippelt/srd-starfinder-1e |
Starfinder 1e — SRD | OGL 1.0a (Paizo) | |
@lippelt/srd-starfinder-2e |
Starfinder 2e — SRD | ORC License (Paizo) | |
@lippelt/srd-lancer |
Lancer (Massif Press) | Lancer 3PP License | |
@lippelt/srd-gumshoe |
GUMSHOE (Pelgrane Press) | CC-BY 3.0 | |
@lippelt/srd-daggerheart |
Daggerheart (Darrington Press) | DPCGL | |
@lippelt/srd-candela-obscura |
Candela Obscura (Darrington Press) | DPCGL |
| Pacote | Versão | O que é |
|---|---|---|
@lippelt/srd-npcgen |
Gerador de NPCs / encontros (d20 + pool + Lancer) |
11 sistemas implementados + core + npcgen. Cada sistema modela só mecânicas (dados, condições, modificadores derivados, campos de status) — sem magias, classes, monstros ou itens específicos, que devem vir do livro ou de uma camada superior.
Os rótulos em PT-BR seguem as traduções oficiais quando existem — ver README de cada pacote:
| Sistema(s) | Editora BR |
|---|---|
| D&D 5e (2014/2024) | Galápagos Jogos |
| D&D 3.5, Pathfinder 1e/2e, Starfinder 1e/2e | Devir |
| Lancer | Tria Editora |
| Daggerheart, Candela Obscura | Jambô Editora |
| GUMSHOE (via Rastro de Cthulhu) | Retropunk |
Só os rótulos (nomes de condições, campos etc.) usam os termos oficiais; os resumos são paráfrases próprias, sem redistribuir texto protegido.
npm install @lippelt/srd-core @lippelt/srd-dnd5e-2014import { register, getSystem } from '@lippelt/srd-core'
import { dnd5e2014 } from '@lippelt/srd-dnd5e-2014'
register(dnd5e2014)
const sys = getSystem('dnd5e-2014')!
const result = sys.rules!.roll!('attack', { modifier: 5, targetAC: 18, advantage: true })
// → { rolls: [18, 4], modifier: 5, total: 23, notation: '2d20kh1+5', notes: ['vantagem', 'acertou (CA 18)'] }Cada pacote tem seu próprio README com a API completa — abra na npmjs.com pelo link da tabela acima.
interface System {
id: string
name: string
ruleVersion: string
attribution: string
dicePresets: DicePreset[]
conditions: ConditionDef[]
trackerFields: TrackerField[]
rules?: SystemRules // opcional — rolagens customizadas (vantagem, crítico etc)
}Tudo em @lippelt/srd-core. Veja o README do core pra detalhes.
npm install
npm test
npm run typecheck
npm run lint
npm run build
npm run pack:checkPra trabalhar em um pacote específico:
npm test -w packages/dnd5e-2014
npm run dev -w packages/coreStack: TypeScript 5.7, tsup (ESM + CJS + .d.ts), vitest, npm workspaces. Node ≥ 22.14 (trusted publishing).
Cada pacote tem seu próprio version em packages/*/package.json. Releases são acionados por tags no formato <dir>@v<versão>:
core@v1.0.0
dnd5e-2014@v1.0.0
lancer@v1.1.0
Quando uma tag desse formato é pushada, o workflow release.yml faz checkout, build, test do pacote alvo e publica no npm via OIDC trusted publisher (sem NPM_TOKEN, sem OTP). Provenance é gerado automaticamente. Depois cria um GitHub Release com o trecho do CHANGELOG.
Republicar a versão que já está no package.json da main (retry): Actions → Release → Run workflow.
Bump no package.json (via PR, como sempre):
npm version patch -w packages/dnd5e-2014 --no-git-tag-versiongit add packages/dnd5e-2014/package.json packages/dnd5e-2014/CHANGELOG.md package-lock.json
git commit -m "chore(dnd5e-2014): bump 0.1.1 → 0.1.2"
git push origin HEADDepois do merge na main, tag e push (um pacote):
git checkout main && git pull
node scripts/tag-release.mjs --push dnd5e-2014Vários pacotes de uma vez — o script empurra uma tag por vez com pausa, senão o GitHub aglutina o push e só um workflow dispara:
node scripts/tag-release.mjs --push lancer gumshoe daggerheartO workflow valida que a versão da tag bate com a do package.json (e que o nome npm é @lippelt/srd-<dir>) antes de publicar.
Já logado como lippelt no npm (npm login). Uma vez para todos os pacotes já publicados (2 s entre um e outro, senão o npm rate-limit):
for pkg in core dnd-3.5 dnd5e-2014 dnd5e-2024 pathfinder-1e pathfinder-2e starfinder-1e starfinder-2e lancer gumshoe daggerheart candela-obscura npcgen; do
npm trust github "@lippelt/srd-$pkg" --file release.yml --repo flippelt/gmcr-srd-systems --allow-publish -y
sleep 2
doneCampos equivalentes na UI: Package → Settings → Trusted Publisher → GitHub Actions (flippelt / gmcr-srd-systems / release.yml / npm publish).
O secret NPM_TOKEN do repo foi apagado; o publish é só OIDC. Não recolocar NODE_AUTH_TOKEN no workflow.
- Crie
packages/<nome>/baseado empackages/dnd5e-2014/(estrutura:package.json,tsconfig.json,tsup.config.ts,src/index.ts,src/index.test.ts,README.md). - Implemente o contrato
System— exporte como named export (ex.:export const meuSistema: System = { ... }). - Testes determinísticos: exporte
setRoller(fn)eresetRoller()pra permitir injeção de dados controlados. - README seguindo o padrão dos outros (o que inclui, o que NÃO inclui, exemplo de uso, licença).
- PR. Após merge, o primeiro publish de um pacote novo é local (
npm publish -w packages/<nome> --access public, com OTP) — o npm só aceita trusted publisher depois da primeira versão. Aínpm trust github @lippelt/srd-<nome> --file release.yml --repo flippelt/gmcr-srd-systems --allow-publish -ye as próximas saem por tag.
Consumido pelo GM Control Room
(wiki: RPG Systems).
Pacotes privados de conteúdo protegido vivem em outro repositório (@flippelt/srd-* no GitHub Packages).
Código sob MIT. Conteúdo derivado de SRDs em cada pacote mantém atribuição própria (vide README + attribution do System).