primocode 10.17.1 → 10.19.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSES/fontes-OFL.txt +95 -0
- package/README.md +37 -20
- package/bin/primocode.js +1047 -267
- package/editor/THIRD_PARTY_NOTICES.md +3 -3
- package/editor/assets/baixar.json +8 -0
- package/editor/helpers/camera_viva.py +39 -2
- package/editor/modelo-projeto/assets/fontes/OFL-Inter.txt +93 -0
- package/editor/modelo-projeto/assets/fontes/larguras.json +1 -1
- package/editor/modelo-projeto/build.py +164 -19
- package/editor/modelo-projeto/ferramentas/medir_fontes.py +1 -1
- package/kits/CATALOGO.md +65 -0
- package/kits/KITS.md +179 -0
- package/kits/adesivos/SKILL.md +53 -0
- package/kits/adesivos/assets/ASSETS.md +22 -0
- package/kits/adesivos/assets/fontes/OFL-BowlbyOne.txt +92 -0
- package/kits/adesivos/assets/fontes/OFL-Nunito.txt +92 -0
- package/kits/adesivos/assets/fontes/bowlby-latin.woff2 +0 -0
- package/kits/adesivos/assets/fontes/nunito-latin.woff2 +0 -0
- package/kits/adesivos/assets/sons/assinatura.mp3 +0 -0
- package/kits/adesivos/assets/sons/cola.mp3 +0 -0
- package/kits/adesivos/assets/sons/confete.mp3 +0 -0
- package/kits/adesivos/assets/sons/impacto.mp3 +0 -0
- package/kits/adesivos/assets/sons/palavra.mp3 +0 -0
- package/kits/adesivos/assets/sons/pop.mp3 +0 -0
- package/kits/adesivos/assets/sons/swipe.mp3 +0 -0
- package/kits/adesivos/assets/sons/whoosh.mp3 +0 -0
- package/kits/adesivos/assets/trilha/pop-colorido-112bpm.mp3 +0 -0
- package/kits/adesivos/capa.jpg +0 -0
- package/kits/adesivos/elementos/AdesivoForma.tsx +42 -0
- package/kits/adesivos/elementos/AdesivoFoto.tsx +36 -0
- package/kits/adesivos/elementos/AdesivoTexto.tsx +35 -0
- package/kits/adesivos/elementos/AssinaturaMarca.tsx +36 -0
- package/kits/adesivos/elementos/Camera.tsx +22 -0
- package/kits/adesivos/elementos/Cena.tsx +48 -0
- package/kits/adesivos/elementos/ChuvaDeAdesivos.tsx +29 -0
- package/kits/adesivos/elementos/Fundo.tsx +21 -0
- package/kits/adesivos/elementos/Montagem.tsx +68 -0
- package/kits/adesivos/elementos/SeloPreco.tsx +38 -0
- package/kits/adesivos/elementos/Som.tsx +33 -0
- package/kits/adesivos/elementos/TituloEtiquetas.tsx +33 -0
- package/kits/adesivos/elementos/base.ts +101 -0
- package/kits/adesivos/elementos/index.ts +16 -0
- package/kits/adesivos/exemplos/fotos/foto-01.jpg +0 -0
- package/kits/adesivos/exemplos/fotos/foto-02.jpg +0 -0
- package/kits/adesivos/exemplos/fotos/foto-03.jpg +0 -0
- package/kits/adesivos/exemplos/logo-grude.svg +1 -0
- package/kits/adesivos/exemplos/plano.json +328 -0
- package/kits/adesivos/exemplos/roteiro.md +21 -0
- package/kits/adesivos/preview.tsx +15 -0
- package/kits/adesivos/receita.json +212 -0
- package/kits/adesivos/regras/area-segura.md +17 -0
- package/kits/adesivos/regras/cor.md +23 -0
- package/kits/adesivos/regras/movimento.md +17 -0
- package/kits/adesivos/regras/ritmo.md +16 -0
- package/kits/adesivos/regras/som.md +20 -0
- package/kits/adesivos/regras/tipografia.md +16 -0
- package/kits/antes-depois/SKILL.md +57 -0
- package/kits/antes-depois/assets/ASSETS.md +23 -0
- package/kits/antes-depois/assets/fontes/OFL-ArchivoBlack.txt +93 -0
- package/kits/antes-depois/assets/fontes/OFL-Manrope.txt +93 -0
- package/kits/antes-depois/assets/fontes/archivoblack.woff2 +0 -0
- package/kits/antes-depois/assets/fontes/manrope.woff2 +0 -0
- package/kits/antes-depois/assets/sons/assinatura.mp3 +0 -0
- package/kits/antes-depois/assets/sons/clique.mp3 +0 -0
- package/kits/antes-depois/assets/sons/impacto.mp3 +0 -0
- package/kits/antes-depois/assets/sons/pop-cartao.mp3 +0 -0
- package/kits/antes-depois/assets/sons/pop-palavra.mp3 +0 -0
- package/kits/antes-depois/assets/sons/subida.mp3 +0 -0
- package/kits/antes-depois/assets/sons/swoosh.mp3 +0 -0
- package/kits/antes-depois/assets/sons/tick.mp3 +0 -0
- package/kits/antes-depois/assets/sons/whoosh-entra.mp3 +0 -0
- package/kits/antes-depois/assets/sons/whoosh-sai.mp3 +0 -0
- package/kits/antes-depois/assets/trilha/corte-118bpm.mp3 +0 -0
- package/kits/antes-depois/capa.jpg +0 -0
- package/kits/antes-depois/elementos/BarraMedidor.tsx +43 -0
- package/kits/antes-depois/elementos/Camera.tsx +21 -0
- package/kits/antes-depois/elementos/Cena.tsx +41 -0
- package/kits/antes-depois/elementos/FaixaMarquee.tsx +35 -0
- package/kits/antes-depois/elementos/Fundo.tsx +24 -0
- package/kits/antes-depois/elementos/ListaMudancas.tsx +37 -0
- package/kits/antes-depois/elementos/Montagem.tsx +59 -0
- package/kits/antes-depois/elementos/NumeroDelta.tsx +36 -0
- package/kits/antes-depois/elementos/RotuloAntesDepois.tsx +26 -0
- package/kits/antes-depois/elementos/Som.tsx +40 -0
- package/kits/antes-depois/elementos/TelaDividida.tsx +68 -0
- package/kits/antes-depois/elementos/base.ts +82 -0
- package/kits/antes-depois/elementos/index.ts +15 -0
- package/kits/antes-depois/exemplos/fotos/foto-07.jpg +0 -0
- package/kits/antes-depois/exemplos/fotos/foto-08.jpg +0 -0
- package/kits/antes-depois/exemplos/plano.json +276 -0
- package/kits/antes-depois/exemplos/roteiro.md +19 -0
- package/kits/antes-depois/preview.tsx +13 -0
- package/kits/antes-depois/receita.json +21 -0
- package/kits/antes-depois/regras/area-segura.md +21 -0
- package/kits/antes-depois/regras/cor.md +15 -0
- package/kits/antes-depois/regras/movimento.md +23 -0
- package/kits/antes-depois/regras/ritmo.md +15 -0
- package/kits/antes-depois/regras/som.md +20 -0
- package/kits/antes-depois/regras/tipografia.md +18 -0
- package/kits/apple-tipografico/SKILL.md +73 -0
- package/kits/apple-tipografico/assets/ASSETS.md +23 -0
- package/kits/apple-tipografico/assets/fontes/OFL-Inter.txt +93 -0
- package/kits/apple-tipografico/assets/fontes/inter-latin-500-800.woff2 +0 -0
- package/kits/apple-tipografico/assets/sons/assinatura.mp3 +0 -0
- package/kits/apple-tipografico/assets/sons/clique.mp3 +0 -0
- package/kits/apple-tipografico/assets/sons/impacto.mp3 +0 -0
- package/kits/apple-tipografico/assets/sons/pop-cartao.mp3 +0 -0
- package/kits/apple-tipografico/assets/sons/pop-palavra.mp3 +0 -0
- package/kits/apple-tipografico/assets/sons/subida.mp3 +0 -0
- package/kits/apple-tipografico/assets/sons/swoosh.mp3 +0 -0
- package/kits/apple-tipografico/assets/sons/whoosh-entra.mp3 +0 -0
- package/kits/apple-tipografico/assets/sons/whoosh-sai.mp3 +0 -0
- package/kits/apple-tipografico/assets/trilha/tech-claro-125bpm.mp3 +0 -0
- package/kits/apple-tipografico/capa.jpg +0 -0
- package/kits/apple-tipografico/elementos/AssinaturaPreta.tsx +33 -0
- package/kits/apple-tipografico/elementos/Camera.tsx +23 -0
- package/kits/apple-tipografico/elementos/CartaoRadial.tsx +41 -0
- package/kits/apple-tipografico/elementos/Cena.tsx +55 -0
- package/kits/apple-tipografico/elementos/Fundo.tsx +21 -0
- package/kits/apple-tipografico/elementos/LegendaCurta.tsx +51 -0
- package/kits/apple-tipografico/elementos/Montagem.tsx +55 -0
- package/kits/apple-tipografico/elementos/Produto3D.tsx +140 -0
- package/kits/apple-tipografico/elementos/ProdutoFoto.tsx +47 -0
- package/kits/apple-tipografico/elementos/Som.tsx +40 -0
- package/kits/apple-tipografico/elementos/base.ts +111 -0
- package/kits/apple-tipografico/elementos/index.ts +18 -0
- package/kits/apple-tipografico/elementos/modelos.ts +108 -0
- package/kits/apple-tipografico/elementos/raymarch.ts +249 -0
- package/kits/apple-tipografico/exemplos/logo-lume.svg +1 -0
- package/kits/apple-tipografico/exemplos/plano.json +56 -0
- package/kits/apple-tipografico/exemplos/roteiro.md +19 -0
- package/kits/apple-tipografico/preview.tsx +12 -0
- package/kits/apple-tipografico/receita.json +22 -0
- package/kits/apple-tipografico/regras/area-segura.md +19 -0
- package/kits/apple-tipografico/regras/cor.md +24 -0
- package/kits/apple-tipografico/regras/movimento.md +29 -0
- package/kits/apple-tipografico/regras/ritmo.md +29 -0
- package/kits/apple-tipografico/regras/som.md +20 -0
- package/kits/apple-tipografico/regras/tipografia.md +21 -0
- package/kits/aquarela/SKILL.md +52 -0
- package/kits/aquarela/assets/ASSETS.md +21 -0
- package/kits/aquarela/assets/fontes/OFL-Caveat.txt +92 -0
- package/kits/aquarela/assets/fontes/OFL-Fraunces.txt +92 -0
- package/kits/aquarela/assets/fontes/caveat-latin.woff2 +0 -0
- package/kits/aquarela/assets/fontes/fraunces-latin.woff2 +0 -0
- package/kits/aquarela/assets/sons/assinatura.mp3 +0 -0
- package/kits/aquarela/assets/sons/gota.mp3 +0 -0
- package/kits/aquarela/assets/sons/impacto.mp3 +0 -0
- package/kits/aquarela/assets/sons/palavra.mp3 +0 -0
- package/kits/aquarela/assets/sons/papel-cai.mp3 +0 -0
- package/kits/aquarela/assets/sons/pop-mancha.mp3 +0 -0
- package/kits/aquarela/assets/sons/risco.mp3 +0 -0
- package/kits/aquarela/assets/sons/whoosh-pincel.mp3 +0 -0
- package/kits/aquarela/assets/trilha/calma-com-punch-108bpm.mp3 +0 -0
- package/kits/aquarela/capa.jpg +0 -0
- package/kits/aquarela/elementos/AnotacaoManual.tsx +40 -0
- package/kits/aquarela/elementos/AssinaturaMarca.tsx +33 -0
- package/kits/aquarela/elementos/Camera.tsx +22 -0
- package/kits/aquarela/elementos/Cena.tsx +48 -0
- package/kits/aquarela/elementos/Fundo.tsx +24 -0
- package/kits/aquarela/elementos/ManchaTinta.tsx +46 -0
- package/kits/aquarela/elementos/Montagem.tsx +60 -0
- package/kits/aquarela/elementos/PapelRasgado.tsx +50 -0
- package/kits/aquarela/elementos/Pincelada.tsx +43 -0
- package/kits/aquarela/elementos/Pingos.tsx +31 -0
- package/kits/aquarela/elementos/Som.tsx +33 -0
- package/kits/aquarela/elementos/TituloPincel.tsx +51 -0
- package/kits/aquarela/elementos/base.ts +97 -0
- package/kits/aquarela/elementos/index.ts +16 -0
- package/kits/aquarela/exemplos/logo-mare.svg +1 -0
- package/kits/aquarela/exemplos/plano.json +62 -0
- package/kits/aquarela/exemplos/roteiro.md +21 -0
- package/kits/aquarela/preview.tsx +12 -0
- package/kits/aquarela/receita.json +213 -0
- package/kits/aquarela/regras/area-segura.md +17 -0
- package/kits/aquarela/regras/cor.md +23 -0
- package/kits/aquarela/regras/movimento.md +19 -0
- package/kits/aquarela/regras/ritmo.md +17 -0
- package/kits/aquarela/regras/som.md +20 -0
- package/kits/aquarela/regras/tipografia.md +16 -0
- package/kits/aurora/SKILL.md +52 -0
- package/kits/aurora/assets/ASSETS.md +21 -0
- package/kits/aurora/assets/fontes/OFL-InstrumentSerif.txt +92 -0
- package/kits/aurora/assets/fontes/OFL-Manrope.txt +92 -0
- package/kits/aurora/assets/fontes/instrument-latin.woff2 +0 -0
- package/kits/aurora/assets/fontes/manrope-latin.woff2 +0 -0
- package/kits/aurora/assets/sons/assinatura.mp3 +0 -0
- package/kits/aurora/assets/sons/brilho.mp3 +0 -0
- package/kits/aurora/assets/sons/meteoro.mp3 +0 -0
- package/kits/aurora/assets/sons/onda.mp3 +0 -0
- package/kits/aurora/assets/sons/sino.mp3 +0 -0
- package/kits/aurora/assets/sons/sopro.mp3 +0 -0
- package/kits/aurora/assets/sons/subida.mp3 +0 -0
- package/kits/aurora/assets/sons/toque.mp3 +0 -0
- package/kits/aurora/assets/trilha/suave-88bpm.mp3 +0 -0
- package/kits/aurora/capa.jpg +0 -0
- package/kits/aurora/elementos/AssinaturaMarca.tsx +24 -0
- package/kits/aurora/elementos/Camera.tsx +22 -0
- package/kits/aurora/elementos/CartaoVidro.tsx +29 -0
- package/kits/aurora/elementos/Cena.tsx +48 -0
- package/kits/aurora/elementos/CeuEstrelado.tsx +22 -0
- package/kits/aurora/elementos/CortinaDeLuz.tsx +36 -0
- package/kits/aurora/elementos/Fundo.tsx +35 -0
- package/kits/aurora/elementos/Legenda.tsx +23 -0
- package/kits/aurora/elementos/Montagem.tsx +68 -0
- package/kits/aurora/elementos/Montanhas.tsx +24 -0
- package/kits/aurora/elementos/Som.tsx +33 -0
- package/kits/aurora/elementos/TituloSerif.tsx +36 -0
- package/kits/aurora/elementos/base.ts +93 -0
- package/kits/aurora/elementos/index.ts +16 -0
- package/kits/aurora/exemplos/logo-boreal.svg +1 -0
- package/kits/aurora/exemplos/plano.json +204 -0
- package/kits/aurora/exemplos/roteiro.md +19 -0
- package/kits/aurora/preview.tsx +12 -0
- package/kits/aurora/receita.json +146 -0
- package/kits/aurora/regras/area-segura.md +18 -0
- package/kits/aurora/regras/cor.md +24 -0
- package/kits/aurora/regras/movimento.md +20 -0
- package/kits/aurora/regras/ritmo.md +14 -0
- package/kits/aurora/regras/som.md +20 -0
- package/kits/aurora/regras/tipografia.md +15 -0
- package/kits/bauhaus/SKILL.md +52 -0
- package/kits/bauhaus/assets/ASSETS.md +18 -0
- package/kits/bauhaus/assets/fontes/OFL-bebas-neue.txt +93 -0
- package/kits/bauhaus/assets/fontes/OFL-jost-900.txt +93 -0
- package/kits/bauhaus/assets/fontes/bebas-neue.woff2 +0 -0
- package/kits/bauhaus/assets/fontes/jost-900.woff2 +0 -0
- package/kits/bauhaus/assets/sons/assinatura.mp3 +0 -0
- package/kits/bauhaus/assets/sons/clique.mp3 +0 -0
- package/kits/bauhaus/assets/sons/impacto.mp3 +0 -0
- package/kits/bauhaus/assets/sons/pop-cartao.mp3 +0 -0
- package/kits/bauhaus/assets/sons/pop-palavra.mp3 +0 -0
- package/kits/bauhaus/assets/sons/subida.mp3 +0 -0
- package/kits/bauhaus/assets/sons/swoosh.mp3 +0 -0
- package/kits/bauhaus/assets/sons/tick.mp3 +0 -0
- package/kits/bauhaus/assets/sons/whoosh-entra.mp3 +0 -0
- package/kits/bauhaus/assets/sons/whoosh-sai.mp3 +0 -0
- package/kits/bauhaus/assets/trilha/trilha.mp3 +0 -0
- package/kits/bauhaus/capa.jpg +0 -0
- package/kits/bauhaus/elementos/AssinaturaMarca.tsx +26 -0
- package/kits/bauhaus/elementos/BarraDiagonal.tsx +20 -0
- package/kits/bauhaus/elementos/Camera.tsx +21 -0
- package/kits/bauhaus/elementos/Cena.tsx +36 -0
- package/kits/bauhaus/elementos/ComposicaoGeometrica.tsx +54 -0
- package/kits/bauhaus/elementos/Fundo.tsx +13 -0
- package/kits/bauhaus/elementos/ListaFaixas.tsx +27 -0
- package/kits/bauhaus/elementos/Montagem.tsx +55 -0
- package/kits/bauhaus/elementos/NumeroBauhaus.tsx +21 -0
- package/kits/bauhaus/elementos/Overlay.tsx +18 -0
- package/kits/bauhaus/elementos/Som.tsx +30 -0
- package/kits/bauhaus/elementos/TituloBauhaus.tsx +32 -0
- package/kits/bauhaus/elementos/base.ts +74 -0
- package/kits/bauhaus/elementos/index.ts +16 -0
- package/kits/bauhaus/exemplos/plano.json +221 -0
- package/kits/bauhaus/exemplos/roteiro.md +20 -0
- package/kits/bauhaus/preview.tsx +12 -0
- package/kits/bauhaus/receita.json +174 -0
- package/kits/bauhaus/regras/area-segura.md +15 -0
- package/kits/bauhaus/regras/cor.md +13 -0
- package/kits/bauhaus/regras/movimento.md +17 -0
- package/kits/bauhaus/regras/ritmo.md +15 -0
- package/kits/bauhaus/regras/som.md +18 -0
- package/kits/bauhaus/regras/tipografia.md +20 -0
- package/kits/brutalista/SKILL.md +54 -0
- package/kits/brutalista/assets/ASSETS.md +23 -0
- package/kits/brutalista/assets/fontes/OFL-ArchivoBlack.txt +93 -0
- package/kits/brutalista/assets/fontes/OFL-JetBrainsMono.txt +93 -0
- package/kits/brutalista/assets/fontes/archivo-black.woff2 +0 -0
- package/kits/brutalista/assets/fontes/jetbrains-mono.woff2 +0 -0
- package/kits/brutalista/assets/sons/assinatura.mp3 +0 -0
- package/kits/brutalista/assets/sons/clique.mp3 +0 -0
- package/kits/brutalista/assets/sons/impacto.mp3 +0 -0
- package/kits/brutalista/assets/sons/pop-cartao.mp3 +0 -0
- package/kits/brutalista/assets/sons/pop-palavra.mp3 +0 -0
- package/kits/brutalista/assets/sons/subida.mp3 +0 -0
- package/kits/brutalista/assets/sons/swoosh.mp3 +0 -0
- package/kits/brutalista/assets/sons/whoosh-entra.mp3 +0 -0
- package/kits/brutalista/assets/sons/whoosh-sai.mp3 +0 -0
- package/kits/brutalista/assets/trilha/bruta-108bpm.mp3 +0 -0
- package/kits/brutalista/capa.jpg +0 -0
- package/kits/brutalista/elementos/AssinaturaMarca.tsx +21 -0
- package/kits/brutalista/elementos/BlocoSombra.tsx +18 -0
- package/kits/brutalista/elementos/Camera.tsx +23 -0
- package/kits/brutalista/elementos/CartaoFotoBruto.tsx +19 -0
- package/kits/brutalista/elementos/Cena.tsx +41 -0
- package/kits/brutalista/elementos/ContadorGrande.tsx +21 -0
- package/kits/brutalista/elementos/FitaAlerta.tsx +20 -0
- package/kits/brutalista/elementos/Fundo.tsx +9 -0
- package/kits/brutalista/elementos/ListaBruta.tsx +23 -0
- package/kits/brutalista/elementos/MonoEnorme.tsx +43 -0
- package/kits/brutalista/elementos/Montagem.tsx +62 -0
- package/kits/brutalista/elementos/QuadroCor.tsx +14 -0
- package/kits/brutalista/elementos/Som.tsx +38 -0
- package/kits/brutalista/elementos/Terminal.tsx +25 -0
- package/kits/brutalista/elementos/base.ts +71 -0
- package/kits/brutalista/elementos/index.ts +18 -0
- package/kits/brutalista/exemplos/fotos/foto-02.jpg +0 -0
- package/kits/brutalista/exemplos/fotos/foto-03.jpg +0 -0
- package/kits/brutalista/exemplos/fotos/foto-05.jpg +0 -0
- package/kits/brutalista/exemplos/fotos/foto-07.jpg +0 -0
- package/kits/brutalista/exemplos/fotos/foto-08.jpg +0 -0
- package/kits/brutalista/exemplos/logo-bloco.svg +1 -0
- package/kits/brutalista/exemplos/plano.json +52 -0
- package/kits/brutalista/exemplos/roteiro.md +19 -0
- package/kits/brutalista/preview.tsx +20 -0
- package/kits/brutalista/receita.json +195 -0
- package/kits/brutalista/regras/area-segura.md +18 -0
- package/kits/brutalista/regras/cor.md +12 -0
- package/kits/brutalista/regras/movimento.md +16 -0
- package/kits/brutalista/regras/ritmo.md +16 -0
- package/kits/brutalista/regras/som.md +21 -0
- package/kits/brutalista/regras/tipografia.md +16 -0
- package/kits/campos-de-cor/SKILL.md +55 -0
- package/kits/campos-de-cor/assets/ASSETS.md +19 -0
- package/kits/campos-de-cor/assets/fontes/OFL-Archivo-Black.txt +93 -0
- package/kits/campos-de-cor/assets/fontes/OFL-DM-Mono.txt +93 -0
- package/kits/campos-de-cor/assets/fontes/OFL-Playfair-Italic.txt +93 -0
- package/kits/campos-de-cor/assets/fontes/archivo-black.woff2 +0 -0
- package/kits/campos-de-cor/assets/fontes/dm-mono.woff2 +0 -0
- package/kits/campos-de-cor/assets/fontes/playfair-italic.woff2 +0 -0
- package/kits/campos-de-cor/assets/sons/assinatura.mp3 +0 -0
- package/kits/campos-de-cor/assets/sons/clique.mp3 +0 -0
- package/kits/campos-de-cor/assets/sons/impacto.mp3 +0 -0
- package/kits/campos-de-cor/assets/sons/pop-cartao.mp3 +0 -0
- package/kits/campos-de-cor/assets/sons/pop-palavra.mp3 +0 -0
- package/kits/campos-de-cor/assets/sons/subida.mp3 +0 -0
- package/kits/campos-de-cor/assets/sons/swoosh.mp3 +0 -0
- package/kits/campos-de-cor/assets/sons/whoosh-entra.mp3 +0 -0
- package/kits/campos-de-cor/assets/sons/whoosh-sai.mp3 +0 -0
- package/kits/campos-de-cor/assets/trilha/trilha.mp3 +0 -0
- package/kits/campos-de-cor/capa.jpg +0 -0
- package/kits/campos-de-cor/elementos/AssinaturaMarca.tsx +18 -0
- package/kits/campos-de-cor/elementos/Asterisco.tsx +26 -0
- package/kits/campos-de-cor/elementos/Camera.tsx +23 -0
- package/kits/campos-de-cor/elementos/CampoDeCor.tsx +39 -0
- package/kits/campos-de-cor/elementos/Cena.tsx +46 -0
- package/kits/campos-de-cor/elementos/FitaDeTexto.tsx +24 -0
- package/kits/campos-de-cor/elementos/FormaGeometrica.tsx +37 -0
- package/kits/campos-de-cor/elementos/Fundo.tsx +11 -0
- package/kits/campos-de-cor/elementos/LegendaItalica.tsx +12 -0
- package/kits/campos-de-cor/elementos/ListaRegua.tsx +30 -0
- package/kits/campos-de-cor/elementos/Montagem.tsx +62 -0
- package/kits/campos-de-cor/elementos/PalavraGigante.tsx +44 -0
- package/kits/campos-de-cor/elementos/Som.tsx +39 -0
- package/kits/campos-de-cor/elementos/base.ts +87 -0
- package/kits/campos-de-cor/elementos/index.ts +17 -0
- package/kits/campos-de-cor/exemplos/logo-pulso.svg +1 -0
- package/kits/campos-de-cor/exemplos/plano.json +258 -0
- package/kits/campos-de-cor/exemplos/roteiro.md +19 -0
- package/kits/campos-de-cor/preview.tsx +12 -0
- package/kits/campos-de-cor/receita.json +174 -0
- package/kits/campos-de-cor/regras/area-segura.md +15 -0
- package/kits/campos-de-cor/regras/cor.md +14 -0
- package/kits/campos-de-cor/regras/movimento.md +15 -0
- package/kits/campos-de-cor/regras/ritmo.md +15 -0
- package/kits/campos-de-cor/regras/som.md +18 -0
- package/kits/campos-de-cor/regras/tipografia.md +13 -0
- package/kits/cartaz-cinetico/SKILL.md +52 -0
- package/kits/cartaz-cinetico/assets/ASSETS.md +22 -0
- package/kits/cartaz-cinetico/assets/fontes/OFL-Anton.txt +93 -0
- package/kits/cartaz-cinetico/assets/fontes/OFL-Archivo.txt +93 -0
- package/kits/cartaz-cinetico/assets/fontes/anton.woff2 +0 -0
- package/kits/cartaz-cinetico/assets/fontes/archivo.woff2 +0 -0
- package/kits/cartaz-cinetico/assets/sons/assinatura.mp3 +0 -0
- package/kits/cartaz-cinetico/assets/sons/clique.mp3 +0 -0
- package/kits/cartaz-cinetico/assets/sons/impacto.mp3 +0 -0
- package/kits/cartaz-cinetico/assets/sons/pop-cartao.mp3 +0 -0
- package/kits/cartaz-cinetico/assets/sons/pop-palavra.mp3 +0 -0
- package/kits/cartaz-cinetico/assets/sons/subida.mp3 +0 -0
- package/kits/cartaz-cinetico/assets/sons/swoosh.mp3 +0 -0
- package/kits/cartaz-cinetico/assets/sons/whoosh-entra.mp3 +0 -0
- package/kits/cartaz-cinetico/assets/sons/whoosh-sai.mp3 +0 -0
- package/kits/cartaz-cinetico/assets/trilha/cartaz-124bpm.mp3 +0 -0
- package/kits/cartaz-cinetico/capa.jpg +0 -0
- package/kits/cartaz-cinetico/elementos/AssinaturaMarca.tsx +31 -0
- package/kits/cartaz-cinetico/elementos/Camera.tsx +22 -0
- package/kits/cartaz-cinetico/elementos/CartazPalavra.tsx +40 -0
- package/kits/cartaz-cinetico/elementos/Cena.tsx +41 -0
- package/kits/cartaz-cinetico/elementos/CirculoPoster.tsx +22 -0
- package/kits/cartaz-cinetico/elementos/EcoPalavra.tsx +27 -0
- package/kits/cartaz-cinetico/elementos/Fundo.tsx +16 -0
- package/kits/cartaz-cinetico/elementos/Montagem.tsx +59 -0
- package/kits/cartaz-cinetico/elementos/PilhaCartaz.tsx +40 -0
- package/kits/cartaz-cinetico/elementos/RoletaPalavras.tsx +30 -0
- package/kits/cartaz-cinetico/elementos/Selo.tsx +25 -0
- package/kits/cartaz-cinetico/elementos/Som.tsx +38 -0
- package/kits/cartaz-cinetico/elementos/base.ts +72 -0
- package/kits/cartaz-cinetico/elementos/index.ts +16 -0
- package/kits/cartaz-cinetico/exemplos/logo-feira.svg +1 -0
- package/kits/cartaz-cinetico/exemplos/plano.json +55 -0
- package/kits/cartaz-cinetico/exemplos/roteiro.md +20 -0
- package/kits/cartaz-cinetico/preview.tsx +16 -0
- package/kits/cartaz-cinetico/receita.json +209 -0
- package/kits/cartaz-cinetico/regras/area-segura.md +19 -0
- package/kits/cartaz-cinetico/regras/cor.md +13 -0
- package/kits/cartaz-cinetico/regras/movimento.md +16 -0
- package/kits/cartaz-cinetico/regras/ritmo.md +17 -0
- package/kits/cartaz-cinetico/regras/som.md +21 -0
- package/kits/cartaz-cinetico/regras/tipografia.md +16 -0
- package/kits/colagem/SKILL.md +53 -0
- package/kits/colagem/assets/ASSETS.md +25 -0
- package/kits/colagem/assets/fontes/OFL-abril-fatface.txt +93 -0
- package/kits/colagem/assets/fontes/OFL-special-elite.txt +93 -0
- package/kits/colagem/assets/fontes/abril-fatface.woff2 +0 -0
- package/kits/colagem/assets/fontes/special-elite.woff2 +0 -0
- package/kits/colagem/assets/sons/assinatura.mp3 +0 -0
- package/kits/colagem/assets/sons/clique.mp3 +0 -0
- package/kits/colagem/assets/sons/impacto.mp3 +0 -0
- package/kits/colagem/assets/sons/pop-cartao.mp3 +0 -0
- package/kits/colagem/assets/sons/pop-palavra.mp3 +0 -0
- package/kits/colagem/assets/sons/subida.mp3 +0 -0
- package/kits/colagem/assets/sons/swoosh.mp3 +0 -0
- package/kits/colagem/assets/sons/tick.mp3 +0 -0
- package/kits/colagem/assets/sons/whoosh-entra.mp3 +0 -0
- package/kits/colagem/assets/sons/whoosh-sai.mp3 +0 -0
- package/kits/colagem/assets/trilha/trilha.mp3 +0 -0
- package/kits/colagem/capa.jpg +0 -0
- package/kits/colagem/elementos/AssinaturaMarca.tsx +17 -0
- package/kits/colagem/elementos/Camera.tsx +21 -0
- package/kits/colagem/elementos/Cena.tsx +36 -0
- package/kits/colagem/elementos/FitaAdesiva.tsx +11 -0
- package/kits/colagem/elementos/FotoRasgada.tsx +26 -0
- package/kits/colagem/elementos/Fundo.tsx +16 -0
- package/kits/colagem/elementos/ListaRecortes.tsx +23 -0
- package/kits/colagem/elementos/Montagem.tsx +56 -0
- package/kits/colagem/elementos/NotaDatilografada.tsx +35 -0
- package/kits/colagem/elementos/Overlay.tsx +8 -0
- package/kits/colagem/elementos/RecorteForma.tsx +23 -0
- package/kits/colagem/elementos/Som.tsx +30 -0
- package/kits/colagem/elementos/TituloRecorte.tsx +34 -0
- package/kits/colagem/elementos/base.ts +77 -0
- package/kits/colagem/elementos/index.ts +17 -0
- package/kits/colagem/elementos/rasgado.ts +16 -0
- package/kits/colagem/exemplos/fotos/foto-01.jpg +0 -0
- package/kits/colagem/exemplos/fotos/foto-02.jpg +0 -0
- package/kits/colagem/exemplos/plano.json +228 -0
- package/kits/colagem/exemplos/roteiro.md +20 -0
- package/kits/colagem/preview.tsx +13 -0
- package/kits/colagem/receita.json +171 -0
- package/kits/colagem/regras/area-segura.md +15 -0
- package/kits/colagem/regras/cor.md +16 -0
- package/kits/colagem/regras/movimento.md +18 -0
- package/kits/colagem/regras/ritmo.md +15 -0
- package/kits/colagem/regras/som.md +18 -0
- package/kits/colagem/regras/tipografia.md +18 -0
- package/kits/contagem/SKILL.md +52 -0
- package/kits/contagem/assets/ASSETS.md +20 -0
- package/kits/contagem/assets/fontes/OFL-BigShouldersDisplay.txt +93 -0
- package/kits/contagem/assets/fontes/OFL-SpaceMono.txt +93 -0
- package/kits/contagem/assets/fontes/bigshoulders.woff2 +0 -0
- package/kits/contagem/assets/fontes/spacemono.woff2 +0 -0
- package/kits/contagem/assets/sons/assinatura.mp3 +0 -0
- package/kits/contagem/assets/sons/clique.mp3 +0 -0
- package/kits/contagem/assets/sons/confete.mp3 +0 -0
- package/kits/contagem/assets/sons/impacto.mp3 +0 -0
- package/kits/contagem/assets/sons/pop-cartao.mp3 +0 -0
- package/kits/contagem/assets/sons/pop-palavra.mp3 +0 -0
- package/kits/contagem/assets/sons/subida.mp3 +0 -0
- package/kits/contagem/assets/sons/swoosh.mp3 +0 -0
- package/kits/contagem/assets/sons/tick.mp3 +0 -0
- package/kits/contagem/assets/sons/whoosh-entra.mp3 +0 -0
- package/kits/contagem/assets/sons/whoosh-sai.mp3 +0 -0
- package/kits/contagem/assets/trilha/pulso-128bpm.mp3 +0 -0
- package/kits/contagem/capa.jpg +0 -0
- package/kits/contagem/elementos/AnelTempo.tsx +36 -0
- package/kits/contagem/elementos/BarraDias.tsx +41 -0
- package/kits/contagem/elementos/Camera.tsx +21 -0
- package/kits/contagem/elementos/CarimboData.tsx +37 -0
- package/kits/contagem/elementos/Cena.tsx +39 -0
- package/kits/contagem/elementos/Fundo.tsx +27 -0
- package/kits/contagem/elementos/Montagem.tsx +58 -0
- package/kits/contagem/elementos/NumeroRolando.tsx +49 -0
- package/kits/contagem/elementos/RelogioFlip.tsx +51 -0
- package/kits/contagem/elementos/Som.tsx +41 -0
- package/kits/contagem/elementos/base.ts +79 -0
- package/kits/contagem/elementos/index.ts +14 -0
- package/kits/contagem/exemplos/plano.json +48 -0
- package/kits/contagem/exemplos/roteiro.md +19 -0
- package/kits/contagem/preview.tsx +9 -0
- package/kits/contagem/receita.json +21 -0
- package/kits/contagem/regras/area-segura.md +16 -0
- package/kits/contagem/regras/cor.md +14 -0
- package/kits/contagem/regras/movimento.md +23 -0
- package/kits/contagem/regras/ritmo.md +15 -0
- package/kits/contagem/regras/som.md +21 -0
- package/kits/contagem/regras/tipografia.md +16 -0
- package/kits/convite-evento/SKILL.md +53 -0
- package/kits/convite-evento/assets/ASSETS.md +19 -0
- package/kits/convite-evento/assets/fontes/OFL-InstrumentSerif.txt +93 -0
- package/kits/convite-evento/assets/fontes/OFL-Unbounded.txt +93 -0
- package/kits/convite-evento/assets/fontes/instrumentserif-i.woff2 +0 -0
- package/kits/convite-evento/assets/fontes/unbounded.woff2 +0 -0
- package/kits/convite-evento/assets/sons/assinatura.mp3 +0 -0
- package/kits/convite-evento/assets/sons/clique.mp3 +0 -0
- package/kits/convite-evento/assets/sons/confete.mp3 +0 -0
- package/kits/convite-evento/assets/sons/impacto.mp3 +0 -0
- package/kits/convite-evento/assets/sons/pop-cartao.mp3 +0 -0
- package/kits/convite-evento/assets/sons/pop-palavra.mp3 +0 -0
- package/kits/convite-evento/assets/sons/subida.mp3 +0 -0
- package/kits/convite-evento/assets/sons/swoosh.mp3 +0 -0
- package/kits/convite-evento/assets/sons/whoosh-entra.mp3 +0 -0
- package/kits/convite-evento/assets/sons/whoosh-sai.mp3 +0 -0
- package/kits/convite-evento/assets/trilha/festa-112bpm.mp3 +0 -0
- package/kits/convite-evento/capa.jpg +0 -0
- package/kits/convite-evento/elementos/BotaoInscricao.tsx +36 -0
- package/kits/convite-evento/elementos/Camera.tsx +21 -0
- package/kits/convite-evento/elementos/Cena.tsx +39 -0
- package/kits/convite-evento/elementos/DataGigante.tsx +37 -0
- package/kits/convite-evento/elementos/Fundo.tsx +30 -0
- package/kits/convite-evento/elementos/IngressoBilhete.tsx +40 -0
- package/kits/convite-evento/elementos/LugarGigante.tsx +38 -0
- package/kits/convite-evento/elementos/Montagem.tsx +59 -0
- package/kits/convite-evento/elementos/SeloRotativo.tsx +32 -0
- package/kits/convite-evento/elementos/Som.tsx +40 -0
- package/kits/convite-evento/elementos/TituloEvento.tsx +33 -0
- package/kits/convite-evento/elementos/base.ts +82 -0
- package/kits/convite-evento/elementos/index.ts +15 -0
- package/kits/convite-evento/exemplos/plano.json +49 -0
- package/kits/convite-evento/exemplos/roteiro.md +19 -0
- package/kits/convite-evento/preview.tsx +9 -0
- package/kits/convite-evento/receita.json +21 -0
- package/kits/convite-evento/regras/area-segura.md +20 -0
- package/kits/convite-evento/regras/cor.md +13 -0
- package/kits/convite-evento/regras/movimento.md +20 -0
- package/kits/convite-evento/regras/ritmo.md +15 -0
- package/kits/convite-evento/regras/som.md +20 -0
- package/kits/convite-evento/regras/tipografia.md +18 -0
- package/kits/corte-podcast/SKILL.md +53 -0
- package/kits/corte-podcast/assets/ASSETS.md +19 -0
- package/kits/corte-podcast/assets/fontes/OFL-Anton.txt +93 -0
- package/kits/corte-podcast/assets/fontes/OFL-IBMPlexMono.txt +93 -0
- package/kits/corte-podcast/assets/fontes/anton.woff2 +0 -0
- package/kits/corte-podcast/assets/fontes/plexmono.woff2 +0 -0
- package/kits/corte-podcast/assets/sons/assinatura.mp3 +0 -0
- package/kits/corte-podcast/assets/sons/clique.mp3 +0 -0
- package/kits/corte-podcast/assets/sons/impacto.mp3 +0 -0
- package/kits/corte-podcast/assets/sons/pop-cartao.mp3 +0 -0
- package/kits/corte-podcast/assets/sons/pop-palavra.mp3 +0 -0
- package/kits/corte-podcast/assets/sons/subida.mp3 +0 -0
- package/kits/corte-podcast/assets/sons/swoosh.mp3 +0 -0
- package/kits/corte-podcast/assets/sons/tick.mp3 +0 -0
- package/kits/corte-podcast/assets/sons/whoosh-entra.mp3 +0 -0
- package/kits/corte-podcast/assets/sons/whoosh-sai.mp3 +0 -0
- package/kits/corte-podcast/assets/trilha/lofi-pulso-100bpm.mp3 +0 -0
- package/kits/corte-podcast/capa.jpg +0 -0
- package/kits/corte-podcast/elementos/BarraEpisodio.tsx +43 -0
- package/kits/corte-podcast/elementos/Camera.tsx +21 -0
- package/kits/corte-podcast/elementos/CartaoConvidado.tsx +32 -0
- package/kits/corte-podcast/elementos/Cena.tsx +41 -0
- package/kits/corte-podcast/elementos/CitacaoGrande.tsx +42 -0
- package/kits/corte-podcast/elementos/Fundo.tsx +27 -0
- package/kits/corte-podcast/elementos/LegendaKaraoke.tsx +32 -0
- package/kits/corte-podcast/elementos/Montagem.tsx +59 -0
- package/kits/corte-podcast/elementos/OndaAudio.tsx +41 -0
- package/kits/corte-podcast/elementos/SeloEpisodio.tsx +33 -0
- package/kits/corte-podcast/elementos/Som.tsx +40 -0
- package/kits/corte-podcast/elementos/base.ts +82 -0
- package/kits/corte-podcast/elementos/index.ts +15 -0
- package/kits/corte-podcast/exemplos/plano.json +62 -0
- package/kits/corte-podcast/exemplos/roteiro.md +20 -0
- package/kits/corte-podcast/preview.tsx +9 -0
- package/kits/corte-podcast/receita.json +21 -0
- package/kits/corte-podcast/regras/area-segura.md +18 -0
- package/kits/corte-podcast/regras/cor.md +15 -0
- package/kits/corte-podcast/regras/movimento.md +18 -0
- package/kits/corte-podcast/regras/ritmo.md +16 -0
- package/kits/corte-podcast/regras/som.md +20 -0
- package/kits/corte-podcast/regras/tipografia.md +16 -0
- package/kits/cubos/SKILL.md +51 -0
- package/kits/cubos/assets/ASSETS.md +21 -0
- package/kits/cubos/assets/fontes/OFL-ArchivoBlack.txt +92 -0
- package/kits/cubos/assets/fontes/OFL-DMSans.txt +92 -0
- package/kits/cubos/assets/fontes/archivoblack-latin.woff2 +0 -0
- package/kits/cubos/assets/fontes/dmsans-latin.woff2 +0 -0
- package/kits/cubos/assets/sons/assinatura.mp3 +0 -0
- package/kits/cubos/assets/sons/bloco.mp3 +0 -0
- package/kits/cubos/assets/sons/desmonta.mp3 +0 -0
- package/kits/cubos/assets/sons/encaixa.mp3 +0 -0
- package/kits/cubos/assets/sons/estala.mp3 +0 -0
- package/kits/cubos/assets/sons/gira.mp3 +0 -0
- package/kits/cubos/assets/sons/queda.mp3 +0 -0
- package/kits/cubos/assets/sons/whoosh.mp3 +0 -0
- package/kits/cubos/assets/trilha/calma-com-punch-108bpm.mp3 +0 -0
- package/kits/cubos/capa.jpg +0 -0
- package/kits/cubos/elementos/AssinaturaMarca.tsx +29 -0
- package/kits/cubos/elementos/Camera.tsx +22 -0
- package/kits/cubos/elementos/Cena.tsx +48 -0
- package/kits/cubos/elementos/Cubo.tsx +40 -0
- package/kits/cubos/elementos/CuboGiratorio.tsx +37 -0
- package/kits/cubos/elementos/Fundo.tsx +15 -0
- package/kits/cubos/elementos/Montagem.tsx +67 -0
- package/kits/cubos/elementos/MontagemDeCubos.tsx +58 -0
- package/kits/cubos/elementos/PlacaBloco.tsx +29 -0
- package/kits/cubos/elementos/Som.tsx +33 -0
- package/kits/cubos/elementos/TorreDeCubos.tsx +39 -0
- package/kits/cubos/elementos/base.ts +97 -0
- package/kits/cubos/elementos/index.ts +15 -0
- package/kits/cubos/exemplos/logo-encaixa.svg +1 -0
- package/kits/cubos/exemplos/plano.json +45 -0
- package/kits/cubos/exemplos/roteiro.md +20 -0
- package/kits/cubos/preview.tsx +12 -0
- package/kits/cubos/receita.json +151 -0
- package/kits/cubos/regras/area-segura.md +18 -0
- package/kits/cubos/regras/cor.md +23 -0
- package/kits/cubos/regras/movimento.md +17 -0
- package/kits/cubos/regras/ritmo.md +14 -0
- package/kits/cubos/regras/som.md +20 -0
- package/kits/cubos/regras/tipografia.md +15 -0
- package/kits/dashboard-dados/SKILL.md +51 -0
- package/kits/dashboard-dados/assets/ASSETS.md +18 -0
- package/kits/dashboard-dados/assets/fontes/OFL-IBM-Plex-Mono.txt +93 -0
- package/kits/dashboard-dados/assets/fontes/OFL-Montserrat.txt +93 -0
- package/kits/dashboard-dados/assets/fontes/montserrat.woff2 +0 -0
- package/kits/dashboard-dados/assets/fontes/plex-mono.woff2 +0 -0
- package/kits/dashboard-dados/assets/sons/assinatura.mp3 +0 -0
- package/kits/dashboard-dados/assets/sons/clique.mp3 +0 -0
- package/kits/dashboard-dados/assets/sons/impacto.mp3 +0 -0
- package/kits/dashboard-dados/assets/sons/pop-cartao.mp3 +0 -0
- package/kits/dashboard-dados/assets/sons/pop-palavra.mp3 +0 -0
- package/kits/dashboard-dados/assets/sons/subida.mp3 +0 -0
- package/kits/dashboard-dados/assets/sons/swoosh.mp3 +0 -0
- package/kits/dashboard-dados/assets/sons/whoosh-entra.mp3 +0 -0
- package/kits/dashboard-dados/assets/sons/whoosh-sai.mp3 +0 -0
- package/kits/dashboard-dados/assets/trilha/trilha.mp3 +0 -0
- package/kits/dashboard-dados/capa.jpg +0 -0
- package/kits/dashboard-dados/elementos/AssinaturaMarca.tsx +19 -0
- package/kits/dashboard-dados/elementos/BarrasCrescendo.tsx +27 -0
- package/kits/dashboard-dados/elementos/Camera.tsx +23 -0
- package/kits/dashboard-dados/elementos/Cena.tsx +46 -0
- package/kits/dashboard-dados/elementos/Fundo.tsx +12 -0
- package/kits/dashboard-dados/elementos/LinhaTendencia.tsx +29 -0
- package/kits/dashboard-dados/elementos/Montagem.tsx +60 -0
- package/kits/dashboard-dados/elementos/NumeroGigante.tsx +21 -0
- package/kits/dashboard-dados/elementos/RankingBarras.tsx +27 -0
- package/kits/dashboard-dados/elementos/RoscaDados.tsx +39 -0
- package/kits/dashboard-dados/elementos/Som.tsx +39 -0
- package/kits/dashboard-dados/elementos/base.ts +87 -0
- package/kits/dashboard-dados/elementos/index.ts +16 -0
- package/kits/dashboard-dados/exemplos/logo-radar.svg +1 -0
- package/kits/dashboard-dados/exemplos/plano.json +325 -0
- package/kits/dashboard-dados/exemplos/roteiro.md +20 -0
- package/kits/dashboard-dados/preview.tsx +12 -0
- package/kits/dashboard-dados/receita.json +173 -0
- package/kits/dashboard-dados/regras/area-segura.md +13 -0
- package/kits/dashboard-dados/regras/cor.md +17 -0
- package/kits/dashboard-dados/regras/movimento.md +17 -0
- package/kits/dashboard-dados/regras/ritmo.md +14 -0
- package/kits/dashboard-dados/regras/som.md +18 -0
- package/kits/dashboard-dados/regras/tipografia.md +16 -0
- package/kits/depoimento/SKILL.md +54 -0
- package/kits/depoimento/assets/ASSETS.md +20 -0
- package/kits/depoimento/assets/fontes/OFL-Newsreader.txt +93 -0
- package/kits/depoimento/assets/fontes/OFL-SpaceGrotesk.txt +93 -0
- package/kits/depoimento/assets/fontes/newsreader-i.woff2 +0 -0
- package/kits/depoimento/assets/fontes/spacegrotesk.woff2 +0 -0
- package/kits/depoimento/assets/sons/assinatura.mp3 +0 -0
- package/kits/depoimento/assets/sons/clique.mp3 +0 -0
- package/kits/depoimento/assets/sons/estrela.mp3 +0 -0
- package/kits/depoimento/assets/sons/impacto.mp3 +0 -0
- package/kits/depoimento/assets/sons/pop-cartao.mp3 +0 -0
- package/kits/depoimento/assets/sons/pop-palavra.mp3 +0 -0
- package/kits/depoimento/assets/sons/subida.mp3 +0 -0
- package/kits/depoimento/assets/sons/swoosh.mp3 +0 -0
- package/kits/depoimento/assets/sons/verificado.mp3 +0 -0
- package/kits/depoimento/assets/sons/whoosh-entra.mp3 +0 -0
- package/kits/depoimento/assets/sons/whoosh-sai.mp3 +0 -0
- package/kits/depoimento/assets/trilha/calor-104bpm.mp3 +0 -0
- package/kits/depoimento/capa.jpg +0 -0
- package/kits/depoimento/elementos/Avatar.tsx +37 -0
- package/kits/depoimento/elementos/Camera.tsx +21 -0
- package/kits/depoimento/elementos/CartaoDepoimento.tsx +69 -0
- package/kits/depoimento/elementos/Cena.tsx +39 -0
- package/kits/depoimento/elementos/Estrelas.tsx +34 -0
- package/kits/depoimento/elementos/FaixaAvatares.tsx +41 -0
- package/kits/depoimento/elementos/Fundo.tsx +23 -0
- package/kits/depoimento/elementos/Montagem.tsx +60 -0
- package/kits/depoimento/elementos/NotaGigante.tsx +38 -0
- package/kits/depoimento/elementos/PilhaCartoes.tsx +37 -0
- package/kits/depoimento/elementos/SeloVerificado.tsx +29 -0
- package/kits/depoimento/elementos/Som.tsx +41 -0
- package/kits/depoimento/elementos/base.ts +83 -0
- package/kits/depoimento/elementos/index.ts +16 -0
- package/kits/depoimento/exemplos/plano.json +57 -0
- package/kits/depoimento/exemplos/roteiro.md +19 -0
- package/kits/depoimento/preview.tsx +9 -0
- package/kits/depoimento/receita.json +21 -0
- package/kits/depoimento/regras/area-segura.md +17 -0
- package/kits/depoimento/regras/cor.md +16 -0
- package/kits/depoimento/regras/movimento.md +20 -0
- package/kits/depoimento/regras/ritmo.md +15 -0
- package/kits/depoimento/regras/som.md +21 -0
- package/kits/depoimento/regras/tipografia.md +17 -0
- package/kits/estudio/package.json +13 -0
- package/kits/estudio/render.mjs +48 -0
- package/kits/infografico/SKILL.md +54 -0
- package/kits/infografico/assets/ASSETS.md +19 -0
- package/kits/infografico/assets/fontes/OFL-Caveat.txt +93 -0
- package/kits/infografico/assets/fontes/OFL-Outfit.txt +93 -0
- package/kits/infografico/assets/fontes/caveat.woff2 +0 -0
- package/kits/infografico/assets/fontes/outfit.woff2 +0 -0
- package/kits/infografico/assets/sons/assinatura.mp3 +0 -0
- package/kits/infografico/assets/sons/clique.mp3 +0 -0
- package/kits/infografico/assets/sons/impacto.mp3 +0 -0
- package/kits/infografico/assets/sons/pop-cartao.mp3 +0 -0
- package/kits/infografico/assets/sons/pop-palavra.mp3 +0 -0
- package/kits/infografico/assets/sons/subida.mp3 +0 -0
- package/kits/infografico/assets/sons/swoosh.mp3 +0 -0
- package/kits/infografico/assets/sons/traco.mp3 +0 -0
- package/kits/infografico/assets/sons/whoosh-entra.mp3 +0 -0
- package/kits/infografico/assets/sons/whoosh-sai.mp3 +0 -0
- package/kits/infografico/assets/trilha/explica-100bpm.mp3 +0 -0
- package/kits/infografico/capa.jpg +0 -0
- package/kits/infografico/elementos/Anotacao.tsx +34 -0
- package/kits/infografico/elementos/CadeiaPassos.tsx +49 -0
- package/kits/infografico/elementos/Camera.tsx +21 -0
- package/kits/infografico/elementos/Cena.tsx +39 -0
- package/kits/infografico/elementos/Fundo.tsx +23 -0
- package/kits/infografico/elementos/GraficoBarras.tsx +41 -0
- package/kits/infografico/elementos/Icone.tsx +35 -0
- package/kits/infografico/elementos/Montagem.tsx +60 -0
- package/kits/infografico/elementos/NoProcesso.tsx +33 -0
- package/kits/infografico/elementos/NumeroDestaque.tsx +35 -0
- package/kits/infografico/elementos/SetaCurva.tsx +33 -0
- package/kits/infografico/elementos/Som.tsx +40 -0
- package/kits/infografico/elementos/base.ts +80 -0
- package/kits/infografico/elementos/index.ts +16 -0
- package/kits/infografico/exemplos/plano.json +49 -0
- package/kits/infografico/exemplos/roteiro.md +19 -0
- package/kits/infografico/preview.tsx +9 -0
- package/kits/infografico/receita.json +21 -0
- package/kits/infografico/regras/area-segura.md +17 -0
- package/kits/infografico/regras/cor.md +15 -0
- package/kits/infografico/regras/movimento.md +20 -0
- package/kits/infografico/regras/ritmo.md +15 -0
- package/kits/infografico/regras/som.md +20 -0
- package/kits/infografico/regras/tipografia.md +16 -0
- package/kits/isometrico/SKILL.md +52 -0
- package/kits/isometrico/assets/ASSETS.md +18 -0
- package/kits/isometrico/assets/fontes/OFL-Archivo.txt +93 -0
- package/kits/isometrico/assets/fontes/OFL-Jost.txt +93 -0
- package/kits/isometrico/assets/fontes/archivo.woff2 +0 -0
- package/kits/isometrico/assets/fontes/jost.woff2 +0 -0
- package/kits/isometrico/assets/sons/assinatura.mp3 +0 -0
- package/kits/isometrico/assets/sons/clique.mp3 +0 -0
- package/kits/isometrico/assets/sons/impacto.mp3 +0 -0
- package/kits/isometrico/assets/sons/pop-cartao.mp3 +0 -0
- package/kits/isometrico/assets/sons/pop-palavra.mp3 +0 -0
- package/kits/isometrico/assets/sons/subida.mp3 +0 -0
- package/kits/isometrico/assets/sons/swoosh.mp3 +0 -0
- package/kits/isometrico/assets/sons/whoosh-entra.mp3 +0 -0
- package/kits/isometrico/assets/sons/whoosh-sai.mp3 +0 -0
- package/kits/isometrico/assets/trilha/trilha.mp3 +0 -0
- package/kits/isometrico/capa.jpg +0 -0
- package/kits/isometrico/elementos/AssinaturaMarca.tsx +24 -0
- package/kits/isometrico/elementos/BlocosMontando.tsx +36 -0
- package/kits/isometrico/elementos/Camera.tsx +23 -0
- package/kits/isometrico/elementos/Cena.tsx +46 -0
- package/kits/isometrico/elementos/CidadeDeDados.tsx +33 -0
- package/kits/isometrico/elementos/Fundo.tsx +13 -0
- package/kits/isometrico/elementos/LegendaPlaca.tsx +18 -0
- package/kits/isometrico/elementos/Montagem.tsx +60 -0
- package/kits/isometrico/elementos/RedeDeBlocos.tsx +41 -0
- package/kits/isometrico/elementos/Som.tsx +39 -0
- package/kits/isometrico/elementos/TextoNoChao.tsx +28 -0
- package/kits/isometrico/elementos/base.ts +86 -0
- package/kits/isometrico/elementos/index.ts +16 -0
- package/kits/isometrico/elementos/iso.tsx +49 -0
- package/kits/isometrico/exemplos/logo-nodo.svg +1 -0
- package/kits/isometrico/exemplos/plano.json +433 -0
- package/kits/isometrico/exemplos/roteiro.md +20 -0
- package/kits/isometrico/preview.tsx +12 -0
- package/kits/isometrico/receita.json +155 -0
- package/kits/isometrico/regras/area-segura.md +13 -0
- package/kits/isometrico/regras/cor.md +18 -0
- package/kits/isometrico/regras/movimento.md +16 -0
- package/kits/isometrico/regras/ritmo.md +13 -0
- package/kits/isometrico/regras/som.md +18 -0
- package/kits/isometrico/regras/tipografia.md +12 -0
- package/kits/jornal/SKILL.md +54 -0
- package/kits/jornal/assets/ASSETS.md +24 -0
- package/kits/jornal/assets/fontes/OFL-PlayfairDisplay.txt +93 -0
- package/kits/jornal/assets/fontes/OFL-UnifrakturMaguntia.txt +93 -0
- package/kits/jornal/assets/fontes/playfair-italic.woff2 +0 -0
- package/kits/jornal/assets/fontes/playfair.woff2 +0 -0
- package/kits/jornal/assets/fontes/unifraktur.woff2 +0 -0
- package/kits/jornal/assets/sons/assinatura.mp3 +0 -0
- package/kits/jornal/assets/sons/clique.mp3 +0 -0
- package/kits/jornal/assets/sons/impacto.mp3 +0 -0
- package/kits/jornal/assets/sons/pop-cartao.mp3 +0 -0
- package/kits/jornal/assets/sons/pop-palavra.mp3 +0 -0
- package/kits/jornal/assets/sons/subida.mp3 +0 -0
- package/kits/jornal/assets/sons/swoosh.mp3 +0 -0
- package/kits/jornal/assets/sons/whoosh-entra.mp3 +0 -0
- package/kits/jornal/assets/sons/whoosh-sai.mp3 +0 -0
- package/kits/jornal/assets/trilha/redacao-96bpm.mp3 +0 -0
- package/kits/jornal/capa.jpg +0 -0
- package/kits/jornal/elementos/AssinaturaMarca.tsx +25 -0
- package/kits/jornal/elementos/Cabecalho.tsx +21 -0
- package/kits/jornal/elementos/Camera.tsx +22 -0
- package/kits/jornal/elementos/Carimbo.tsx +18 -0
- package/kits/jornal/elementos/Cena.tsx +41 -0
- package/kits/jornal/elementos/Colunas.tsx +24 -0
- package/kits/jornal/elementos/FotoMeiaTinta.tsx +20 -0
- package/kits/jornal/elementos/Fundo.tsx +18 -0
- package/kits/jornal/elementos/JornalGirando.tsx +27 -0
- package/kits/jornal/elementos/Manchete.tsx +30 -0
- package/kits/jornal/elementos/Montagem.tsx +61 -0
- package/kits/jornal/elementos/Som.tsx +38 -0
- package/kits/jornal/elementos/Ticker.tsx +19 -0
- package/kits/jornal/elementos/base.ts +76 -0
- package/kits/jornal/elementos/index.ts +17 -0
- package/kits/jornal/exemplos/fotos/foto-03.jpg +0 -0
- package/kits/jornal/exemplos/fotos/foto-07.jpg +0 -0
- package/kits/jornal/exemplos/logo-esquina.svg +1 -0
- package/kits/jornal/exemplos/plano.json +48 -0
- package/kits/jornal/exemplos/roteiro.md +19 -0
- package/kits/jornal/preview.tsx +17 -0
- package/kits/jornal/receita.json +170 -0
- package/kits/jornal/regras/area-segura.md +19 -0
- package/kits/jornal/regras/cor.md +14 -0
- package/kits/jornal/regras/movimento.md +16 -0
- package/kits/jornal/regras/ritmo.md +15 -0
- package/kits/jornal/regras/som.md +21 -0
- package/kits/jornal/regras/tipografia.md +17 -0
- package/kits/legenda-viva/SKILL.md +52 -0
- package/kits/legenda-viva/assets/ASSETS.md +23 -0
- package/kits/legenda-viva/assets/fontes/OFL-Inter.txt +93 -0
- package/kits/legenda-viva/assets/fontes/OFL-Montserrat.txt +93 -0
- package/kits/legenda-viva/assets/fontes/inter.woff2 +0 -0
- package/kits/legenda-viva/assets/fontes/montserrat.woff2 +0 -0
- package/kits/legenda-viva/assets/sons/assinatura.mp3 +0 -0
- package/kits/legenda-viva/assets/sons/clique.mp3 +0 -0
- package/kits/legenda-viva/assets/sons/impacto.mp3 +0 -0
- package/kits/legenda-viva/assets/sons/pop-cartao.mp3 +0 -0
- package/kits/legenda-viva/assets/sons/pop-palavra.mp3 +0 -0
- package/kits/legenda-viva/assets/sons/subida.mp3 +0 -0
- package/kits/legenda-viva/assets/sons/swoosh.mp3 +0 -0
- package/kits/legenda-viva/assets/sons/whoosh-entra.mp3 +0 -0
- package/kits/legenda-viva/assets/sons/whoosh-sai.mp3 +0 -0
- package/kits/legenda-viva/assets/trilha/voz-118bpm.mp3 +0 -0
- package/kits/legenda-viva/capa.jpg +0 -0
- package/kits/legenda-viva/elementos/AssinaturaMarca.tsx +29 -0
- package/kits/legenda-viva/elementos/Camera.tsx +22 -0
- package/kits/legenda-viva/elementos/Cena.tsx +41 -0
- package/kits/legenda-viva/elementos/ChipTema.tsx +19 -0
- package/kits/legenda-viva/elementos/Fundo.tsx +6 -0
- package/kits/legenda-viva/elementos/LegendaCaixa.tsx +36 -0
- package/kits/legenda-viva/elementos/LegendaPalavra.tsx +32 -0
- package/kits/legenda-viva/elementos/Montagem.tsx +59 -0
- package/kits/legenda-viva/elementos/OndaVoz.tsx +23 -0
- package/kits/legenda-viva/elementos/PalavraGigante.tsx +18 -0
- package/kits/legenda-viva/elementos/QuadroFalante.tsx +17 -0
- package/kits/legenda-viva/elementos/Som.tsx +38 -0
- package/kits/legenda-viva/elementos/base.ts +73 -0
- package/kits/legenda-viva/elementos/index.ts +16 -0
- package/kits/legenda-viva/exemplos/fotos/foto-01.jpg +0 -0
- package/kits/legenda-viva/exemplos/fotos/foto-02.jpg +0 -0
- package/kits/legenda-viva/exemplos/fotos/foto-03.jpg +0 -0
- package/kits/legenda-viva/exemplos/fotos/foto-05.jpg +0 -0
- package/kits/legenda-viva/exemplos/logo-dica.svg +1 -0
- package/kits/legenda-viva/exemplos/plano.json +45 -0
- package/kits/legenda-viva/exemplos/roteiro.md +18 -0
- package/kits/legenda-viva/preview.tsx +19 -0
- package/kits/legenda-viva/receita.json +171 -0
- package/kits/legenda-viva/regras/area-segura.md +19 -0
- package/kits/legenda-viva/regras/cor.md +14 -0
- package/kits/legenda-viva/regras/movimento.md +16 -0
- package/kits/legenda-viva/regras/ritmo.md +15 -0
- package/kits/legenda-viva/regras/som.md +21 -0
- package/kits/legenda-viva/regras/tipografia.md +16 -0
- package/kits/luxo/SKILL.md +55 -0
- package/kits/luxo/assets/ASSETS.md +20 -0
- package/kits/luxo/assets/fontes/OFL-CormorantGaramond.txt +93 -0
- package/kits/luxo/assets/fontes/OFL-Jost.txt +93 -0
- package/kits/luxo/assets/fontes/cormorant-i.woff2 +0 -0
- package/kits/luxo/assets/fontes/cormorant.woff2 +0 -0
- package/kits/luxo/assets/fontes/jost.woff2 +0 -0
- package/kits/luxo/assets/sons/assinatura.mp3 +0 -0
- package/kits/luxo/assets/sons/clique.mp3 +0 -0
- package/kits/luxo/assets/sons/impacto.mp3 +0 -0
- package/kits/luxo/assets/sons/pop-cartao.mp3 +0 -0
- package/kits/luxo/assets/sons/pop-palavra.mp3 +0 -0
- package/kits/luxo/assets/sons/sino.mp3 +0 -0
- package/kits/luxo/assets/sons/subida.mp3 +0 -0
- package/kits/luxo/assets/sons/swoosh.mp3 +0 -0
- package/kits/luxo/assets/sons/whoosh-entra.mp3 +0 -0
- package/kits/luxo/assets/sons/whoosh-sai.mp3 +0 -0
- package/kits/luxo/assets/trilha/ambar-78bpm.mp3 +0 -0
- package/kits/luxo/capa.jpg +0 -0
- package/kits/luxo/elementos/Camera.tsx +21 -0
- package/kits/luxo/elementos/Cena.tsx +36 -0
- package/kits/luxo/elementos/ConviteOuro.tsx +34 -0
- package/kits/luxo/elementos/Fundo.tsx +26 -0
- package/kits/luxo/elementos/LegendaFina.tsx +25 -0
- package/kits/luxo/elementos/LinhaOuro.tsx +24 -0
- package/kits/luxo/elementos/MolduraArco.tsx +36 -0
- package/kits/luxo/elementos/Monograma.tsx +35 -0
- package/kits/luxo/elementos/Montagem.tsx +59 -0
- package/kits/luxo/elementos/Som.tsx +40 -0
- package/kits/luxo/elementos/TituloSerifa.tsx +35 -0
- package/kits/luxo/elementos/base.ts +85 -0
- package/kits/luxo/elementos/index.ts +15 -0
- package/kits/luxo/exemplos/fotos/foto-07.jpg +0 -0
- package/kits/luxo/exemplos/fotos/foto-08.jpg +0 -0
- package/kits/luxo/exemplos/plano.json +145 -0
- package/kits/luxo/exemplos/roteiro.md +18 -0
- package/kits/luxo/preview.tsx +13 -0
- package/kits/luxo/receita.json +18 -0
- package/kits/luxo/regras/area-segura.md +16 -0
- package/kits/luxo/regras/cor.md +16 -0
- package/kits/luxo/regras/movimento.md +19 -0
- package/kits/luxo/regras/ritmo.md +14 -0
- package/kits/luxo/regras/som.md +21 -0
- package/kits/luxo/regras/tipografia.md +17 -0
- package/kits/manifest.json +552 -0
- package/kits/mapa/SKILL.md +54 -0
- package/kits/mapa/assets/ASSETS.md +20 -0
- package/kits/mapa/assets/fontes/OFL-DMMono.txt +93 -0
- package/kits/mapa/assets/fontes/OFL-DMSans.txt +93 -0
- package/kits/mapa/assets/fontes/dmmono.woff2 +0 -0
- package/kits/mapa/assets/fontes/dmsans.woff2 +0 -0
- package/kits/mapa/assets/sons/assinatura.mp3 +0 -0
- package/kits/mapa/assets/sons/clique.mp3 +0 -0
- package/kits/mapa/assets/sons/impacto.mp3 +0 -0
- package/kits/mapa/assets/sons/pop-cartao.mp3 +0 -0
- package/kits/mapa/assets/sons/pop-palavra.mp3 +0 -0
- package/kits/mapa/assets/sons/quique.mp3 +0 -0
- package/kits/mapa/assets/sons/subida.mp3 +0 -0
- package/kits/mapa/assets/sons/swoosh.mp3 +0 -0
- package/kits/mapa/assets/sons/traco.mp3 +0 -0
- package/kits/mapa/assets/sons/whoosh-entra.mp3 +0 -0
- package/kits/mapa/assets/sons/whoosh-sai.mp3 +0 -0
- package/kits/mapa/assets/trilha/rota-100bpm.mp3 +0 -0
- package/kits/mapa/capa.jpg +0 -0
- package/kits/mapa/elementos/Camera.tsx +21 -0
- package/kits/mapa/elementos/CartaoEndereco.tsx +40 -0
- package/kits/mapa/elementos/Cena.tsx +41 -0
- package/kits/mapa/elementos/ChipTempo.tsx +29 -0
- package/kits/mapa/elementos/Fundo.tsx +25 -0
- package/kits/mapa/elementos/MapaBase.tsx +63 -0
- package/kits/mapa/elementos/Montagem.tsx +59 -0
- package/kits/mapa/elementos/Pino.tsx +38 -0
- package/kits/mapa/elementos/RotaAnimada.tsx +38 -0
- package/kits/mapa/elementos/Som.tsx +41 -0
- package/kits/mapa/elementos/TituloLocal.tsx +38 -0
- package/kits/mapa/elementos/base.ts +89 -0
- package/kits/mapa/elementos/index.ts +15 -0
- package/kits/mapa/exemplos/plano.json +48 -0
- package/kits/mapa/exemplos/roteiro.md +19 -0
- package/kits/mapa/preview.tsx +9 -0
- package/kits/mapa/receita.json +21 -0
- package/kits/mapa/regras/area-segura.md +15 -0
- package/kits/mapa/regras/cor.md +18 -0
- package/kits/mapa/regras/movimento.md +21 -0
- package/kits/mapa/regras/ritmo.md +15 -0
- package/kits/mapa/regras/som.md +21 -0
- package/kits/mapa/regras/tipografia.md +16 -0
- package/kits/massinha/SKILL.md +53 -0
- package/kits/massinha/assets/ASSETS.md +18 -0
- package/kits/massinha/assets/fontes/OFL-chewy.txt +93 -0
- package/kits/massinha/assets/fontes/OFL-nunito-800.txt +93 -0
- package/kits/massinha/assets/fontes/chewy.woff2 +0 -0
- package/kits/massinha/assets/fontes/nunito-800.woff2 +0 -0
- package/kits/massinha/assets/sons/assinatura.mp3 +0 -0
- package/kits/massinha/assets/sons/clique.mp3 +0 -0
- package/kits/massinha/assets/sons/impacto.mp3 +0 -0
- package/kits/massinha/assets/sons/pop-cartao.mp3 +0 -0
- package/kits/massinha/assets/sons/pop-palavra.mp3 +0 -0
- package/kits/massinha/assets/sons/subida.mp3 +0 -0
- package/kits/massinha/assets/sons/swoosh.mp3 +0 -0
- package/kits/massinha/assets/sons/tick.mp3 +0 -0
- package/kits/massinha/assets/sons/whoosh-entra.mp3 +0 -0
- package/kits/massinha/assets/sons/whoosh-sai.mp3 +0 -0
- package/kits/massinha/assets/trilha/trilha.mp3 +0 -0
- package/kits/massinha/capa.jpg +0 -0
- package/kits/massinha/elementos/AssinaturaMarca.tsx +20 -0
- package/kits/massinha/elementos/BichinhoMassa.tsx +30 -0
- package/kits/massinha/elementos/BolasMassa.tsx +25 -0
- package/kits/massinha/elementos/Camera.tsx +21 -0
- package/kits/massinha/elementos/Cena.tsx +36 -0
- package/kits/massinha/elementos/FormaMassa.tsx +23 -0
- package/kits/massinha/elementos/Fundo.tsx +12 -0
- package/kits/massinha/elementos/ListaMassa.tsx +19 -0
- package/kits/massinha/elementos/Montagem.tsx +56 -0
- package/kits/massinha/elementos/Overlay.tsx +11 -0
- package/kits/massinha/elementos/PlacaMassa.tsx +24 -0
- package/kits/massinha/elementos/Som.tsx +30 -0
- package/kits/massinha/elementos/TituloMassa.tsx +31 -0
- package/kits/massinha/elementos/argila.ts +21 -0
- package/kits/massinha/elementos/base.ts +79 -0
- package/kits/massinha/elementos/index.ts +17 -0
- package/kits/massinha/exemplos/plano.json +220 -0
- package/kits/massinha/exemplos/roteiro.md +20 -0
- package/kits/massinha/preview.tsx +12 -0
- package/kits/massinha/receita.json +170 -0
- package/kits/massinha/regras/area-segura.md +15 -0
- package/kits/massinha/regras/cor.md +18 -0
- package/kits/massinha/regras/movimento.md +17 -0
- package/kits/massinha/regras/ritmo.md +15 -0
- package/kits/massinha/regras/som.md +17 -0
- package/kits/massinha/regras/tipografia.md +18 -0
- package/kits/memphis/SKILL.md +52 -0
- package/kits/memphis/assets/ASSETS.md +18 -0
- package/kits/memphis/assets/fontes/OFL-bowlby-one.txt +93 -0
- package/kits/memphis/assets/fontes/OFL-dm-sans-800.txt +93 -0
- package/kits/memphis/assets/fontes/bowlby-one.woff2 +0 -0
- package/kits/memphis/assets/fontes/dm-sans-800.woff2 +0 -0
- package/kits/memphis/assets/sons/assinatura.mp3 +0 -0
- package/kits/memphis/assets/sons/clique.mp3 +0 -0
- package/kits/memphis/assets/sons/impacto.mp3 +0 -0
- package/kits/memphis/assets/sons/pop-cartao.mp3 +0 -0
- package/kits/memphis/assets/sons/pop-palavra.mp3 +0 -0
- package/kits/memphis/assets/sons/subida.mp3 +0 -0
- package/kits/memphis/assets/sons/swoosh.mp3 +0 -0
- package/kits/memphis/assets/sons/tick.mp3 +0 -0
- package/kits/memphis/assets/sons/whoosh-entra.mp3 +0 -0
- package/kits/memphis/assets/sons/whoosh-sai.mp3 +0 -0
- package/kits/memphis/assets/trilha/trilha.mp3 +0 -0
- package/kits/memphis/capa.jpg +0 -0
- package/kits/memphis/elementos/AssinaturaMarca.tsx +20 -0
- package/kits/memphis/elementos/Camera.tsx +21 -0
- package/kits/memphis/elementos/CartaoMemphis.tsx +16 -0
- package/kits/memphis/elementos/Cena.tsx +36 -0
- package/kits/memphis/elementos/FitaMarquee.tsx +21 -0
- package/kits/memphis/elementos/FormasMemphis.tsx +46 -0
- package/kits/memphis/elementos/Fundo.tsx +15 -0
- package/kits/memphis/elementos/ListaPilulas.tsx +17 -0
- package/kits/memphis/elementos/Montagem.tsx +56 -0
- package/kits/memphis/elementos/NumeroGigante.tsx +19 -0
- package/kits/memphis/elementos/Overlay.tsx +23 -0
- package/kits/memphis/elementos/Som.tsx +30 -0
- package/kits/memphis/elementos/TituloMemphis.tsx +28 -0
- package/kits/memphis/elementos/base.ts +78 -0
- package/kits/memphis/elementos/index.ts +17 -0
- package/kits/memphis/exemplos/plano.json +314 -0
- package/kits/memphis/exemplos/roteiro.md +20 -0
- package/kits/memphis/preview.tsx +12 -0
- package/kits/memphis/receita.json +174 -0
- package/kits/memphis/regras/area-segura.md +14 -0
- package/kits/memphis/regras/cor.md +17 -0
- package/kits/memphis/regras/movimento.md +18 -0
- package/kits/memphis/regras/ritmo.md +15 -0
- package/kits/memphis/regras/som.md +18 -0
- package/kits/memphis/regras/tipografia.md +19 -0
- package/kits/metal-liquido/SKILL.md +51 -0
- package/kits/metal-liquido/assets/ASSETS.md +21 -0
- package/kits/metal-liquido/assets/fontes/OFL-SpaceGrotesk.txt +92 -0
- package/kits/metal-liquido/assets/fontes/OFL-Unbounded.txt +92 -0
- package/kits/metal-liquido/assets/fontes/grotesk-latin.woff2 +0 -0
- package/kits/metal-liquido/assets/fontes/unbounded-latin.woff2 +0 -0
- package/kits/metal-liquido/assets/sons/assinatura.mp3 +0 -0
- package/kits/metal-liquido/assets/sons/clique.mp3 +0 -0
- package/kits/metal-liquido/assets/sons/cromo.mp3 +0 -0
- package/kits/metal-liquido/assets/sons/liquido.mp3 +0 -0
- package/kits/metal-liquido/assets/sons/quique.mp3 +0 -0
- package/kits/metal-liquido/assets/sons/subida.mp3 +0 -0
- package/kits/metal-liquido/assets/sons/varre.mp3 +0 -0
- package/kits/metal-liquido/assets/sons/whoosh.mp3 +0 -0
- package/kits/metal-liquido/assets/trilha/sombrio-114bpm.mp3 +0 -0
- package/kits/metal-liquido/capa.jpg +0 -0
- package/kits/metal-liquido/elementos/AnelCromo.tsx +28 -0
- package/kits/metal-liquido/elementos/AssinaturaMarca.tsx +26 -0
- package/kits/metal-liquido/elementos/BolhasCromadas.tsx +53 -0
- package/kits/metal-liquido/elementos/Camera.tsx +22 -0
- package/kits/metal-liquido/elementos/Cena.tsx +48 -0
- package/kits/metal-liquido/elementos/EsferaCromo.tsx +32 -0
- package/kits/metal-liquido/elementos/Fundo.tsx +20 -0
- package/kits/metal-liquido/elementos/Montagem.tsx +67 -0
- package/kits/metal-liquido/elementos/PilulaCromo.tsx +23 -0
- package/kits/metal-liquido/elementos/Som.tsx +33 -0
- package/kits/metal-liquido/elementos/TituloCromo.tsx +32 -0
- package/kits/metal-liquido/elementos/base.ts +94 -0
- package/kits/metal-liquido/elementos/index.ts +15 -0
- package/kits/metal-liquido/exemplos/logo-mercurio.svg +1 -0
- package/kits/metal-liquido/exemplos/plano.json +48 -0
- package/kits/metal-liquido/exemplos/roteiro.md +20 -0
- package/kits/metal-liquido/preview.tsx +12 -0
- package/kits/metal-liquido/receita.json +173 -0
- package/kits/metal-liquido/regras/area-segura.md +16 -0
- package/kits/metal-liquido/regras/cor.md +23 -0
- package/kits/metal-liquido/regras/movimento.md +18 -0
- package/kits/metal-liquido/regras/ritmo.md +14 -0
- package/kits/metal-liquido/regras/som.md +20 -0
- package/kits/metal-liquido/regras/tipografia.md +15 -0
- package/kits/minimal/SKILL.md +54 -0
- package/kits/minimal/assets/ASSETS.md +19 -0
- package/kits/minimal/assets/fontes/OFL-HankenGrotesk.txt +93 -0
- package/kits/minimal/assets/fontes/OFL-SplineSansMono.txt +93 -0
- package/kits/minimal/assets/fontes/hanken.woff2 +0 -0
- package/kits/minimal/assets/fontes/splinemono.woff2 +0 -0
- package/kits/minimal/assets/sons/assinatura.mp3 +0 -0
- package/kits/minimal/assets/sons/clique.mp3 +0 -0
- package/kits/minimal/assets/sons/impacto.mp3 +0 -0
- package/kits/minimal/assets/sons/pop-cartao.mp3 +0 -0
- package/kits/minimal/assets/sons/pop-palavra.mp3 +0 -0
- package/kits/minimal/assets/sons/subida.mp3 +0 -0
- package/kits/minimal/assets/sons/swoosh.mp3 +0 -0
- package/kits/minimal/assets/sons/toque.mp3 +0 -0
- package/kits/minimal/assets/sons/whoosh-entra.mp3 +0 -0
- package/kits/minimal/assets/sons/whoosh-sai.mp3 +0 -0
- package/kits/minimal/assets/trilha/vazio-90bpm.mp3 +0 -0
- package/kits/minimal/capa.jpg +0 -0
- package/kits/minimal/elementos/Camera.tsx +21 -0
- package/kits/minimal/elementos/Cena.tsx +39 -0
- package/kits/minimal/elementos/FormaMorph.tsx +44 -0
- package/kits/minimal/elementos/FraseUnica.tsx +33 -0
- package/kits/minimal/elementos/Fundo.tsx +20 -0
- package/kits/minimal/elementos/LinhaFina.tsx +24 -0
- package/kits/minimal/elementos/Montagem.tsx +59 -0
- package/kits/minimal/elementos/NumeroSolo.tsx +33 -0
- package/kits/minimal/elementos/PontoMovel.tsx +27 -0
- package/kits/minimal/elementos/RodapeMinimal.tsx +26 -0
- package/kits/minimal/elementos/Som.tsx +40 -0
- package/kits/minimal/elementos/base.ts +80 -0
- package/kits/minimal/elementos/index.ts +15 -0
- package/kits/minimal/exemplos/plano.json +48 -0
- package/kits/minimal/exemplos/roteiro.md +19 -0
- package/kits/minimal/preview.tsx +9 -0
- package/kits/minimal/receita.json +21 -0
- package/kits/minimal/regras/area-segura.md +15 -0
- package/kits/minimal/regras/cor.md +12 -0
- package/kits/minimal/regras/movimento.md +20 -0
- package/kits/minimal/regras/ritmo.md +15 -0
- package/kits/minimal/regras/som.md +21 -0
- package/kits/minimal/regras/tipografia.md +15 -0
- package/kits/neon-cidade/SKILL.md +51 -0
- package/kits/neon-cidade/assets/ASSETS.md +21 -0
- package/kits/neon-cidade/assets/fontes/OFL-BarlowCondensed.txt +92 -0
- package/kits/neon-cidade/assets/fontes/OFL-TiltNeon.txt +92 -0
- package/kits/neon-cidade/assets/fontes/barlow-latin.woff2 +0 -0
- package/kits/neon-cidade/assets/fontes/tiltneon-latin.woff2 +0 -0
- package/kits/neon-cidade/assets/sons/assinatura.mp3 +0 -0
- package/kits/neon-cidade/assets/sons/balanca.mp3 +0 -0
- package/kits/neon-cidade/assets/sons/clique.mp3 +0 -0
- package/kits/neon-cidade/assets/sons/impacto.mp3 +0 -0
- package/kits/neon-cidade/assets/sons/liga.mp3 +0 -0
- package/kits/neon-cidade/assets/sons/tick.mp3 +0 -0
- package/kits/neon-cidade/assets/sons/whoosh.mp3 +0 -0
- package/kits/neon-cidade/assets/sons/zumbido.mp3 +0 -0
- package/kits/neon-cidade/assets/trilha/noite-100bpm.mp3 +0 -0
- package/kits/neon-cidade/capa.jpg +0 -0
- package/kits/neon-cidade/elementos/AssinaturaMarca.tsx +24 -0
- package/kits/neon-cidade/elementos/CaixaLuminosa.tsx +40 -0
- package/kits/neon-cidade/elementos/Camera.tsx +22 -0
- package/kits/neon-cidade/elementos/Cena.tsx +48 -0
- package/kits/neon-cidade/elementos/Chuva.tsx +23 -0
- package/kits/neon-cidade/elementos/FormaNeon.tsx +42 -0
- package/kits/neon-cidade/elementos/Fundo.tsx +18 -0
- package/kits/neon-cidade/elementos/Horizonte.tsx +34 -0
- package/kits/neon-cidade/elementos/LetreiroNeon.tsx +46 -0
- package/kits/neon-cidade/elementos/Montagem.tsx +67 -0
- package/kits/neon-cidade/elementos/Som.tsx +33 -0
- package/kits/neon-cidade/elementos/base.ts +100 -0
- package/kits/neon-cidade/elementos/index.ts +15 -0
- package/kits/neon-cidade/exemplos/logo-fenix.svg +1 -0
- package/kits/neon-cidade/exemplos/plano.json +50 -0
- package/kits/neon-cidade/exemplos/roteiro.md +20 -0
- package/kits/neon-cidade/preview.tsx +12 -0
- package/kits/neon-cidade/receita.json +151 -0
- package/kits/neon-cidade/regras/area-segura.md +18 -0
- package/kits/neon-cidade/regras/cor.md +23 -0
- package/kits/neon-cidade/regras/movimento.md +18 -0
- package/kits/neon-cidade/regras/ritmo.md +14 -0
- package/kits/neon-cidade/regras/som.md +20 -0
- package/kits/neon-cidade/regras/tipografia.md +15 -0
- package/kits/notion-editorial/SKILL.md +51 -0
- package/kits/notion-editorial/assets/ASSETS.md +19 -0
- package/kits/notion-editorial/assets/fontes/OFL-Cormorant-Italic.txt +93 -0
- package/kits/notion-editorial/assets/fontes/OFL-Cormorant.txt +93 -0
- package/kits/notion-editorial/assets/fontes/OFL-Jost.txt +93 -0
- package/kits/notion-editorial/assets/fontes/cormorant-italic.woff2 +0 -0
- package/kits/notion-editorial/assets/fontes/cormorant.woff2 +0 -0
- package/kits/notion-editorial/assets/fontes/jost.woff2 +0 -0
- package/kits/notion-editorial/assets/sons/assinatura.mp3 +0 -0
- package/kits/notion-editorial/assets/sons/clique.mp3 +0 -0
- package/kits/notion-editorial/assets/sons/impacto.mp3 +0 -0
- package/kits/notion-editorial/assets/sons/pop-cartao.mp3 +0 -0
- package/kits/notion-editorial/assets/sons/pop-palavra.mp3 +0 -0
- package/kits/notion-editorial/assets/sons/subida.mp3 +0 -0
- package/kits/notion-editorial/assets/sons/swoosh.mp3 +0 -0
- package/kits/notion-editorial/assets/sons/whoosh-entra.mp3 +0 -0
- package/kits/notion-editorial/assets/sons/whoosh-sai.mp3 +0 -0
- package/kits/notion-editorial/assets/trilha/trilha.mp3 +0 -0
- package/kits/notion-editorial/capa.jpg +0 -0
- package/kits/notion-editorial/elementos/AssinaturaMarca.tsx +20 -0
- package/kits/notion-editorial/elementos/BlocoNota.tsx +38 -0
- package/kits/notion-editorial/elementos/Camera.tsx +23 -0
- package/kits/notion-editorial/elementos/Cena.tsx +46 -0
- package/kits/notion-editorial/elementos/Diagrama.tsx +29 -0
- package/kits/notion-editorial/elementos/Fundo.tsx +12 -0
- package/kits/notion-editorial/elementos/Montagem.tsx +60 -0
- package/kits/notion-editorial/elementos/PassosNumerados.tsx +23 -0
- package/kits/notion-editorial/elementos/RabiscoIcone.tsx +33 -0
- package/kits/notion-editorial/elementos/Som.tsx +39 -0
- package/kits/notion-editorial/elementos/TextoSerifa.tsx +53 -0
- package/kits/notion-editorial/elementos/base.ts +87 -0
- package/kits/notion-editorial/elementos/desenho.tsx +36 -0
- package/kits/notion-editorial/elementos/index.ts +16 -0
- package/kits/notion-editorial/exemplos/logo-pauta.svg +1 -0
- package/kits/notion-editorial/exemplos/plano.json +254 -0
- package/kits/notion-editorial/exemplos/roteiro.md +20 -0
- package/kits/notion-editorial/preview.tsx +12 -0
- package/kits/notion-editorial/receita.json +165 -0
- package/kits/notion-editorial/regras/area-segura.md +13 -0
- package/kits/notion-editorial/regras/cor.md +15 -0
- package/kits/notion-editorial/regras/movimento.md +16 -0
- package/kits/notion-editorial/regras/ritmo.md +14 -0
- package/kits/notion-editorial/regras/som.md +18 -0
- package/kits/notion-editorial/regras/tipografia.md +15 -0
- package/kits/papel-recortado/SKILL.md +57 -0
- package/kits/papel-recortado/assets/ASSETS.md +18 -0
- package/kits/papel-recortado/assets/fontes/OFL-fredoka-700.txt +93 -0
- package/kits/papel-recortado/assets/fontes/OFL-nunito-700.txt +93 -0
- package/kits/papel-recortado/assets/fontes/fredoka-700.woff2 +0 -0
- package/kits/papel-recortado/assets/fontes/nunito-700.woff2 +0 -0
- package/kits/papel-recortado/assets/sons/assinatura.mp3 +0 -0
- package/kits/papel-recortado/assets/sons/clique.mp3 +0 -0
- package/kits/papel-recortado/assets/sons/impacto.mp3 +0 -0
- package/kits/papel-recortado/assets/sons/pop-cartao.mp3 +0 -0
- package/kits/papel-recortado/assets/sons/pop-palavra.mp3 +0 -0
- package/kits/papel-recortado/assets/sons/subida.mp3 +0 -0
- package/kits/papel-recortado/assets/sons/swoosh.mp3 +0 -0
- package/kits/papel-recortado/assets/sons/tick.mp3 +0 -0
- package/kits/papel-recortado/assets/sons/whoosh-entra.mp3 +0 -0
- package/kits/papel-recortado/assets/sons/whoosh-sai.mp3 +0 -0
- package/kits/papel-recortado/assets/trilha/trilha.mp3 +0 -0
- package/kits/papel-recortado/capa.jpg +0 -0
- package/kits/papel-recortado/elementos/CamadaPapel.tsx +81 -0
- package/kits/papel-recortado/elementos/Camera.tsx +28 -0
- package/kits/papel-recortado/elementos/CartaoCamadas.tsx +38 -0
- package/kits/papel-recortado/elementos/Cena.tsx +29 -0
- package/kits/papel-recortado/elementos/EtiquetaPapel.tsx +40 -0
- package/kits/papel-recortado/elementos/Filtros.tsx +33 -0
- package/kits/papel-recortado/elementos/Fita.tsx +21 -0
- package/kits/papel-recortado/elementos/FolhaPopUp.tsx +49 -0
- package/kits/papel-recortado/elementos/Fundo.tsx +10 -0
- package/kits/papel-recortado/elementos/LetrasRecortadas.tsx +48 -0
- package/kits/papel-recortado/elementos/MolduraPapel.tsx +12 -0
- package/kits/papel-recortado/elementos/Montagem.tsx +42 -0
- package/kits/papel-recortado/elementos/Som.tsx +30 -0
- package/kits/papel-recortado/elementos/base.ts +51 -0
- package/kits/papel-recortado/elementos/index.ts +15 -0
- package/kits/papel-recortado/exemplos/plano.json +410 -0
- package/kits/papel-recortado/exemplos/roteiro.md +13 -0
- package/kits/papel-recortado/preview.tsx +9 -0
- package/kits/papel-recortado/receita.json +14 -0
- package/kits/papel-recortado/regras/area-segura.md +13 -0
- package/kits/papel-recortado/regras/cor.md +16 -0
- package/kits/papel-recortado/regras/movimento.md +17 -0
- package/kits/papel-recortado/regras/ritmo.md +13 -0
- package/kits/papel-recortado/regras/som.md +17 -0
- package/kits/papel-recortado/regras/tipografia.md +12 -0
- package/kits/pixel/SKILL.md +52 -0
- package/kits/pixel/assets/ASSETS.md +18 -0
- package/kits/pixel/assets/fontes/OFL-pressstart2p.txt +93 -0
- package/kits/pixel/assets/fontes/OFL-vt323.txt +93 -0
- package/kits/pixel/assets/fontes/pressstart2p.woff2 +0 -0
- package/kits/pixel/assets/fontes/vt323.woff2 +0 -0
- package/kits/pixel/assets/sons/assinatura.mp3 +0 -0
- package/kits/pixel/assets/sons/clique.mp3 +0 -0
- package/kits/pixel/assets/sons/impacto.mp3 +0 -0
- package/kits/pixel/assets/sons/pop-cartao.mp3 +0 -0
- package/kits/pixel/assets/sons/pop-palavra.mp3 +0 -0
- package/kits/pixel/assets/sons/subida.mp3 +0 -0
- package/kits/pixel/assets/sons/swoosh.mp3 +0 -0
- package/kits/pixel/assets/sons/tick.mp3 +0 -0
- package/kits/pixel/assets/sons/whoosh-entra.mp3 +0 -0
- package/kits/pixel/assets/sons/whoosh-sai.mp3 +0 -0
- package/kits/pixel/assets/trilha/trilha.mp3 +0 -0
- package/kits/pixel/capa.jpg +0 -0
- package/kits/pixel/elementos/AssinaturaMarca.tsx +18 -0
- package/kits/pixel/elementos/CaixaDialogo.tsx +22 -0
- package/kits/pixel/elementos/Camera.tsx +21 -0
- package/kits/pixel/elementos/Cena.tsx +36 -0
- package/kits/pixel/elementos/ChuvaDeSprites.tsx +15 -0
- package/kits/pixel/elementos/Fundo.tsx +23 -0
- package/kits/pixel/elementos/HudPlacar.tsx +19 -0
- package/kits/pixel/elementos/MenuPixel.tsx +19 -0
- package/kits/pixel/elementos/Montagem.tsx +56 -0
- package/kits/pixel/elementos/Overlay.tsx +14 -0
- package/kits/pixel/elementos/Som.tsx +30 -0
- package/kits/pixel/elementos/Sprite.tsx +33 -0
- package/kits/pixel/elementos/TituloPixel.tsx +31 -0
- package/kits/pixel/elementos/base.ts +79 -0
- package/kits/pixel/elementos/index.ts +17 -0
- package/kits/pixel/exemplos/plano.json +309 -0
- package/kits/pixel/exemplos/roteiro.md +20 -0
- package/kits/pixel/preview.tsx +12 -0
- package/kits/pixel/receita.json +175 -0
- package/kits/pixel/regras/area-segura.md +14 -0
- package/kits/pixel/regras/cor.md +17 -0
- package/kits/pixel/regras/movimento.md +18 -0
- package/kits/pixel/regras/ritmo.md +15 -0
- package/kits/pixel/regras/som.md +18 -0
- package/kits/pixel/regras/tipografia.md +18 -0
- package/kits/pontos-3d/SKILL.md +51 -0
- package/kits/pontos-3d/assets/ASSETS.md +21 -0
- package/kits/pontos-3d/assets/fontes/OFL-JetBrainsMono.txt +92 -0
- package/kits/pontos-3d/assets/fontes/OFL-Sora.txt +92 -0
- package/kits/pontos-3d/assets/fontes/jetbrains-latin.woff2 +0 -0
- package/kits/pontos-3d/assets/fontes/sora-latin.woff2 +0 -0
- package/kits/pontos-3d/assets/sons/assinatura.mp3 +0 -0
- package/kits/pontos-3d/assets/sons/clique.mp3 +0 -0
- package/kits/pontos-3d/assets/sons/impacto.mp3 +0 -0
- package/kits/pontos-3d/assets/sons/pop.mp3 +0 -0
- package/kits/pontos-3d/assets/sons/subida.mp3 +0 -0
- package/kits/pontos-3d/assets/sons/tick.mp3 +0 -0
- package/kits/pontos-3d/assets/sons/varre.mp3 +0 -0
- package/kits/pontos-3d/assets/sons/whoosh.mp3 +0 -0
- package/kits/pontos-3d/assets/trilha/tech-120bpm.mp3 +0 -0
- package/kits/pontos-3d/capa.jpg +0 -0
- package/kits/pontos-3d/elementos/AssinaturaMarca.tsx +23 -0
- package/kits/pontos-3d/elementos/Camera.tsx +22 -0
- package/kits/pontos-3d/elementos/Cena.tsx +48 -0
- package/kits/pontos-3d/elementos/Contador.tsx +32 -0
- package/kits/pontos-3d/elementos/Fundo.tsx +20 -0
- package/kits/pontos-3d/elementos/Montagem.tsx +67 -0
- package/kits/pontos-3d/elementos/NuvemDePontos.tsx +84 -0
- package/kits/pontos-3d/elementos/RotuloPonto.tsx +32 -0
- package/kits/pontos-3d/elementos/Som.tsx +33 -0
- package/kits/pontos-3d/elementos/TextoDePontos.tsx +55 -0
- package/kits/pontos-3d/elementos/TituloSora.tsx +36 -0
- package/kits/pontos-3d/elementos/base.ts +92 -0
- package/kits/pontos-3d/elementos/index.ts +15 -0
- package/kits/pontos-3d/exemplos/logo-malha.svg +1 -0
- package/kits/pontos-3d/exemplos/plano.json +46 -0
- package/kits/pontos-3d/exemplos/roteiro.md +20 -0
- package/kits/pontos-3d/preview.tsx +12 -0
- package/kits/pontos-3d/receita.json +153 -0
- package/kits/pontos-3d/regras/area-segura.md +17 -0
- package/kits/pontos-3d/regras/cor.md +21 -0
- package/kits/pontos-3d/regras/movimento.md +19 -0
- package/kits/pontos-3d/regras/ritmo.md +14 -0
- package/kits/pontos-3d/regras/som.md +20 -0
- package/kits/pontos-3d/regras/tipografia.md +16 -0
- package/kits/produto-3d/SKILL.md +59 -0
- package/kits/produto-3d/assets/ASSETS.md +18 -0
- package/kits/produto-3d/assets/fontes/OFL-IBMPlexMono.txt +93 -0
- package/kits/produto-3d/assets/fontes/OFL-Syncopate.txt +92 -0
- package/kits/produto-3d/assets/fontes/plex-mono.woff2 +0 -0
- package/kits/produto-3d/assets/fontes/syncopate-latin.woff2 +0 -0
- package/kits/produto-3d/assets/sons/assinatura.mp3 +0 -0
- package/kits/produto-3d/assets/sons/clique.mp3 +0 -0
- package/kits/produto-3d/assets/sons/impacto.mp3 +0 -0
- package/kits/produto-3d/assets/sons/pop-cartao.mp3 +0 -0
- package/kits/produto-3d/assets/sons/pop-palavra.mp3 +0 -0
- package/kits/produto-3d/assets/sons/subida.mp3 +0 -0
- package/kits/produto-3d/assets/sons/swoosh.mp3 +0 -0
- package/kits/produto-3d/assets/sons/whoosh-entra.mp3 +0 -0
- package/kits/produto-3d/assets/sons/whoosh-sai.mp3 +0 -0
- package/kits/produto-3d/assets/trilha/trilha.mp3 +0 -0
- package/kits/produto-3d/capa.jpg +0 -0
- package/kits/produto-3d/elementos/AssinaturaMarca.tsx +28 -0
- package/kits/produto-3d/elementos/Camera.tsx +23 -0
- package/kits/produto-3d/elementos/Cena.tsx +55 -0
- package/kits/produto-3d/elementos/Fundo.tsx +45 -0
- package/kits/produto-3d/elementos/Montagem.tsx +53 -0
- package/kits/produto-3d/elementos/NumeroDestaque.tsx +35 -0
- package/kits/produto-3d/elementos/Produto3D.tsx +144 -0
- package/kits/produto-3d/elementos/RotuloChamada.tsx +43 -0
- package/kits/produto-3d/elementos/Som.tsx +39 -0
- package/kits/produto-3d/elementos/TituloMinimo.tsx +45 -0
- package/kits/produto-3d/elementos/VarreduraLuz.tsx +22 -0
- package/kits/produto-3d/elementos/base.ts +109 -0
- package/kits/produto-3d/elementos/index.ts +13 -0
- package/kits/produto-3d/elementos/modelos.ts +92 -0
- package/kits/produto-3d/elementos/raymarch.ts +295 -0
- package/kits/produto-3d/exemplos/plano.json +53 -0
- package/kits/produto-3d/exemplos/roteiro.md +15 -0
- package/kits/produto-3d/preview.tsx +9 -0
- package/kits/produto-3d/receita.json +16 -0
- package/kits/produto-3d/regras/area-segura.md +14 -0
- package/kits/produto-3d/regras/cor.md +20 -0
- package/kits/produto-3d/regras/movimento.md +19 -0
- package/kits/produto-3d/regras/ritmo.md +15 -0
- package/kits/produto-3d/regras/som.md +18 -0
- package/kits/produto-3d/regras/tipografia.md +13 -0
- package/kits/quadro-giz/SKILL.md +52 -0
- package/kits/quadro-giz/assets/ASSETS.md +18 -0
- package/kits/quadro-giz/assets/fontes/OFL-patrick-hand.txt +93 -0
- package/kits/quadro-giz/assets/fontes/OFL-schoolbell.txt +93 -0
- package/kits/quadro-giz/assets/fontes/patrick-hand.woff2 +0 -0
- package/kits/quadro-giz/assets/fontes/schoolbell.woff2 +0 -0
- package/kits/quadro-giz/assets/sons/assinatura.mp3 +0 -0
- package/kits/quadro-giz/assets/sons/clique.mp3 +0 -0
- package/kits/quadro-giz/assets/sons/impacto.mp3 +0 -0
- package/kits/quadro-giz/assets/sons/pop-cartao.mp3 +0 -0
- package/kits/quadro-giz/assets/sons/pop-palavra.mp3 +0 -0
- package/kits/quadro-giz/assets/sons/subida.mp3 +0 -0
- package/kits/quadro-giz/assets/sons/swoosh.mp3 +0 -0
- package/kits/quadro-giz/assets/sons/tick.mp3 +0 -0
- package/kits/quadro-giz/assets/sons/whoosh-entra.mp3 +0 -0
- package/kits/quadro-giz/assets/sons/whoosh-sai.mp3 +0 -0
- package/kits/quadro-giz/assets/trilha/trilha.mp3 +0 -0
- package/kits/quadro-giz/capa.jpg +0 -0
- package/kits/quadro-giz/elementos/ApagadorVarrendo.tsx +32 -0
- package/kits/quadro-giz/elementos/AssinaturaMarca.tsx +20 -0
- package/kits/quadro-giz/elementos/Camera.tsx +21 -0
- package/kits/quadro-giz/elementos/CartaoGiz.tsx +25 -0
- package/kits/quadro-giz/elementos/Cena.tsx +36 -0
- package/kits/quadro-giz/elementos/ContaNoQuadro.tsx +34 -0
- package/kits/quadro-giz/elementos/DesenhoGiz.tsx +29 -0
- package/kits/quadro-giz/elementos/Fundo.tsx +21 -0
- package/kits/quadro-giz/elementos/ListaGiz.tsx +21 -0
- package/kits/quadro-giz/elementos/Montagem.tsx +56 -0
- package/kits/quadro-giz/elementos/Overlay.tsx +12 -0
- package/kits/quadro-giz/elementos/Som.tsx +30 -0
- package/kits/quadro-giz/elementos/TituloGiz.tsx +29 -0
- package/kits/quadro-giz/elementos/base.ts +78 -0
- package/kits/quadro-giz/elementos/index.ts +17 -0
- package/kits/quadro-giz/elementos/traco.ts +9 -0
- package/kits/quadro-giz/exemplos/plano.json +237 -0
- package/kits/quadro-giz/exemplos/roteiro.md +20 -0
- package/kits/quadro-giz/preview.tsx +12 -0
- package/kits/quadro-giz/receita.json +193 -0
- package/kits/quadro-giz/regras/area-segura.md +15 -0
- package/kits/quadro-giz/regras/cor.md +17 -0
- package/kits/quadro-giz/regras/movimento.md +18 -0
- package/kits/quadro-giz/regras/ritmo.md +16 -0
- package/kits/quadro-giz/regras/som.md +18 -0
- package/kits/quadro-giz/regras/tipografia.md +19 -0
- package/kits/rabisco/SKILL.md +51 -0
- package/kits/rabisco/assets/ASSETS.md +18 -0
- package/kits/rabisco/assets/fontes/OFL-caveat-700.txt +93 -0
- package/kits/rabisco/assets/fontes/OFL-permanent-marker.txt +93 -0
- package/kits/rabisco/assets/fontes/caveat-700.woff2 +0 -0
- package/kits/rabisco/assets/fontes/permanent-marker.woff2 +0 -0
- package/kits/rabisco/assets/sons/assinatura.mp3 +0 -0
- package/kits/rabisco/assets/sons/clique.mp3 +0 -0
- package/kits/rabisco/assets/sons/impacto.mp3 +0 -0
- package/kits/rabisco/assets/sons/pop-cartao.mp3 +0 -0
- package/kits/rabisco/assets/sons/pop-palavra.mp3 +0 -0
- package/kits/rabisco/assets/sons/subida.mp3 +0 -0
- package/kits/rabisco/assets/sons/swoosh.mp3 +0 -0
- package/kits/rabisco/assets/sons/tick.mp3 +0 -0
- package/kits/rabisco/assets/sons/whoosh-entra.mp3 +0 -0
- package/kits/rabisco/assets/sons/whoosh-sai.mp3 +0 -0
- package/kits/rabisco/assets/trilha/trilha.mp3 +0 -0
- package/kits/rabisco/capa.jpg +0 -0
- package/kits/rabisco/elementos/AssinaturaMarca.tsx +21 -0
- package/kits/rabisco/elementos/Bonequinho.tsx +31 -0
- package/kits/rabisco/elementos/Camera.tsx +21 -0
- package/kits/rabisco/elementos/CartaoRabiscado.tsx +27 -0
- package/kits/rabisco/elementos/Cena.tsx +36 -0
- package/kits/rabisco/elementos/Fundo.tsx +17 -0
- package/kits/rabisco/elementos/ListaRabiscada.tsx +23 -0
- package/kits/rabisco/elementos/Montagem.tsx +55 -0
- package/kits/rabisco/elementos/Overlay.tsx +8 -0
- package/kits/rabisco/elementos/Som.tsx +30 -0
- package/kits/rabisco/elementos/TituloRabisco.tsx +28 -0
- package/kits/rabisco/elementos/TracoDesenhando.tsx +31 -0
- package/kits/rabisco/elementos/base.ts +76 -0
- package/kits/rabisco/elementos/index.ts +16 -0
- package/kits/rabisco/elementos/traco.ts +10 -0
- package/kits/rabisco/exemplos/plano.json +238 -0
- package/kits/rabisco/exemplos/roteiro.md +20 -0
- package/kits/rabisco/preview.tsx +12 -0
- package/kits/rabisco/receita.json +171 -0
- package/kits/rabisco/regras/area-segura.md +14 -0
- package/kits/rabisco/regras/cor.md +15 -0
- package/kits/rabisco/regras/movimento.md +18 -0
- package/kits/rabisco/regras/ritmo.md +15 -0
- package/kits/rabisco/regras/som.md +17 -0
- package/kits/rabisco/regras/tipografia.md +18 -0
- package/kits/retro-70/SKILL.md +53 -0
- package/kits/retro-70/assets/ASSETS.md +23 -0
- package/kits/retro-70/assets/fontes/OFL-Fredoka.txt +93 -0
- package/kits/retro-70/assets/fontes/OFL-Shrikhand.txt +93 -0
- package/kits/retro-70/assets/fontes/fredoka.woff2 +0 -0
- package/kits/retro-70/assets/fontes/shrikhand.woff2 +0 -0
- package/kits/retro-70/assets/sons/assinatura.mp3 +0 -0
- package/kits/retro-70/assets/sons/clique.mp3 +0 -0
- package/kits/retro-70/assets/sons/impacto.mp3 +0 -0
- package/kits/retro-70/assets/sons/pop-cartao.mp3 +0 -0
- package/kits/retro-70/assets/sons/pop-palavra.mp3 +0 -0
- package/kits/retro-70/assets/sons/subida.mp3 +0 -0
- package/kits/retro-70/assets/sons/swoosh.mp3 +0 -0
- package/kits/retro-70/assets/sons/whoosh-entra.mp3 +0 -0
- package/kits/retro-70/assets/sons/whoosh-sai.mp3 +0 -0
- package/kits/retro-70/assets/trilha/solar-104bpm.mp3 +0 -0
- package/kits/retro-70/capa.jpg +0 -0
- package/kits/retro-70/elementos/ArcoListras.tsx +25 -0
- package/kits/retro-70/elementos/AssinaturaMarca.tsx +21 -0
- package/kits/retro-70/elementos/Camera.tsx +22 -0
- package/kits/retro-70/elementos/CartaoData.tsx +24 -0
- package/kits/retro-70/elementos/Cena.tsx +41 -0
- package/kits/retro-70/elementos/FaixaOnda.tsx +27 -0
- package/kits/retro-70/elementos/Flor70.tsx +25 -0
- package/kits/retro-70/elementos/FotoArredondada.tsx +19 -0
- package/kits/retro-70/elementos/Fundo.tsx +11 -0
- package/kits/retro-70/elementos/Montagem.tsx +60 -0
- package/kits/retro-70/elementos/RaiosDeSol.tsx +27 -0
- package/kits/retro-70/elementos/Som.tsx +38 -0
- package/kits/retro-70/elementos/TituloGordo.tsx +28 -0
- package/kits/retro-70/elementos/base.ts +73 -0
- package/kits/retro-70/elementos/index.ts +17 -0
- package/kits/retro-70/exemplos/fotos/foto-02.jpg +0 -0
- package/kits/retro-70/exemplos/fotos/foto-03.jpg +0 -0
- package/kits/retro-70/exemplos/logo-girassol.svg +1 -0
- package/kits/retro-70/exemplos/plano.json +50 -0
- package/kits/retro-70/exemplos/roteiro.md +19 -0
- package/kits/retro-70/preview.tsx +17 -0
- package/kits/retro-70/receita.json +172 -0
- package/kits/retro-70/regras/area-segura.md +20 -0
- package/kits/retro-70/regras/cor.md +14 -0
- package/kits/retro-70/regras/movimento.md +16 -0
- package/kits/retro-70/regras/ritmo.md +15 -0
- package/kits/retro-70/regras/som.md +21 -0
- package/kits/retro-70/regras/tipografia.md +17 -0
- package/kits/revista/SKILL.md +52 -0
- package/kits/revista/assets/ASSETS.md +24 -0
- package/kits/revista/assets/fontes/OFL-CormorantGaramond.txt +93 -0
- package/kits/revista/assets/fontes/OFL-Jost.txt +93 -0
- package/kits/revista/assets/fontes/cormorant-italic.woff2 +0 -0
- package/kits/revista/assets/fontes/cormorant.woff2 +0 -0
- package/kits/revista/assets/fontes/jost.woff2 +0 -0
- package/kits/revista/assets/sons/assinatura.mp3 +0 -0
- package/kits/revista/assets/sons/clique.mp3 +0 -0
- package/kits/revista/assets/sons/impacto.mp3 +0 -0
- package/kits/revista/assets/sons/pop-cartao.mp3 +0 -0
- package/kits/revista/assets/sons/pop-palavra.mp3 +0 -0
- package/kits/revista/assets/sons/subida.mp3 +0 -0
- package/kits/revista/assets/sons/swoosh.mp3 +0 -0
- package/kits/revista/assets/sons/whoosh-entra.mp3 +0 -0
- package/kits/revista/assets/sons/whoosh-sai.mp3 +0 -0
- package/kits/revista/assets/trilha/editorial-100bpm.mp3 +0 -0
- package/kits/revista/capa.jpg +0 -0
- package/kits/revista/elementos/AssinaturaMarca.tsx +23 -0
- package/kits/revista/elementos/Camera.tsx +22 -0
- package/kits/revista/elementos/Cena.tsx +41 -0
- package/kits/revista/elementos/CitacaoGrande.tsx +27 -0
- package/kits/revista/elementos/ColagemFotos.tsx +22 -0
- package/kits/revista/elementos/Folio.tsx +19 -0
- package/kits/revista/elementos/FotoSangrando.tsx +24 -0
- package/kits/revista/elementos/Fundo.tsx +11 -0
- package/kits/revista/elementos/Montagem.tsx +59 -0
- package/kits/revista/elementos/PaginaDupla.tsx +36 -0
- package/kits/revista/elementos/Som.tsx +38 -0
- package/kits/revista/elementos/TituloEditorial.tsx +31 -0
- package/kits/revista/elementos/base.ts +76 -0
- package/kits/revista/elementos/index.ts +16 -0
- package/kits/revista/exemplos/fotos/foto-02.jpg +0 -0
- package/kits/revista/exemplos/fotos/foto-03.jpg +0 -0
- package/kits/revista/exemplos/fotos/foto-05.jpg +0 -0
- package/kits/revista/exemplos/fotos/foto-06.jpg +0 -0
- package/kits/revista/exemplos/fotos/foto-07.jpg +0 -0
- package/kits/revista/exemplos/fotos/foto-08.jpg +0 -0
- package/kits/revista/exemplos/logo-linho.svg +1 -0
- package/kits/revista/exemplos/plano.json +44 -0
- package/kits/revista/exemplos/roteiro.md +19 -0
- package/kits/revista/preview.tsx +21 -0
- package/kits/revista/receita.json +168 -0
- package/kits/revista/regras/area-segura.md +19 -0
- package/kits/revista/regras/cor.md +14 -0
- package/kits/revista/regras/movimento.md +15 -0
- package/kits/revista/regras/ritmo.md +15 -0
- package/kits/revista/regras/som.md +21 -0
- package/kits/revista/regras/tipografia.md +17 -0
- package/kits/risografia/SKILL.md +53 -0
- package/kits/risografia/assets/ASSETS.md +18 -0
- package/kits/risografia/assets/fontes/OFL-bricolage-800.txt +93 -0
- package/kits/risografia/assets/fontes/OFL-space-mono-700.txt +93 -0
- package/kits/risografia/assets/fontes/bricolage-800.woff2 +0 -0
- package/kits/risografia/assets/fontes/space-mono-700.woff2 +0 -0
- package/kits/risografia/assets/sons/assinatura.mp3 +0 -0
- package/kits/risografia/assets/sons/clique.mp3 +0 -0
- package/kits/risografia/assets/sons/impacto.mp3 +0 -0
- package/kits/risografia/assets/sons/pop-cartao.mp3 +0 -0
- package/kits/risografia/assets/sons/pop-palavra.mp3 +0 -0
- package/kits/risografia/assets/sons/subida.mp3 +0 -0
- package/kits/risografia/assets/sons/swoosh.mp3 +0 -0
- package/kits/risografia/assets/sons/tick.mp3 +0 -0
- package/kits/risografia/assets/sons/whoosh-entra.mp3 +0 -0
- package/kits/risografia/assets/sons/whoosh-sai.mp3 +0 -0
- package/kits/risografia/assets/trilha/trilha.mp3 +0 -0
- package/kits/risografia/capa.jpg +0 -0
- package/kits/risografia/elementos/AssinaturaMarca.tsx +21 -0
- package/kits/risografia/elementos/BolaReticula.tsx +26 -0
- package/kits/risografia/elementos/Camera.tsx +21 -0
- package/kits/risografia/elementos/Cena.tsx +36 -0
- package/kits/risografia/elementos/FormaRiso.tsx +24 -0
- package/kits/risografia/elementos/Fundo.tsx +12 -0
- package/kits/risografia/elementos/ListaRiso.tsx +22 -0
- package/kits/risografia/elementos/Montagem.tsx +56 -0
- package/kits/risografia/elementos/NumeroRiso.tsx +21 -0
- package/kits/risografia/elementos/Overlay.tsx +18 -0
- package/kits/risografia/elementos/Som.tsx +30 -0
- package/kits/risografia/elementos/TarjaCarimbo.tsx +20 -0
- package/kits/risografia/elementos/TituloRiso.tsx +26 -0
- package/kits/risografia/elementos/base.ts +73 -0
- package/kits/risografia/elementos/index.ts +17 -0
- package/kits/risografia/exemplos/plano.json +209 -0
- package/kits/risografia/exemplos/roteiro.md +20 -0
- package/kits/risografia/preview.tsx +12 -0
- package/kits/risografia/receita.json +169 -0
- package/kits/risografia/regras/area-segura.md +14 -0
- package/kits/risografia/regras/cor.md +12 -0
- package/kits/risografia/regras/movimento.md +18 -0
- package/kits/risografia/regras/ritmo.md +15 -0
- package/kits/risografia/regras/som.md +17 -0
- package/kits/risografia/regras/tipografia.md +18 -0
- package/kits/saas-linear/SKILL.md +60 -0
- package/kits/saas-linear/assets/ASSETS.md +19 -0
- package/kits/saas-linear/assets/fontes/OFL-Inter.txt +93 -0
- package/kits/saas-linear/assets/fontes/OFL-Newsreader.txt +93 -0
- package/kits/saas-linear/assets/fontes/inter-400.woff2 +0 -0
- package/kits/saas-linear/assets/fontes/inter-600.woff2 +0 -0
- package/kits/saas-linear/assets/fontes/newsreader-400.woff2 +0 -0
- package/kits/saas-linear/assets/sons/assinatura.mp3 +0 -0
- package/kits/saas-linear/assets/sons/clique.mp3 +0 -0
- package/kits/saas-linear/assets/sons/impacto.mp3 +0 -0
- package/kits/saas-linear/assets/sons/pop-cartao.mp3 +0 -0
- package/kits/saas-linear/assets/sons/pop-palavra.mp3 +0 -0
- package/kits/saas-linear/assets/sons/subida.mp3 +0 -0
- package/kits/saas-linear/assets/sons/swoosh.mp3 +0 -0
- package/kits/saas-linear/assets/sons/whoosh-entra.mp3 +0 -0
- package/kits/saas-linear/assets/sons/whoosh-sai.mp3 +0 -0
- package/kits/saas-linear/assets/trilha/trilha.mp3 +0 -0
- package/kits/saas-linear/capa.jpg +0 -0
- package/kits/saas-linear/elementos/Agenda.tsx +46 -0
- package/kits/saas-linear/elementos/CaixaPrompt.tsx +41 -0
- package/kits/saas-linear/elementos/Camera.tsx +38 -0
- package/kits/saas-linear/elementos/CartoesIntegracao.tsx +57 -0
- package/kits/saas-linear/elementos/Cena.tsx +38 -0
- package/kits/saas-linear/elementos/Cursor.tsx +40 -0
- package/kits/saas-linear/elementos/FraseSerifa.tsx +25 -0
- package/kits/saas-linear/elementos/Fundo.tsx +18 -0
- package/kits/saas-linear/elementos/Marca.tsx +20 -0
- package/kits/saas-linear/elementos/MarcaFinal.tsx +22 -0
- package/kits/saas-linear/elementos/Menu.tsx +46 -0
- package/kits/saas-linear/elementos/Monitor.tsx +28 -0
- package/kits/saas-linear/elementos/Montagem.tsx +67 -0
- package/kits/saas-linear/elementos/Saudacao.tsx +27 -0
- package/kits/saas-linear/elementos/Som.tsx +39 -0
- package/kits/saas-linear/elementos/base.ts +84 -0
- package/kits/saas-linear/elementos/index.ts +21 -0
- package/kits/saas-linear/exemplos/plano.json +459 -0
- package/kits/saas-linear/exemplos/roteiro.md +15 -0
- package/kits/saas-linear/preview.tsx +9 -0
- package/kits/saas-linear/receita.json +32 -0
- package/kits/saas-linear/regras/area-segura.md +17 -0
- package/kits/saas-linear/regras/cor.md +19 -0
- package/kits/saas-linear/regras/movimento.md +20 -0
- package/kits/saas-linear/regras/ritmo.md +14 -0
- package/kits/saas-linear/regras/som.md +16 -0
- package/kits/saas-linear/regras/tipografia.md +17 -0
- package/kits/stripe-ondas/SKILL.md +52 -0
- package/kits/stripe-ondas/assets/ASSETS.md +18 -0
- package/kits/stripe-ondas/assets/fontes/OFL-DM-Mono.txt +93 -0
- package/kits/stripe-ondas/assets/fontes/OFL-Inter.txt +93 -0
- package/kits/stripe-ondas/assets/fontes/dm-mono.woff2 +0 -0
- package/kits/stripe-ondas/assets/fontes/inter.woff2 +0 -0
- package/kits/stripe-ondas/assets/sons/assinatura.mp3 +0 -0
- package/kits/stripe-ondas/assets/sons/clique.mp3 +0 -0
- package/kits/stripe-ondas/assets/sons/impacto.mp3 +0 -0
- package/kits/stripe-ondas/assets/sons/pop-cartao.mp3 +0 -0
- package/kits/stripe-ondas/assets/sons/pop-palavra.mp3 +0 -0
- package/kits/stripe-ondas/assets/sons/subida.mp3 +0 -0
- package/kits/stripe-ondas/assets/sons/swoosh.mp3 +0 -0
- package/kits/stripe-ondas/assets/sons/whoosh-entra.mp3 +0 -0
- package/kits/stripe-ondas/assets/sons/whoosh-sai.mp3 +0 -0
- package/kits/stripe-ondas/assets/trilha/trilha.mp3 +0 -0
- package/kits/stripe-ondas/capa.jpg +0 -0
- package/kits/stripe-ondas/elementos/AssinaturaMarca.tsx +18 -0
- package/kits/stripe-ondas/elementos/Camera.tsx +23 -0
- package/kits/stripe-ondas/elementos/CartaoPagamento.tsx +35 -0
- package/kits/stripe-ondas/elementos/Cena.tsx +46 -0
- package/kits/stripe-ondas/elementos/FaixaDeOndas.tsx +49 -0
- package/kits/stripe-ondas/elementos/Fundo.tsx +11 -0
- package/kits/stripe-ondas/elementos/GraficoOnda.tsx +34 -0
- package/kits/stripe-ondas/elementos/Montagem.tsx +61 -0
- package/kits/stripe-ondas/elementos/PainelCodigo.tsx +36 -0
- package/kits/stripe-ondas/elementos/SelosDeMetodo.tsx +27 -0
- package/kits/stripe-ondas/elementos/Som.tsx +39 -0
- package/kits/stripe-ondas/elementos/TituloLimpo.tsx +27 -0
- package/kits/stripe-ondas/elementos/base.ts +85 -0
- package/kits/stripe-ondas/elementos/index.ts +16 -0
- package/kits/stripe-ondas/exemplos/logo-cais.svg +1 -0
- package/kits/stripe-ondas/exemplos/plano.json +366 -0
- package/kits/stripe-ondas/exemplos/roteiro.md +20 -0
- package/kits/stripe-ondas/preview.tsx +12 -0
- package/kits/stripe-ondas/receita.json +177 -0
- package/kits/stripe-ondas/regras/area-segura.md +16 -0
- package/kits/stripe-ondas/regras/cor.md +17 -0
- package/kits/stripe-ondas/regras/movimento.md +16 -0
- package/kits/stripe-ondas/regras/ritmo.md +14 -0
- package/kits/stripe-ondas/regras/som.md +18 -0
- package/kits/stripe-ondas/regras/tipografia.md +15 -0
- package/kits/suica/SKILL.md +56 -0
- package/kits/suica/assets/ASSETS.md +23 -0
- package/kits/suica/assets/fontes/OFL-IBMPlexMono.txt +93 -0
- package/kits/suica/assets/fontes/OFL-InterTight.txt +93 -0
- package/kits/suica/assets/fontes/inter-tight.woff2 +0 -0
- package/kits/suica/assets/fontes/plex-mono.woff2 +0 -0
- package/kits/suica/assets/sons/assinatura.mp3 +0 -0
- package/kits/suica/assets/sons/clique.mp3 +0 -0
- package/kits/suica/assets/sons/impacto.mp3 +0 -0
- package/kits/suica/assets/sons/pop-cartao.mp3 +0 -0
- package/kits/suica/assets/sons/pop-palavra.mp3 +0 -0
- package/kits/suica/assets/sons/subida.mp3 +0 -0
- package/kits/suica/assets/sons/swoosh.mp3 +0 -0
- package/kits/suica/assets/sons/whoosh-entra.mp3 +0 -0
- package/kits/suica/assets/sons/whoosh-sai.mp3 +0 -0
- package/kits/suica/assets/trilha/frio-120bpm.mp3 +0 -0
- package/kits/suica/capa.jpg +0 -0
- package/kits/suica/elementos/AssinaturaMarca.tsx +21 -0
- package/kits/suica/elementos/Camera.tsx +22 -0
- package/kits/suica/elementos/Cena.tsx +41 -0
- package/kits/suica/elementos/DiscoFoto.tsx +20 -0
- package/kits/suica/elementos/Fundo.tsx +16 -0
- package/kits/suica/elementos/GradeFotos.tsx +21 -0
- package/kits/suica/elementos/Indice.tsx +17 -0
- package/kits/suica/elementos/ListaIndice.tsx +25 -0
- package/kits/suica/elementos/Montagem.tsx +60 -0
- package/kits/suica/elementos/NumeroGigante.tsx +21 -0
- package/kits/suica/elementos/Regua.tsx +20 -0
- package/kits/suica/elementos/Som.tsx +38 -0
- package/kits/suica/elementos/TituloGrade.tsx +38 -0
- package/kits/suica/elementos/base.ts +76 -0
- package/kits/suica/elementos/index.ts +17 -0
- package/kits/suica/exemplos/fotos/foto-01.jpg +0 -0
- package/kits/suica/exemplos/fotos/foto-02.jpg +0 -0
- package/kits/suica/exemplos/fotos/foto-03.jpg +0 -0
- package/kits/suica/exemplos/fotos/foto-05.jpg +0 -0
- package/kits/suica/exemplos/fotos/foto-06.jpg +0 -0
- package/kits/suica/exemplos/fotos/foto-07.jpg +0 -0
- package/kits/suica/exemplos/logo-ponto.svg +1 -0
- package/kits/suica/exemplos/plano.json +268 -0
- package/kits/suica/exemplos/roteiro.md +19 -0
- package/kits/suica/preview.tsx +21 -0
- package/kits/suica/receita.json +197 -0
- package/kits/suica/regras/area-segura.md +18 -0
- package/kits/suica/regras/cor.md +13 -0
- package/kits/suica/regras/movimento.md +15 -0
- package/kits/suica/regras/ritmo.md +17 -0
- package/kits/suica/regras/som.md +21 -0
- package/kits/suica/regras/tipografia.md +16 -0
- package/kits/synthwave/SKILL.md +52 -0
- package/kits/synthwave/assets/ASSETS.md +22 -0
- package/kits/synthwave/assets/fontes/OFL-Orbitron.txt +93 -0
- package/kits/synthwave/assets/fontes/OFL-Rajdhani.txt +93 -0
- package/kits/synthwave/assets/fontes/orbitron.woff2 +0 -0
- package/kits/synthwave/assets/fontes/rajdhani.woff2 +0 -0
- package/kits/synthwave/assets/sons/assinatura.mp3 +0 -0
- package/kits/synthwave/assets/sons/clique.mp3 +0 -0
- package/kits/synthwave/assets/sons/impacto.mp3 +0 -0
- package/kits/synthwave/assets/sons/pop-cartao.mp3 +0 -0
- package/kits/synthwave/assets/sons/pop-palavra.mp3 +0 -0
- package/kits/synthwave/assets/sons/subida.mp3 +0 -0
- package/kits/synthwave/assets/sons/swoosh.mp3 +0 -0
- package/kits/synthwave/assets/sons/whoosh-entra.mp3 +0 -0
- package/kits/synthwave/assets/sons/whoosh-sai.mp3 +0 -0
- package/kits/synthwave/assets/trilha/noite-110bpm.mp3 +0 -0
- package/kits/synthwave/capa.jpg +0 -0
- package/kits/synthwave/elementos/AssinaturaMarca.tsx +26 -0
- package/kits/synthwave/elementos/Camera.tsx +22 -0
- package/kits/synthwave/elementos/Cena.tsx +41 -0
- package/kits/synthwave/elementos/Estrelas.tsx +27 -0
- package/kits/synthwave/elementos/Fundo.tsx +20 -0
- package/kits/synthwave/elementos/Montagem.tsx +59 -0
- package/kits/synthwave/elementos/Montanhas.tsx +27 -0
- package/kits/synthwave/elementos/Palmeiras.tsx +30 -0
- package/kits/synthwave/elementos/QuadroHUD.tsx +33 -0
- package/kits/synthwave/elementos/SolListrado.tsx +29 -0
- package/kits/synthwave/elementos/Som.tsx +38 -0
- package/kits/synthwave/elementos/TituloNeon.tsx +30 -0
- package/kits/synthwave/elementos/base.ts +75 -0
- package/kits/synthwave/elementos/index.ts +16 -0
- package/kits/synthwave/exemplos/logo-arcade.svg +1 -0
- package/kits/synthwave/exemplos/plano.json +50 -0
- package/kits/synthwave/exemplos/roteiro.md +19 -0
- package/kits/synthwave/preview.tsx +16 -0
- package/kits/synthwave/receita.json +170 -0
- package/kits/synthwave/regras/area-segura.md +19 -0
- package/kits/synthwave/regras/cor.md +16 -0
- package/kits/synthwave/regras/movimento.md +16 -0
- package/kits/synthwave/regras/ritmo.md +15 -0
- package/kits/synthwave/regras/som.md +21 -0
- package/kits/synthwave/regras/tipografia.md +16 -0
- package/kits/terminal/SKILL.md +57 -0
- package/kits/terminal/assets/ASSETS.md +20 -0
- package/kits/terminal/assets/fontes/OFL-jetbrains-mono-700.txt +93 -0
- package/kits/terminal/assets/fontes/OFL-vt323.txt +93 -0
- package/kits/terminal/assets/fontes/jetbrains-mono-700.woff2 +0 -0
- package/kits/terminal/assets/fontes/vt323.woff2 +0 -0
- package/kits/terminal/assets/sons/assinatura.mp3 +0 -0
- package/kits/terminal/assets/sons/clique.mp3 +0 -0
- package/kits/terminal/assets/sons/digitar.mp3 +0 -0
- package/kits/terminal/assets/sons/impacto.mp3 +0 -0
- package/kits/terminal/assets/sons/liga-crt.mp3 +0 -0
- package/kits/terminal/assets/sons/pop-cartao.mp3 +0 -0
- package/kits/terminal/assets/sons/pop-palavra.mp3 +0 -0
- package/kits/terminal/assets/sons/subida.mp3 +0 -0
- package/kits/terminal/assets/sons/swoosh.mp3 +0 -0
- package/kits/terminal/assets/sons/tick.mp3 +0 -0
- package/kits/terminal/assets/sons/whoosh-entra.mp3 +0 -0
- package/kits/terminal/assets/sons/whoosh-sai.mp3 +0 -0
- package/kits/terminal/assets/trilha/trilha.mp3 +0 -0
- package/kits/terminal/capa.jpg +0 -0
- package/kits/terminal/elementos/ArteAscii.tsx +61 -0
- package/kits/terminal/elementos/BarraProgresso.tsx +42 -0
- package/kits/terminal/elementos/BarraStatus.tsx +18 -0
- package/kits/terminal/elementos/BootBios.tsx +41 -0
- package/kits/terminal/elementos/Camera.tsx +23 -0
- package/kits/terminal/elementos/Cena.tsx +25 -0
- package/kits/terminal/elementos/Fundo.tsx +22 -0
- package/kits/terminal/elementos/LinhaComando.tsx +31 -0
- package/kits/terminal/elementos/Monitor.tsx +42 -0
- package/kits/terminal/elementos/Montagem.tsx +52 -0
- package/kits/terminal/elementos/PainelCaixa.tsx +35 -0
- package/kits/terminal/elementos/Som.tsx +32 -0
- package/kits/terminal/elementos/Tela.tsx +25 -0
- package/kits/terminal/elementos/TextoGrande.tsx +35 -0
- package/kits/terminal/elementos/base.ts +67 -0
- package/kits/terminal/elementos/index.ts +16 -0
- package/kits/terminal/exemplos/plano.json +330 -0
- package/kits/terminal/exemplos/roteiro.md +14 -0
- package/kits/terminal/preview.tsx +9 -0
- package/kits/terminal/receita.json +14 -0
- package/kits/terminal/regras/area-segura.md +18 -0
- package/kits/terminal/regras/cor.md +16 -0
- package/kits/terminal/regras/movimento.md +15 -0
- package/kits/terminal/regras/ritmo.md +14 -0
- package/kits/terminal/regras/som.md +17 -0
- package/kits/terminal/regras/tipografia.md +15 -0
- package/kits/tiktok-energia/SKILL.md +51 -0
- package/kits/tiktok-energia/assets/ASSETS.md +22 -0
- package/kits/tiktok-energia/assets/fontes/OFL-Anton.txt +92 -0
- package/kits/tiktok-energia/assets/fontes/OFL-Rubik.txt +92 -0
- package/kits/tiktok-energia/assets/fontes/anton-latin.woff2 +0 -0
- package/kits/tiktok-energia/assets/fontes/rubik-latin.woff2 +0 -0
- package/kits/tiktok-energia/assets/sons/assinatura.mp3 +0 -0
- package/kits/tiktok-energia/assets/sons/corte.mp3 +0 -0
- package/kits/tiktok-energia/assets/sons/palavra.mp3 +0 -0
- package/kits/tiktok-energia/assets/sons/pop.mp3 +0 -0
- package/kits/tiktok-energia/assets/sons/soco.mp3 +0 -0
- package/kits/tiktok-energia/assets/sons/subida.mp3 +0 -0
- package/kits/tiktok-energia/assets/sons/whoosh.mp3 +0 -0
- package/kits/tiktok-energia/assets/sons/zap.mp3 +0 -0
- package/kits/tiktok-energia/assets/trilha/tech-128bpm.mp3 +0 -0
- package/kits/tiktok-energia/capa.jpg +0 -0
- package/kits/tiktok-energia/elementos/AssinaturaMarca.tsx +25 -0
- package/kits/tiktok-energia/elementos/Camera.tsx +22 -0
- package/kits/tiktok-energia/elementos/Cena.tsx +48 -0
- package/kits/tiktok-energia/elementos/CorteDeCor.tsx +22 -0
- package/kits/tiktok-energia/elementos/EmojiSticker.tsx +21 -0
- package/kits/tiktok-energia/elementos/FotoSoco.tsx +27 -0
- package/kits/tiktok-energia/elementos/Fundo.tsx +8 -0
- package/kits/tiktok-energia/elementos/Montagem.tsx +67 -0
- package/kits/tiktok-energia/elementos/PalavraSoco.tsx +29 -0
- package/kits/tiktok-energia/elementos/Som.tsx +33 -0
- package/kits/tiktok-energia/elementos/TextoCaixa.tsx +25 -0
- package/kits/tiktok-energia/elementos/base.ts +92 -0
- package/kits/tiktok-energia/elementos/index.ts +15 -0
- package/kits/tiktok-energia/exemplos/fotos/foto-03.jpg +0 -0
- package/kits/tiktok-energia/exemplos/logo-pulo.svg +1 -0
- package/kits/tiktok-energia/exemplos/plano.json +66 -0
- package/kits/tiktok-energia/exemplos/roteiro.md +22 -0
- package/kits/tiktok-energia/preview.tsx +13 -0
- package/kits/tiktok-energia/receita.json +166 -0
- package/kits/tiktok-energia/regras/area-segura.md +19 -0
- package/kits/tiktok-energia/regras/cor.md +20 -0
- package/kits/tiktok-energia/regras/movimento.md +17 -0
- package/kits/tiktok-energia/regras/ritmo.md +15 -0
- package/kits/tiktok-energia/regras/som.md +20 -0
- package/kits/tiktok-energia/regras/tipografia.md +15 -0
- package/kits/tunel/SKILL.md +51 -0
- package/kits/tunel/assets/ASSETS.md +21 -0
- package/kits/tunel/assets/fontes/OFL-ChakraPetch.txt +92 -0
- package/kits/tunel/assets/fontes/OFL-Syncopate.txt +92 -0
- package/kits/tunel/assets/fontes/chakra-latin.woff2 +0 -0
- package/kits/tunel/assets/fontes/syncopate-latin.woff2 +0 -0
- package/kits/tunel/assets/sons/assinatura.mp3 +0 -0
- package/kits/tunel/assets/sons/clique.mp3 +0 -0
- package/kits/tunel/assets/sons/impacto.mp3 +0 -0
- package/kits/tunel/assets/sons/passa.mp3 +0 -0
- package/kits/tunel/assets/sons/subida.mp3 +0 -0
- package/kits/tunel/assets/sons/tick.mp3 +0 -0
- package/kits/tunel/assets/sons/varre.mp3 +0 -0
- package/kits/tunel/assets/sons/whoosh.mp3 +0 -0
- package/kits/tunel/assets/trilha/tech-128bpm.mp3 +0 -0
- package/kits/tunel/capa.jpg +0 -0
- package/kits/tunel/elementos/AssinaturaMarca.tsx +22 -0
- package/kits/tunel/elementos/Camera.tsx +22 -0
- package/kits/tunel/elementos/Cena.tsx +48 -0
- package/kits/tunel/elementos/Fundo.tsx +13 -0
- package/kits/tunel/elementos/LinhasDeVelocidade.tsx +25 -0
- package/kits/tunel/elementos/Montagem.tsx +67 -0
- package/kits/tunel/elementos/NumeroGigante.tsx +28 -0
- package/kits/tunel/elementos/PlacaVoadora.tsx +28 -0
- package/kits/tunel/elementos/Som.tsx +33 -0
- package/kits/tunel/elementos/TituloTunel.tsx +32 -0
- package/kits/tunel/elementos/TunelDeFormas.tsx +52 -0
- package/kits/tunel/elementos/base.ts +97 -0
- package/kits/tunel/elementos/index.ts +15 -0
- package/kits/tunel/exemplos/logo-rota21.svg +1 -0
- package/kits/tunel/exemplos/plano.json +51 -0
- package/kits/tunel/exemplos/roteiro.md +20 -0
- package/kits/tunel/preview.tsx +12 -0
- package/kits/tunel/receita.json +153 -0
- package/kits/tunel/regras/area-segura.md +18 -0
- package/kits/tunel/regras/cor.md +21 -0
- package/kits/tunel/regras/movimento.md +17 -0
- package/kits/tunel/regras/ritmo.md +14 -0
- package/kits/tunel/regras/som.md +20 -0
- package/kits/tunel/regras/tipografia.md +15 -0
- package/kits/tutorial-tela/SKILL.md +55 -0
- package/kits/tutorial-tela/assets/ASSETS.md +20 -0
- package/kits/tutorial-tela/assets/fontes/OFL-JetBrainsMono.txt +93 -0
- package/kits/tutorial-tela/assets/fontes/OFL-PlusJakartaSans.txt +93 -0
- package/kits/tutorial-tela/assets/fontes/jakarta.woff2 +0 -0
- package/kits/tutorial-tela/assets/fontes/jbmono.woff2 +0 -0
- package/kits/tutorial-tela/assets/sons/assinatura.mp3 +0 -0
- package/kits/tutorial-tela/assets/sons/clique.mp3 +0 -0
- package/kits/tutorial-tela/assets/sons/digitar.mp3 +0 -0
- package/kits/tutorial-tela/assets/sons/impacto.mp3 +0 -0
- package/kits/tutorial-tela/assets/sons/pop-cartao.mp3 +0 -0
- package/kits/tutorial-tela/assets/sons/pop-palavra.mp3 +0 -0
- package/kits/tutorial-tela/assets/sons/subida.mp3 +0 -0
- package/kits/tutorial-tela/assets/sons/sucesso.mp3 +0 -0
- package/kits/tutorial-tela/assets/sons/swoosh.mp3 +0 -0
- package/kits/tutorial-tela/assets/sons/whoosh-entra.mp3 +0 -0
- package/kits/tutorial-tela/assets/sons/whoosh-sai.mp3 +0 -0
- package/kits/tutorial-tela/assets/trilha/passo-108bpm.mp3 +0 -0
- package/kits/tutorial-tela/capa.jpg +0 -0
- package/kits/tutorial-tela/elementos/CameraTela.tsx +29 -0
- package/kits/tutorial-tela/elementos/Cursor.tsx +36 -0
- package/kits/tutorial-tela/elementos/DestaqueCaixa.tsx +17 -0
- package/kits/tutorial-tela/elementos/Fundo.tsx +12 -0
- package/kits/tutorial-tela/elementos/JanelaApp.tsx +81 -0
- package/kits/tutorial-tela/elementos/Montagem.tsx +49 -0
- package/kits/tutorial-tela/elementos/PassoChamada.tsx +22 -0
- package/kits/tutorial-tela/elementos/Som.tsx +41 -0
- package/kits/tutorial-tela/elementos/TeclaAtalho.tsx +29 -0
- package/kits/tutorial-tela/elementos/TituloTela.tsx +30 -0
- package/kits/tutorial-tela/elementos/base.ts +65 -0
- package/kits/tutorial-tela/elementos/index.ts +12 -0
- package/kits/tutorial-tela/exemplos/plano.json +41 -0
- package/kits/tutorial-tela/exemplos/roteiro.md +14 -0
- package/kits/tutorial-tela/preview.tsx +9 -0
- package/kits/tutorial-tela/receita.json +15 -0
- package/kits/tutorial-tela/regras/area-segura.md +13 -0
- package/kits/tutorial-tela/regras/cor.md +17 -0
- package/kits/tutorial-tela/regras/movimento.md +20 -0
- package/kits/tutorial-tela/regras/ritmo.md +24 -0
- package/kits/tutorial-tela/regras/som.md +21 -0
- package/kits/tutorial-tela/regras/tipografia.md +15 -0
- package/kits/ugc-reels/SKILL.md +53 -0
- package/kits/ugc-reels/assets/ASSETS.md +22 -0
- package/kits/ugc-reels/assets/fontes/OFL-Caveat.txt +92 -0
- package/kits/ugc-reels/assets/fontes/OFL-Montserrat.txt +92 -0
- package/kits/ugc-reels/assets/fontes/caveat-latin.woff2 +0 -0
- package/kits/ugc-reels/assets/fontes/montserrat-latin.woff2 +0 -0
- package/kits/ugc-reels/assets/sons/assinatura.mp3 +0 -0
- package/kits/ugc-reels/assets/sons/corte.mp3 +0 -0
- package/kits/ugc-reels/assets/sons/impacto.mp3 +0 -0
- package/kits/ugc-reels/assets/sons/notificacao.mp3 +0 -0
- package/kits/ugc-reels/assets/sons/palavra.mp3 +0 -0
- package/kits/ugc-reels/assets/sons/pop.mp3 +0 -0
- package/kits/ugc-reels/assets/sons/toque.mp3 +0 -0
- package/kits/ugc-reels/assets/sons/whoosh.mp3 +0 -0
- package/kits/ugc-reels/assets/trilha/pop-120bpm.mp3 +0 -0
- package/kits/ugc-reels/capa.jpg +0 -0
- package/kits/ugc-reels/elementos/AssinaturaMarca.tsx +28 -0
- package/kits/ugc-reels/elementos/BotaoLink.tsx +24 -0
- package/kits/ugc-reels/elementos/CabecalhoPerfil.tsx +38 -0
- package/kits/ugc-reels/elementos/Camera.tsx +22 -0
- package/kits/ugc-reels/elementos/Cena.tsx +48 -0
- package/kits/ugc-reels/elementos/Comentario.tsx +29 -0
- package/kits/ugc-reels/elementos/Fundo.tsx +8 -0
- package/kits/ugc-reels/elementos/LegendaEmoji.tsx +43 -0
- package/kits/ugc-reels/elementos/Montagem.tsx +69 -0
- package/kits/ugc-reels/elementos/NotaDeMao.tsx +29 -0
- package/kits/ugc-reels/elementos/Reacoes.tsx +26 -0
- package/kits/ugc-reels/elementos/Som.tsx +33 -0
- package/kits/ugc-reels/elementos/VideoCelular.tsx +37 -0
- package/kits/ugc-reels/elementos/base.ts +92 -0
- package/kits/ugc-reels/elementos/index.ts +17 -0
- package/kits/ugc-reels/exemplos/fotos/foto-02.jpg +0 -0
- package/kits/ugc-reels/exemplos/fotos/foto-03.jpg +0 -0
- package/kits/ugc-reels/exemplos/fotos/foto-04.jpg +0 -0
- package/kits/ugc-reels/exemplos/fotos/foto-06.jpg +0 -0
- package/kits/ugc-reels/exemplos/logo-rotina.svg +1 -0
- package/kits/ugc-reels/exemplos/plano.json +54 -0
- package/kits/ugc-reels/exemplos/roteiro.md +20 -0
- package/kits/ugc-reels/preview.tsx +16 -0
- package/kits/ugc-reels/receita.json +147 -0
- package/kits/ugc-reels/regras/area-segura.md +18 -0
- package/kits/ugc-reels/regras/cor.md +22 -0
- package/kits/ugc-reels/regras/movimento.md +19 -0
- package/kits/ugc-reels/regras/ritmo.md +14 -0
- package/kits/ugc-reels/regras/som.md +20 -0
- package/kits/ugc-reels/regras/tipografia.md +16 -0
- package/kits/vercel-mono/SKILL.md +51 -0
- package/kits/vercel-mono/assets/ASSETS.md +18 -0
- package/kits/vercel-mono/assets/fontes/OFL-Inter.txt +93 -0
- package/kits/vercel-mono/assets/fontes/OFL-JetBrains-Mono.txt +93 -0
- package/kits/vercel-mono/assets/fontes/inter.woff2 +0 -0
- package/kits/vercel-mono/assets/fontes/jetbrains-mono.woff2 +0 -0
- package/kits/vercel-mono/assets/sons/assinatura.mp3 +0 -0
- package/kits/vercel-mono/assets/sons/clique.mp3 +0 -0
- package/kits/vercel-mono/assets/sons/impacto.mp3 +0 -0
- package/kits/vercel-mono/assets/sons/pop-cartao.mp3 +0 -0
- package/kits/vercel-mono/assets/sons/pop-palavra.mp3 +0 -0
- package/kits/vercel-mono/assets/sons/subida.mp3 +0 -0
- package/kits/vercel-mono/assets/sons/swoosh.mp3 +0 -0
- package/kits/vercel-mono/assets/sons/whoosh-entra.mp3 +0 -0
- package/kits/vercel-mono/assets/sons/whoosh-sai.mp3 +0 -0
- package/kits/vercel-mono/assets/trilha/trilha.mp3 +0 -0
- package/kits/vercel-mono/capa.jpg +0 -0
- package/kits/vercel-mono/elementos/AssinaturaMarca.tsx +18 -0
- package/kits/vercel-mono/elementos/Camera.tsx +23 -0
- package/kits/vercel-mono/elementos/Cena.tsx +46 -0
- package/kits/vercel-mono/elementos/FaixaOutline.tsx +25 -0
- package/kits/vercel-mono/elementos/Fundo.tsx +6 -0
- package/kits/vercel-mono/elementos/GradeDeNumeros.tsx +27 -0
- package/kits/vercel-mono/elementos/Montagem.tsx +61 -0
- package/kits/vercel-mono/elementos/PalavraMono.tsx +31 -0
- package/kits/vercel-mono/elementos/Quadro.tsx +28 -0
- package/kits/vercel-mono/elementos/Som.tsx +39 -0
- package/kits/vercel-mono/elementos/TerminalComando.tsx +33 -0
- package/kits/vercel-mono/elementos/TrianguloGigante.tsx +27 -0
- package/kits/vercel-mono/elementos/base.ts +82 -0
- package/kits/vercel-mono/elementos/index.ts +16 -0
- package/kits/vercel-mono/exemplos/logo-vetor.svg +1 -0
- package/kits/vercel-mono/exemplos/plano.json +318 -0
- package/kits/vercel-mono/exemplos/roteiro.md +20 -0
- package/kits/vercel-mono/preview.tsx +12 -0
- package/kits/vercel-mono/receita.json +156 -0
- package/kits/vercel-mono/regras/area-segura.md +13 -0
- package/kits/vercel-mono/regras/cor.md +12 -0
- package/kits/vercel-mono/regras/movimento.md +15 -0
- package/kits/vercel-mono/regras/ritmo.md +13 -0
- package/kits/vercel-mono/regras/som.md +18 -0
- package/kits/vercel-mono/regras/tipografia.md +14 -0
- package/kits/vhs-90/SKILL.md +52 -0
- package/kits/vhs-90/assets/ASSETS.md +23 -0
- package/kits/vhs-90/assets/fontes/OFL-BebasNeue.txt +93 -0
- package/kits/vhs-90/assets/fontes/OFL-VT323.txt +93 -0
- package/kits/vhs-90/assets/fontes/bebas.woff2 +0 -0
- package/kits/vhs-90/assets/fontes/vt323.woff2 +0 -0
- package/kits/vhs-90/assets/sons/assinatura.mp3 +0 -0
- package/kits/vhs-90/assets/sons/clique.mp3 +0 -0
- package/kits/vhs-90/assets/sons/impacto.mp3 +0 -0
- package/kits/vhs-90/assets/sons/pop-cartao.mp3 +0 -0
- package/kits/vhs-90/assets/sons/pop-palavra.mp3 +0 -0
- package/kits/vhs-90/assets/sons/subida.mp3 +0 -0
- package/kits/vhs-90/assets/sons/swoosh.mp3 +0 -0
- package/kits/vhs-90/assets/sons/whoosh-entra.mp3 +0 -0
- package/kits/vhs-90/assets/sons/whoosh-sai.mp3 +0 -0
- package/kits/vhs-90/assets/trilha/fita-88bpm.mp3 +0 -0
- package/kits/vhs-90/capa.jpg +0 -0
- package/kits/vhs-90/elementos/AssinaturaMarca.tsx +29 -0
- package/kits/vhs-90/elementos/BarrasRastreio.tsx +21 -0
- package/kits/vhs-90/elementos/Camera.tsx +22 -0
- package/kits/vhs-90/elementos/CapaVHS.tsx +28 -0
- package/kits/vhs-90/elementos/CarimboData.tsx +19 -0
- package/kits/vhs-90/elementos/Cena.tsx +41 -0
- package/kits/vhs-90/elementos/Fundo.tsx +27 -0
- package/kits/vhs-90/elementos/MenuOSD.tsx +27 -0
- package/kits/vhs-90/elementos/Montagem.tsx +60 -0
- package/kits/vhs-90/elementos/Som.tsx +38 -0
- package/kits/vhs-90/elementos/TelaAzul.tsx +29 -0
- package/kits/vhs-90/elementos/TituloFita.tsx +40 -0
- package/kits/vhs-90/elementos/base.ts +75 -0
- package/kits/vhs-90/elementos/index.ts +16 -0
- package/kits/vhs-90/exemplos/fotos/foto-05.jpg +0 -0
- package/kits/vhs-90/exemplos/fotos/foto-07.jpg +0 -0
- package/kits/vhs-90/exemplos/logo-rewind.svg +1 -0
- package/kits/vhs-90/exemplos/plano.json +47 -0
- package/kits/vhs-90/exemplos/roteiro.md +19 -0
- package/kits/vhs-90/preview.tsx +17 -0
- package/kits/vhs-90/receita.json +189 -0
- package/kits/vhs-90/regras/area-segura.md +18 -0
- package/kits/vhs-90/regras/cor.md +16 -0
- package/kits/vhs-90/regras/movimento.md +16 -0
- package/kits/vhs-90/regras/ritmo.md +16 -0
- package/kits/vhs-90/regras/som.md +21 -0
- package/kits/vhs-90/regras/tipografia.md +17 -0
- package/kits/vidro-ios/SKILL.md +52 -0
- package/kits/vidro-ios/assets/ASSETS.md +18 -0
- package/kits/vidro-ios/assets/fontes/OFL-DM-Mono.txt +93 -0
- package/kits/vidro-ios/assets/fontes/OFL-Inter.txt +93 -0
- package/kits/vidro-ios/assets/fontes/dm-mono.woff2 +0 -0
- package/kits/vidro-ios/assets/fontes/inter.woff2 +0 -0
- package/kits/vidro-ios/assets/sons/assinatura.mp3 +0 -0
- package/kits/vidro-ios/assets/sons/clique.mp3 +0 -0
- package/kits/vidro-ios/assets/sons/impacto.mp3 +0 -0
- package/kits/vidro-ios/assets/sons/pop-cartao.mp3 +0 -0
- package/kits/vidro-ios/assets/sons/pop-palavra.mp3 +0 -0
- package/kits/vidro-ios/assets/sons/subida.mp3 +0 -0
- package/kits/vidro-ios/assets/sons/swoosh.mp3 +0 -0
- package/kits/vidro-ios/assets/sons/whoosh-entra.mp3 +0 -0
- package/kits/vidro-ios/assets/sons/whoosh-sai.mp3 +0 -0
- package/kits/vidro-ios/assets/trilha/trilha.mp3 +0 -0
- package/kits/vidro-ios/capa.jpg +0 -0
- package/kits/vidro-ios/elementos/AssinaturaMarca.tsx +21 -0
- package/kits/vidro-ios/elementos/Camera.tsx +23 -0
- package/kits/vidro-ios/elementos/Cena.tsx +46 -0
- package/kits/vidro-ios/elementos/Fundo.tsx +17 -0
- package/kits/vidro-ios/elementos/IlhaDinamica.tsx +24 -0
- package/kits/vidro-ios/elementos/Montagem.tsx +60 -0
- package/kits/vidro-ios/elementos/PainelControle.tsx +33 -0
- package/kits/vidro-ios/elementos/PilhaNotificacoes.tsx +29 -0
- package/kits/vidro-ios/elementos/Som.tsx +39 -0
- package/kits/vidro-ios/elementos/TituloVidro.tsx +22 -0
- package/kits/vidro-ios/elementos/WidgetsGrade.tsx +34 -0
- package/kits/vidro-ios/elementos/base.ts +87 -0
- package/kits/vidro-ios/elementos/index.ts +16 -0
- package/kits/vidro-ios/elementos/vidro.tsx +20 -0
- package/kits/vidro-ios/exemplos/logo-vento.svg +1 -0
- package/kits/vidro-ios/exemplos/plano.json +288 -0
- package/kits/vidro-ios/exemplos/roteiro.md +20 -0
- package/kits/vidro-ios/preview.tsx +12 -0
- package/kits/vidro-ios/receita.json +170 -0
- package/kits/vidro-ios/regras/area-segura.md +13 -0
- package/kits/vidro-ios/regras/cor.md +16 -0
- package/kits/vidro-ios/regras/movimento.md +16 -0
- package/kits/vidro-ios/regras/ritmo.md +14 -0
- package/kits/vidro-ios/regras/som.md +18 -0
- package/kits/vidro-ios/regras/tipografia.md +15 -0
- package/kits/y2k-cromado/SKILL.md +53 -0
- package/kits/y2k-cromado/assets/ASSETS.md +23 -0
- package/kits/y2k-cromado/assets/fontes/OFL-DMMono.txt +93 -0
- package/kits/y2k-cromado/assets/fontes/OFL-Unbounded.txt +93 -0
- package/kits/y2k-cromado/assets/fontes/dm-mono.woff2 +0 -0
- package/kits/y2k-cromado/assets/fontes/unbounded.woff2 +0 -0
- package/kits/y2k-cromado/assets/sons/assinatura.mp3 +0 -0
- package/kits/y2k-cromado/assets/sons/clique.mp3 +0 -0
- package/kits/y2k-cromado/assets/sons/impacto.mp3 +0 -0
- package/kits/y2k-cromado/assets/sons/pop-cartao.mp3 +0 -0
- package/kits/y2k-cromado/assets/sons/pop-palavra.mp3 +0 -0
- package/kits/y2k-cromado/assets/sons/subida.mp3 +0 -0
- package/kits/y2k-cromado/assets/sons/swoosh.mp3 +0 -0
- package/kits/y2k-cromado/assets/sons/whoosh-entra.mp3 +0 -0
- package/kits/y2k-cromado/assets/sons/whoosh-sai.mp3 +0 -0
- package/kits/y2k-cromado/assets/trilha/y2k-128bpm.mp3 +0 -0
- package/kits/y2k-cromado/capa.jpg +0 -0
- package/kits/y2k-cromado/elementos/AssinaturaMarca.tsx +25 -0
- package/kits/y2k-cromado/elementos/Bolhas.tsx +30 -0
- package/kits/y2k-cromado/elementos/Brilhos.tsx +28 -0
- package/kits/y2k-cromado/elementos/Camera.tsx +22 -0
- package/kits/y2k-cromado/elementos/CartaoGloss.tsx +26 -0
- package/kits/y2k-cromado/elementos/Cena.tsx +41 -0
- package/kits/y2k-cromado/elementos/FitaMarquee.tsx +20 -0
- package/kits/y2k-cromado/elementos/Fundo.tsx +18 -0
- package/kits/y2k-cromado/elementos/JanelaY2K.tsx +31 -0
- package/kits/y2k-cromado/elementos/Montagem.tsx +60 -0
- package/kits/y2k-cromado/elementos/OrbeCromo.tsx +20 -0
- package/kits/y2k-cromado/elementos/Som.tsx +38 -0
- package/kits/y2k-cromado/elementos/TextoCromo.tsx +34 -0
- package/kits/y2k-cromado/elementos/base.ts +75 -0
- package/kits/y2k-cromado/elementos/index.ts +17 -0
- package/kits/y2k-cromado/exemplos/fotos/foto-02.jpg +0 -0
- package/kits/y2k-cromado/exemplos/fotos/foto-03.jpg +0 -0
- package/kits/y2k-cromado/exemplos/logo-bolha.svg +1 -0
- package/kits/y2k-cromado/exemplos/plano.json +47 -0
- package/kits/y2k-cromado/exemplos/roteiro.md +19 -0
- package/kits/y2k-cromado/preview.tsx +17 -0
- package/kits/y2k-cromado/receita.json +174 -0
- package/kits/y2k-cromado/regras/area-segura.md +19 -0
- package/kits/y2k-cromado/regras/cor.md +16 -0
- package/kits/y2k-cromado/regras/movimento.md +16 -0
- package/kits/y2k-cromado/regras/ritmo.md +15 -0
- package/kits/y2k-cromado/regras/som.md +21 -0
- package/kits/y2k-cromado/regras/tipografia.md +17 -0
- package/lib/act.js +387 -18
- package/lib/afirmacoes.js +56 -0
- package/lib/agendar.js +124 -0
- package/lib/backup-banco.js +121 -0
- package/lib/boas-vindas.js +4 -3
- package/lib/catalogo.js +8 -2
- package/lib/chave-exposta.js +61 -0
- package/lib/checkpoint-git.js +7 -4
- package/lib/checkpoint.js +120 -3
- package/lib/comandos-extra.js +69 -2
- package/lib/comecar.js +56 -0
- package/lib/como-rodar.js +66 -0
- package/lib/conferir.js +117 -0
- package/lib/config.js +4 -2
- package/lib/editor-pro.js +162 -21
- package/lib/encolheu.js +33 -0
- package/lib/entrada.js +1 -1
- package/lib/entregaveis.js +67 -0
- package/lib/escopo.js +68 -0
- package/lib/especialistas.js +1 -1
- package/lib/estudio/conferencia.js +71 -6
- package/lib/estudio/gosto/tela.html +119 -4
- package/lib/estudio/gosto-descrever.js +87 -0
- package/lib/estudio/gosto-medir.js +204 -0
- package/lib/estudio/gosto-prova.js +52 -0
- package/lib/estudio/gosto.js +312 -9
- package/lib/estudio/index.js +2 -2
- package/lib/estudio/kits/tela.html +568 -0
- package/lib/estudio/kits-tela.js +199 -0
- package/lib/estudio/maquina-diretor.js +6 -2
- package/lib/estudio/regras-motion.js +69 -0
- package/lib/explicar.js +48 -0
- package/lib/exportar-conversa.js +49 -0
- package/lib/fundo.js +199 -0
- package/lib/guardar.js +118 -0
- package/lib/headless.js +20 -1
- package/lib/idioma.js +74 -0
- package/lib/kits-parecidos.js +99 -0
- package/lib/kits-plano.js +557 -0
- package/lib/kits.js +1045 -0
- package/lib/limite.js +99 -0
- package/lib/linha-do-tempo.js +130 -0
- package/lib/local/cerebro.json +118 -2
- package/lib/local/entrada.js +1 -1
- package/lib/mapa.js +94 -0
- package/lib/memoria-usuario.js +1 -1
- package/lib/mencoes.js +10 -0
- package/lib/mostrar.js +121 -0
- package/lib/motioncraft.js +67 -0
- package/lib/mudou.js +58 -0
- package/lib/nomes.js +251 -0
- package/lib/partes.js +39 -0
- package/lib/passagem.js +30 -1
- package/lib/perigo.js +74 -6
- package/lib/plano-previo.js +53 -0
- package/lib/planos.js +1 -1
- package/lib/porta.js +147 -0
- package/lib/publicar.js +112 -0
- package/lib/registro.js +38 -4
- package/lib/regras.js +88 -0
- package/lib/saida.js +83 -0
- package/lib/segredos.js +103 -0
- package/lib/team.js +317 -0
- package/lib/tools.js +84 -21
- package/lib/trava.js +155 -0
- package/lib/ui.js +42 -5
- package/lib/video/conferir-legenda.js +47 -0
- package/lib/video/ops.js +6 -1
- package/lib/video/transcript.js +1 -1
- package/lib/web-pagina.js +87 -0
- package/package.json +4 -1
- package/skills/motion-de-primeira/SKILL.md +1 -1
- package/skills/motion-motioncraft/SKILL.md +31 -0
- package/vendor/motioncraft/CREDITS.md +18 -0
- package/vendor/motioncraft/LICENSE +21 -0
- package/vendor/motioncraft/ORIGEM.txt +1 -0
- package/vendor/motioncraft/SKILL.md +178 -0
- package/vendor/motioncraft/assets/template/package-lock.json +2958 -0
- package/vendor/motioncraft/assets/template/package.json +27 -0
- package/vendor/motioncraft/assets/template/remotion.config.ts +4 -0
- package/vendor/motioncraft/assets/template/src/Root.tsx +27 -0
- package/vendor/motioncraft/assets/template/src/components/CachedFrames.tsx +11 -0
- package/vendor/motioncraft/assets/template/src/components/EndCard.tsx +17 -0
- package/vendor/motioncraft/assets/template/src/components/Headline.tsx +45 -0
- package/vendor/motioncraft/assets/template/src/components/MorphTransition.tsx +28 -0
- package/vendor/motioncraft/assets/template/src/components/Stage.tsx +52 -0
- package/vendor/motioncraft/assets/template/src/components/Three.tsx +134 -0
- package/vendor/motioncraft/assets/template/src/components/UI.tsx +103 -0
- package/vendor/motioncraft/assets/template/src/components/Word.tsx +46 -0
- package/vendor/motioncraft/assets/template/src/index.ts +3 -0
- package/vendor/motioncraft/assets/template/src/lib/anim.ts +17 -0
- package/vendor/motioncraft/assets/template/src/lib/beat.ts +23 -0
- package/vendor/motioncraft/assets/template/src/lib/debug.tsx +12 -0
- package/vendor/motioncraft/assets/template/src/lib/fonts.ts +6 -0
- package/vendor/motioncraft/assets/template/src/lib/format-context.tsx +5 -0
- package/vendor/motioncraft/assets/template/src/lib/format.d.mts +2 -0
- package/vendor/motioncraft/assets/template/src/lib/format.mjs +28 -0
- package/vendor/motioncraft/assets/template/src/lib/timeline.ts +29 -0
- package/vendor/motioncraft/assets/template/src/lib/tokens.ts +9 -0
- package/vendor/motioncraft/assets/template/src/scenes/Example.tsx +76 -0
- package/vendor/motioncraft/assets/template/src/scenes/Launch.tsx +26 -0
- package/vendor/motioncraft/assets/template/src/scenes/TimelineLegacy.tsx +24 -0
- package/vendor/motioncraft/assets/template/src/scenes/TimelineVideo.tsx +49 -0
- package/vendor/motioncraft/assets/template/src/scenes/Tutorial.tsx +37 -0
- package/vendor/motioncraft/assets/template/src/style.json +62 -0
- package/vendor/motioncraft/assets/template/tsconfig.json +7 -0
- package/vendor/motioncraft/references/animation-system.md +57 -0
- package/vendor/motioncraft/references/assets-and-licensing.md +21 -0
- package/vendor/motioncraft/references/customization.md +52 -0
- package/vendor/motioncraft/references/gpu-cloud-render.md +15 -0
- package/vendor/motioncraft/references/music.md +43 -0
- package/vendor/motioncraft/references/phase1-planning-and-preview.md +74 -0
- package/vendor/motioncraft/references/phase2-timeline-audio.md +33 -0
- package/vendor/motioncraft/references/phase3-pixel-review.md +13 -0
- package/vendor/motioncraft/references/phase4-templates.md +30 -0
- package/vendor/motioncraft/references/preflight.md +27 -0
- package/vendor/motioncraft/references/qa.md +53 -0
- package/vendor/motioncraft/references/reference-analysis.md +37 -0
- package/vendor/motioncraft/references/research-and-topic.md +25 -0
- package/vendor/motioncraft/references/script-and-structure.md +39 -0
- package/vendor/motioncraft/references/sfx.md +40 -0
- package/vendor/motioncraft/references/social-formats.md +18 -0
- package/vendor/motioncraft/references/taste.md +36 -0
- package/vendor/motioncraft/references/troubleshooting.md +19 -0
- package/vendor/motioncraft/references/typography.md +34 -0
- package/vendor/motioncraft/references/voiceover.md +37 -0
- package/vendor/motioncraft/references/workflow.md +40 -0
- package/vendor/motioncraft/scripts/assets/timeline-editor.js +24 -0
- package/vendor/motioncraft/scripts/doctor.ps1 +13 -0
- package/vendor/motioncraft/scripts/doctor.sh +23 -0
- package/vendor/motioncraft/scripts/lib/audio.mjs +58 -0
- package/vendor/motioncraft/scripts/lib/check-update.mjs +66 -0
- package/vendor/motioncraft/scripts/lib/commands.mjs +147 -0
- package/vendor/motioncraft/scripts/lib/doctor.mjs +67 -0
- package/vendor/motioncraft/scripts/lib/dsp.mjs +178 -0
- package/vendor/motioncraft/scripts/lib/music.mjs +162 -0
- package/vendor/motioncraft/scripts/lib/phase1.mjs +90 -0
- package/vendor/motioncraft/scripts/lib/phase2.mjs +89 -0
- package/vendor/motioncraft/scripts/lib/qa-full.mjs +24 -0
- package/vendor/motioncraft/scripts/lib/qa-pixels.mjs +47 -0
- package/vendor/motioncraft/scripts/lib/qa.mjs +66 -0
- package/vendor/motioncraft/scripts/lib/qa_full.py +45 -0
- package/vendor/motioncraft/scripts/lib/qa_pixels.py +50 -0
- package/vendor/motioncraft/scripts/lib/render-worker.mjs +37 -0
- package/vendor/motioncraft/scripts/lib/render.mjs +31 -0
- package/vendor/motioncraft/scripts/lib/retime-audio.mjs +49 -0
- package/vendor/motioncraft/scripts/lib/sfx.mjs +68 -0
- package/vendor/motioncraft/scripts/lib/style.mjs +44 -0
- package/vendor/motioncraft/scripts/lib/templates.mjs +34 -0
- package/vendor/motioncraft/scripts/lib/timeline-editor.mjs +74 -0
- package/vendor/motioncraft/scripts/lib/util.mjs +45 -0
- package/vendor/motioncraft/scripts/lib/voices.mjs +85 -0
- package/vendor/motioncraft/scripts/motioncraft.mjs +79 -0
- package/vendor/motioncraft/scripts/py/whisper_words.py +13 -0
- package/vendor/motioncraft/styles/mono-editorial/style.md +13 -0
- package/vendor/motioncraft/styles/mono-editorial/tokens.json +256 -0
- package/vendor/motioncraft/styles/pi-v2/style.md +15 -0
- package/vendor/motioncraft/styles/pi-v2/tokens.json +62 -0
- package/vendor/motioncraft/styles/pi-v2-dark/style.md +13 -0
- package/vendor/motioncraft/styles/pi-v2-dark/tokens.json +256 -0
- package/vendor/motioncraft/styles/tech-neon-soft/style.md +13 -0
- package/vendor/motioncraft/styles/tech-neon-soft/tokens.json +256 -0
- package/vendor/motioncraft/styles/warm-paper/style.md +13 -0
- package/vendor/motioncraft/styles/warm-paper/tokens.json +256 -0
- package/vendor/motioncraft/tests/beat.test.mjs +13 -0
- package/vendor/motioncraft/tests/camera3d.test.mjs +22 -0
- package/vendor/motioncraft/tests/check-update.test.mjs +19 -0
- package/vendor/motioncraft/tests/format.test.mjs +23 -0
- package/vendor/motioncraft/tests/kinetic.test.mjs +10 -0
- package/vendor/motioncraft/tests/morph.test.mjs +13 -0
- package/vendor/motioncraft/tests/phase1.test.mjs +27 -0
- package/vendor/motioncraft/tests/phase2.test.mjs +57 -0
- package/vendor/motioncraft/tests/phase3.test.mjs +25 -0
- package/vendor/motioncraft/tests/phase4.test.mjs +21 -0
- package/vendor/motioncraft/tests/qa-frame-rate.test.mjs +15 -0
- package/vendor/motioncraft/tests/qa-full.test.mjs +10 -0
- package/vendor/motioncraft/tests/render-worker.test.mjs +7 -0
- package/vendor/motioncraft/tests/retime-audio.test.mjs +23 -0
- package/vendor/motioncraft/tests/timeline-editor.test.mjs +45 -0
- package/voz/primo_voz/transcrever.py +34 -4
- /package/comandos/{explicar.md → explain.md} +0 -0
- /package/comandos/{revisar.md → review.md} +0 -0
- /package/comandos/{publicar.md → ship.md} +0 -0
package/bin/primocode.js
CHANGED
|
@@ -38,6 +38,7 @@ const perigo = require('../lib/perigo');
|
|
|
38
38
|
const skills = require('../lib/skills');
|
|
39
39
|
const checkpoint = require('../lib/checkpoint');
|
|
40
40
|
const comandosLib = require('../lib/comandos');
|
|
41
|
+
const nomes = require('../lib/nomes');
|
|
41
42
|
const marketplace = require('../lib/marketplace');
|
|
42
43
|
const portaoSkill = require('../lib/portao-skill');
|
|
43
44
|
const vozModo = require('../lib/voz');
|
|
@@ -49,10 +50,11 @@ const compat = require('../lib/compatibilidade');
|
|
|
49
50
|
const mencoesLib = require('../lib/mencoes');
|
|
50
51
|
const extra = require('../lib/comandos-extra');
|
|
51
52
|
const offline = require('../lib/offline');
|
|
53
|
+
const conferirLib = require('../lib/conferir');
|
|
52
54
|
|
|
53
55
|
/* O /custo: toda conversa com o modelo passa pelo lib/api.js, e o contador
|
|
54
56
|
embrulha as funções dele uma vez, aqui. Quem atende é o provedor do /api
|
|
55
|
-
quando há um, senão o servidor — é por eles que o /
|
|
57
|
+
quando há um, senão o servidor — é por eles que o /usage separa. */
|
|
56
58
|
const contadorDaSessao = extra.novoContador();
|
|
57
59
|
extra.instalarContador(api, contadorDaSessao, () => {
|
|
58
60
|
const p = provedorLocal.atual();
|
|
@@ -93,6 +95,7 @@ const VERSION = pkg.version;
|
|
|
93
95
|
const state = {
|
|
94
96
|
config: cfg.loadConfig(),
|
|
95
97
|
history: [],
|
|
98
|
+
passosProntos: null, // os passos que a pessoa aprovou no /plan: o próximo enviarPedido usa em vez de dividir
|
|
96
99
|
resumindo: null, // o resumo da última rodada, sendo feito em segundo plano
|
|
97
100
|
mode: null, // 'primocode' | 'chat' | 'auto' — vem da config em main()
|
|
98
101
|
modoEfetivo: null, // no auto, o modo que o último pedido usou de fato
|
|
@@ -120,55 +123,32 @@ const state = {
|
|
|
120
123
|
controle: permissao.novo(),
|
|
121
124
|
currentProject: null,
|
|
122
125
|
workDir: null, // pasta onde o agente trabalha nesta sessão
|
|
123
|
-
workDirOrigem: null, // 'padrao' | '/dir' | 'detectada' | 'projeto' — para o /dir explicar
|
|
126
|
+
workDirOrigem: null, // 'padrao' | '/dir' | 'detectada' | 'projeto' | 'terminal' (o -p) — para o /dir explicar
|
|
124
127
|
};
|
|
125
128
|
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
${c.brand('/
|
|
129
|
+
/* O /help: os comandos nos 9 grupos de lib/nomes.js, cada um com a descrição
|
|
130
|
+
que o menu já tem (SLASH_COMANDOS + os .md da pessoa e de fábrica). É função
|
|
131
|
+
porque SLASH_COMANDOS nasce depois deste ponto do arquivo. */
|
|
132
|
+
function linhasDosGrupos() {
|
|
133
|
+
const desc = new Map(comandosDoMenu().map(([n, d]) => [n.slice(1), d]));
|
|
134
|
+
const saida = [];
|
|
135
|
+
for (const g of nomes.agrupados()) {
|
|
136
|
+
saida.push(c.bold(g.titulo));
|
|
137
|
+
for (const n of g.comandos) {
|
|
138
|
+
const d = desc.get(n);
|
|
139
|
+
saida.push(d ? ` ${c.brand(ui.padRight('/' + n, 16))}${c.muted(d)}` : ` ${c.brand('/' + n)}`);
|
|
140
|
+
}
|
|
141
|
+
saida.push('');
|
|
142
|
+
}
|
|
143
|
+
return saida;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
function montarHelp() {
|
|
147
|
+
return `
|
|
148
|
+
${c.bold('Comandos')} ${c.dim('· os nomes em português continuam valendo (/desfazer = /undo)')}
|
|
149
|
+
|
|
150
|
+
${linhasDosGrupos().join('\n')}
|
|
137
151
|
${c.brand('-p')} "pedido" modo script: sem tela, aceita stdin e --output-format json
|
|
138
|
-
${c.brand('/memoria')} o que ele lembra de você: /memoria esquecer <nome> · /memoria pasta
|
|
139
|
-
${c.brand('/gosto')} o seu gosto de motion: /gosto refazer|apagar
|
|
140
|
-
${c.brand('/sandbox')} isola os comandos do agente: on|off|rede on|off|status
|
|
141
|
-
${c.brand('/compact')} resume a conversa e devolve o contexto
|
|
142
|
-
${c.brand('/init')} estuda o projeto e escreve o PRIMO.md
|
|
143
|
-
${c.brand('/attach')} <arquivo> anexa arquivo ao próximo pedido · ou @arquivo no pedido
|
|
144
|
-
${c.brand('/files')} lista anexos ${c.brand('/detach')} remove
|
|
145
|
-
${c.brand('/all')} lista tudo que ele sabe fazer
|
|
146
|
-
${c.brand('/desfazer')} [lista|N] desfaz o que o último pedido (ou os N últimos) mudou
|
|
147
|
-
${c.brand('/tree')} [n] árvore do projeto
|
|
148
|
-
${c.brand('/read')} <arquivo> mostra um arquivo
|
|
149
|
-
${c.brand('/run')} <comando> executa no shell do projeto
|
|
150
|
-
${c.brand('/open')} <arq|url> abre no navegador
|
|
151
|
-
${c.brand('/abrir')} abre o projeto: o servidor de pé, ou a index.html
|
|
152
|
-
${c.brand('/copiar')} copia a última resposta
|
|
153
|
-
${c.brand('/videos')} seus vídeos prontos (abrir <n> · pasta <n>)
|
|
154
|
-
${c.brand('/historico')} [termo] procura nos seus pedidos antigos
|
|
155
|
-
${c.brand('/login')} entra na sua conta · ${c.brand('/account')} mostra o plano
|
|
156
|
-
${c.brand('/planos')} os planos e o link para assinar
|
|
157
|
-
${c.brand('/chats')} [n] suas conversas — as mesmas do app e do celular
|
|
158
|
-
${c.brand('/logout')} desconecta este computador da conta
|
|
159
|
-
${c.brand('/comandos')} seus comandos (/revisar, /explicar…) · /comandos novo <nome>
|
|
160
|
-
${c.brand('/status')} checa o servidor
|
|
161
|
-
${c.brand('/offline')} roda o servidor no seu computador (temporário) · /offline off volta
|
|
162
|
-
${c.brand('/doctor')} confere tudo (servidor, /api, Chrome, disco…) e diz como consertar
|
|
163
|
-
${c.brand('/custo')} tokens e pedidos desta sessão, por provedor
|
|
164
|
-
${c.brand('/atalhos')} as teclas que ajudam
|
|
165
|
-
${c.brand('/name')} <nome> como o Primo te chama
|
|
166
|
-
${c.brand('/marca')} [criar|listar|usar] o kit de marca: cores, fontes e logo em todo vídeo
|
|
167
|
-
${c.brand('/mascot')} [nome|n] galeria dos mascotes · /mascot reacoes on|off
|
|
168
|
-
${c.brand('/config')} mostra suas preferências
|
|
169
|
-
${c.brand('/clear')} limpa a conversa ${c.brand('/cls')} limpa a tela
|
|
170
|
-
${c.brand('/uninstall')} remove o PrimoCode
|
|
171
|
-
${c.brand('/exit')} sai do PrimoCode
|
|
172
152
|
|
|
173
153
|
${c.bold('Modos')}
|
|
174
154
|
${c.warn('Primo Code')} ${c.muted('Agente completo — cria arquivos, roda comandos, abre o navegador')}
|
|
@@ -182,39 +162,55 @@ ${c.bold('Onde ele trabalha')}
|
|
|
182
162
|
${c.muted(' ·')} ${c.muted('falar o nome dela no pedido — ele procura no seu computador')}
|
|
183
163
|
${c.dim('Pasta de projeto nova só nasce quando ele vai mexer em arquivo.')}
|
|
184
164
|
`;
|
|
165
|
+
}
|
|
185
166
|
|
|
186
167
|
// ── Autopreenchimento dos comandos (estilo Claude Code) ────────────────
|
|
187
168
|
// Metade do comando já serve: Tab completa, e um prefixo único executa
|
|
188
169
|
// direto — "/eff" vira "/effort" sozinho. A lista é só a dos nomes
|
|
189
170
|
// canônicos; os apelidos (/cd, /stream…) continuam valendo por extenso.
|
|
190
171
|
const SLASH_COMANDOS = [
|
|
191
|
-
['/help', 'todos os comandos'],
|
|
192
|
-
['/
|
|
193
|
-
['/
|
|
194
|
-
['/novo', 'começa um projeto novo do zero: /novo site da padaria'],
|
|
172
|
+
['/help', 'todos os comandos · /help all: tudo que ele sabe fazer'],
|
|
173
|
+
['/projects', 'seus projetos, do mais recente · /projects 2 entra · /projects <nome> cria'],
|
|
174
|
+
['/new', 'projeto novo do zero: /new site da padaria · sem nada: 3 perguntas pra quem nunca programou'],
|
|
195
175
|
['/dir', 'trabalhar numa pasta sua'],
|
|
176
|
+
['/worktree', 'cria ../<repo>-<nome> numa branch nova e entra'],
|
|
177
|
+
['/resume', 'retoma uma conversa salva (sem número, lista)'],
|
|
178
|
+
['/sandbox', 'isola os comandos do agente: on | off | rede on | off | status'],
|
|
196
179
|
['/mode', 'primocode | chat | auto'],
|
|
197
180
|
['/effort', 'esforço: low → ultracode (←/→ para ajustar)'],
|
|
198
|
-
['/
|
|
199
|
-
['/
|
|
181
|
+
['/perms', 'auto | perguntar | livre | plano — quando ele pede licença'],
|
|
182
|
+
['/memory', 'o que ele lembra de você · esquecer <nome> · pasta'],
|
|
183
|
+
['/taste', 'o seu gosto de motion e pra onde ele inclina (refazer, apagar, tirar N) · /taste referencias: ensina com vídeos que você curtiu'],
|
|
200
184
|
['/compact', 'resume a conversa e devolve o contexto'],
|
|
201
185
|
['/init', 'estuda o projeto e escreve o PRIMO.md (as instruções dele)'],
|
|
202
|
-
['/attach', 'anexa arquivo
|
|
186
|
+
['/attach', 'anexa um arquivo ou uma página (/attach <url>) · sem nada, lista · /detach tira'],
|
|
203
187
|
['/detach', 'remove os anexos'],
|
|
204
|
-
['/
|
|
205
|
-
['/
|
|
206
|
-
['/
|
|
207
|
-
['/
|
|
188
|
+
['/undo', 'desfaz o que o último pedido mudou nos arquivos (lista · N · out)'],
|
|
189
|
+
['/redo', 'volta o que o último /undo desfez'],
|
|
190
|
+
['/check', 'testa o projeto e diz se funcionou (/conferir e /testar ainda valem)'],
|
|
191
|
+
['/restore', 'volta pro último ponto que o /check marcou como funcionando'],
|
|
192
|
+
['/show', 'abre o app no celular de alguém no mesmo Wi-Fi, sem publicar'],
|
|
193
|
+
['/howto', 'escreve no PRIMO.md como abrir e testar este projeto'],
|
|
194
|
+
['/save', 'guarda o projeto no GitHub (privado) e mostra o link · também vale /guardar'],
|
|
195
|
+
['/secrets', 'as chaves que o projeto usa (só os nomes) · /secrets add NOME guarda uma, escondida, no .env · também vale /segredos'],
|
|
196
|
+
['/schedule', 'um pedido que roda sozinho: /schedule "toda segunda às 9h" <pedido> · sem nada, lista · /schedule off 1 tira · também vale /agendar'],
|
|
197
|
+
['/lock', 'arquivos que o agente só pode ler · /lock login.js trava · /lock off login.js solta · sem nada, lista'],
|
|
198
|
+
['/rule', 'uma regra que o PrimoCode segue sempre, mesmo depois de resumir a conversa'],
|
|
199
|
+
['/port', 'o app não abre? diz qual porta responde e o endereço certo'],
|
|
200
|
+
['/map', 'o que tem no projeto, em português, e o que está faltando · /map tree: as pastas'],
|
|
201
|
+
['/explain', 'o que o último pedido mudou, em até 5 linhas · /explain commit: uma palavra · /explain projeto: o projeto todo'],
|
|
202
|
+
['/plan', 'mostra 3 a 5 passos e só começa quando você aperta Enter (ou muda um passo) · /plan <pedido>'],
|
|
203
|
+
['/changes', 'o que mudou no projeto, em português (arquivos e linhas)'],
|
|
204
|
+
['/timeline', 'abre a história do projeto numa página'],
|
|
208
205
|
['/read', 'mostra um arquivo'],
|
|
209
206
|
['/run', 'roda um comando'],
|
|
210
|
-
['/open', 'abre no navegador'],
|
|
211
|
-
['/
|
|
212
|
-
['/
|
|
207
|
+
['/open', 'abre o projeto (sem nada), um arquivo ou um site no navegador'],
|
|
208
|
+
['/export', 'salva a conversa num .md, sem chave nem senha'],
|
|
209
|
+
['/copy', 'copia a última resposta'],
|
|
213
210
|
['/videos', 'seus vídeos prontos (abrir n · pasta n)'],
|
|
214
|
-
['/
|
|
211
|
+
['/history', 'procura nos seus pedidos antigos: /history login'],
|
|
215
212
|
['/login', 'entra na sua conta (abre o navegador) · /login senha: e-mail e senha aqui'],
|
|
216
|
-
['/account', 'sua conta e o seu plano'],
|
|
217
|
-
['/planos', 'os planos do PrimoCode e o link para assinar'],
|
|
213
|
+
['/account', 'sua conta e o seu plano · /account plans: os planos e o link para assinar'],
|
|
218
214
|
['/chats', 'suas conversas salvas, as mesmas do app e do celular'],
|
|
219
215
|
['/logout', 'desconecta este computador da conta'],
|
|
220
216
|
['!comando', 'roda direto no shell, sem passar pelo agente (o campo fica âmbar)'],
|
|
@@ -222,19 +218,19 @@ const SLASH_COMANDOS = [
|
|
|
222
218
|
['/voice painel', 'só o painel do Primo (ESC esconde)'],
|
|
223
219
|
['/voice nome <Nome>', 'dá outro nome ao assistente (só o nome; o modo voz abre no clique)'],
|
|
224
220
|
['/voice parar', 'desliga o modo voz e fecha o microfone'],
|
|
225
|
-
['/skills', 'o que ele sabe fazer bem
|
|
226
|
-
['/
|
|
227
|
-
['/
|
|
228
|
-
['/
|
|
221
|
+
['/skills', 'o que ele sabe fazer bem · /skills store: a loja · /skills add <arquivo>: instala'],
|
|
222
|
+
['/commands', 'seus comandos: um .md vira /nome · /commands novo <nome>'],
|
|
223
|
+
['/styles', 'os estilos de motion (kits): a lista e a galeria · /styles <estilo>: o preview dele'],
|
|
224
|
+
['/team', 'trabalhar junto com o claude, codex, gemini, agy ou opencode: /team <nome> liga · /team off'],
|
|
229
225
|
['/api', 'usa a SUA chave (Gemini, ChatGPT, Claude…) direto daqui, sem o limite do servidor'],
|
|
230
|
-
['/status', 'checa o servidor'],
|
|
231
226
|
['/offline', 'roda o servidor aqui no seu computador, com as chaves do Render'],
|
|
232
|
-
['/doctor', 'confere se está tudo certo e diz como consertar'],
|
|
233
|
-
['/
|
|
234
|
-
['/
|
|
227
|
+
['/doctor', 'confere se está tudo certo e diz como consertar · /doctor status: só o servidor'],
|
|
228
|
+
['/usage', 'quanto você gastou (agora e hoje) e quando zera · /usage limite 100000 ensina o limite do seu plano'],
|
|
229
|
+
['/tasks', 'o que roda em segundo plano · rodar <cmd> · abrir · parar <id>'],
|
|
230
|
+
['/keys', 'as teclas que ajudam'],
|
|
235
231
|
['/connectors', 'quem está atendendo os seus pedidos'],
|
|
236
|
-
['/name', 'como ele te chama'],
|
|
237
|
-
['/
|
|
232
|
+
['/name', 'como ele te chama · /name voz <Nome>: o nome do assistente de voz'],
|
|
233
|
+
['/brand', 'kit de marca: cores, fontes e logo'],
|
|
238
234
|
['/mascot', 'galeria dos mascotes · escolha por nome ou número'],
|
|
239
235
|
['/config', 'suas preferências'],
|
|
240
236
|
['/clear', 'limpa a conversa'],
|
|
@@ -417,11 +413,15 @@ function comandosDoMenu() {
|
|
|
417
413
|
}
|
|
418
414
|
|
|
419
415
|
function mostrarMenuSlash() {
|
|
416
|
+
// "/" sozinho mostra as 9 intenções, não a lista seca; o /help tem tudo, com descrição.
|
|
420
417
|
console.log('');
|
|
421
|
-
for (const
|
|
422
|
-
console.log(` ${c.
|
|
418
|
+
for (const g of nomes.agrupados()) {
|
|
419
|
+
console.log(` ${c.bold(ui.padRight(g.titulo, 19))}${c.brand(g.comandos.map((n) => '/' + n).join(' '))}`);
|
|
423
420
|
}
|
|
424
|
-
|
|
421
|
+
const dela = comandosDaPessoa().filter((x) => !nomes.COMANDOS[x.nome]);
|
|
422
|
+
if (dela.length) console.log(` ${c.bold(ui.padRight('Os seus', 19))}${c.brand(dela.map((x) => '/' + x.nome).join(' '))}`);
|
|
423
|
+
console.log(c.dim('\n /help explica cada um · Tab completa · metade do comando já serve: /eff vira /effort'));
|
|
424
|
+
console.log(c.dim(' Os nomes em português continuam valendo: /undo chama o /undo.'));
|
|
425
425
|
}
|
|
426
426
|
|
|
427
427
|
let rl = null;
|
|
@@ -486,6 +486,14 @@ function barraDeStatus() {
|
|
|
486
486
|
esquece que deu — e ela vale até o PrimoCode fechar. */
|
|
487
487
|
if (state.controle && state.controle.liberado) partes.push(c.warn('controle do pc'));
|
|
488
488
|
|
|
489
|
+
/* O que o agente deixou de pé (run_background). Servidor esquecido segura
|
|
490
|
+
a porta e gasta bateria: tem que estar à vista enquanto roda. */
|
|
491
|
+
const vivos = require('../lib/fundo.js').listar().filter((t) => t.rodando);
|
|
492
|
+
if (vivos.length) {
|
|
493
|
+
const porta = vivos.length === 1 && vivos[0].url && (vivos[0].url.match(/:(\d+)/) || [])[1];
|
|
494
|
+
partes.push(c.ok('●') + ' ' + c.muted(porta ? `de pé :${porta}` : `${vivos.length} de pé`));
|
|
495
|
+
}
|
|
496
|
+
|
|
489
497
|
/* O CONTEXTO. Só aparece depois que há conversa: um "ctx 0%" na abertura
|
|
490
498
|
é ruído, e ruído que aparece sempre é o que a pessoa aprende a não
|
|
491
499
|
enxergar — inclusive quando marcar 90%. Âmbar a partir de 70% e
|
|
@@ -772,7 +780,7 @@ function ehSoEstudio(texto) {
|
|
|
772
780
|
function planWorkDir(userText) {
|
|
773
781
|
// O /novo já criou a pasta e entrou nela: nenhuma heurística decide outra.
|
|
774
782
|
if (state.projetoFixo) return { dir: state.workDir, pending: false, name: state.currentProject };
|
|
775
|
-
const escolhida = ['/dir', 'detectada', 'projeto'].includes(state.workDirOrigem);
|
|
783
|
+
const escolhida = ['/dir', 'detectada', 'projeto', 'terminal'].includes(state.workDirOrigem);
|
|
776
784
|
// Pasta escolhida a dedo (/dir, ou dita no pedido) manda sempre. Projeto
|
|
777
785
|
// em andamento manda também — a menos que o pedido abra outra coisa.
|
|
778
786
|
if (escolhida && !(state.workDirOrigem === 'projeto' && pedeProjetoNovo(userText))) {
|
|
@@ -801,6 +809,32 @@ async function perguntarNome(texto) {
|
|
|
801
809
|
return resposta;
|
|
802
810
|
}
|
|
803
811
|
|
|
812
|
+
/* O corpo do /novo, num lugar só: o /comecar também cria a pasta e roda o
|
|
813
|
+
pedido preso nela, e dois caminhos copiados divergiriam. */
|
|
814
|
+
async function criarProjetoNovo(rest) {
|
|
815
|
+
const nomes = cfg.listProjects();
|
|
816
|
+
const sp = new Spinner('escolhendo o nome da pasta').start();
|
|
817
|
+
const sugerido = await nomeProjeto.escolher({ pedido: rest, nomes, perguntar: perguntarNome }).catch(() => null);
|
|
818
|
+
sp.stop();
|
|
819
|
+
const nomeNovo = extra.nomeDoNovo({
|
|
820
|
+
descricao: rest, nomes, sugerido, derivar: deriveProjectName,
|
|
821
|
+
// A régua curta (lib/nome-curto.js) também no /novo.
|
|
822
|
+
slugify: (t) => nomeCurto(t) || cfg.slugify(t), semColisao: nomeProjeto.semColisao,
|
|
823
|
+
});
|
|
824
|
+
const dir = cfg.createProjectDir(nomeNovo);
|
|
825
|
+
entrarNoProjeto(dir, 'projeto');
|
|
826
|
+
// Conversa nova junto: o que se falou do projeto anterior puxaria o
|
|
827
|
+
// agente de volta para ele.
|
|
828
|
+
state.history = []; state.memoria = memoria.nova(); state.gravador.zerar();
|
|
829
|
+
console.log(c.ok(` Projeto novo: ${state.currentProject}`) + c.muted(` (${shortPath(dir)})`));
|
|
830
|
+
refreshPrompt();
|
|
831
|
+
const modoAntes = state.mode;
|
|
832
|
+
state.mode = 'primocode';
|
|
833
|
+
state.projetoFixo = true;
|
|
834
|
+
try { await sendPrompt(extra.pedidoDoNovo(rest, state.currentProject)); }
|
|
835
|
+
finally { state.mode = modoAntes; state.projetoFixo = false; }
|
|
836
|
+
}
|
|
837
|
+
|
|
804
838
|
function batizarDepois(plan, userText) {
|
|
805
839
|
if (!plan.pending || !(RE_CRIAR_UM.test(semAcento(userText)) || PEDIDO_DE_CODIGO.test(userText))) return;
|
|
806
840
|
plan.batizando = nomeProjeto.escolher({ pedido: userText, nomes: cfg.listProjects(), perguntar: perguntarNome })
|
|
@@ -956,7 +990,7 @@ async function autorizarControle(oQueVaiFazer, { primeira, tipo } = {}) {
|
|
|
956
990
|
console.log('');
|
|
957
991
|
console.log(' ' + c.warn('▸▸') + ' ' + c.bold(c.white(tipo === 'perigo'
|
|
958
992
|
? 'Isto não tem volta. O Primo quer:'
|
|
959
|
-
: 'O Primo quer (você escolheu /
|
|
993
|
+
: 'O Primo quer (você escolheu /perms perguntar):')));
|
|
960
994
|
} else if (primeira) {
|
|
961
995
|
console.log('');
|
|
962
996
|
console.log(' ' + c.warn('▸▸') + ' ' + c.bold(c.white('O Primo quer usar o seu computador.')));
|
|
@@ -1158,7 +1192,7 @@ async function instalarComPortao(caminho) {
|
|
|
1158
1192
|
return skills.instalarDe(caminho, { forcar: true });
|
|
1159
1193
|
}
|
|
1160
1194
|
|
|
1161
|
-
async function sendPrompt(userText) {
|
|
1195
|
+
async function sendPrompt(userText, { digitado = false } = {}) {
|
|
1162
1196
|
/* O portão do plano. Sem ele o bloqueio da abertura seria só um texto na
|
|
1163
1197
|
tela: a pessoa leria "você não tem acesso" e mandaria a primeira coisa
|
|
1164
1198
|
do mesmo jeito, e funcionaria.
|
|
@@ -1170,14 +1204,49 @@ async function sendPrompt(userText) {
|
|
|
1170
1204
|
produto está quebrado. */
|
|
1171
1205
|
if (state.liberado === false) {
|
|
1172
1206
|
console.log(c.err(' O PrimoCode pede um plano (a partir de R$ 69,90/mês).'));
|
|
1173
|
-
console.log(c.muted(' Veja e assine com ') + c.brand('/
|
|
1207
|
+
console.log(c.muted(' Veja e assine com ') + c.brand('/account plans')
|
|
1174
1208
|
+ c.muted(' · já assinou? ') + c.brand('/account'));
|
|
1175
1209
|
return;
|
|
1176
1210
|
}
|
|
1177
1211
|
|
|
1212
|
+
/* Pedido grande: uma linha dizendo quanto deve gastar do plano de hoje (lib/limite.js). Sem o limite do plano,
|
|
1213
|
+
diz isso com todas as letras (uma vez por conversa) em vez de inventar %. Só pra quem digitou, no terminal. */
|
|
1214
|
+
if (digitado && !state.semTerminal && process.stdin.isTTY) {
|
|
1215
|
+
try {
|
|
1216
|
+
const L = require('../lib/limite.js');
|
|
1217
|
+
const anexos = state.attachedFiles.reduce((n, f) => n + String(f.content || '').length, 0);
|
|
1218
|
+
const limite = L.limiteConhecido();
|
|
1219
|
+
if (L.pedidoGrande(userText, anexos) && (limite || !state.avisouSemLimite)) {
|
|
1220
|
+
const { total } = extra.resumoCusto(contadorDaSessao);
|
|
1221
|
+
const media = total.pedidos ? Math.round((total.enviados + total.recebidos) / total.pedidos) : 0;
|
|
1222
|
+
console.log(c.muted(' ' + L.linhaDoPedido({ tokens: L.estimar({ texto: userText, anexosChars: anexos, mediaPorPedido: media }), limite, usadoHoje: L.usoDeHoje().tokens })));
|
|
1223
|
+
if (!limite) state.avisouSemLimite = true;
|
|
1224
|
+
}
|
|
1225
|
+
} catch { /* a estimativa nunca derruba o pedido */ }
|
|
1226
|
+
}
|
|
1227
|
+
|
|
1178
1228
|
// PRIMOCODE_TEMPOS=1: uma linha no fim com o custo de cada fase.
|
|
1179
1229
|
tempos.comecar();
|
|
1180
1230
|
const inicio = Date.now();
|
|
1231
|
+
/* Pedido em lista, com 4 itens ou mais (lib/partes.js): PERGUNTA se faz um de cada vez. Só no terminal de
|
|
1232
|
+
verdade; no app e no -p, segue inteiro como sempre. */
|
|
1233
|
+
// só o que a PESSOA digitou: o pedido que o próprio PrimoCode monta (o conserto do /conferir leva a saída do teste,
|
|
1234
|
+
// e o mocha escreve "1) nome do teste") não pode virar "esse pedido tem 4 partes" (achado da revisão de 24/10)
|
|
1235
|
+
const divisao = digitado && !state.semTerminal && process.stdin.isTTY ? require('../lib/partes.js').dividir(userText) : null;
|
|
1236
|
+
if (divisao && await confirm(`Esse pedido tem ${divisao.partes.length} partes. De uma vez só, pedido grande costuma travar no meio. Faço uma de cada vez, conferindo entre elas?`)) {
|
|
1237
|
+
const P = require('../lib/partes.js');
|
|
1238
|
+
try {
|
|
1239
|
+
for (let i = 0; i < divisao.partes.length; i++) {
|
|
1240
|
+
console.log(c.brand(`\n ▸ parte ${i + 1} de ${divisao.partes.length}: `) + c.white(divisao.partes[i].slice(0, 80)));
|
|
1241
|
+
await enviarPedido(P.pedidoDaParte(divisao, i));
|
|
1242
|
+
if (require('../lib/act.js').interrompido()) break; // Esc Esc numa parte para as que faltam
|
|
1243
|
+
}
|
|
1244
|
+
} finally {
|
|
1245
|
+
const linha = tempos.relatorio();
|
|
1246
|
+
if (linha) console.log(c.dim(` ⏱ ${linha}`));
|
|
1247
|
+
}
|
|
1248
|
+
return;
|
|
1249
|
+
}
|
|
1181
1250
|
try { await enviarPedido(userText); }
|
|
1182
1251
|
finally {
|
|
1183
1252
|
const linha = tempos.relatorio();
|
|
@@ -1188,15 +1257,37 @@ async function sendPrompt(userText) {
|
|
|
1188
1257
|
if (!state.semTerminal) {
|
|
1189
1258
|
console.log('\n ' + `${COR_MODO[m] || COR_MODO.auto}▣${c.reset} ` + c.white(NOME_MODO[m] || m)
|
|
1190
1259
|
+ c.dim(` · ${effort.normalizar(state.config.effort)} · ${((Date.now() - inicio) / 1000).toFixed(1)}s`) + '\n');
|
|
1260
|
+
// O que o agente deixou de pé (run_background), com o endereço pra abrir.
|
|
1261
|
+
const rodape = require('../lib/fundo.js').linhasRodape(require('../lib/fundo.js').listar(), c);
|
|
1262
|
+
if (rodape.length) console.log(rodape.join('\n') + '\n');
|
|
1191
1263
|
}
|
|
1192
1264
|
}
|
|
1193
1265
|
}
|
|
1194
1266
|
|
|
1267
|
+
/* Marca no arquivo de hoje o que ESTA conversa já gastou (lib/limite.js): é o que o /usage soma. */
|
|
1268
|
+
const IDENTIDADE_DA_SESSAO = `${process.pid}-${Date.now()}`;
|
|
1269
|
+
function guardarUsoDeHoje() {
|
|
1270
|
+
try {
|
|
1271
|
+
const { total } = extra.resumoCusto(contadorDaSessao);
|
|
1272
|
+
require('../lib/limite.js').guardarSessao(IDENTIDADE_DA_SESSAO, total.enviados + total.recebidos);
|
|
1273
|
+
} catch { /* contar nunca derruba um pedido */ }
|
|
1274
|
+
}
|
|
1275
|
+
|
|
1195
1276
|
async function enviarPedido(userText) {
|
|
1196
1277
|
let prompt = userText;
|
|
1278
|
+
const custoAntes = extra.resumoCusto(contadorDaSessao); // pro "Este pedido: …" do fim
|
|
1197
1279
|
// "@index.html" no pedido é um /attach só deste pedido: vai junto dos
|
|
1198
1280
|
// anexos, mas não fica em state.attachedFiles para o próximo.
|
|
1199
1281
|
const citados = mencoesDoPedido(userText);
|
|
1282
|
+
// "@https://…" no pedido é um /web só deste pedido (lib/web-pagina.js)
|
|
1283
|
+
const W = require('../lib/web-pagina.js');
|
|
1284
|
+
for (const url of W.urlsDoPedido(userText)) {
|
|
1285
|
+
const r = await W.baixar(url);
|
|
1286
|
+
if (r.ok) {
|
|
1287
|
+
citados.push({ path: r.url, content: (r.titulo ? `# ${r.titulo}\n\n` : '') + r.texto });
|
|
1288
|
+
console.log(c.dim(` ⎿ anexado: ${r.titulo || r.url} (${r.palavras} palavras${r.cortado ? ', o começo da página' : ''})`));
|
|
1289
|
+
} else console.log(c.dim(` ⎿ não anexei ${url}: ${r.error}`));
|
|
1290
|
+
}
|
|
1200
1291
|
const anexos = [...state.attachedFiles, ...citados];
|
|
1201
1292
|
if (anexos.length) {
|
|
1202
1293
|
const parts = anexos.map((f) => `Arquivo: ${f.path}\n\`\`\`\n${f.content}\n\`\`\``);
|
|
@@ -1285,7 +1376,8 @@ async function enviarPedido(userText) {
|
|
|
1285
1376
|
? '\n\nATENÇÃO: o passo anterior não trouxe fatos. Trabalhe só com o que está no pedido. '
|
|
1286
1377
|
+ 'É PROIBIDO inventar dado de empresa, data, preço ou pessoa — na dúvida, não afirme.'
|
|
1287
1378
|
: '';
|
|
1288
|
-
|
|
1379
|
+
// o pedido citou arquivo: o agente sabe antes, não só no aviso do fim (lib/escopo.js)
|
|
1380
|
+
const pedido = passos[i].pedido + contexto + semFatos + require('../lib/escopo.js').nota(userText);
|
|
1289
1381
|
|
|
1290
1382
|
const rodarPasso = (texto = pedido) => runAct(texto, {
|
|
1291
1383
|
server: state.config.server,
|
|
@@ -1362,11 +1454,32 @@ async function enviarPedido(userText) {
|
|
|
1362
1454
|
}
|
|
1363
1455
|
checkpoint.encerrar();
|
|
1364
1456
|
|
|
1457
|
+
// O pedido nomeou arquivo e o agente mexeu em outros? Diz quais, e o /desfazer fora volta só esses (lib/escopo.js).
|
|
1458
|
+
try {
|
|
1459
|
+
const escopo = require('../lib/escopo.js');
|
|
1460
|
+
const ultimo = checkpoint.lista(projectDir())[0];
|
|
1461
|
+
if (ultimo && ultimo.pedido === String(userText).replace(/\s+/g, ' ').trim()) {
|
|
1462
|
+
const fora = escopo.foraDoPedido(userText, ultimo.mudou, projectDir());
|
|
1463
|
+
if (fora.length) {
|
|
1464
|
+
escopo.texto(escopo.citados(userText), fora).forEach((l, i, ls) => console.log(i === 0 ? c.warn(' ' + l) : i === ls.length - 1 ? c.muted(' ' + l) : c.white(' ' + l)));
|
|
1465
|
+
}
|
|
1466
|
+
}
|
|
1467
|
+
} catch { /* o aviso nunca derruba o pedido */ }
|
|
1468
|
+
// "nunca mexa no logo" dito no pedido: oferece guardar como regra, não guarda sozinho (lib/regras.js)
|
|
1469
|
+
try {
|
|
1470
|
+
const regras = require('../lib/regras.js');
|
|
1471
|
+
const sug = regras.sugerir(userText, regras.ler(projectDir()));
|
|
1472
|
+
if (sug) console.log(c.muted(' Isso vale sempre? ') + c.white(`/rule ${sug}`) + c.muted(' (fica no PRIMO.md e não some quando a conversa é resumida)'));
|
|
1473
|
+
} catch { /* a oferta nunca derruba o pedido */ }
|
|
1474
|
+
|
|
1365
1475
|
/* O balanço, depois da resposta. Depois, e não antes, de propósito: o
|
|
1366
1476
|
que a pessoa quer ler primeiro é o que ele TEM A DIZER; a lista de
|
|
1367
1477
|
arquivos é a conferência, e conferência se lê por último. */
|
|
1368
1478
|
const balanco = registro.resumo(livro, { colunas: process.stdout.columns || 80 });
|
|
1369
1479
|
if (balanco) console.log(balanco);
|
|
1480
|
+
const custo = extra.custoDoPedido(custoAntes, extra.resumoCusto(contadorDaSessao));
|
|
1481
|
+
if (custo) console.log(c.dim(` ${custo}`));
|
|
1482
|
+
guardarUsoDeHoje();
|
|
1370
1483
|
// O rostinho do mascote, por último e numa linha só. O humor sai do
|
|
1371
1484
|
// que aconteceu, não de adivinhar pelo texto da resposta.
|
|
1372
1485
|
if (state.config.reacoes !== false && r) {
|
|
@@ -1374,7 +1487,10 @@ async function enviarPedido(userText) {
|
|
|
1374
1487
|
console.log(ui.reacao(state.config.mascot, humor));
|
|
1375
1488
|
}
|
|
1376
1489
|
state.history.push({ role: 'user', content: userText });
|
|
1377
|
-
|
|
1490
|
+
// na memória da conversa vai também o que o pedido fez no disco (arquivos, último teste): o pedido seguinte sabe
|
|
1491
|
+
let feito = '';
|
|
1492
|
+
try { feito = require('../lib/registro.js').paraMemoria(r.registro); } catch { /* sem registro */ }
|
|
1493
|
+
state.history.push({ role: 'assistant', content: r.assistantMessage.content + (feito ? `\n\n${feito}` : '') });
|
|
1378
1494
|
resumirDepois();
|
|
1379
1495
|
state.lastResponse = r.assistantMessage.content;
|
|
1380
1496
|
cfg.appendHistory({ mode: 'primocode', project: state.currentProject, prompt: userText });
|
|
@@ -1382,6 +1498,8 @@ async function enviarPedido(userText) {
|
|
|
1382
1498
|
// rede, não acontece nada — a conversa segue aqui do mesmo jeito.
|
|
1383
1499
|
state.gravador.turno(userText, r.assistantMessage.content,
|
|
1384
1500
|
{ modo: 'primocode', projeto: state.currentProject || null });
|
|
1501
|
+
// O parceiro do /team revisa o que mudou (lib/team.js). Depois do histórico: o conserto vem como pedido seguinte.
|
|
1502
|
+
await revisaoDoParceiro(userText, livro, r);
|
|
1385
1503
|
} else {
|
|
1386
1504
|
await tempos.medir('espera do resumo', () => esperarResumo());
|
|
1387
1505
|
await tempos.medir('chat', () => runChat(prompt, userText));
|
|
@@ -1391,6 +1509,72 @@ async function enviarPedido(userText) {
|
|
|
1391
1509
|
refreshPrompt();
|
|
1392
1510
|
}
|
|
1393
1511
|
|
|
1512
|
+
/* "UM FAZ, O OUTRO REVISA" (/team). O PrimoCode fez; o parceiro lê a mudança
|
|
1513
|
+
(só lendo, na pasta do projeto, com prazo) e devolve a revisão. Achou
|
|
1514
|
+
problema, a pessoa diz se corrige; o conserto não é revisado de novo. */
|
|
1515
|
+
async function revisaoDoParceiro(userText, livro, r) {
|
|
1516
|
+
const nome = state.config.team;
|
|
1517
|
+
if (!nome || state.consertandoRevisao || !r || r.parado || !livro) return;
|
|
1518
|
+
const arquivos = [...(livro.criados || []), ...(livro.alterados || [])];
|
|
1519
|
+
if (!arquivos.length) return;
|
|
1520
|
+
const team = require('../lib/team.js');
|
|
1521
|
+
const dele = team.instalados().find((x) => x.nome === nome);
|
|
1522
|
+
if (!dele) { console.log(c.warn(` O ${nome} não está mais instalado: sem revisão. /team mostra os que você tem.`)); return; }
|
|
1523
|
+
const dir = r.pasta || projectDir();
|
|
1524
|
+
const diff = team.diffDaVez(dir, arquivos);
|
|
1525
|
+
if (!diff) return;
|
|
1526
|
+
console.log(c.muted(` ${dele.titulo} revisando o que eu fiz (só lendo)…`));
|
|
1527
|
+
const rev = await team.rodar(nome, 'revisar', { prompt: team.pedidoDeRevisao({ pedido: userText, diff }), dir, caminho: dele.caminho,
|
|
1528
|
+
linha: (l) => console.log(c.dim(` ${nome} │ ${l}`)) });
|
|
1529
|
+
if (!rev.ok) { console.log(c.warn(` ${rev.erro}`)); return; }
|
|
1530
|
+
if (!rev.texto || team.semProblema(rev.texto)) { console.log(c.ok(` ✓ ${nome} revisou: nada a corrigir.`)); return; }
|
|
1531
|
+
console.log(c.white(` A revisão do ${nome}:`));
|
|
1532
|
+
for (const l of rev.texto.split('\n')) console.log(` ${l}`);
|
|
1533
|
+
if (state.semTerminal) return;
|
|
1534
|
+
if (!(await confirm('Corrijo o que a revisão achou?'))) return;
|
|
1535
|
+
state.consertandoRevisao = true;
|
|
1536
|
+
try { await sendPrompt(team.pedidoDeConserto(nome, rev.texto)); } finally { state.consertandoRevisao = false; }
|
|
1537
|
+
}
|
|
1538
|
+
|
|
1539
|
+
/* `/team <nome> faz <pedido>`: o parceiro faz numa cópia do projeto (git
|
|
1540
|
+
worktree, ou cópia da pasta), o PrimoCode mostra o que mudou, passa cada
|
|
1541
|
+
arquivo pelo portão (lib/perigo.js) e só aplica com o sim. /undo volta. */
|
|
1542
|
+
async function parceiroFaz(nome, pedido) {
|
|
1543
|
+
const team = require('../lib/team.js');
|
|
1544
|
+
const dele = team.instalados().find((x) => x.nome === nome);
|
|
1545
|
+
const dir = projectDir();
|
|
1546
|
+
if (!pastaSegura(dir) || path.resolve(dir) === path.resolve(cfg.ROOT_DIR)) {
|
|
1547
|
+
console.log(c.warn(' Entre num projeto antes (/projects ou /dir): o parceiro trabalha numa cópia dele.'));
|
|
1548
|
+
return;
|
|
1549
|
+
}
|
|
1550
|
+
let copia;
|
|
1551
|
+
try { copia = team.prepararCopia(dir); } catch (e) { console.log(c.warn(` Não consegui preparar a cópia do projeto: ${String(e.message || e).split('\n')[0]}`)); return; }
|
|
1552
|
+
try {
|
|
1553
|
+
console.log(c.muted(` ${dele.titulo} trabalhando numa cópia do projeto${copia.git ? ' (git worktree)' : ''}…`));
|
|
1554
|
+
const r = await team.rodar(nome, 'fazer', { prompt: team.pedidoDeFazer(pedido), dir: copia.pasta, caminho: dele.caminho,
|
|
1555
|
+
linha: (l) => console.log(c.dim(` ${nome} │ ${l}`)) });
|
|
1556
|
+
if (!r.ok) { console.log(c.warn(` ${r.erro}`)); return; }
|
|
1557
|
+
if (r.texto) { console.log(c.white(` O ${nome} disse:`)); for (const l of r.texto.split('\n')) console.log(` ${l}`); }
|
|
1558
|
+
const m = team.mudancasDaCopia(copia);
|
|
1559
|
+
if (!m.arquivos.length) { console.log(c.muted(' Ele não mudou nenhum arquivo. O projeto ficou como estava.')); return; }
|
|
1560
|
+
console.log(c.white(` O que ele mudou (${m.arquivos.length} arquivo${m.arquivos.length > 1 ? 's' : ''}):`));
|
|
1561
|
+
const linhas = m.patch.split('\n');
|
|
1562
|
+
for (const l of linhas.slice(0, 200)) console.log(' ' + (/^\+(?!\+\+)/.test(l) ? c.ok(l) : /^-(?!--)/.test(l) ? c.err(l) : c.dim(l)));
|
|
1563
|
+
if (linhas.length > 200) console.log(c.dim(` … e mais ${linhas.length - 200} linhas`));
|
|
1564
|
+
if (!state.controle.perigo) state.controle.perigo = perigo.novo();
|
|
1565
|
+
const recusas = await team.passarPeloPortao(m.arquivos, { projectDir: dir, aplicarEm: copia.aplicarEm, modo: state.config.permissoes,
|
|
1566
|
+
estado: state.controle.perigo, perguntar: state.semTerminal ? undefined : autorizarControle });
|
|
1567
|
+
if (recusas.length) { console.log(c.warn(` O portão do PrimoCode recusou: ${recusas.join('; ')}. Nada foi aplicado.`)); return; }
|
|
1568
|
+
if (state.semTerminal) { console.log(c.muted(' No modo script eu não aplico sozinho: rode no terminal do PrimoCode pra aplicar.')); return; }
|
|
1569
|
+
if (!(await confirm('Aplico essa mudança no projeto?'))) { console.log(c.muted(' Não apliquei. O projeto ficou como estava.')); return; }
|
|
1570
|
+
checkpoint.iniciar(`/team ${nome} faz ${pedido}`, dir);
|
|
1571
|
+
for (const a of m.arquivos) checkpoint.antesDeMudar(path.join(copia.aplicarEm, a.caminho), dir);
|
|
1572
|
+
const ap = team.aplicar(copia, m.patch);
|
|
1573
|
+
checkpoint.encerrar();
|
|
1574
|
+
console.log(ap.ok ? c.ok(` ✓ Apliquei. /undo volta.`) : c.warn(` ${ap.erro}`));
|
|
1575
|
+
} finally { copia.limpar(); }
|
|
1576
|
+
}
|
|
1577
|
+
|
|
1394
1578
|
/**
|
|
1395
1579
|
* Arruma o pedido e divide em passos — as duas coisas, ESCONDIDAS.
|
|
1396
1580
|
*
|
|
@@ -1488,6 +1672,8 @@ function pedidoDeContinuacao(original, livro) {
|
|
|
1488
1672
|
}
|
|
1489
1673
|
|
|
1490
1674
|
async function dividirTarefa(pedido) {
|
|
1675
|
+
// O /plan já dividiu, e a pessoa aprovou: nada de chamar o servidor de novo.
|
|
1676
|
+
if (state.passosProntos) { const prontos = state.passosProntos; state.passosProntos = null; console.log(c.dim(` ⎿ ${prontos[0].titulo}`)); return prontos; }
|
|
1491
1677
|
const inteiro = [{ titulo: 'tarefa', pedido }];
|
|
1492
1678
|
if (!pedido || pedido.trim().length < 12) return inteiro;
|
|
1493
1679
|
// Sem as duas fases no texto, nem chama o servidor: mais rápido, e sem
|
|
@@ -1760,35 +1946,10 @@ async function rodarBash(text) {
|
|
|
1760
1946
|
}
|
|
1761
1947
|
|
|
1762
1948
|
/* ── OS NOMES ANTIGOS ────────────────────────────────────────────────────
|
|
1763
|
-
* Os comandos
|
|
1764
|
-
*
|
|
1765
|
-
*
|
|
1766
|
-
*
|
|
1767
|
-
* O nome antigo NÃO some: ele responde e ensina o novo. Sumir de vez faz quem
|
|
1768
|
-
* tem o dedo viciado bater num "comando não existe" e concluir que a
|
|
1769
|
-
* atualização quebrou alguma coisa — e essa pessoa não vai procurar no /help,
|
|
1770
|
-
* vai desinstalar.
|
|
1771
|
-
*
|
|
1772
|
-
* Uma tabela, e não um `if` dentro de cada `case`: com dezoito apelidos, o
|
|
1773
|
-
* `if` espalhado é o jeito garantido de esquecer um. Aqui, esquecer é não
|
|
1774
|
-
* escrever a linha, e a linha some da lista.
|
|
1775
|
-
*/
|
|
1776
|
-
const RENOMEADOS = {
|
|
1777
|
-
// a conta
|
|
1778
|
-
entrar: 'login', conectar: 'login',
|
|
1779
|
-
conta: 'account',
|
|
1780
|
-
plano: 'planos', assinar: 'planos', assinatura: 'planos', precos: 'planos',
|
|
1781
|
-
sair: 'exit', // sair é SAIR; desconectar a conta é /logout
|
|
1782
|
-
// o histórico
|
|
1783
|
-
// /historico deixou de ser apelido do /chats: agora procura nos pedidos
|
|
1784
|
-
// guardados nesta máquina (lib/comandos-extra.js). /chats segue sendo a
|
|
1785
|
-
// conversa inteira, da conta.
|
|
1786
|
-
conversas: 'chats',
|
|
1787
|
-
// o resto
|
|
1788
|
-
pasta: 'dir',
|
|
1789
|
-
esforco: 'effort', esforço: 'effort',
|
|
1790
|
-
tudo: 'all', capacidades: 'all',
|
|
1791
|
-
};
|
|
1949
|
+
* Os comandos são todos em inglês curto e o nome antigo NÃO some: ele responde
|
|
1950
|
+
* e ensina o novo. Sumir de vez faz quem tem o dedo viciado achar que a
|
|
1951
|
+
* atualização quebrou — e essa pessoa não procura no /help, desinstala.
|
|
1952
|
+
* A tabela (apelido → nome novo, e os 9 grupos) mora em lib/nomes.js. */
|
|
1792
1953
|
|
|
1793
1954
|
/* Abrir uma conversa salva e seguir dela. Uma função só, para o /chats n e o
|
|
1794
1955
|
`primo -c` carregarem a conversa do MESMO jeito: dois caminhos divergiriam
|
|
@@ -1874,19 +2035,126 @@ function entrarNoWorktree(nome) {
|
|
|
1874
2035
|
return true;
|
|
1875
2036
|
}
|
|
1876
2037
|
|
|
2038
|
+
/* /new sem nada: as 3 perguntas (era o /new). */
|
|
2039
|
+
async function comecarPerguntas() {
|
|
2040
|
+
const comecar = require('../lib/comecar');
|
|
2041
|
+
let oque = (await ask(' O que você quer criar? Conte do seu jeito. (Enter: ver ideias)\n > ')).trim();
|
|
2042
|
+
if (!oque) {
|
|
2043
|
+
// Sem ideia não é motivo pra desistir: mostra por onde começar.
|
|
2044
|
+
console.log(c.muted('\n Algumas ideias pra começar:'));
|
|
2045
|
+
comecar.IDEIAS.forEach((ideia, i) => console.log(` ${c.brand(String(i + 1))} ${ideia}`));
|
|
2046
|
+
oque = comecar.escolherIdeia(await ask('\n Escolha um número, ou escreva a sua ideia (Enter cancela)\n > ')) || '';
|
|
2047
|
+
}
|
|
2048
|
+
if (!oque) { console.log(c.muted(' Tudo bem, sem pressa. Quando quiser, é só digitar /new de novo.')); return; }
|
|
2049
|
+
console.log(c.muted(` → ${oque}`));
|
|
2050
|
+
const praQuem = (await ask(' Pra quem é? (Enter pula)\n > ')).trim();
|
|
2051
|
+
const onde = (await ask(' Abre onde: no navegador, no celular, ou tanto faz? (Enter pula)\n > ')).trim();
|
|
2052
|
+
await criarProjetoNovo(comecar.montarPedidoComecar({ oque, praQuem, onde }));
|
|
2053
|
+
// quem acabou de fazer o primeiro app não sabe que pode conferir nem voltar: é a hora de contar
|
|
2054
|
+
console.log(c.muted(`\n ${comecar.DEPOIS_DO_PRIMEIRO_APP}`));
|
|
2055
|
+
return;
|
|
2056
|
+
}
|
|
2057
|
+
|
|
2058
|
+
/* /attach <url>: a página vira texto e vai junto do próximo pedido (lib/web-pagina.js). */
|
|
2059
|
+
async function anexarPagina(rest) {
|
|
2060
|
+
const sp = new Spinner('lendo a página').start();
|
|
2061
|
+
const r = await require('../lib/web-pagina.js').baixar(rest.trim());
|
|
2062
|
+
sp.stop();
|
|
2063
|
+
if (!r.ok) { console.log(c.err(` Não anexei: ${r.error}.`)); return; }
|
|
2064
|
+
state.attachedFiles.push({ path: r.url, content: (r.titulo ? `# ${r.titulo}\n\n` : '') + r.texto });
|
|
2065
|
+
console.log(c.ok(` Anexei: ${r.titulo || r.url}`) + c.muted(` · ${r.palavras} palavras${r.cortado ? ' (o começo da página)' : ''}`));
|
|
2066
|
+
console.log(c.muted(' Vai junto do próximo pedido. /attach mostra, /detach tira.'));
|
|
2067
|
+
refreshPrompt();
|
|
2068
|
+
return;
|
|
2069
|
+
}
|
|
2070
|
+
|
|
2071
|
+
/* /attach sem nada: o que está anexado. */
|
|
2072
|
+
function listarAnexos() {
|
|
2073
|
+
if (!state.attachedFiles.length) console.log(c.muted('Nenhum arquivo anexado.'));
|
|
2074
|
+
else state.attachedFiles.forEach((f) => console.log(` ${c.brand(f.path)} ${c.muted(tools.fmtBytes(f.content.length))}`));
|
|
2075
|
+
}
|
|
2076
|
+
|
|
2077
|
+
/* /help all: tudo que ele sabe fazer (lib/catalogo.js). */
|
|
2078
|
+
function mostrarTudo() {
|
|
2079
|
+
const cols = Math.max(40, Math.min(process.stdout.columns || 90, 110));
|
|
2080
|
+
console.log('');
|
|
2081
|
+
for (const g of catalogo.GRUPOS) {
|
|
2082
|
+
console.log(' ' + c.bold(c.white(g.nome)) + ' ' + ui.truncate(c.dim('— ' + g.resumo), cols - 4 - ui.visibleWidth(g.nome)));
|
|
2083
|
+
for (const i of g.itens) {
|
|
2084
|
+
console.log(' ' + c.brand(ui.padRight(i.tool, 23)) + ui.truncate(c.muted(i.faz), cols - 28));
|
|
2085
|
+
}
|
|
2086
|
+
console.log('');
|
|
2087
|
+
}
|
|
2088
|
+
console.log(c.dim(` ${catalogo.TODAS.length} ferramentas. Você não precisa saber nenhum desses nomes — peça em português.`));
|
|
2089
|
+
return;
|
|
2090
|
+
}
|
|
2091
|
+
|
|
2092
|
+
/* /taste referencias: a tela pra soltar os motions que você curtiu. */
|
|
2093
|
+
async function abrirReferencias() {
|
|
2094
|
+
const G = require('../lib/estudio/gosto.js');
|
|
2095
|
+
console.log(c.muted(process.env.PRIMOCODE_APP === '1' ? ' Abri a tela do gosto (até 10 min): solte os vídeos que você curtiu e salve.' : ' Abri uma tela no navegador (até 10 min): solte os vídeos que você curtiu e salve.'));
|
|
2096
|
+
const r = await G.abrirOndeDer({ inicio: 'referencias' });
|
|
2097
|
+
if (!r.ok) console.log(c.warn(r.motivo === 'pulou' ? ' Você pulou: nada foi salvo.' : r.motivo === 'tempo' ? ' Acabou o tempo: nada foi salvo.' : r.motivo === 'fechou' ? ' Você fechou a tela: nada foi salvo.' : ' Não consegui abrir a tela.'));
|
|
2098
|
+
const rs = G.resumo(G.ler());
|
|
2099
|
+
console.log(rs ? c.muted(' ') + rs : c.muted(' Ainda não tem gosto salvo. /taste referencias abre a tela.'));
|
|
2100
|
+
return;
|
|
2101
|
+
}
|
|
2102
|
+
|
|
2103
|
+
/* /doctor status: só o servidor, a versão e a conversa. */
|
|
2104
|
+
async function mostrarStatus() {
|
|
2105
|
+
const sp = new Spinner('verificando').start();
|
|
2106
|
+
try {
|
|
2107
|
+
const h = await api.getHealth(state.config.server, state.config.token);
|
|
2108
|
+
sp.stop();
|
|
2109
|
+
console.log(c.ok(`Servidor: ${h.status || 'ok'}`));
|
|
2110
|
+
if (h.version) console.log(c.muted(` Versão: ${h.version}`));
|
|
2111
|
+
if (h.model) console.log(c.muted(` Modelo: ${h.model}`) + (h.gratis ? c.dim(' · grátis') : ''));
|
|
2112
|
+
// A corrente inteira: é o que garante que um modelo no limite não
|
|
2113
|
+
// vira erro na sua tela.
|
|
2114
|
+
if (h.correntes && h.correntes[state.config.model || 'main']) {
|
|
2115
|
+
const fila = h.correntes[state.config.model] || h.correntes.main;
|
|
2116
|
+
console.log(c.dim(` Reservas: ${fila.length - 1}`));
|
|
2117
|
+
}
|
|
2118
|
+
} catch (e) { sp.stop(); console.log(c.err(`Indisponível: ${e.message}`)); }
|
|
2119
|
+
// A memória da conversa: quanto ela está poupando por pedido.
|
|
2120
|
+
if (state.history.length) {
|
|
2121
|
+
const e = memoria.economia(state.memoria, state.history);
|
|
2122
|
+
console.log(c.muted(` Conversa: ${state.history.length} mensagens`)
|
|
2123
|
+
+ (state.memoria.resumo
|
|
2124
|
+
? c.dim(` · resumida, ${e.enxuto} tokens por pedido em vez de ${e.cheio}`)
|
|
2125
|
+
: c.dim(` · ${e.enxuto} tokens por pedido`)));
|
|
2126
|
+
}
|
|
2127
|
+
return;
|
|
2128
|
+
}
|
|
2129
|
+
|
|
2130
|
+
/* /account plans: os planos e o link pra assinar. */
|
|
2131
|
+
async function mostrarPlanos() {
|
|
2132
|
+
const sp = new Spinner('buscando os planos').start();
|
|
2133
|
+
const r = await planosTela.buscarPlanos(state.config.server);
|
|
2134
|
+
sp.stop();
|
|
2135
|
+
const eu = conta.atual();
|
|
2136
|
+
for (const l of planosTela.desenhar(r, { cores: c, atual: eu && eu.pro ? eu.plano : null, site: conta.SITE })) console.log(l);
|
|
2137
|
+
return;
|
|
2138
|
+
}
|
|
2139
|
+
|
|
1877
2140
|
async function handleSlash(text) {
|
|
1878
2141
|
const [cmd] = text.trim().slice(1).split(/\s+/);
|
|
1879
|
-
const
|
|
2142
|
+
const restoDigitado = text.trim().slice(1 + cmd.length).trim();
|
|
1880
2143
|
|
|
1881
2144
|
let nome = cmd.toLowerCase();
|
|
1882
|
-
|
|
1883
|
-
|
|
1884
|
-
|
|
1885
|
-
|
|
2145
|
+
const apelido = nomes.ehApelido(nome);
|
|
2146
|
+
// O comando da própria pessoa com o nome antigo (um ~/.primocode/comandos/revisar.md) ganha do apelido.
|
|
2147
|
+
const dela = apelido && comandosDaPessoa().find((x) => x.nome === nome && x.origem !== 'primocode');
|
|
2148
|
+
let rest = restoDigitado;
|
|
2149
|
+
if (apelido && !dela) {
|
|
2150
|
+
const junto = nomes.PREFIXO[nome];
|
|
2151
|
+
console.log(c.muted(' Agora é ') + c.brand('/' + apelido + (junto ? ' ' + junto : '')) + c.muted('.'));
|
|
2152
|
+
nome = apelido;
|
|
2153
|
+
if (junto) rest = `${junto} ${restoDigitado}`.trim(); // /account plans vira /account plans
|
|
1886
2154
|
}
|
|
1887
2155
|
|
|
1888
2156
|
switch (nome) {
|
|
1889
|
-
case 'help': console.log(
|
|
2157
|
+
case 'help': if (/^(all|tudo)$/i.test(rest)) mostrarTudo(); else console.log(montarHelp()); break;
|
|
1890
2158
|
|
|
1891
2159
|
case 'resume': await retomarConversa(rest); break;
|
|
1892
2160
|
case 'worktree':
|
|
@@ -1898,10 +2166,10 @@ async function handleSlash(text) {
|
|
|
1898
2166
|
listava os nomes, em ordem alfabética, e quem procurava "o de ontem"
|
|
1899
2167
|
tinha de abrir pasta por pasta. Agora vem do mais recente, com
|
|
1900
2168
|
quando mexeu e o tamanho, e um número para entrar. */
|
|
1901
|
-
case '
|
|
2169
|
+
case 'projects': {
|
|
1902
2170
|
const lista = extra.listarProjetos(cfg.ROOT_DIR);
|
|
1903
2171
|
const numero = /^\d+$/.test(rest) ? Number(rest) : 0;
|
|
1904
|
-
if (!rest || (numero &&
|
|
2172
|
+
if (!rest || (numero && cmd.toLowerCase() === 'projetos') || (numero && numero <= lista.length)) {
|
|
1905
2173
|
if (!lista.length) { console.log(c.muted(' Nenhum projeto ainda. Peça algo e eu crio o primeiro.')); break; }
|
|
1906
2174
|
if (numero) {
|
|
1907
2175
|
const alvo = lista[numero - 1];
|
|
@@ -1920,7 +2188,7 @@ async function handleSlash(text) {
|
|
|
1920
2188
|
+ c.muted(ui.padRight(extra.quandoFoi(x.modificado), 11))
|
|
1921
2189
|
+ c.dim(`${extra.fmtTamanho(x.bytes)}${x.cortado ? '+' : ''} · ${x.arquivos} arq.`));
|
|
1922
2190
|
});
|
|
1923
|
-
console.log(c.dim(`\n ${shortPath(cfg.ROOT_DIR)} · /
|
|
2191
|
+
console.log(c.dim(`\n ${shortPath(cfg.ROOT_DIR)} · /projects 1 entra no primeiro · /new <descrição> começa outro`));
|
|
1924
2192
|
break;
|
|
1925
2193
|
}
|
|
1926
2194
|
const dir = cfg.createProjectDir(rest);
|
|
@@ -1932,8 +2200,7 @@ async function handleSlash(text) {
|
|
|
1932
2200
|
|
|
1933
2201
|
// Antes só existia /project, que SEMPRE cria em ~/primocode/<nome>. Se a
|
|
1934
2202
|
// sua pasta já existe em outro lugar, não havia como apontar para ela.
|
|
1935
|
-
case 'dir':
|
|
1936
|
-
case 'cd': {
|
|
2203
|
+
case 'dir': {
|
|
1937
2204
|
if (!rest) {
|
|
1938
2205
|
const de = {
|
|
1939
2206
|
padrao: 'a pasta padrão do PrimoCode',
|
|
@@ -1984,10 +2251,13 @@ async function handleSlash(text) {
|
|
|
1984
2251
|
|
|
1985
2252
|
/* Quando ele pergunta antes de agir. Os três modos e o porquê de cada
|
|
1986
2253
|
um estão em lib/perigo.js. */
|
|
2254
|
+
/* Os motions que a pessoa curtiu: ela solta os vídeos na tela e o PrimoCode mede e soma no gosto (gosto-medir.js). */
|
|
2255
|
+
|
|
1987
2256
|
/* O gosto de motion: a tela abre sozinha no primeiro estudio_motion; aqui dá pra ver, refazer ou apagar. */
|
|
1988
|
-
case '
|
|
2257
|
+
case 'taste': {
|
|
1989
2258
|
const G = require('../lib/estudio/gosto.js');
|
|
1990
2259
|
const a = String(rest || '').trim().toLowerCase();
|
|
2260
|
+
if (/^(referencias|ref|refs)$/.test(a)) { await abrirReferencias(); break; }
|
|
1991
2261
|
if (a === 'apagar') {
|
|
1992
2262
|
try { fs.unlinkSync(G.arquivo()); console.log(c.ok(' Gosto de motion apagado. O próximo motion pergunta de novo.')); }
|
|
1993
2263
|
catch { console.log(c.muted(' Não havia gosto salvo.')); }
|
|
@@ -1995,32 +2265,58 @@ async function handleSlash(text) {
|
|
|
1995
2265
|
}
|
|
1996
2266
|
if (a === 'refazer') {
|
|
1997
2267
|
console.log(c.muted(' Abri uma tela no navegador (até 10 min). Feche ou pule pra voltar.'));
|
|
1998
|
-
const r = await G.
|
|
2268
|
+
const r = await G.abrirOndeDer();
|
|
1999
2269
|
if (!r.ok) console.log(c.warn(r.motivo === 'pulou' ? ' Você pulou: sem gosto salvo.' : r.motivo === 'tempo' ? ' Acabou o tempo: nada foi salvo.' : ' Não consegui abrir a tela.'));
|
|
2000
|
-
} else if (a
|
|
2001
|
-
|
|
2002
|
-
|
|
2270
|
+
} else if (/^provar\b/.test(a)) {
|
|
2271
|
+
const assunto = String(rest).trim().replace(/^provar\s*/i, '') || 'um vídeo de apresentação';
|
|
2272
|
+
const P = require('../lib/estudio/gosto-prova.js');
|
|
2273
|
+
for (const l of P.texto(P.provar(G.pesos(G.ler()), { assunto }), assunto)) console.log(' ' + l);
|
|
2274
|
+
break;
|
|
2275
|
+
} else if (/^for[cç]a\s+\S/.test(a)) {
|
|
2276
|
+
const r = G.definirForca(a.replace(/^for[cç]a\s+/, ''));
|
|
2277
|
+
if (!r.ok) { console.log(c.err(` ${r.error}`)); break; }
|
|
2278
|
+
console.log(c.ok(` Força das referências: ${{ pouco: 'pouco (só sugerem)', medio: 'médio', muito: 'muito (puxam forte)' }[r.forca]}.`));
|
|
2279
|
+
} else if (/^salvar\s+\S/.test(a)) {
|
|
2280
|
+
const r = G.salvarEstilo(String(rest).trim().replace(/^salvar\s+/i, ''));
|
|
2281
|
+
console.log(r.ok ? c.ok(` Estilo "${r.nome}" salvo. /taste usar ${r.nome} volta pra ele quando quiser.`) : c.err(` ${r.error}`));
|
|
2282
|
+
break;
|
|
2283
|
+
} else if (/^usar\s+\S/.test(a)) {
|
|
2284
|
+
const r = G.usarEstilo(String(rest).trim().replace(/^usar\s+/i, ''));
|
|
2285
|
+
if (!r.ok) { console.log(c.err(` ${r.error}`)); break; }
|
|
2286
|
+
console.log(c.ok(` Agora o gosto em uso é o "${r.nome}".`));
|
|
2287
|
+
} else if (a === 'estilos') {
|
|
2288
|
+
const lista = G.estilos();
|
|
2289
|
+
console.log(lista.length ? ' Estilos salvos: ' + lista.join(', ') + c.muted(' · /taste usar <nome>') : c.muted(' Nenhum estilo salvo ainda. /taste salvar <nome> guarda o gosto de agora.'));
|
|
2290
|
+
break;
|
|
2291
|
+
} else if (/^tirar\s+\d+$/.test(a)) {
|
|
2292
|
+
const g = G.tirarReferencia(a.split(/\s+/)[1]);
|
|
2293
|
+
console.log(g ? c.ok(` Referência ${a.split(/\s+/)[1]} tirada.`) : c.err(' Não tem essa referência. /taste mostra os números.'));
|
|
2294
|
+
} else if (a && a !== 'ver') { console.log(c.err('Uso: /taste [refazer|apagar|tirar N|força pouco/médio/muito|provar [assunto]|salvar <nome>|usar <nome>|estilos]')); break; }
|
|
2295
|
+
const linhas = G.listar(G.ler());
|
|
2296
|
+
if (!linhas.length) { console.log(c.muted(' Ainda não tem gosto salvo. /taste refazer abre a tela, e /taste referencias recebe os vídeos que você curtiu.')); break; }
|
|
2297
|
+
for (const l of linhas) console.log(/^\s*"/.test(l) ? c.muted(' ' + l) : ' ' + l);
|
|
2298
|
+
if ((G.ler().referencias || []).length) console.log(c.muted(' /taste tirar N tira um vídeo · /taste referencias traz mais'));
|
|
2003
2299
|
break;
|
|
2004
2300
|
}
|
|
2005
2301
|
/* A memória entre sessões (lib/memoria-usuario.js): ver, esquecer, achar a pasta. */
|
|
2006
|
-
case '
|
|
2302
|
+
case 'memory': {
|
|
2007
2303
|
const M = require('../lib/memoria-usuario.js');
|
|
2008
2304
|
const [sub, ...resto] = String(rest || '').trim().split(/\s+/);
|
|
2009
2305
|
const a = (sub || '').toLowerCase();
|
|
2010
2306
|
if (a === 'pasta') { console.log(c.muted(' ') + M.pasta()); break; }
|
|
2011
2307
|
if (a === 'esquecer') {
|
|
2012
2308
|
const alvo = resto.join(' ');
|
|
2013
|
-
if (!alvo) { console.log(c.err('Uso: /
|
|
2309
|
+
if (!alvo) { console.log(c.err('Uso: /memory esquecer <nome>')); break; }
|
|
2014
2310
|
const r = M.apagar(alvo);
|
|
2015
2311
|
console.log(r.ok ? c.ok(` Esqueci "${r.nome}".`) : c.err(' ' + r.error));
|
|
2016
2312
|
break;
|
|
2017
2313
|
}
|
|
2018
|
-
if (a) { console.log(c.err('Uso: /
|
|
2314
|
+
if (a) { console.log(c.err('Uso: /memory [esquecer <nome> | pasta]')); break; }
|
|
2019
2315
|
const lista = M.listar();
|
|
2020
2316
|
if (!lista.length) { console.log(c.muted(' Ainda não lembro de nada. Conforme você trabalha, eu vou anotando.')); break; }
|
|
2021
2317
|
console.log('');
|
|
2022
2318
|
for (const m of lista) console.log(' ' + c.brand(m.nome) + c.dim(` (${m.tipo})`) + c.muted(' — ' + m.descricao));
|
|
2023
|
-
console.log(c.dim(`\n ${lista.length} memórias · /
|
|
2319
|
+
console.log(c.dim(`\n ${lista.length} memórias · /memory esquecer <nome> · /memory pasta`));
|
|
2024
2320
|
break;
|
|
2025
2321
|
}
|
|
2026
2322
|
case 'sandbox': {
|
|
@@ -2037,8 +2333,7 @@ async function handleSlash(text) {
|
|
|
2037
2333
|
console.log(c.dim(` ${e.rede ? 'Com a rede aberta, o que o comando LÊ pode sair pela internet: a lista acima é o que fica protegido. ' : ''}Detalhes: docs/sandbox.md`));
|
|
2038
2334
|
break;
|
|
2039
2335
|
}
|
|
2040
|
-
case '
|
|
2041
|
-
case 'permissions': {
|
|
2336
|
+
case 'perms': {
|
|
2042
2337
|
const DIZ = {
|
|
2043
2338
|
auto: 'roda tudo, mas pergunta antes do que não tem volta (apagar fora do projeto, push --force, sudo…)',
|
|
2044
2339
|
perguntar: 'pergunta antes de todo comando e de toda escrita de arquivo',
|
|
@@ -2049,12 +2344,12 @@ async function handleSlash(text) {
|
|
|
2049
2344
|
if (!rest) {
|
|
2050
2345
|
console.log(c.muted(' Agora: ') + c.brand(atual) + c.muted(' — ' + DIZ[atual]));
|
|
2051
2346
|
for (const m of perigo.MODOS) console.log(` ${m === atual ? c.brand('● ' + m) : c.muted('○ ' + m)} ${c.dim(DIZ[m])}`);
|
|
2052
|
-
console.log(c.dim(' Use /
|
|
2347
|
+
console.log(c.dim(' Use /perms auto|perguntar|livre|plano'));
|
|
2053
2348
|
break;
|
|
2054
2349
|
}
|
|
2055
2350
|
const pedido = rest.toLowerCase();
|
|
2056
2351
|
if (!perigo.MODOS.includes(perigo.normalizarModo(pedido)) || (perigo.normalizarModo(pedido) === 'auto' && pedido !== 'auto')) {
|
|
2057
|
-
console.log(c.err('Uso: /
|
|
2352
|
+
console.log(c.err('Uso: /perms auto|perguntar|livre|plano'));
|
|
2058
2353
|
break;
|
|
2059
2354
|
}
|
|
2060
2355
|
const m = perigo.normalizarModo(pedido);
|
|
@@ -2063,7 +2358,7 @@ async function handleSlash(text) {
|
|
|
2063
2358
|
console.log(c.ok(` Permissões: ${m}`) + c.muted(' — ' + DIZ[m]));
|
|
2064
2359
|
if (m === 'livre') {
|
|
2065
2360
|
console.log(' ' + c.warn('▸▸ Atenção: ele vai apagar, forçar push e usar sudo sem te perguntar.'));
|
|
2066
|
-
console.log(' ' + c.warn(' O que der errado pode não ter volta. /
|
|
2361
|
+
console.log(' ' + c.warn(' O que der errado pode não ter volta. /perms auto desfaz.'));
|
|
2067
2362
|
}
|
|
2068
2363
|
break;
|
|
2069
2364
|
}
|
|
@@ -2118,7 +2413,8 @@ async function handleSlash(text) {
|
|
|
2118
2413
|
}
|
|
2119
2414
|
|
|
2120
2415
|
case 'attach': {
|
|
2121
|
-
if (!rest) {
|
|
2416
|
+
if (!rest) { listarAnexos(); break; }
|
|
2417
|
+
if (/^https?:\/\//i.test(rest)) { await anexarPagina(rest); break; }
|
|
2122
2418
|
try {
|
|
2123
2419
|
// Relativo à pasta de trabalho (a do /dir), como o /read — não ao
|
|
2124
2420
|
// terminal de onde o PrimoCode foi aberto.
|
|
@@ -2140,55 +2436,65 @@ async function handleSlash(text) {
|
|
|
2140
2436
|
// achasse que é conversa) o /init só responderia um texto.
|
|
2141
2437
|
const modoAntes = state.mode;
|
|
2142
2438
|
state.mode = 'primocode';
|
|
2143
|
-
|
|
2439
|
+
// o /init reescreve o PRIMO.md inteiro: as regras do /regra voltam pro topo depois
|
|
2440
|
+
const regras = require('../lib/regras.js');
|
|
2441
|
+
const guardadas = regras.ler(projectDir());
|
|
2442
|
+
try { await sendPrompt(PEDIDO_INIT); } finally {
|
|
2443
|
+
state.mode = modoAntes;
|
|
2444
|
+
if (regras.garantir(projectDir(), guardadas).length) console.log(c.muted(` As suas ${guardadas.length === 1 ? 'regra voltou' : guardadas.length + ' regras voltaram'} pro topo do PRIMO.md.`));
|
|
2445
|
+
}
|
|
2144
2446
|
break;
|
|
2145
2447
|
}
|
|
2146
2448
|
|
|
2147
2449
|
case 'detach': state.attachedFiles = []; console.log(c.ok('Anexos removidos.')); refreshPrompt(); break;
|
|
2148
2450
|
|
|
2149
|
-
case 'files':
|
|
2150
|
-
if (!state.attachedFiles.length) console.log(c.muted('Nenhum arquivo anexado.'));
|
|
2151
|
-
else state.attachedFiles.forEach((f) => console.log(` ${c.brand(f.path)} ${c.muted(tools.fmtBytes(f.content.length))}`));
|
|
2152
|
-
break;
|
|
2153
2451
|
|
|
2154
2452
|
// A lista vem de lib/catalogo.js, e o test/catalogo.test.js cruza aquela
|
|
2155
2453
|
// lista com as tools que o tools.execute realmente atende. Ou seja: esta
|
|
2156
2454
|
// tela não consegue prometer coisa que o programa não faz.
|
|
2157
|
-
case 'all':
|
|
2158
|
-
case 'tools': {
|
|
2159
|
-
const cols = Math.max(40, Math.min(process.stdout.columns || 90, 110));
|
|
2160
|
-
console.log('');
|
|
2161
|
-
for (const g of catalogo.GRUPOS) {
|
|
2162
|
-
console.log(' ' + c.bold(c.white(g.nome)) + ' ' + ui.truncate(c.dim('— ' + g.resumo), cols - 4 - ui.visibleWidth(g.nome)));
|
|
2163
|
-
for (const i of g.itens) {
|
|
2164
|
-
console.log(' ' + c.brand(ui.padRight(i.tool, 23)) + ui.truncate(c.muted(i.faz), cols - 28));
|
|
2165
|
-
}
|
|
2166
|
-
console.log('');
|
|
2167
|
-
}
|
|
2168
|
-
console.log(c.dim(` ${catalogo.TODAS.length} ferramentas. Você não precisa saber nenhum desses nomes — peça em português.`));
|
|
2169
|
-
break;
|
|
2170
|
-
}
|
|
2171
2455
|
|
|
2172
2456
|
/* ── /desfazer ────────────────────────────────────────────────
|
|
2173
2457
|
* Quem não sabe git não tem como voltar uma edição ruim. Aqui volta:
|
|
2174
2458
|
* cada pedido tirou uma foto do projeto (com git) ou guardou o
|
|
2175
2459
|
* original dos arquivos que mexeu (sem git). */
|
|
2176
|
-
case '
|
|
2460
|
+
case 'undo': {
|
|
2177
2461
|
const cps = checkpoint.lista(projectDir());
|
|
2178
|
-
|
|
2462
|
+
const BK = require('../lib/backup-banco.js');
|
|
2463
|
+
const hora = (iso) => new Date(iso).toLocaleString('pt-BR', { dateStyle: 'short', timeStyle: 'short' });
|
|
2464
|
+
if (!cps.length) {
|
|
2465
|
+
// sem foto do pedido (a pasta está fora do git, ou o banco é ignorado), a cópia do banco ainda volta
|
|
2466
|
+
const sobra = BK.pendentes(projectDir()).slice(-1)[0];
|
|
2467
|
+
if (!sobra) { console.log(c.muted(' Nada para desfazer nesta pasta.')); break; }
|
|
2468
|
+
console.log(c.muted(` Tem uma cópia do banco de ${hora(sobra.criado)}: ${sobra.arquivos.join(', ')}`));
|
|
2469
|
+
if (!(await confirm('Voltar o banco para essa cópia?'))) { console.log(c.muted('Cancelado.')); break; }
|
|
2470
|
+
for (const f of BK.restaurar(projectDir(), sobra)) console.log(f.acao === 'falhou' ? c.err(` falhou: ${f.erro} ${f.arquivo}`) : c.ok(' banco voltou ') + f.arquivo);
|
|
2471
|
+
break;
|
|
2472
|
+
}
|
|
2179
2473
|
const quando = (cp) => new Date(cp.quando).toLocaleString('pt-BR', { dateStyle: 'short', timeStyle: 'short' });
|
|
2180
2474
|
if (/^(lista|list|ls)$/i.test(rest)) {
|
|
2181
2475
|
cps.forEach((cp, i) => console.log(` ${c.brand(String(i + 1).padStart(2))} ${c.dim(quando(cp))} `
|
|
2182
2476
|
+ `${c.white(cp.pedido.slice(0, 50) + (cp.pedido.length > 50 ? '…' : ''))} `
|
|
2183
|
-
+ c.muted(`${cp.mudou.length} ${cp.mudou.length === 1 ? 'arquivo mudou' : 'arquivos mudaram'}`)
|
|
2184
|
-
|
|
2477
|
+
+ c.muted(`${cp.mudou.length} ${cp.mudou.length === 1 ? 'arquivo mudou' : 'arquivos mudaram'}`)
|
|
2478
|
+
+ (cp.funcionava ? ` ${c.ok('✓ funcionava')}${cp.funcionava_como ? c.dim(' · ' + cp.funcionava_como) : ''}` : '')));
|
|
2479
|
+
console.log(c.muted('\n /undo N volta os N últimos pedidos.'));
|
|
2185
2480
|
if (checkpoint.modo(projectDir()) === 'arquivo') {
|
|
2186
2481
|
console.log(c.muted(' Sem git aqui: só volta o que o agente escreveu com as ferramentas de arquivo (não o que um comando apagou).'));
|
|
2187
2482
|
}
|
|
2188
2483
|
break;
|
|
2189
2484
|
}
|
|
2485
|
+
// /desfazer fora: só o que o último pedido mudou sem você ter citado (lib/escopo.js)
|
|
2486
|
+
if (/^(fora|extras?)$/i.test(rest)) {
|
|
2487
|
+
// tirado do checkpoint (o pedido fica no manifest), não da memória: vale depois de fechar e abrir o PrimoCode
|
|
2488
|
+
const ultimo = cps[0];
|
|
2489
|
+
const fora = ultimo ? require('../lib/escopo.js').foraDoPedido(ultimo.pedido, ultimo.mudou, projectDir()) : [];
|
|
2490
|
+
if (!fora.length) { console.log(c.muted(' O último pedido não mexeu em nada além do que você citou.')); break; }
|
|
2491
|
+
const feitos = checkpoint.desfazerArquivos(projectDir(), fora.map((f) => f.caminho));
|
|
2492
|
+
for (const f of feitos) console.log(f.acao === 'falhou' ? c.err(` ✗ ${shortPath(f.caminho)}: ${f.erro}`) : c.ok(` ↺ ${path.relative(projectDir(), f.caminho)}`) + c.dim(` (${f.acao})`));
|
|
2493
|
+
console.log(c.muted(' O que você pediu ficou. /undo volta o pedido inteiro.'));
|
|
2494
|
+
break;
|
|
2495
|
+
}
|
|
2190
2496
|
const n = rest ? parseInt(rest, 10) : 1;
|
|
2191
|
-
if (!(n >= 1)) { console.log(c.err('Uso: /
|
|
2497
|
+
if (!(n >= 1)) { console.log(c.err('Uso: /undo · /undo lista · /undo N · /undo fora')); break; }
|
|
2192
2498
|
const alvo = cps.slice(0, n);
|
|
2193
2499
|
console.log(c.muted(`\n Volta ${alvo.length === 1 ? 'o último pedido' : `os ${alvo.length} últimos pedidos`}:`));
|
|
2194
2500
|
for (const cp of alvo) console.log(` ${c.dim(quando(cp))} ${c.white(cp.pedido.slice(0, 60))}`);
|
|
@@ -2196,15 +2502,348 @@ async function handleSlash(text) {
|
|
|
2196
2502
|
if (!previa.length) console.log(c.muted(' (o disco já está como estava antes)'));
|
|
2197
2503
|
for (const a of previa.slice(0, 40)) console.log(c.muted(` ${a.acao} `) + shortPath(a.caminho));
|
|
2198
2504
|
if (previa.length > 40) console.log(c.muted(` … e mais ${previa.length - 40}`));
|
|
2505
|
+
// a cópia do banco feita durante esses pedidos: a MAIS VELHA é o banco de antes de tudo
|
|
2506
|
+
const copiaDoBanco = BK.desde(projectDir(), alvo[alvo.length - 1].quando).slice(-1)[0];
|
|
2507
|
+
if (copiaDoBanco) console.log(c.muted(' banco ') + `volta pra cópia de ${hora(copiaDoBanco.criado)} (${copiaDoBanco.arquivos.join(', ')})`);
|
|
2199
2508
|
if (!(await confirm('Desfazer?'))) { console.log(c.muted('Cancelado.')); break; }
|
|
2200
2509
|
for (const f of checkpoint.desfazer(projectDir(), n)) {
|
|
2201
2510
|
const rotulo = f.acao === 'falhou' ? c.err(` falhou: ${f.erro} `) : c.ok(` ${f.acao} `);
|
|
2202
2511
|
console.log(rotulo + shortPath(f.caminho));
|
|
2203
2512
|
}
|
|
2513
|
+
if (copiaDoBanco) for (const f of BK.restaurar(projectDir(), copiaDoBanco)) console.log(f.acao === 'falhou' ? c.err(` falhou: ${f.erro} ${f.arquivo}`) : c.ok(' banco voltou ') + f.arquivo);
|
|
2514
|
+
if (checkpoint.refazerDisponivel(projectDir())) console.log(c.muted('\n Mudou de ideia? ') + c.brand('/redo') + c.muted(' devolve.'));
|
|
2515
|
+
break;
|
|
2516
|
+
}
|
|
2517
|
+
|
|
2518
|
+
/* /refazer: o arrependimento do /desfazer. Só o último, e só enquanto
|
|
2519
|
+
nenhum pedido novo mexeu nos arquivos (lib/checkpoint.js). */
|
|
2520
|
+
case 'redo': {
|
|
2521
|
+
const volta = checkpoint.refazerDisponivel(projectDir());
|
|
2522
|
+
if (!volta) { console.log(c.muted(' Nada para refazer: o /redo só volta o último /undo, antes de um pedido novo mudar os arquivos.')); break; }
|
|
2523
|
+
console.log(c.muted(`\n Refaz ${volta.pedidos.length === 1 ? 'o pedido' : `os ${volta.pedidos.length} pedidos`}:`));
|
|
2524
|
+
for (const p of volta.pedidos) console.log(` ${c.white(String(p || '').slice(0, 60))}`);
|
|
2525
|
+
if (!(await confirm('Refazer?'))) { console.log(c.muted('Cancelado.')); break; }
|
|
2526
|
+
for (const f of checkpoint.refazer(projectDir())) {
|
|
2527
|
+
const rotulo = f.acao === 'falhou' ? c.err(` falhou: ${f.erro} `) : c.ok(` ${f.acao} `);
|
|
2528
|
+
console.log(rotulo + shortPath(f.caminho));
|
|
2529
|
+
}
|
|
2530
|
+
break;
|
|
2531
|
+
}
|
|
2532
|
+
|
|
2533
|
+
/* /conferir: "funcionou / não funcionou" em português simples. Passou?
|
|
2534
|
+
O ponto fica marcado e o /restore sabe para onde ir. Falhou? Oferece
|
|
2535
|
+
a IA consertar com a saída do erro já na mão. */
|
|
2536
|
+
case 'check': {
|
|
2537
|
+
const achou = conferirLib.descobrir(projectDir());
|
|
2538
|
+
if (!achou && require('../lib/pipeline.js').acharEntrada(projectDir())) {
|
|
2539
|
+
// sem script de teste, mas é uma página: abrir escondido e olhar é o teste que existe
|
|
2540
|
+
const spP = new Spinner('abrindo a página escondido pra conferir').start();
|
|
2541
|
+
let m = null;
|
|
2542
|
+
try { m = await require('../lib/pipeline.js').medirNoNavegador(projectDir()); } catch (e) { m = { testou: false, relato: e.message }; }
|
|
2543
|
+
spP.stop();
|
|
2544
|
+
const exP = conferirLib.explicarPagina(m);
|
|
2545
|
+
if (exP.ok) {
|
|
2546
|
+
console.log(c.ok(` ✓ ${exP.titulo}`));
|
|
2547
|
+
if (checkpoint.marcarFuncionando(projectDir(), 'a página abriu sem erro')) console.log(c.muted(" Marquei este ponto como 'funcionava': /restore volta pra cá, e a /timeline mostra."));
|
|
2548
|
+
break;
|
|
2549
|
+
}
|
|
2550
|
+
console.log((exP.testou ? c.err : c.warn)(` ${exP.testou ? '✗' : '·'} ${exP.titulo}`));
|
|
2551
|
+
for (const l of exP.linhas) console.log(c.muted(` ${l}`));
|
|
2552
|
+
if (exP.testou && await confirm('Quero que a IA conserte?')) {
|
|
2553
|
+
await sendPrompt(`Abri a página escondido e ela tem problema:\n${m.relato}\nAche a causa, conserte e confira de novo.`);
|
|
2554
|
+
}
|
|
2555
|
+
break;
|
|
2556
|
+
}
|
|
2557
|
+
if (!achou) { console.log(c.muted(" Não achei como testar este projeto (sem script de test/build, e sem página pra abrir). Peça: 'cria testes pra isso'.")); break; }
|
|
2558
|
+
console.log(c.muted(` $ ${achou.comando}`));
|
|
2559
|
+
const sp = new Spinner(`rodando ${achou.rotulo}`).start();
|
|
2560
|
+
const r = await conferirLib.rodar(achou.comando, projectDir());
|
|
2561
|
+
sp.stop();
|
|
2562
|
+
if (r.semTeste) { console.log(c.muted(` O ${achou.comando} não achou teste pra rodar (ou o pytest não está instalado). Peça: 'cria testes pra isso'.`)); break; }
|
|
2563
|
+
const ex = conferirLib.explicar(r, achou);
|
|
2564
|
+
if (r.ok) {
|
|
2565
|
+
console.log(c.ok(` ✓ ${ex.titulo}`));
|
|
2566
|
+
if (checkpoint.marcarFuncionando(projectDir(), achou.comando)) {
|
|
2567
|
+
console.log(c.muted(" Marquei este ponto como 'funcionava': /restore volta pra cá, e a /timeline mostra."));
|
|
2568
|
+
} else {
|
|
2569
|
+
// sem pedido nenhum nesta pasta ainda, não há ponto pra marcar: dizer, em vez de calar
|
|
2570
|
+
console.log(c.muted(' Ainda não tem ponto pra marcar: o primeiro pedido que mexer nos arquivos cria um, e o próximo /check marca.'));
|
|
2571
|
+
}
|
|
2572
|
+
break;
|
|
2573
|
+
}
|
|
2574
|
+
console.log(c.err(` ✗ ${ex.titulo}`));
|
|
2575
|
+
for (const l of ex.linhas) console.log(c.muted(` ${l}`));
|
|
2576
|
+
if (await confirm('Quero que a IA conserte?')) {
|
|
2577
|
+
await sendPrompt(`Rodei \`${achou.comando}\` e falhou. A saída:\n${r.saida}\nAche a causa, conserte e rode \`${achou.comando}\` de novo até passar.`);
|
|
2578
|
+
}
|
|
2579
|
+
break;
|
|
2580
|
+
}
|
|
2581
|
+
|
|
2582
|
+
/* /voltar: o /desfazer com destino certo — o último ponto que o
|
|
2583
|
+
/check marcou como funcionando, em vez de "N pedidos" no chute. */
|
|
2584
|
+
case 'restore': {
|
|
2585
|
+
const ponto = checkpoint.ultimoQueFuncionava(projectDir());
|
|
2586
|
+
if (!ponto) { console.log(c.muted(' Nenhum ponto marcado ainda. Quando estiver funcionando, rode /check: ele marca.')); break; }
|
|
2587
|
+
if (ponto.indice === 0) { console.log(c.muted(' Você já está no último ponto que funcionava.')); break; }
|
|
2588
|
+
const quando = (cp) => new Date(cp.quando).toLocaleString('pt-BR', { dateStyle: 'short', timeStyle: 'short' });
|
|
2589
|
+
const alvo = checkpoint.lista(projectDir()).slice(0, ponto.indice);
|
|
2590
|
+
console.log(c.muted(`\n O último ponto que funcionava: ${quando(ponto.cp)}, "${String(ponto.cp.pedido || '').slice(0, 50)}"`)
|
|
2591
|
+
+ (ponto.cp.funcionava_como ? c.dim(` (conferido: ${ponto.cp.funcionava_como})`) : ''));
|
|
2592
|
+
console.log(c.muted(`\n Volta ${alvo.length === 1 ? 'o pedido' : `os ${alvo.length} pedidos`} feito${alvo.length === 1 ? '' : 's'} depois do último ponto que funcionava:`));
|
|
2593
|
+
for (const cp of alvo) console.log(` ${c.dim(quando(cp))} ${c.white(cp.pedido.slice(0, 60))}`);
|
|
2594
|
+
const previa = checkpoint.previa(projectDir(), ponto.indice);
|
|
2595
|
+
if (!previa.length) console.log(c.muted(' (o disco já está como estava antes)'));
|
|
2596
|
+
for (const a of previa.slice(0, 40)) console.log(c.muted(` ${a.acao} `) + shortPath(a.caminho));
|
|
2597
|
+
if (previa.length > 40) console.log(c.muted(` … e mais ${previa.length - 40}`));
|
|
2598
|
+
if (!(await confirm('Voltar?'))) { console.log(c.muted('Cancelado.')); break; }
|
|
2599
|
+
for (const f of checkpoint.desfazer(projectDir(), ponto.indice)) {
|
|
2600
|
+
const rotulo = f.acao === 'falhou' ? c.err(` falhou: ${f.erro} `) : c.ok(` ${f.acao} `);
|
|
2601
|
+
console.log(rotulo + shortPath(f.caminho));
|
|
2602
|
+
}
|
|
2603
|
+
if (checkpoint.refazerDisponivel(projectDir())) console.log(c.muted('\n Mudou de ideia? ') + c.brand('/redo') + c.muted(' devolve.'));
|
|
2604
|
+
console.log(c.muted(' A história inteira do projeto, numa página: ') + c.brand('/timeline'));
|
|
2605
|
+
break;
|
|
2606
|
+
}
|
|
2607
|
+
|
|
2608
|
+
/* /linha-do-tempo: o /desfazer lista numa página que quem não sabe
|
|
2609
|
+
git consegue ler. Pedido explícito, então abre o navegador; se não
|
|
2610
|
+
abrir (app de voz), mostra onde o arquivo ficou. */
|
|
2611
|
+
/* /mostrar: o app no celular de alguém no mesmo Wi-Fi, com link de prazo, sem publicar (lib/mostrar.js). */
|
|
2612
|
+
case 'show': {
|
|
2613
|
+
const arg = String(rest || '').trim().toLowerCase();
|
|
2614
|
+
if (state.mostrando && (arg === 'parar' || arg === 'stop')) { await state.mostrando.fechar(); state.mostrando = null; console.log(c.ok(' Parei de mostrar. O link não abre mais.')); break; }
|
|
2615
|
+
if (arg === 'parar' || arg === 'stop') { console.log(c.muted(' Não estou mostrando nada agora.')); break; }
|
|
2616
|
+
const entradaMostrar = require('../lib/pipeline.js').acharEntrada(projectDir());
|
|
2617
|
+
if (!entradaMostrar) { console.log(c.muted(' Não achei uma página pra mostrar (um index.html). Esse projeto roda como servidor? Peça "roda o projeto".')); break; }
|
|
2618
|
+
if (state.mostrando) await state.mostrando.fechar();
|
|
2619
|
+
const minutos = Math.max(5, Math.min(240, Number(arg) || 60));
|
|
2620
|
+
const r = await require('../lib/mostrar.js').abrir(projectDir(), { minutos, entrada: entradaMostrar }); // lista.html sem index.html também abre
|
|
2621
|
+
if (!r.ok) { console.log(c.err(` Não consegui abrir: ${r.error}`)); break; }
|
|
2622
|
+
state.mostrando = r;
|
|
2623
|
+
console.log(c.ok(` Mostrando ${path.basename(projectDir())} por ${minutos} min, só pra quem está no mesmo Wi-Fi:`));
|
|
2624
|
+
console.log(' ' + c.white(r.url || r.urlLocal));
|
|
2625
|
+
console.log(c.muted(' Nada foi publicado: o link morre no prazo ou quando você fecha o PrimoCode. .env, .git e node_modules nunca saem. /show parar fecha agora.'));
|
|
2626
|
+
break;
|
|
2627
|
+
}
|
|
2628
|
+
/* /como-rodar: o bloco "Como rodar" do PRIMO.md, tirado do disco sem modelo (lib/como-rodar.js). */
|
|
2629
|
+
case 'howto': {
|
|
2630
|
+
const r = require('../lib/como-rodar.js').gravar(projectDir());
|
|
2631
|
+
if (!r.passos.length) { console.log(c.muted(' Ainda não deu pra saber como este projeto roda (sem package.json, index.html nem main.py).')); break; }
|
|
2632
|
+
console.log(c.ok(` ${r.criou ? 'Criei o PRIMO.md' : 'Atualizei o PRIMO.md'} com o "Como rodar":`));
|
|
2633
|
+
r.passos.forEach((p, i) => console.log(` ${c.brand(String(i + 1))} ${p.texto}${p.comando ? c.muted(': ') + c.white(p.comando) : ''}`));
|
|
2634
|
+
console.log(c.muted(' O PrimoCode lê o PRIMO.md em todo pedido. Rodar de novo atualiza o bloco.'));
|
|
2635
|
+
break;
|
|
2636
|
+
}
|
|
2637
|
+
/* /porta: "o app não abre" por causa da porta, dito em português (lib/porta.js). */
|
|
2638
|
+
case 'port': {
|
|
2639
|
+
const r = await require('../lib/porta.js').diagnostico(projectDir());
|
|
2640
|
+
r.linhas.forEach((l, i) => console.log(i === 0 ? ' ' + (r.url ? c.ok(l) : c.warn(l)) : /^Abra:|abra: http/.test(l) ? ' ' + c.white(l) : c.muted(' ' + l)));
|
|
2641
|
+
if (r.url) console.log(c.muted(` /open ${r.url} abre no navegador.`));
|
|
2642
|
+
break;
|
|
2643
|
+
}
|
|
2644
|
+
/* /regra: "nunca mexa em X" no topo do PRIMO.md, que entra em todo pedido e não vira resumo (lib/regras.js). */
|
|
2645
|
+
case 'rule': {
|
|
2646
|
+
const R = require('../lib/regras.js');
|
|
2647
|
+
const mostrar = (lista) => lista.forEach((r, i) => console.log(` ${c.brand(String(i + 1))} ${r}`));
|
|
2648
|
+
const tira = rest.match(/^(?:tirar|tira|apagar|remover)\s+(\d+)$/i);
|
|
2649
|
+
if (tira) {
|
|
2650
|
+
const r = R.tirar(projectDir(), tira[1]);
|
|
2651
|
+
if (!r) { console.log(c.err(` Não tem regra ${tira[1]}. /rule mostra a lista.`)); break; }
|
|
2652
|
+
console.log(c.ok(` Tirei: ${r.tirada}`));
|
|
2653
|
+
if (r.regras.length) mostrar(r.regras); else console.log(c.muted(' Não sobrou nenhuma regra.'));
|
|
2654
|
+
break;
|
|
2655
|
+
}
|
|
2656
|
+
if (!rest.trim()) {
|
|
2657
|
+
const lista = R.ler(projectDir());
|
|
2658
|
+
if (!lista.length) { console.log(c.muted(' Nenhuma regra ainda. Exemplo: /rule nunca mexa no style.css')); break; }
|
|
2659
|
+
console.log(c.white(` As regras de ${path.basename(projectDir())} (o PrimoCode segue em todo pedido):`));
|
|
2660
|
+
mostrar(lista);
|
|
2661
|
+
console.log(c.muted(' /rule tirar N tira uma.'));
|
|
2662
|
+
break;
|
|
2663
|
+
}
|
|
2664
|
+
const r = R.adicionar(projectDir(), rest);
|
|
2665
|
+
console.log(r.ja_tinha ? c.muted(' Essa regra já estava lá.') : c.ok(' Guardei no topo do PRIMO.md. Vale em todo pedido, mesmo depois de resumir a conversa:'));
|
|
2666
|
+
mostrar(r.regras);
|
|
2667
|
+
break;
|
|
2668
|
+
}
|
|
2669
|
+
/* /mapa: o que tem no projeto, em português, e o arquivo que é pedido mas não existe (lib/mapa.js). */
|
|
2670
|
+
case 'map': {
|
|
2671
|
+
const arvore = rest.match(/^(?:tree|arvore|árvore)\b\s*(\d*)/i);
|
|
2672
|
+
if (arvore) { console.log(tools.treeDir(projectDir(), parseInt(arvore[1], 10) || 2)); break; }
|
|
2673
|
+
const M = require('../lib/mapa.js');
|
|
2674
|
+
const m = M.montar(projectDir());
|
|
2675
|
+
for (const l of M.texto(m, path.basename(projectDir()))) console.log(/⚠/.test(l) ? c.warn(l) : /^\S/.test(l) ? ' ' + c.white(l) : c.muted(l));
|
|
2676
|
+
if (m.faltando.length) console.log(c.muted(' Peça: "cria o que está faltando", ou rode /check pra ver a página abrindo.'));
|
|
2677
|
+
break;
|
|
2678
|
+
}
|
|
2679
|
+
/* /mudou: o que mudou no projeto, em português simples (lib/mudou.js), e não um diff. */
|
|
2680
|
+
case 'changes': {
|
|
2681
|
+
const r = require('../lib/mudou.js').medir(projectDir());
|
|
2682
|
+
console.log(' ' + c.white(r.frase));
|
|
2683
|
+
for (const a of r.arquivos.slice(0, 15)) {
|
|
2684
|
+
const rotulo = r.git ? (a.novo ? c.ok('novo ') : a.apagado ? c.warn('apagado ') : c.muted('editado ')) : c.muted((a.acao || 'mudou').padEnd(8));
|
|
2685
|
+
const conta = r.git && !a.novo && !a.apagado ? c.dim(` +${a.mais} −${a.menos}`) : '';
|
|
2686
|
+
console.log(` ${rotulo}${a.arquivo}${conta}`);
|
|
2687
|
+
}
|
|
2688
|
+
if (r.arquivos.length > 15) console.log(c.dim(` … e mais ${r.arquivos.length - 15}`));
|
|
2689
|
+
if (r.arquivos.length) console.log(c.muted(' Quebrou algo? /restore volta pro último ponto que funcionava.'));
|
|
2690
|
+
break;
|
|
2691
|
+
}
|
|
2692
|
+
/* /explain: sem nada, o último pedido em 5 linhas; com uma palavra, uma linha; "projeto" é o comando de fábrica. */
|
|
2693
|
+
case 'explain': {
|
|
2694
|
+
const E = require('../lib/explicar.js');
|
|
2695
|
+
const m = E.modo(rest);
|
|
2696
|
+
if (m.tipo === 'projeto') {
|
|
2697
|
+
const fabrica = comandosDaPessoa().find((x) => x.nome === 'explain');
|
|
2698
|
+
if (!fabrica) { console.log(c.err(' Não achei o comando de fábrica (comandos/explain.md).')); break; }
|
|
2699
|
+
console.log(c.dim(` ⎿ /explain projeto · ${fabrica.origem}`));
|
|
2700
|
+
await sendPrompt(comandosLib.expandir(fabrica, ''));
|
|
2701
|
+
break;
|
|
2702
|
+
}
|
|
2703
|
+
if (m.tipo === 'termo') { await sendPrompt(E.pedidoDoTermo(m.termo)); break; }
|
|
2704
|
+
const ultimo = E.doUltimoPedido(projectDir());
|
|
2705
|
+
if (!ultimo) { console.log(c.muted(' Ainda não mudou nada por aqui. /explain projeto explica o projeto; /explain <palavra> explica uma palavra.')); break; }
|
|
2706
|
+
await sendPrompt(E.pedidoDoUltimo(ultimo));
|
|
2707
|
+
break;
|
|
2708
|
+
}
|
|
2709
|
+
/* /plan: 1ª fase no modo plano (só lê) mostra 3 a 5 passos; Enter começa, um número muda o passo (lib/plano-previo.js). */
|
|
2710
|
+
case 'plan': {
|
|
2711
|
+
const P = require('../lib/plano-previo.js');
|
|
2712
|
+
if (!rest) { console.log(c.muted(' Uso: /plan <pedido> — ele mostra os passos e só começa quando você aperta Enter.')); break; }
|
|
2713
|
+
const antes = state.config.permissoes, tamanho = state.history.length;
|
|
2714
|
+
state.config.permissoes = 'plano';
|
|
2715
|
+
try { await sendPrompt(P.pedidoDoPlano(rest)); } finally { state.config.permissoes = antes; }
|
|
2716
|
+
const ultima = state.history.length > tamanho ? state.history[state.history.length - 1] : null;
|
|
2717
|
+
const passos = ultima && ultima.role === 'assistant' ? P.extrairPassos(ultima.content) : [];
|
|
2718
|
+
if (passos.length < 2) { console.log(c.muted(' Não consegui montar uma lista de passos. Peça de novo, ou mande o pedido sem o /plan.')); break; }
|
|
2719
|
+
for (;;) {
|
|
2720
|
+
console.log(c.white('\n O plano:'));
|
|
2721
|
+
passos.forEach((p, i) => console.log(` ${c.brand(String(i + 1))} ${p}`));
|
|
2722
|
+
const r = P.resposta(await ask(`\n${c.brand('?')} ${c.muted('Enter começa · número muda o passo · n cancela')} `), passos);
|
|
2723
|
+
if (r.acao === 'cancelar') { console.log(c.muted(' Cancelado. Nada foi mexido.')); passos.length = 0; break; }
|
|
2724
|
+
if (r.acao === 'comecar') break;
|
|
2725
|
+
if (r.acao === 'editar') {
|
|
2726
|
+
const novo = (await ask(` ${c.muted(`Passo ${r.n}, com as suas palavras (vazio apaga):`)} `)).trim();
|
|
2727
|
+
if (novo) passos[r.n - 1] = novo; else if (passos.length > 1) passos.splice(r.n - 1, 1);
|
|
2728
|
+
} else console.log(c.muted(' Aperte Enter para começar, digite o número de um passo, ou n.'));
|
|
2729
|
+
}
|
|
2730
|
+
if (!passos.length) break;
|
|
2731
|
+
state.passosProntos = P.comoPassos(rest, passos);
|
|
2732
|
+
try { await sendPrompt(rest); } finally { state.passosProntos = null; }
|
|
2733
|
+
break;
|
|
2734
|
+
}
|
|
2735
|
+
/* /lock: arquivo que o agente só lê. A recusa mora no portão (lib/perigo.js → lib/trava.js). */
|
|
2736
|
+
case 'lock': {
|
|
2737
|
+
const T = require('../lib/trava.js');
|
|
2738
|
+
const palavras = (rest.match(/"[^"]+"|'[^']+'|\S+/g) || []).map((x) => x.replace(/^["']|["']$/g, ''));
|
|
2739
|
+
const lista = (ts) => ts.forEach((t, i) => console.log(` ${c.brand(String(i + 1))} ${t}`));
|
|
2740
|
+
if (/^(off|soltar|solta|destravar|unlock)$/i.test(palavras[0] || '')) {
|
|
2741
|
+
if (palavras.length < 2) { console.log(c.err(' Uso: /lock off <arquivo> (ou /lock off tudo)')); break; }
|
|
2742
|
+
const alvos = palavras.slice(1);
|
|
2743
|
+
for (const a of alvos) {
|
|
2744
|
+
const r = T.soltar(projectDir(), a);
|
|
2745
|
+
console.log(r.soltos.length ? c.ok(` Soltei ${r.soltos.join(', ')}. O agente volta a poder mexer.`) : c.muted(` ${a} não estava travado.`));
|
|
2746
|
+
}
|
|
2747
|
+
break;
|
|
2748
|
+
}
|
|
2749
|
+
if (!palavras.length) {
|
|
2750
|
+
const ts = T.ler(projectDir());
|
|
2751
|
+
if (!ts.length) { console.log(c.muted(' Nenhum arquivo travado. Exemplo: /lock login.js logo.png')); break; }
|
|
2752
|
+
console.log(c.white(` Travados em ${path.basename(projectDir())} (o agente só pode ler):`));
|
|
2753
|
+
lista(ts);
|
|
2754
|
+
console.log(c.muted(' /lock off <arquivo> solta um.'));
|
|
2755
|
+
break;
|
|
2756
|
+
}
|
|
2757
|
+
const r = T.travar(projectDir(), palavras);
|
|
2758
|
+
for (const f of r.fora) console.log(c.warn(` ${f} está fora da pasta do projeto: não travei.`));
|
|
2759
|
+
for (const n of r.novos) if (!fs.existsSync(path.join(projectDir(), n))) console.log(c.muted(` ${n} ainda não existe: travei mesmo assim.`));
|
|
2760
|
+
if (r.novos.length) console.log(c.ok(` Travei ${r.novos.join(', ')}. O agente só pode ler.`));
|
|
2761
|
+
else if (!r.fora.length) console.log(c.muted(' Esses já estavam travados.'));
|
|
2762
|
+
if (r.travados.length) { lista(r.travados); console.log(c.muted(' /lock off <arquivo> solta um.')); }
|
|
2763
|
+
break;
|
|
2764
|
+
}
|
|
2765
|
+
/* /save: guarda o projeto no GitHub, num repositório privado (lib/guardar.js). */
|
|
2766
|
+
case 'save': {
|
|
2767
|
+
const r = require('../lib/guardar.js').salvar(projectDir(), { log: (l) => console.log(c.muted(' ' + l)) });
|
|
2768
|
+
console.log(r.ok ? c.ok(` Seu trabalho está guardado fora do computador: ${r.url}`) : c.warn(` ${r.erro}`));
|
|
2769
|
+
break;
|
|
2770
|
+
}
|
|
2771
|
+
/* /secrets: nomes das chaves, nunca os valores; `add` pede o valor escondido (lib/segredos.js). */
|
|
2772
|
+
case 'secrets': {
|
|
2773
|
+
const S = require('../lib/segredos.js');
|
|
2774
|
+
const [sub, nomeDado] = rest.split(/\s+/).filter(Boolean);
|
|
2775
|
+
if (/^(add|adicionar|novo)$/i.test(sub || '')) {
|
|
2776
|
+
const n = S.nomeValido(nomeDado);
|
|
2777
|
+
if (!n) { console.log(c.warn(' Qual o nome? Exemplo: /secrets add OPENAI_API_KEY')); break; }
|
|
2778
|
+
console.log(c.warn(' Isto é uma chave, não mostre pra ninguém.') + c.muted(' O que você digitar não aparece na tela.'));
|
|
2779
|
+
const valor = (await askSecret(` Valor de ${n}: `)).trim();
|
|
2780
|
+
if (!valor) { console.log(c.muted(' Vazio: não guardei nada.')); break; }
|
|
2781
|
+
try {
|
|
2782
|
+
const r = S.gravar(projectDir(), n, valor);
|
|
2783
|
+
console.log(c.ok(` ${r.substituiu ? 'Troquei' : 'Guardei'} ${n} no .env${r.criou ? ' (criei o arquivo)' : ''}.`));
|
|
2784
|
+
if (r.gitignore) console.log(c.muted(' Pus .env no .gitignore: ele não vai pro GitHub.'));
|
|
2785
|
+
} catch (e) { console.log(c.warn(` ${e.message}`)); }
|
|
2786
|
+
break;
|
|
2787
|
+
}
|
|
2788
|
+
const lista = S.listar(projectDir());
|
|
2789
|
+
if (!lista.length) { console.log(c.muted(' Este projeto não usa nenhuma chave (ainda). Quando precisar: /secrets add NOME')); break; }
|
|
2790
|
+
console.log(c.white(' Chaves deste projeto (só os nomes, nunca o valor):'));
|
|
2791
|
+
for (const x of lista) {
|
|
2792
|
+
const estado = x.noEnv && !x.vazia ? c.ok('guardada') : x.noEnv ? c.warn('vazia no .env') : c.warn('falta guardar');
|
|
2793
|
+
console.log(` ${c.brand(ui.padRight(x.nome, 28))}${ui.padRight(estado, 16)}${c.dim(x.usadaEm.length ? 'usada em ' + x.usadaEm.join(', ') : '')}`);
|
|
2794
|
+
}
|
|
2795
|
+
console.log(c.muted(' /secrets add NOME guarda uma. Isto é uma chave, não mostre pra ninguém.'));
|
|
2796
|
+
break;
|
|
2797
|
+
}
|
|
2798
|
+
/* /schedule: pedido que roda sozinho no Mac, pelo launchd (lib/agendar.js). */
|
|
2799
|
+
case 'schedule': {
|
|
2800
|
+
const A = require('../lib/agendar.js');
|
|
2801
|
+
const off = rest.match(/^(?:off|tirar|remover|cancelar)\s+(\S+)/i);
|
|
2802
|
+
if (off) {
|
|
2803
|
+
const r = A.remover(projectDir(), off[1]);
|
|
2804
|
+
console.log(r.ok ? c.ok(` Tirei: ${r.item.quando} · ${r.item.pedido.slice(0, 60)}`) : c.warn(` ${r.erro}`));
|
|
2805
|
+
break;
|
|
2806
|
+
}
|
|
2807
|
+
if (!rest) {
|
|
2808
|
+
const lista = A.listar(projectDir());
|
|
2809
|
+
if (!lista.length) { console.log(c.muted(' Nada agendado. Exemplo: /schedule "toda segunda às 9h" resuma o que mudou na semana')); break; }
|
|
2810
|
+
console.log(c.white(' Agendados neste projeto:'));
|
|
2811
|
+
lista.forEach((x, i) => console.log(` ${c.brand(String(i + 1))} ${c.white(x.quando)} ${c.muted(x.pedido.slice(0, 60))}`));
|
|
2812
|
+
console.log(c.muted(' O resultado de cada dia fica em .primocode/agendados/<data>.md · /schedule off <número> tira um.'));
|
|
2813
|
+
break;
|
|
2814
|
+
}
|
|
2815
|
+
const { quando, pedido } = A.separar(rest);
|
|
2816
|
+
const r = A.criar(projectDir(), quando, pedido);
|
|
2817
|
+
if (!r.ok) { console.log(c.warn(` ${r.erro}`)); break; }
|
|
2818
|
+
console.log(c.ok(` Agendado: ${r.item.quando}. O resultado vai para .primocode/agendados/<data>.md`));
|
|
2819
|
+
console.log(c.muted(r.relogio ? ' Roda sozinho, mesmo com o PrimoCode fechado (o Mac precisa estar ligado). /schedule off ' + r.item.id + ' tira.'
|
|
2820
|
+
: ' Atenção: o relógio automático só existe no Mac. O pedido ficou salvo, mas não vai rodar sozinho neste computador.'));
|
|
2821
|
+
break;
|
|
2822
|
+
}
|
|
2823
|
+
/* /ship: site estático, Next e app Node simples vão pro ar de verdade (lib/publicar.js); o resto cai no guia
|
|
2824
|
+
de fábrica (comandos/ship.md), que também vale pro /ship.md que a pessoa escreveu. */
|
|
2825
|
+
case 'ship': {
|
|
2826
|
+
const guia = comandosDaPessoa().find((x) => x.nome === 'ship');
|
|
2827
|
+
if (guia && guia.origem !== 'primocode') { console.log(c.dim(` ⎿ /ship · ${guia.origem}`)); await sendPrompt(comandosLib.expandir(guia, rest)); break; }
|
|
2828
|
+
const r = await require('../lib/publicar.js').publicar(projectDir(), { log: (l) => console.log(c.muted(' ' + l)), confirmar: (q) => confirm(q) });
|
|
2829
|
+
if (r.guiado) {
|
|
2830
|
+
if (!guia) { console.log(c.err(' Não achei o guia de fábrica (comandos/ship.md).')); break; }
|
|
2831
|
+
console.log(c.muted(' Este projeto eu não publico sozinho: vou te guiar passo a passo.'));
|
|
2832
|
+
await sendPrompt(comandosLib.expandir(guia, rest));
|
|
2833
|
+
break;
|
|
2834
|
+
}
|
|
2835
|
+
if (r.recusou) console.log(c.muted(' Tudo bem, não enviei nada.'));
|
|
2836
|
+
else console.log(r.ok ? c.ok(` Seu projeto está no ar: ${r.url}`) : c.warn(` ${r.erro}`));
|
|
2837
|
+
break;
|
|
2838
|
+
}
|
|
2839
|
+
case 'timeline': {
|
|
2840
|
+
const arquivo = require('../lib/linha-do-tempo').gravar(projectDir());
|
|
2841
|
+
const r = await tools.openInBrowser(arquivo);
|
|
2842
|
+
if (r && r.ok === false) console.log(c.muted(' A página está em: ') + arquivo);
|
|
2843
|
+
else console.log(c.ok(' Abri a história do projeto no navegador.') + c.dim(' ' + shortPath(arquivo)));
|
|
2204
2844
|
break;
|
|
2205
2845
|
}
|
|
2206
2846
|
|
|
2207
|
-
case 'tree': console.log(tools.treeDir(projectDir(), parseInt(rest, 10) || 2)); break;
|
|
2208
2847
|
|
|
2209
2848
|
case 'read': {
|
|
2210
2849
|
if (!rest) { console.log(c.err('Uso: /read <arquivo>')); break; }
|
|
@@ -2231,46 +2870,27 @@ async function handleSlash(text) {
|
|
|
2231
2870
|
parece (findSimilarProject) — e quem quer começar do zero não tem
|
|
2232
2871
|
como dizer isso. Aqui a pasta nasce antes, com nome que não colide,
|
|
2233
2872
|
e o pedido roda preso nela. */
|
|
2234
|
-
case '
|
|
2235
|
-
|
|
2236
|
-
|
|
2237
|
-
|
|
2238
|
-
const sugerido = await nomeProjeto.escolher({ pedido: rest, nomes, perguntar: perguntarNome }).catch(() => null);
|
|
2239
|
-
sp.stop();
|
|
2240
|
-
const nomeNovo = extra.nomeDoNovo({
|
|
2241
|
-
descricao: rest, nomes, sugerido, derivar: deriveProjectName,
|
|
2242
|
-
// A régua curta (lib/nome-curto.js) também no /novo.
|
|
2243
|
-
slugify: (t) => nomeCurto(t) || cfg.slugify(t), semColisao: nomeProjeto.semColisao,
|
|
2244
|
-
});
|
|
2245
|
-
const dir = cfg.createProjectDir(nomeNovo);
|
|
2246
|
-
entrarNoProjeto(dir, 'projeto');
|
|
2247
|
-
// Conversa nova junto: o que se falou do projeto anterior puxaria o
|
|
2248
|
-
// agente de volta para ele.
|
|
2249
|
-
state.history = []; state.memoria = memoria.nova(); state.gravador.zerar();
|
|
2250
|
-
console.log(c.ok(` Projeto novo: ${state.currentProject}`) + c.muted(` (${shortPath(dir)})`));
|
|
2251
|
-
refreshPrompt();
|
|
2252
|
-
const modoAntes = state.mode;
|
|
2253
|
-
state.mode = 'primocode';
|
|
2254
|
-
state.projetoFixo = true;
|
|
2255
|
-
try { await sendPrompt(extra.pedidoDoNovo(rest, state.currentProject)); }
|
|
2256
|
-
finally { state.mode = modoAntes; state.projetoFixo = false; }
|
|
2873
|
+
case 'new': {
|
|
2874
|
+
// sem nada: as 3 perguntas de quem nunca programou (era o /new)
|
|
2875
|
+
if (!rest) { await comecarPerguntas(); break; }
|
|
2876
|
+
await criarProjetoNovo(rest);
|
|
2257
2877
|
break;
|
|
2258
2878
|
}
|
|
2259
2879
|
|
|
2260
|
-
/* /open sem nada (e /
|
|
2880
|
+
/* /open sem nada (e /open) acha sozinho o que abrir: o servidor do
|
|
2261
2881
|
projeto de pé, ou a index.html. Antes pedia o caminho, e quem não
|
|
2262
2882
|
sabe que a página se chama index.html ficava parado aqui. */
|
|
2263
|
-
case '
|
|
2883
|
+
case 'open': {
|
|
2264
2884
|
if (!rest) {
|
|
2265
2885
|
const pastaAtual = projectDir();
|
|
2266
2886
|
if (path.resolve(pastaAtual) === path.resolve(cfg.ROOT_DIR)) {
|
|
2267
|
-
console.log(c.muted(' Nenhum projeto aberto.') + c.dim(' /
|
|
2887
|
+
console.log(c.muted(' Nenhum projeto aberto.') + c.dim(' /projects para escolher um'));
|
|
2268
2888
|
break;
|
|
2269
2889
|
}
|
|
2270
2890
|
const alvo = await extra.acharAlvoAbrir(pastaAtual);
|
|
2271
2891
|
if (!alvo) {
|
|
2272
2892
|
console.log(c.muted(` Não achei página nem servidor em ${shortPath(pastaAtual)}.`));
|
|
2273
|
-
console.log(c.dim(' Peça "roda o projeto" ao Primo, ou /open <arquivo>.'));
|
|
2893
|
+
console.log(c.dim(' Peça "roda o projeto" ao Primo, ou /open <arquivo>. O app devia estar rodando? /port diz por que não abre.'));
|
|
2274
2894
|
break;
|
|
2275
2895
|
}
|
|
2276
2896
|
const r = await tools.openInBrowser(alvo.url || alvo.caminho);
|
|
@@ -2285,6 +2905,13 @@ async function handleSlash(text) {
|
|
|
2285
2905
|
}
|
|
2286
2906
|
|
|
2287
2907
|
case 'name': {
|
|
2908
|
+
// /name voz <Nome>: o nome do assistente de voz (o mesmo do /voice nome)
|
|
2909
|
+
const nomeVoz = rest.match(/^(?:voz|voice|assistente)\s+(.{2,20})$/i);
|
|
2910
|
+
if (nomeVoz) {
|
|
2911
|
+
const salvo = vozModo.definirNome(nomeVoz[1]);
|
|
2912
|
+
console.log(salvo ? c.ok(` Fechado: o assistente agora se chama ${salvo}. Vale na próxima vez que ligar o /voice.`) : c.err(' Nome inválido (1 ou 2 palavras, até 20 letras).'));
|
|
2913
|
+
break;
|
|
2914
|
+
}
|
|
2288
2915
|
if (!rest) { console.log(c.muted(` Nome atual: ${state.config.userName || '(nenhum)'}`)); break; }
|
|
2289
2916
|
state.config.userName = rest;
|
|
2290
2917
|
cfg.saveConfig({ userName: rest });
|
|
@@ -2296,14 +2923,14 @@ async function handleSlash(text) {
|
|
|
2296
2923
|
nome ou número — na hora, se há teclado; senão pelo /mascot <n>.
|
|
2297
2924
|
Num pipe não pergunta: a "resposta" seria o próximo comando. */
|
|
2298
2925
|
// O kit de marca (lib/marca-kit.js): /marca criar|listar|usar <nome> [aqui]|mostrar|apagar <nome>
|
|
2299
|
-
case '
|
|
2926
|
+
case 'brand': {
|
|
2300
2927
|
const kit = require('../lib/marca-kit.js');
|
|
2301
2928
|
const perguntar = async (t, p) => (String(await ask(`${c.brand('?')} ${t}${p ? c.muted(` [${p}]`) : ''}: `)).trim() || p || '');
|
|
2302
2929
|
await kit.main((rest || 'mostrar').split(/\s+/), { perguntar, dizer: (t) => console.log(c.muted(t)), pasta: state.workDir || process.cwd() });
|
|
2303
2930
|
break;
|
|
2304
2931
|
}
|
|
2305
2932
|
|
|
2306
|
-
case 'mascot':
|
|
2933
|
+
case 'mascot': {
|
|
2307
2934
|
const reac = rest.match(/^(reac(?:oes|ões)?|rea[cç][aã]o|reactions?)\s*(on|off|liga[r]?|desliga[r]?|sim|n[aã]o)?$/i);
|
|
2308
2935
|
if (reac) {
|
|
2309
2936
|
const quer = reac[2] ? /^(on|liga|ligar|sim)$/i.test(reac[2]) : state.config.reacoes === false;
|
|
@@ -2381,7 +3008,8 @@ async function handleSlash(text) {
|
|
|
2381
3008
|
|
|
2382
3009
|
/* O /status olha só o servidor. O /doctor olha tudo o que costuma
|
|
2383
3010
|
ser o motivo de "não funciona" — e cada ✗ diz como consertar. */
|
|
2384
|
-
case 'doctor':
|
|
3011
|
+
case 'doctor': {
|
|
3012
|
+
if (/^status$/i.test(rest)) { await mostrarStatus(); break; }
|
|
2385
3013
|
const sp = new Spinner('conferindo').start();
|
|
2386
3014
|
const linhas = await extra.diagnosticar({
|
|
2387
3015
|
saude: () => api.getHealth(state.config.server, state.config.token),
|
|
@@ -2405,10 +3033,21 @@ async function handleSlash(text) {
|
|
|
2405
3033
|
break;
|
|
2406
3034
|
}
|
|
2407
3035
|
|
|
2408
|
-
case '
|
|
3036
|
+
case 'usage': {
|
|
3037
|
+
const Lim = require('../lib/limite.js');
|
|
3038
|
+
const querLimite = /^(limite|limit)\b/i.exec(rest) && rest.replace(/^\S+\s*/, '').replace(/[.\s]/g, '').replace(/mil$/i, '000');
|
|
3039
|
+
if (querLimite) { // /usage limite 100000 ensina o limite do plano; sem número, mostra o uso de hoje
|
|
3040
|
+
console.log(Lim.definirLimite(querLimite) ? c.ok(` Anotei: ${Number(querLimite).toLocaleString('pt-BR')} tokens por dia. Agora os pedidos grandes dizem quantos % gastam.`) : c.warn(' Não entendi o número. Exemplo: /usage limite 100000'));
|
|
3041
|
+
break;
|
|
3042
|
+
}
|
|
3043
|
+
guardarUsoDeHoje();
|
|
2409
3044
|
const { linhas, total } = extra.resumoCusto(contadorDaSessao);
|
|
2410
|
-
|
|
2411
|
-
console.log('');
|
|
3045
|
+
const hojeL = Lim.resumoDeHoje({ tokens: Lim.usoDeHoje().tokens, limite: Lim.limiteConhecido() });
|
|
3046
|
+
if (!linhas.length) { console.log(c.muted(' Nenhum pedido ao modelo nesta sessão ainda.')); hojeL.forEach((l) => console.log(c.muted(' ' + l))); break; }
|
|
3047
|
+
const simples = extra.resumoSimples({ linhas, total });
|
|
3048
|
+
console.log('\n ' + c.white('Nesta conversa: ') + simples.frase);
|
|
3049
|
+
console.log(' ' + c.ok(simples.quemPaga));
|
|
3050
|
+
console.log(c.dim('\n Em tokens (a unidade que o modelo conta):'));
|
|
2412
3051
|
for (const l of linhas) {
|
|
2413
3052
|
console.log(` ${c.white(ui.padRight(l.provedor, 22))}${c.muted(ui.padRight(l.pedidos + (l.pedidos === 1 ? ' pedido' : ' pedidos'), 12))}`
|
|
2414
3053
|
+ `${c.dim('enviou ')}${c.white(extra.fmtNumero(l.enviados))}${c.dim(' · recebeu ')}${c.white(extra.fmtNumero(l.recebidos))}${c.dim(' tokens' + (l.exato ? '' : ' (estimado)'))}`);
|
|
@@ -2418,22 +3057,70 @@ async function handleSlash(text) {
|
|
|
2418
3057
|
+ `${c.dim('enviou ')}${c.white(extra.fmtNumero(total.enviados))}${c.dim(' · recebeu ')}${c.white(extra.fmtNumero(total.recebidos))}`);
|
|
2419
3058
|
}
|
|
2420
3059
|
if (linhas.some((l) => !l.exato)) console.log(c.dim('\n Estimado = caracteres ÷ 4. Conta cada pedido inteiro, com a conversa que vai junto.'));
|
|
3060
|
+
console.log(''); hojeL.forEach((l) => console.log(c.white(' ' + l)));
|
|
2421
3061
|
break;
|
|
2422
3062
|
}
|
|
2423
3063
|
|
|
2424
|
-
|
|
3064
|
+
/* O que o agente deixou de pé com run_background (lib/fundo.js). */
|
|
3065
|
+
case 'tasks': {
|
|
3066
|
+
const fundo = require('../lib/fundo.js');
|
|
3067
|
+
const [sub, alvo] = rest.split(/\s+/).filter(Boolean);
|
|
3068
|
+
if (/^(rodar|run)$/i.test(sub || '')) {
|
|
3069
|
+
// A pessoa também deixa coisa de pé, sem pedir ao agente (como o /run, mas sem travar).
|
|
3070
|
+
const cmd = rest.replace(/^\S+\s*/, '');
|
|
3071
|
+
if (!cmd) { console.log(c.warn(' Qual comando? /tasks rodar npm run dev')); break; }
|
|
3072
|
+
const r = fundo.iniciar(cmd, { projectDir: projectDir(), env: tools.ambienteLimpo(process.env, tools.permitidasNoShell()) });
|
|
3073
|
+
console.log(r.ok ? c.ok(` ${r.id} rodando em segundo plano.`) + c.muted(' /tasks mostra a saída e o endereço.') : c.warn(` ${r.error}`));
|
|
3074
|
+
break;
|
|
3075
|
+
}
|
|
3076
|
+
if (/^(abrir|open)$/i.test(sub || '')) {
|
|
3077
|
+
// Sem id: a primeira que anunciou endereço — quase sempre é a única.
|
|
3078
|
+
const t = fundo.listar().find((x) => x.url && x.rodando && (!alvo || x.id === alvo));
|
|
3079
|
+
if (!t) { console.log(c.warn(alvo ? ` ${alvo} não anunciou endereço (ou já parou).` : ' Nada rodando com endereço pra abrir.')); break; }
|
|
3080
|
+
const r = await tools.openInBrowser(t.url);
|
|
3081
|
+
console.log(r && r.ok === false ? c.warn(` Não abriu: ${r.error}. Abra você: ${t.url}`) : c.ok(` Abri ${t.url}`));
|
|
3082
|
+
break;
|
|
3083
|
+
}
|
|
3084
|
+
if (/^(parar|stop|kill)$/i.test(sub || '')) {
|
|
3085
|
+
if (!alvo) { console.log(c.warn(' Qual? /tasks parar <id>')); break; }
|
|
3086
|
+
const r = fundo.parar(alvo);
|
|
3087
|
+
console.log(r.ok ? c.ok(` Parei ${alvo}.`) : c.warn(` ${r.error}`));
|
|
3088
|
+
break;
|
|
3089
|
+
}
|
|
3090
|
+
const lista = fundo.listar();
|
|
3091
|
+
if (!lista.length) { console.log(c.muted(' Nada rodando em segundo plano.')); break; }
|
|
3092
|
+
console.log('');
|
|
3093
|
+
for (const t of lista) {
|
|
3094
|
+
const estado = t.rodando ? c.ok('rodando') : c.muted(`terminou${t.codigo === null ? '' : ' (código ' + t.codigo + ')'}`);
|
|
3095
|
+
const tempo = t.segundos >= 60 ? `${Math.floor(t.segundos / 60)}min${String(t.segundos % 60).padStart(2, '0')}s` : `${t.segundos}s`;
|
|
3096
|
+
console.log(` ${c.white(ui.padRight(t.id, 12))}${ui.padRight(estado, 28)}${c.dim(ui.padRight(tempo, 9))}${ui.truncate(c.muted(t.comando), Math.max(20, (process.stdout.columns || 80) - 52))}`);
|
|
3097
|
+
if (t.url && t.rodando) console.log(` ${' '.repeat(12)}${c.brand(t.url)}`);
|
|
3098
|
+
}
|
|
3099
|
+
break;
|
|
3100
|
+
}
|
|
3101
|
+
|
|
3102
|
+
case 'videos': {
|
|
2425
3103
|
console.log(require('../lib/estudio/exportar.js').main(rest.split(/\s+/).filter(Boolean)).texto);
|
|
2426
3104
|
break;
|
|
2427
3105
|
}
|
|
2428
3106
|
|
|
2429
|
-
|
|
3107
|
+
/* /exportar: a conversa vira um .md local, com chave e senha escondidas (lib/exportar-conversa.js). */
|
|
3108
|
+
case 'export': {
|
|
3109
|
+
const conversa = state.history.filter((m) => m.role === 'user' || m.role === 'assistant');
|
|
3110
|
+
if (!conversa.length) { console.log(c.muted(' Ainda não tem conversa pra exportar: faça um pedido primeiro.')); break; }
|
|
3111
|
+
const arq = require('../lib/exportar-conversa.js').gravar(conversa, { projeto: path.basename(projectDir()) });
|
|
3112
|
+
console.log(c.ok(` Conversa salva (${conversa.length} mensagens): `) + shortPath(arq));
|
|
3113
|
+
console.log(c.muted(' Chave e senha saem trocadas por [chave escondida]. É um arquivo seu, sem link público.'));
|
|
3114
|
+
break;
|
|
3115
|
+
}
|
|
3116
|
+
case 'copy': {
|
|
2430
3117
|
const r = extra.copiar(state.lastResponse);
|
|
2431
3118
|
if (r.ok) console.log(c.ok(' Copiado.') + c.dim(` ${state.lastResponse.length} caracteres · é só colar`));
|
|
2432
3119
|
else console.log(c.muted(` Não copiei: ${r.error}.`));
|
|
2433
3120
|
break;
|
|
2434
3121
|
}
|
|
2435
3122
|
|
|
2436
|
-
case '
|
|
3123
|
+
case 'history': {
|
|
2437
3124
|
const achados = extra.buscarHistorico(cfg.HISTORY_FILE, rest, 20);
|
|
2438
3125
|
if (!achados.length) {
|
|
2439
3126
|
console.log(c.muted(rest ? ` Nada com "${rest}" nos seus pedidos.` : ' Nenhum pedido guardado ainda.'));
|
|
@@ -2447,41 +3134,16 @@ async function handleSlash(text) {
|
|
|
2447
3134
|
console.log(` ${c.dim(quando)} ${c.muted(ui.padRight(ui.truncate(e.project || e.mode || '', 14), 14))} `
|
|
2448
3135
|
+ ui.truncate(c.white(String(e.prompt).replace(/\s+/g, ' ')), largura));
|
|
2449
3136
|
}
|
|
2450
|
-
console.log(c.dim(`\n ${achados.length === 20 ? 'Os 20 mais recentes' : achados.length + ' pedido(s)'}${rest ? ` com "${rest}"` : ''} · /
|
|
3137
|
+
console.log(c.dim(`\n ${achados.length === 20 ? 'Os 20 mais recentes' : achados.length + ' pedido(s)'}${rest ? ` com "${rest}"` : ''} · /history <termo> filtra · /chats abre conversas`));
|
|
2451
3138
|
break;
|
|
2452
3139
|
}
|
|
2453
3140
|
|
|
2454
|
-
case '
|
|
3141
|
+
case 'keys': {
|
|
2455
3142
|
console.log('');
|
|
2456
3143
|
for (const [tecla, faz] of extra.ATALHOS) console.log(` ${c.brand(ui.padRight(tecla, 20))}${c.muted(faz)}`);
|
|
2457
3144
|
break;
|
|
2458
3145
|
}
|
|
2459
3146
|
|
|
2460
|
-
case 'status': {
|
|
2461
|
-
const sp = new Spinner('verificando').start();
|
|
2462
|
-
try {
|
|
2463
|
-
const h = await api.getHealth(state.config.server, state.config.token);
|
|
2464
|
-
sp.stop();
|
|
2465
|
-
console.log(c.ok(`Servidor: ${h.status || 'ok'}`));
|
|
2466
|
-
if (h.version) console.log(c.muted(` Versão: ${h.version}`));
|
|
2467
|
-
if (h.model) console.log(c.muted(` Modelo: ${h.model}`) + (h.gratis ? c.dim(' · grátis') : ''));
|
|
2468
|
-
// A corrente inteira: é o que garante que um modelo no limite não
|
|
2469
|
-
// vira erro na sua tela.
|
|
2470
|
-
if (h.correntes && h.correntes[state.config.model || 'main']) {
|
|
2471
|
-
const fila = h.correntes[state.config.model] || h.correntes.main;
|
|
2472
|
-
console.log(c.dim(` Reservas: ${fila.length - 1}`));
|
|
2473
|
-
}
|
|
2474
|
-
} catch (e) { sp.stop(); console.log(c.err(`Indisponível: ${e.message}`)); }
|
|
2475
|
-
// A memória da conversa: quanto ela está poupando por pedido.
|
|
2476
|
-
if (state.history.length) {
|
|
2477
|
-
const e = memoria.economia(state.memoria, state.history);
|
|
2478
|
-
console.log(c.muted(` Conversa: ${state.history.length} mensagens`)
|
|
2479
|
-
+ (state.memoria.resumo
|
|
2480
|
-
? c.dim(` · resumida, ${e.enxuto} tokens por pedido em vez de ${e.cheio}`)
|
|
2481
|
-
: c.dim(` · ${e.enxuto} tokens por pedido`)));
|
|
2482
|
-
}
|
|
2483
|
-
break;
|
|
2484
|
-
}
|
|
2485
3147
|
|
|
2486
3148
|
/* ── AS SKILLS ───────────────────────────────────────────────────
|
|
2487
3149
|
* `/skills` lista, `/install-skill` traz de um arquivo, e
|
|
@@ -2492,6 +3154,21 @@ async function handleSlash(text) {
|
|
|
2492
3154
|
* modelo — que o usuário vê acontecendo, ação por ação, na tela.
|
|
2493
3155
|
*/
|
|
2494
3156
|
case 'skills': {
|
|
3157
|
+
const sub = rest.match(/^(store|loja|add|instalar)\b\s*(.*)$/i);
|
|
3158
|
+
if (sub && /^(store|loja)$/i.test(sub[1])) { await abrirMarketplace(); break; }
|
|
3159
|
+
if (sub) {
|
|
3160
|
+
const alvo = sub[2].trim();
|
|
3161
|
+
if (!alvo) {
|
|
3162
|
+
console.log(c.muted(' Uso: ') + c.brand('/skills add <caminho do SKILL.md>'));
|
|
3163
|
+
console.log(c.dim(' Ou abra o ') + c.brand('/skills store') + c.dim(' e escolha "New Skill" para escrever uma.'));
|
|
3164
|
+
break;
|
|
3165
|
+
}
|
|
3166
|
+
const r = await instalarComPortao(alvo);
|
|
3167
|
+
if (!r.ok) { console.log(c.err(` ${r.error}`)); break; }
|
|
3168
|
+
console.log(c.ok(` Skill instalada: ${r.nome}`) + c.muted(` (${shortPath(r.caminho)})`));
|
|
3169
|
+
console.log(c.dim(' Já está ligada. /skills mostra todas.'));
|
|
3170
|
+
break;
|
|
3171
|
+
}
|
|
2495
3172
|
const lista = skills.listar();
|
|
2496
3173
|
if (!lista.length) { console.log(c.muted(' Nenhuma skill instalada.')); break; }
|
|
2497
3174
|
const ligadas = lista.filter((s) => s.ligada);
|
|
@@ -2504,29 +3181,17 @@ async function handleSlash(text) {
|
|
|
2504
3181
|
+ c.dim(ui.truncate(s.descricao, (process.stdout.columns || 80) - 36)));
|
|
2505
3182
|
}
|
|
2506
3183
|
console.log('');
|
|
2507
|
-
console.log(c.dim(' /
|
|
3184
|
+
console.log(c.dim(' /skills store liga e desliga · o corpo da skill só entra no pedido'));
|
|
2508
3185
|
console.log(c.dim(' quando o assunto bate, para não gastar o teto de tokens à toa.'));
|
|
2509
3186
|
break;
|
|
2510
3187
|
}
|
|
2511
3188
|
|
|
2512
|
-
case 'install-skill': case 'installskill': {
|
|
2513
|
-
if (!rest) {
|
|
2514
|
-
console.log(c.muted(' Uso: ') + c.brand('/install-skill <caminho do SKILL.md>'));
|
|
2515
|
-
console.log(c.dim(' Ou abra o ') + c.brand('/marketplace') + c.dim(' e escolha "New Skill" para escrever uma.'));
|
|
2516
|
-
break;
|
|
2517
|
-
}
|
|
2518
|
-
const r = await instalarComPortao(rest);
|
|
2519
|
-
if (!r.ok) { console.log(c.err(` ${r.error}`)); break; }
|
|
2520
|
-
console.log(c.ok(` Skill instalada: ${r.nome}`) + c.muted(` (${shortPath(r.caminho)})`));
|
|
2521
|
-
console.log(c.dim(' Já está ligada. /skills mostra todas.'));
|
|
2522
|
-
break;
|
|
2523
|
-
}
|
|
2524
3189
|
|
|
2525
3190
|
/* ── /voice ──────────────────────────────────────────────────────
|
|
2526
3191
|
* O ouvido e a boca são Python (voz/primo_voz); o cérebro é este
|
|
2527
3192
|
* terminal. Ver entradaDeVoz no main() e lib/voz.js.
|
|
2528
3193
|
*/
|
|
2529
|
-
case 'voice':
|
|
3194
|
+
case 'voice': {
|
|
2530
3195
|
/* ── O MODO VOZ É UMA FORMA DE DIGITAR ─────────────────────────
|
|
2531
3196
|
Você fala; o que foi dito entra aqui como se tivesse sido
|
|
2532
3197
|
digitado — a mesma fila, o mesmo recado no meio da tarefa, o
|
|
@@ -2601,10 +3266,6 @@ async function handleSlash(text) {
|
|
|
2601
3266
|
break;
|
|
2602
3267
|
}
|
|
2603
3268
|
|
|
2604
|
-
case 'marketplace': case 'market': {
|
|
2605
|
-
await abrirMarketplace();
|
|
2606
|
-
break;
|
|
2607
|
-
}
|
|
2608
3269
|
|
|
2609
3270
|
/* ── /connectors ─────────────────────────────────────────────────
|
|
2610
3271
|
* Só mostra. Não há o que configurar — os conectores vivem no
|
|
@@ -2617,7 +3278,7 @@ async function handleSlash(text) {
|
|
|
2617
3278
|
* dá para ver que o preferido está fora e outro assumiu — e essa é a
|
|
2618
3279
|
* primeira pergunta de todo suporte.
|
|
2619
3280
|
*/
|
|
2620
|
-
case 'connectors':
|
|
3281
|
+
case 'connectors': {
|
|
2621
3282
|
const sp = new Spinner('lendo os conectores').start();
|
|
2622
3283
|
let dados = null;
|
|
2623
3284
|
try {
|
|
@@ -2694,7 +3355,7 @@ async function handleSlash(text) {
|
|
|
2694
3355
|
}
|
|
2695
3356
|
if (!r.ok) { console.log(c.err(` ${r.error}`)); break; }
|
|
2696
3357
|
console.log(c.ok(' Conectado.')
|
|
2697
|
-
+ c.muted(r.pro ? ` Plano ${r.plano}.` : ' Sua conta ainda não tem plano: ') + (r.pro ? '' : c.brand('/
|
|
3358
|
+
+ c.muted(r.pro ? ` Plano ${r.plano}.` : ' Sua conta ainda não tem plano: ') + (r.pro ? '' : c.brand('/account plans')));
|
|
2698
3359
|
return r;
|
|
2699
3360
|
}
|
|
2700
3361
|
|
|
@@ -2746,6 +3407,7 @@ async function handleSlash(text) {
|
|
|
2746
3407
|
}
|
|
2747
3408
|
|
|
2748
3409
|
case 'account': {
|
|
3410
|
+
if (/^(plans?|planos?)$/i.test(rest)) { await mostrarPlanos(); break; }
|
|
2749
3411
|
const eu = conta.atual();
|
|
2750
3412
|
if (!eu) {
|
|
2751
3413
|
console.log(c.muted(' Não conectado. ') + c.brand('/login') + c.muted(' para entrar.'));
|
|
@@ -2758,7 +3420,7 @@ async function handleSlash(text) {
|
|
|
2758
3420
|
console.log(c.white(' Conta ') + c.muted(eu.email || eu.uid));
|
|
2759
3421
|
if (s.ok) {
|
|
2760
3422
|
const ate = s.planoAte ? c.dim(` até ${new Date(s.planoAte).toLocaleDateString('pt-BR')}`) : '';
|
|
2761
|
-
console.log(c.white(' Plano ') + (s.pro ? c.brand(s.plano) + ate : c.muted('sem plano ') + c.brand('/
|
|
3423
|
+
console.log(c.white(' Plano ') + (s.pro ? c.brand(s.plano) + ate : c.muted('sem plano ') + c.brand('/account plans')));
|
|
2762
3424
|
} else if (s.offline) {
|
|
2763
3425
|
console.log(c.white(' Plano ') + c.muted(eu.plano) + c.dim(' (sem rede — último conhecido)'));
|
|
2764
3426
|
} else {
|
|
@@ -2768,14 +3430,6 @@ async function handleSlash(text) {
|
|
|
2768
3430
|
break;
|
|
2769
3431
|
}
|
|
2770
3432
|
|
|
2771
|
-
case 'planos': {
|
|
2772
|
-
const sp = new Spinner('buscando os planos').start();
|
|
2773
|
-
const r = await planosTela.buscarPlanos(state.config.server);
|
|
2774
|
-
sp.stop();
|
|
2775
|
-
const eu = conta.atual();
|
|
2776
|
-
for (const l of planosTela.desenhar(r, { cores: c, atual: eu && eu.pro ? eu.plano : null, site: conta.SITE })) console.log(l);
|
|
2777
|
-
break;
|
|
2778
|
-
}
|
|
2779
3433
|
|
|
2780
3434
|
case 'uninstall': {
|
|
2781
3435
|
if (await confirm('Remover o PrimoCode? Seus projetos em ~/primocode NÃO serão apagados.')) {
|
|
@@ -2787,7 +3441,7 @@ async function handleSlash(text) {
|
|
|
2787
3441
|
case 'version': console.log(c.brand(`PrimoCode v${VERSION}`)); break;
|
|
2788
3442
|
// rl.close() em vez de process.exit(): sair na marra descarta o que
|
|
2789
3443
|
// ainda estava no buffer de saída.
|
|
2790
|
-
case 'exit':
|
|
3444
|
+
case 'exit': if (rl) rl.close(); break;
|
|
2791
3445
|
/* ── OS COMANDOS APOSENTADOS ──────────────────────────────────────
|
|
2792
3446
|
* `/claude`, `/gpt`, `/codex` e `/key` existiam quando o PrimoCode
|
|
2793
3447
|
* rodava em cima da assinatura da própria pessoa: ela instalava o
|
|
@@ -2808,7 +3462,7 @@ async function handleSlash(text) {
|
|
|
2808
3462
|
/* O servidor aqui, no computador da pessoa, até a sessão acabar
|
|
2809
3463
|
(lib/offline.js). "Enquanto não tenho acesso ao Railway, eu testo
|
|
2810
3464
|
com o projeto rodando localmente." (24/09/2026) */
|
|
2811
|
-
case 'offline':
|
|
3465
|
+
case 'offline': {
|
|
2812
3466
|
if (/^(off|sair|desligar|parar)$/i.test(rest)) {
|
|
2813
3467
|
if (!state.servidorAntes) { console.log(c.muted(' O /offline não está ligado.')); break; }
|
|
2814
3468
|
offline.desligar();
|
|
@@ -2845,7 +3499,60 @@ async function handleSlash(text) {
|
|
|
2845
3499
|
}
|
|
2846
3500
|
|
|
2847
3501
|
/* Os comandos da pessoa: lista, e explica como fazer o dela. */
|
|
2848
|
-
case '
|
|
3502
|
+
case 'styles': {
|
|
3503
|
+
// Os kits de estilo de motion (lib/kits.js): a lista no terminal e a galeria (capa + preview + nome).
|
|
3504
|
+
const K = require('../lib/kits.js');
|
|
3505
|
+
const a = String(rest || '').trim();
|
|
3506
|
+
if (a && !/^(galeria|abrir|lista)$/i.test(a)) {
|
|
3507
|
+
const k = K.achar(a);
|
|
3508
|
+
if (!k) { console.log(c.warn(` Não achei o estilo "${a}". /styles mostra todos.`)); break; }
|
|
3509
|
+
console.log(` ${c.brand(k.nome)} ${c.muted(`(${k.slug} · ${k.familia})`)}`);
|
|
3510
|
+
console.log(` ${k.descricao}`);
|
|
3511
|
+
if (k.quando.length) console.log(c.muted(` Serve pra: ${k.quando.slice(0, 3).join('; ')}`));
|
|
3512
|
+
if (!K.previewPronto(k)) console.log(c.muted(' Renderizando o preview aqui (uma vez só)…'));
|
|
3513
|
+
const r = await K.main(['preview', k.slug], { aoFalar: (t) => process.stdout.write(c.muted(`\r ⎿ ${t}`.padEnd(60))) });
|
|
3514
|
+
process.stdout.write('\n');
|
|
3515
|
+
if (r.ok && r.video) { if (process.env.PRIMOCODE_APP !== '1') tools.openInBrowser(r.video); console.log(c.ok(` ${r.texto}`)); }
|
|
3516
|
+
else console.log(c.warn(` ${r.texto}`));
|
|
3517
|
+
console.log(c.muted(` Pra usar: peça o vídeo dizendo "estilo ${k.nome.split(' · ')[0].toLowerCase()}".`));
|
|
3518
|
+
break;
|
|
3519
|
+
}
|
|
3520
|
+
for (const l of K.listaParaPessoa()) console.log(/^\s/.test(l) ? c.muted(l) : ` ${c.brand(l)}`);
|
|
3521
|
+
if (a.toLowerCase() === 'lista') break;
|
|
3522
|
+
// a tela de estilos (os kits no carrossel da tela de gosto): no terminal abre no navegador, no app numa janela
|
|
3523
|
+
console.log(c.muted(` Abri a tela de estilos${process.env.PRIMOCODE_APP === '1' ? '' : ' no navegador'} (até 10 min). Escolha um estilo ou feche pra voltar.`));
|
|
3524
|
+
const r = await K.main(['galeria']);
|
|
3525
|
+
console.log((r.ok ? c.ok : c.muted)(` ${r.texto} · /styles <estilo> mostra o preview no terminal`));
|
|
3526
|
+
break;
|
|
3527
|
+
}
|
|
3528
|
+
case 'team': {
|
|
3529
|
+
const team = require('../lib/team.js');
|
|
3530
|
+
const achados = team.instalados();
|
|
3531
|
+
const o = team.entender(rest, achados);
|
|
3532
|
+
if (o.erro) { console.log(c.warn(` ${o.erro}`)); break; }
|
|
3533
|
+
if (o.acao === 'status') {
|
|
3534
|
+
const ligado = achados.some((x) => x.nome === state.config.team) ? state.config.team : null;
|
|
3535
|
+
team.status(achados, ligado).forEach((l, i) => console.log(i === 0 ? c.white(` ${l}`) : c.muted(` ${l}`)));
|
|
3536
|
+
break;
|
|
3537
|
+
}
|
|
3538
|
+
if (o.acao === 'desligar') {
|
|
3539
|
+
state.config.team = null;
|
|
3540
|
+
cfg.saveConfig({ team: null });
|
|
3541
|
+
console.log(c.ok(' O PrimoCode volta a trabalhar sozinho.'));
|
|
3542
|
+
break;
|
|
3543
|
+
}
|
|
3544
|
+
if (o.acao === 'ligar') {
|
|
3545
|
+
state.config.team = o.nome;
|
|
3546
|
+
cfg.saveConfig({ team: o.nome });
|
|
3547
|
+
console.log(c.ok(` ${team.PARCEIROS[o.nome].titulo} ligado: o PrimoCode faz e ele revisa, só lendo.`));
|
|
3548
|
+
console.log(c.dim(` /team ${o.nome} faz <pedido> deixa ele fazer · /team off desliga`));
|
|
3549
|
+
break;
|
|
3550
|
+
}
|
|
3551
|
+
await parceiroFaz(o.nome, o.pedido);
|
|
3552
|
+
break;
|
|
3553
|
+
}
|
|
3554
|
+
|
|
3555
|
+
case 'commands': {
|
|
2849
3556
|
const novo = rest.match(/^(novo|new|criar)\s+(\S+)$/i);
|
|
2850
3557
|
if (novo) {
|
|
2851
3558
|
const r = comandosLib.criar(novo[2]);
|
|
@@ -2860,14 +3567,14 @@ async function handleSlash(text) {
|
|
|
2860
3567
|
for (const x of lista) {
|
|
2861
3568
|
console.log(` ${c.brand(ui.padRight('/' + x.nome, 14))}${c.dim(ui.padRight(x.origem, 11))}${c.muted(x.descricao)}`);
|
|
2862
3569
|
}
|
|
2863
|
-
console.log(c.dim('\n Um arquivo .md vira um comando:
|
|
3570
|
+
console.log(c.dim('\n Um arquivo .md vira um comando: review.md é /review.'));
|
|
2864
3571
|
console.log(c.dim(' ~/.primocode/comandos/ vale em todo projeto · <projeto>/.primocode/comandos/ só naquele.'));
|
|
2865
|
-
console.log(c.dim(' $ARGUMENTOS no texto recebe o que você digitar depois: /
|
|
2866
|
-
console.log(c.dim(' /
|
|
3572
|
+
console.log(c.dim(' $ARGUMENTOS no texto recebe o que você digitar depois: /review o login.'));
|
|
3573
|
+
console.log(c.dim(' /commands novo <nome> cria um para você editar.'));
|
|
2867
3574
|
break;
|
|
2868
3575
|
}
|
|
2869
3576
|
|
|
2870
|
-
case 'claude': case 'gpt': case 'codex': case 'key':
|
|
3577
|
+
case 'claude': case 'gpt': case 'codex': case 'key': {
|
|
2871
3578
|
console.log(c.muted(' Não existe mais provedor para configurar.'));
|
|
2872
3579
|
console.log(c.muted(' A API já vem com o PrimoCode: entrou na conta, pode usar.'));
|
|
2873
3580
|
console.log(c.dim(' /effort escolhe o esforço · /account mostra o seu plano'));
|
|
@@ -2889,7 +3596,9 @@ async function handleSlash(text) {
|
|
|
2889
3596
|
await sendPrompt(comandosLib.expandir(proprio, rest));
|
|
2890
3597
|
break;
|
|
2891
3598
|
}
|
|
2892
|
-
|
|
3599
|
+
let casam = comandosDoMenu().map(([nome]) => nome.slice(1)).filter((n) => n.startsWith(cmd.toLowerCase()));
|
|
3600
|
+
// Meio apelido antigo também serve: "/desf" chega no /undo.
|
|
3601
|
+
if (!casam.length) casam = nomes.porPrefixo(cmd).filter((n) => comandosDoMenu().some(([m]) => m === '/' + n));
|
|
2893
3602
|
if (casam.length === 1) {
|
|
2894
3603
|
console.log(c.dim(` → /${casam[0]}`));
|
|
2895
3604
|
await handleSlash('/' + casam[0] + (rest ? ' ' + rest : ''));
|
|
@@ -2962,6 +3671,52 @@ async function main() {
|
|
|
2962
3671
|
if (process.argv[2] === 'editor') {
|
|
2963
3672
|
process.exit(await require('../lib/editor-pro.js').main(process.argv.slice(3)));
|
|
2964
3673
|
}
|
|
3674
|
+
/* `primocode gosto medir <video> [mais videos] [--salvar]`: os números do vídeo que a pessoa curtiu (lib/estudio/gosto-medir.js).
|
|
3675
|
+
Com --salvar, cada um entra no gosto como referência. (O /taste de dentro da sessão é outra entrada.) */
|
|
3676
|
+
// `primocode gosto` fora da sessão: o mesmo que o /gosto mostra (o que você escolheu, as referências, pra onde inclina)
|
|
3677
|
+
// `primocode porta`: o /porta fora da sessão, na pasta atual — é o que o agente roda pelo run_shell (lib/porta.js)
|
|
3678
|
+
if (process.argv[2] === 'porta') {
|
|
3679
|
+
const r = await require('../lib/porta.js').diagnostico(path.resolve(process.argv[3] || process.cwd()));
|
|
3680
|
+
for (const l of r.linhas) console.log(' ' + l);
|
|
3681
|
+
process.exit(0);
|
|
3682
|
+
}
|
|
3683
|
+
if (process.argv[2] === 'gosto' && process.argv[3] === 'provar') {
|
|
3684
|
+
const G = require('../lib/estudio/gosto.js'), P = require('../lib/estudio/gosto-prova.js');
|
|
3685
|
+
const assunto = process.argv.slice(4).join(' ').trim() || 'um vídeo de apresentação';
|
|
3686
|
+
for (const l of P.texto(P.provar(G.pesos(G.ler()), { assunto }), assunto)) console.log(' ' + l);
|
|
3687
|
+
process.exit(0);
|
|
3688
|
+
}
|
|
3689
|
+
if (process.argv[2] === 'gosto' && (!process.argv[3] || process.argv[3] === 'ver')) {
|
|
3690
|
+
const G = require('../lib/estudio/gosto.js');
|
|
3691
|
+
const linhas = G.listar(G.ler());
|
|
3692
|
+
if (!linhas.length) console.log(' Ainda não tem gosto salvo. Dentro do PrimoCode: /taste referencias recebe os vídeos que você curtiu.\n Daqui: primocode gosto medir <vídeo ou pasta> --salvar');
|
|
3693
|
+
else for (const l of linhas) console.log(' ' + l);
|
|
3694
|
+
process.exit(0);
|
|
3695
|
+
}
|
|
3696
|
+
if (process.argv[2] === 'gosto' && process.argv[3] === 'medir') {
|
|
3697
|
+
const salvar = process.argv.includes('--salvar'), json = process.argv.includes('--json');
|
|
3698
|
+
const { medir, explicar, videosDe } = require('../lib/estudio/gosto-medir.js');
|
|
3699
|
+
const pedidos = process.argv.slice(4).filter((x) => x !== '--salvar' && x !== '--json');
|
|
3700
|
+
const arquivos = videosDe(pedidos.map((x) => path.resolve(x)));
|
|
3701
|
+
if (!pedidos.length) { console.error('Uso: primocode gosto medir <vídeo ou pasta> [mais] [--salvar] [--json]'); process.exit(1); }
|
|
3702
|
+
if (!arquivos.length) { console.error('Não achei vídeo (mp4, mov, m4v ou webm) nessa pasta.'); process.exit(1); }
|
|
3703
|
+
if (salvar && arquivos.length > 5) console.log(' O gosto guarda até 5 vídeos: ficam os 5 últimos desta lista.\n');
|
|
3704
|
+
const G = require('../lib/estudio/gosto.js');
|
|
3705
|
+
let falhou = false;
|
|
3706
|
+
for (const f of arquivos) {
|
|
3707
|
+
const m = await medir(f);
|
|
3708
|
+
if (m.ok && salvar) G.adicionarReferencia(m, { nome: path.basename(f) });
|
|
3709
|
+
if (!m.ok) falhou = true;
|
|
3710
|
+
if (json) console.log(JSON.stringify(m, null, 2));
|
|
3711
|
+
else console.log(explicar(m, { cor: !!process.stdout.isTTY }).join('\n') + '\n');
|
|
3712
|
+
}
|
|
3713
|
+
if (!json) console.log(salvar ? ' Guardado no seu gosto. O próximo motion leva isso em conta (/taste mostra).' : ' Pra guardar como referência do seu gosto: --salvar');
|
|
3714
|
+
process.exit(falhou ? 1 : 0);
|
|
3715
|
+
}
|
|
3716
|
+
// `primocode motioncraft …`: o motion com o MotionCraft + a voz do PrimoCode.
|
|
3717
|
+
if (process.argv[2] === 'motioncraft') {
|
|
3718
|
+
process.exit(require('../lib/motioncraft.js').main(process.argv.slice(3)));
|
|
3719
|
+
}
|
|
2965
3720
|
// `primocode mcp …`: os servidores MCP pelo run_shell (lib/mcp.js).
|
|
2966
3721
|
if (process.argv[2] === 'videos') {
|
|
2967
3722
|
const r = require('../lib/estudio/exportar.js').main(process.argv.slice(3));
|
|
@@ -2975,6 +3730,12 @@ async function main() {
|
|
|
2975
3730
|
console.log(JSON.stringify({ ok: true, comandos: comandosDoMenu().map(([nome, descricao]) => ({ nome, descricao: ui.stripAnsi ? ui.stripAnsi(String(descricao)) : String(descricao), embutido: embutidos.has(nome) })) }));
|
|
2976
3731
|
process.exit(0);
|
|
2977
3732
|
}
|
|
3733
|
+
// `primocode kit …`: os kits de estilo de motion (lib/kits.js). Pelo run_shell do agente ele roda dentro do processo (lib/tools.js).
|
|
3734
|
+
if (process.argv[2] === 'kit' || process.argv[2] === 'kits') {
|
|
3735
|
+
const r = await require('../lib/kits.js').main(process.argv.slice(3), { projectDir: process.cwd(), aoFalar: (t) => process.stderr.write(` ⎿ ${t}\n`) });
|
|
3736
|
+
console.log(r.texto);
|
|
3737
|
+
process.exit(r.ok ? 0 : 1);
|
|
3738
|
+
}
|
|
2978
3739
|
if (process.argv[2] === 'skill' || process.argv[2] === 'skills') {
|
|
2979
3740
|
process.exit(require('../lib/skills.js').main(process.argv.slice(3)));
|
|
2980
3741
|
}
|
|
@@ -3070,7 +3831,7 @@ async function main() {
|
|
|
3070
3831
|
}
|
|
3071
3832
|
if (args[0] === '--help' || args[0] === '-h') {
|
|
3072
3833
|
console.log(welcomeBox(VERSION, null, { mascot: state.config.mascot, userName: state.config.userName, modo: state.mode }));
|
|
3073
|
-
console.log(
|
|
3834
|
+
console.log(montarHelp());
|
|
3074
3835
|
process.exit(0);
|
|
3075
3836
|
}
|
|
3076
3837
|
|
|
@@ -3090,6 +3851,9 @@ async function main() {
|
|
|
3090
3851
|
if (!pedido) { console.error('Uso: primocode -p "pedido" [--output-format json] [--permission-mode plan]'); process.exit(1); }
|
|
3091
3852
|
if (typeof fl.resume === 'string') await retomarConversa(fl.resume);
|
|
3092
3853
|
else if (continuar) await continuarUltima();
|
|
3854
|
+
// O script trabalha na pasta de onde rodou, não no último projeto (sem lembrar: é só nesta execução).
|
|
3855
|
+
const aqui = H.pastaDoScript({ cwd: process.cwd(), casa: os.homedir(), raiz: cfg.ROOT_DIR, app: process.env.PRIMOCODE_APP === '1' });
|
|
3856
|
+
if (aqui) { state.workDir = aqui; state.currentProject = path.basename(aqui); state.workDirOrigem = 'terminal'; }
|
|
3093
3857
|
state.semTerminal = true;
|
|
3094
3858
|
process.env.PRIMOCODE_SEM_TELA = '1'; // modo script: nenhuma tela de gosto abre no navegador (com PRIMOCODE_APP=1 o app abre pela linha `primocode:abrir-gosto`)
|
|
3095
3859
|
if (process.env.PRIMOCODE_LOG_FERRAMENTAS === '1') { // o app do Primo registra cada ferramenta no log dele
|
|
@@ -3097,7 +3861,7 @@ async function main() {
|
|
|
3097
3861
|
}
|
|
3098
3862
|
let erro = null;
|
|
3099
3863
|
const antes = state.history.length;
|
|
3100
|
-
const comando = isSlash(pedido); // `-p "/tree"`: o comando roda como no terminal (o app usa isso)
|
|
3864
|
+
const comando = isSlash(pedido); // `-p "/map tree"`: o comando roda como no terminal (o app usa isso)
|
|
3101
3865
|
const texto = await H.capturar(async () => {
|
|
3102
3866
|
try { if (comando) await handleSlash(pedido); else await sendPrompt(pedido); } catch (e) { erro = e.message || String(e); }
|
|
3103
3867
|
}, { calar: h.formato === 'json' });
|
|
@@ -3170,6 +3934,15 @@ async function main() {
|
|
|
3170
3934
|
if (telaCheia && state.workDirOrigem === 'padrao') {
|
|
3171
3935
|
console.log(c.warn(` pasta padrão: ${shortPath(state.workDir)}`) + c.dim(' · /dir <pasta> para trabalhar numa sua'));
|
|
3172
3936
|
}
|
|
3937
|
+
/* A última conversa desta pasta, em uma linha (lib/passagem.js). Uma vez por abertura, só aqui (o -p já saiu
|
|
3938
|
+
antes) e só se a pessoa não abriu já retomando (-c / --resume). */
|
|
3939
|
+
if (!state.dicaRetomarMostrada && !continuar && !fl.resume && state.workDirOrigem !== 'padrao') {
|
|
3940
|
+
state.dicaRetomarMostrada = true;
|
|
3941
|
+
try {
|
|
3942
|
+
const linha = require('../lib/passagem.js').linhaDeAbertura(fs.readFileSync(path.join(state.workDir || process.cwd(), 'memory.md'), 'utf8').slice(-20000));
|
|
3943
|
+
if (linha) console.log(c.muted(' ' + linha));
|
|
3944
|
+
} catch { /* a dica nunca derruba a abertura */ }
|
|
3945
|
+
}
|
|
3173
3946
|
// O spinner desenha dentro da caixa (lib/entrada.js mostrarSpinner).
|
|
3174
3947
|
if (rl.tty) Spinner.caixa = rl;
|
|
3175
3948
|
ui.titulo('PrimoCode');
|
|
@@ -3229,6 +4002,9 @@ async function main() {
|
|
|
3229
4002
|
// solto, para não segurar o prompt. Fechar o terminal em cima dele
|
|
3230
4003
|
// perderia justamente a resposta que a pessoa acabou de ler, e ela
|
|
3231
4004
|
// não veria falta nenhuma até procurar no celular.
|
|
4005
|
+
// O que ficou de pé em segundo plano morre junto: o filho com a saída
|
|
4006
|
+
// ligada ao PrimoCode seguraria o processo vivo depois do "Até logo!".
|
|
4007
|
+
require('../lib/fundo.js').pararTodas();
|
|
3232
4008
|
const fim = () => console.log(c.muted('\nAté logo!'));
|
|
3233
4009
|
Promise.race([
|
|
3234
4010
|
state.gravador.esperar(),
|
|
@@ -3258,7 +4034,7 @@ async function main() {
|
|
|
3258
4034
|
if (ehBash(text)) await rodarBash(text);
|
|
3259
4035
|
else if (isSlash(text)) await handleSlash(text);
|
|
3260
4036
|
else {
|
|
3261
|
-
await sendPrompt(text);
|
|
4037
|
+
await sendPrompt(text, { digitado: true });
|
|
3262
4038
|
}
|
|
3263
4039
|
} catch (e) {
|
|
3264
4040
|
fala.problema(e);
|
|
@@ -3357,7 +4133,11 @@ async function main() {
|
|
|
3357
4133
|
// o primocode-server, que tem a chave do provedor.
|
|
3358
4134
|
state.liberado = !r || r.liberado !== false;
|
|
3359
4135
|
state.motivoBloqueio = r && r.motivo;
|
|
3360
|
-
}).catch(() => {
|
|
4136
|
+
}).catch((e) => {
|
|
4137
|
+
// A abertura quebrou (rede, arquivo da conta). Não prende a pessoa, mas diz o que foi.
|
|
4138
|
+
state.liberado = true;
|
|
4139
|
+
console.log(c.muted(` (a abertura falhou: ${e && e.message ? e.message : e}. Se algo estranhar, rode /doctor)`));
|
|
4140
|
+
})
|
|
3361
4141
|
// Depois da abertura, porque é nela que a pessoa entra na conta — e
|
|
3362
4142
|
// sem conta não há conversa para achar.
|
|
3363
4143
|
.then(() => (fl.resume === true ? escolherNaAbertura().catch(() => false)
|