DeepSeek Harness Remote
DeepSeek Harness Remote: DeepSeek Harness 실행 PC와 모바일·PC를 안전하게 연결해 어디서나 작업 이어받기
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기Agenda da Diretoria — calendário compartilhado da Insper AI
저장소 README에서 가져옴
README 전체를 불러오는 중입니다.
README 전문 보기 ↗Calendário compartilhado da Insper AI: eventos, aulas, reuniões e prazos. Três níveis: a diretoria cria e edita tudo e marca, em cada evento, se membros e/ou trainees também veem; membros criam e editam os próprios eventos; trainees só veem. Pedidos de disponibilidade (estilo when2meet) com link curto e prévia no WhatsApp. Quem entra sem estar cadastrado pede acesso pelo site e um admin aprova. Login com Google ou com código no e-mail. Modo claro/escuro, instalável no celular (PWA). Feed .ics por pessoa para conectar ao Google Agenda / Apple Calendar.
Estado atual, infraestrutura e pendências:
docs/estado.md. Convenções de trabalho:CLAUDE.md.
Stack: Next.js 16 (App Router) na Vercel (região gru1) · Supabase em São Paulo (Postgres + Auth com Google e OTP por e-mail) · Tailwind v4 com os tokens do Playbook de Marca · Motion, GSAP e lucide-react na interface.
npm install
cp .env.local.example .env.local # preencha com as chaves do passo 2
npm run dev -- -p 3002 # http://localhost:3002 (a porta precisa estar nas Redirect URLs do Supabase)
npm test # testes da lógica pura (recorrência, .ics, níveis, disponibilidade, login…)
npm run lint && npm run typecheck
Já está tudo configurado em produção (ver docs/estado.md); estes passos servem para recriar do zero. A ordem importa: Supabase → Google Cloud → Vercel.
agenda-insper-ai.git init && git add -A && git commit -m "Agenda da Diretoria" && git branch -M main && git remote add origin <url> && git push -u origin main.South America (São Paulo). Guarde a senha do banco.supabase/migrations/0001_init.sql inteiro → Run. Depois, uma query nova para cada uma, em ordem: 0002_niveis.sql, 0003_publico_e_pedidos.sql, 0004_votacoes.sql, 0005_diretoria_acompanha.sql, 0006_link_curto.sql, 0007_membros_criam.sql e 0008_membros_pedem_disponibilidade.sql → Run. Cada migração roda uma vez só.supabase/seed.sql, troque o e-mail pelo da sua conta Google e o nome, cole no SQL Editor → Run. Você é o primeiro admin..env.local.http://localhost:3000 (depois do deploy, troque pela URL da Vercel).http://localhost:3000/** e https://agenda-insper-ai.vercel.app/** (ajuste ao domínio real).https://<ref>.supabase.co/auth/v1/callback). Deixe a aba aberta para colar o Client ID/Secret do passo C.openid, email, profile). Depois Publish app (sem isso, só 100 "test users" conseguem entrar). Não precisa de verificação para esses escopos.Precisa de SMTP próprio (o envio padrão do Supabase só entrega para o time do projeto). Passo a passo e template do e-mail em docs/estado.md → Pendências.
Pronto para testar local: npm run dev → /entrar → Google → /agenda.
agenda-insper-ai. Framework: Next.js. O vercel.json já fixa as funções em gru1 (perto do banco) e o cron diário..env.local.example. NEXT_PUBLIC_SITE_URL = URL de produção; CRON_SECRET = qualquer string longa aleatória.NEXT_PUBLIC_SITE_URL se mudou e faça Redeploy.Para adicionar as pessoas: mande o link do site; quem não está cadastrado cai em Sem acesso e pede acesso ali (aparece em Membros → Pedidos, com contador na barra). Ou cadastre em Membros uma a uma (e-mail da conta Google, nome, nível, cargo) ou Colar uma lista com linhas email, nome, nível, cargo copiadas de uma planilha.
| Peça | Onde |
|---|---|
| Esquema, triggers de auditoria, RLS | supabase/migrations/0001_init.sql |
| Níveis (diretoria/membro/trainee) | supabase/migrations/0002_niveis.sql, lib/niveis.ts |
Pedidos de disponibilidade (estilo when2meet; no código e no banco, votacao) e convidados individuais em eventos | supabase/migrations/0004_votacoes.sql, lib/votacao.ts, components/votacao/ |
Público por evento (publico) e pedidos de acesso | supabase/migrations/0003_publico_e_pedidos.sql, app/sem-acesso/, components/admin/PedidosAcesso.tsx |
Tema claro/escuro (light-dark() + cookie tema) | app/globals.css, lib/tema.ts |
Link curto /d/<codigo> com prévia (Open Graph) | app/d/[codigo]/, lib/og.tsx, supabase/migrations/0006_link_curto.sql |
| Membros criam eventos / pedidos | supabase/migrations/0007_membros_criam.sql, 0008_membros_pedem_disponibilidade.sql, lib/niveis.ts |
| Login com código no e-mail | app/entrar/EntrarComEmail.tsx, lib/login.ts |
| Celular: PWA, barra de abas, folhas, gestos | app/manifest.ts, components/layout/BarraAbas.tsx, components/ui/Dialogo.tsx, app/globals.css |
Portão de membro (logado mas fora da lista → /sem-acesso) | app/(app)/layout.tsx, proxy.ts |
| Expansão de séries (semanal/quinzenal/mensal + exceções) | lib/recorrencia.ts |
Serializador .ics (RRULE / EXDATE / RECURRENCE-ID) | lib/ics.ts, app/api/feed/[token]/route.ts |
| Cores das categorias | app/globals.css (--cat-*) + lib/categorias.ts |
| Vistas mês / semana / próximos | components/agenda/Vista*.tsx |
Recorrência: uma linha "mestre" guarda freq + until. Editar/excluir só esta ocorrência cria uma linha filha com series_id + original_start (ou cancelled = true). Editar toda a série atualiza o mestre e propaga título/local/etc. para as filhas; mudar horário ou repetição apaga as filhas (o app avisa antes).
Permissões: só e-mails em members entram. Cada evento tem publico (membro e/ou trainee; a diretoria sempre vê); a RLS só devolve o que o nível da pessoa pode ver, e a diretoria cria/edita/exclui tudo, membros só os próprios eventos (sempre visíveis para membros) e trainees só veem (0007). Só admins alteram members, e admin precisa ser da diretoria (constraint). O último admin não pode ser removido (trigger). created_by/updated_by são preenchidos por trigger, não pelo cliente.
Feed: GET /api/feed/<token> é público, autenticado só pelo token (48 hex) do membro. Como usa a service role (sem RLS), filtra pelo nível do dono do token com visiveisPara(). Em Conectar dá para copiar, abrir no Google/Apple e gerar um novo token.
/sem-acesso. A adiciona B em Membros → B recarrega → vê a agenda. A remove B → próxima navegação de B cai em /sem-acesso.curl -i https://<site>/api/feed/<token> → 200 + text/calendar; token errado → 404. Cole o corpo em https://icalendar.org/validator.html.