Oracle3
Oracle3: 예측시장 거래 엔진·MCP 서버
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 README에서 읽을 수 있습니다. 저장소 README ↗
README 전체를 불러오는 중입니다.
README 전문 보기 ↗Protótipo funcional de um SaaS multi-tenant de contabilidade (Diário, Plano de Contas, Razões, Balancete) e análise de carteira de investimentos (índices de risco/concentração, agenda de vencimentos com alertas), com um assistente de IA ("CFO de Bolso") que responde perguntas com base nos dados da própria organização — nunca de outra.
Construído com Next.js 16 (App Router, Server Actions) + Supabase (Postgres + Auth + Row Level Security). O isolamento entre clientes (tenants) é garantido no banco de dados, não só na aplicação — ver seção Segurança e RLS abaixo.
app/
(auth)/ login, signup, criação de organização
(app)/ área logada: dashboard, diario, plano-de-contas,
razoes, balancete, carteira, vencimentos, cfo-bolso
api/cfo-bolso/ rota do chat (usa client com RLS do usuário, nunca service role)
api/cron/ job de alertas de vencimento (usa service role, protegido por CRON_SECRET)
privacidade/, termos/ páginas públicas
lib/
supabase/ clients (browser, server, admin) + middleware de sessão
accounting/ queries de saldo/razão (via views SQL)
portfolio/ cálculo de índices de carteira (HHI, ROA, K estimado etc.)
cfo-bolso/ montagem do contexto financeiro enviado ao modelo
org.ts resolução de organização atual + papel do usuário
supabase/
migrations/0001_schema.sql schema completo com RLS (rode isto no seu projeto Supabase)
scripts/
seed.mjs popula uma organização de EXEMPLO com dados fictícios
Em https://supabase.com/dashboard, crie um novo projeto. Anote a Project URL, a anon key e a service_role key (Project Settings → API).
No SQL Editor do painel do Supabase, cole e rode o conteúdo de
supabase/migrations/0001_schema.sql. Isso cria todas as tabelas, funções,
triggers e políticas de RLS. (Alternativamente, use a Supabase CLI:
supabase db push apontando para este diretório de migrations.)
cp .env.local.example .env.local
Preencha NEXT_PUBLIC_SUPABASE_URL, NEXT_PUBLIC_SUPABASE_ANON_KEY e
SUPABASE_SERVICE_ROLE_KEY com os valores do seu projeto. ANTHROPIC_API_KEY
é opcional (sem ela, o CFO de Bolso funciona em modo demo, mostrando o
contexto que seria enviado ao modelo). CRON_SECRET é um valor aleatório seu.
npm install
npm run dev
Acesse http://localhost:3000, crie uma conta em /signup e depois crie sua
organização em /signup/organizacao.
NEXT_PUBLIC_SUPABASE_URL=... SUPABASE_SERVICE_ROLE_KEY=... \
node scripts/seed.mjs [email protected] "SuaSenha123!"
Isso cria (ou reaproveita) o usuário informado e uma organização "Exemplo Holdings Ltd" com plano de contas, lançamentos, ativos e configuração de alerta já preenchidos, com números fictícios/redondos.
.env.local
nas configurações do projeto.GET https://seu-dominio/api/cron/vencimentos periodicamente (sugestão:
a cada hora), enviando o header Authorization: Bearer <CRON_SECRET>.
A rota hoje conta quantos alertas disparariam; plugue seu provedor de
push/e-mail no ponto marcado com TODO em
app/api/cron/vencimentos/route.ts.Antes de escrever qualquer código de UI, o schema SQL (supabase/migrations/0001_schema.sql)
foi validado rodando um Postgres local de verdade (não é só leitura de código):
lancamentos, plano_de_contas, views de
saldo) pertencente à organização do usuário A, e uma tentativa de INSERT
forjando o org_id de A é rejeitada pelo Postgres com
new row violates row-level security policy.viewer
consegue ler os lançamentos da organização, mas uma tentativa de
INSERT/UPDATE é rejeitada — só owner/admin/accountant têm
permissão de escrita (via a função has_write_role).owner/admin — corrigido um bug
real de recursão infinita de política (infinite recursion detected in policy for relation memberships) durante os testes, resolvido com uma
função auxiliar SECURITY DEFINER (is_org_admin) que evita a política de
memberships reconsultar a própria tabela sob o role do usuário.INSERT direto
quanto via a função create_lancamento.v_saldo_contas e
v_movimento_contas são criadas com security_invoker = true, então
herdam as mesmas policies das tabelas base — testado que o usuário B
consegue ler suas próprias views com count() = 0 para a org de A.O código da aplicação (lib/org.ts, lib/supabase/*) segue os mesmos
princípios: toda leitura/escrita usa o client autenticado do usuário (chave
anon + sessão), nunca a service role — a única exceção documentada é o job
de alertas de vencimento (app/api/cron/vencimentos/route.ts), que
deliberadamente precisa varrer todas as organizações e por isso é protegido
por um segredo (CRON_SECRET) e nunca é chamado a partir do navegador.
npm run build e npm run lint passam limpos) e o
schema foi testado com um Postgres real, mas o fluxo completo de
autenticação/UI não foi testado ponta a ponta contra um projeto Supabase
real dentro deste ambiente (não há acesso a um projeto Supabase de
produção a partir daqui) — recomenda-se testar o fluxo de cadastro/login
assim que configurar seu próprio projeto.app/(app)/carteira/page.tsx) — ajuste-os ou
transforme-os em configuração por organização conforme sua necessidade.TODO — o job já identifica corretamente quais ativos
deveriam alertar, falta plugar o provedor de notificação escolhido.