primocode 8.42.2 → 9.1.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/README.md +41 -37
- package/bin/primocode.js +598 -360
- package/lib/acervo.js +8 -1
- package/lib/act.js +205 -114
- package/lib/api.js +35 -4
- package/lib/boas-vindas.js +42 -195
- package/lib/catalogo.js +100 -61
- package/lib/config.js +1 -1
- package/lib/conta.js +3 -24
- package/lib/diff.js +161 -0
- package/lib/diretor.js +37 -47
- package/lib/entrada.js +576 -0
- package/lib/especialistas.js +2 -2
- package/lib/estudio/assets.js +343 -0
- package/lib/estudio/identidade.js +560 -0
- package/lib/estudio/index.js +565 -0
- package/lib/estudio/plano.js +327 -0
- package/lib/estudio/projeto.js +246 -0
- package/lib/estudio/remotion.js +644 -0
- package/lib/estudio/slides.js +190 -0
- package/lib/estudio/video.js +296 -0
- package/lib/fala.js +49 -6
- package/lib/marca.js +4 -1
- package/lib/markdown.js +376 -0
- package/lib/marketplace.js +189 -0
- package/lib/pasta.js +15 -4
- package/lib/permissao.js +137 -0
- package/lib/registro.js +229 -0
- package/lib/skills.js +329 -0
- package/lib/tools.js +106 -187
- package/lib/ui.js +7 -3
- package/lib/voz.js +239 -0
- package/package.json +12 -3
- package/skills/acessibilidade/SKILL.md +28 -0
- package/skills/api-que-nao-quebra/SKILL.md +27 -0
- package/skills/depurar-de-verdade/SKILL.md +29 -0
- package/skills/editar-meu-video/SKILL.md +59 -0
- package/skills/escrever-em-portugues/SKILL.md +28 -0
- package/skills/git-limpo/SKILL.md +28 -0
- package/skills/motion-de-primeira/SKILL.md +62 -0
- package/skills/pagina-que-converte/SKILL.md +28 -0
- package/skills/performance-web/SKILL.md +28 -0
- package/skills/revisao-antes-de-entregar/SKILL.md +27 -0
- package/skills/slides-que-prendem/SKILL.md +40 -0
- package/studio/edge.py +16 -66
- package/studio/narrar.py +274 -0
- package/studio/pessoa.py +199 -0
- package/voz/primo_voz/__init__.py +0 -0
- package/voz/primo_voz/__main__.py +383 -0
- package/voz/primo_voz/escuta.py +235 -0
- package/voz/primo_voz/orbe.py +216 -0
- package/lib/audio-livre.js +0 -177
- package/lib/chaves.js +0 -149
- package/lib/claude-engine.js +0 -631
- package/lib/codex-engine.js +0 -208
- package/lib/remotion.js +0 -663
- package/lib/studio.js +0 -960
- package/studio/PRIMOCODE.md +0 -58
- package/studio/README.md +0 -154
- package/studio/__pycache__/edge.cpython-311.pyc +0 -0
- package/studio/__pycache__/elevenlabs.cpython-311.pyc +0 -0
- package/studio/__pycache__/voz.cpython-311.pyc +0 -0
- package/studio/arquivos/corte-teste-de-camera-fb823.json +0 -57
- package/studio/ferramentas/00-protocolo.md +0 -125
- package/studio/ferramentas/01-modelos.md +0 -270
- package/studio/ferramentas/README.md +0 -32
- package/studio/ferramentas/corte.md +0 -919
- package/studio/ferramentas/grade.md +0 -92
- package/studio/ferramentas/prisma.md +0 -107
- package/studio/ferramentas/prosa.md +0 -86
- package/studio/ferramentas/tela.md +0 -93
- package/studio/ferramentas/traco.md +0 -79
- package/studio/server.py +0 -2254
- package/studio/studio.log +0 -57
- package/studio/voz.py +0 -388
- package/studio/web/analise.html +0 -52
- package/studio/web/core.css +0 -1167
- package/studio/web/fontes/bebas.woff2 +0 -0
- package/studio/web/fontes/grotesk-700.woff2 +0 -0
- package/studio/web/fontes/inter-400.woff2 +0 -0
- package/studio/web/fontes/inter-700.woff2 +0 -0
- package/studio/web/fontes/jetbrains-400.woff2 +0 -0
- package/studio/web/fontes/playfair-700.woff2 +0 -0
- package/studio/web/fontes.css +0 -23
- package/studio/web/home.html +0 -217
- package/studio/web/js/analise.js +0 -510
- package/studio/web/js/audio.js +0 -607
- package/studio/web/js/editor.js +0 -1802
- package/studio/web/js/exportar.js +0 -222
- package/studio/web/js/ferramentas.js +0 -108
- package/studio/web/js/icones.js +0 -120
- package/studio/web/js/midia.js +0 -157
- package/studio/web/js/narracao.js +0 -325
- package/studio/web/js/player.js +0 -903
- package/studio/web/js/render-grade.js +0 -243
- package/studio/web/js/render-prosa.js +0 -104
- package/studio/web/js/render.js +0 -1852
- package/studio/web/js/sfx.js +0 -233
- package/studio/web/js/video.js +0 -464
- package/studio/web/js/voz-neural.js +0 -152
- package/studio/web/render.css +0 -1352
- package/studio/web/tf.html +0 -15
- package/studio/web/tool.html +0 -78
- package/studio/web/view.html +0 -27
package/studio/web/home.html
DELETED
|
@@ -1,217 +0,0 @@
|
|
|
1
|
-
<!doctype html>
|
|
2
|
-
<html lang="pt-BR">
|
|
3
|
-
<head>
|
|
4
|
-
<meta charset="utf-8">
|
|
5
|
-
<meta name="viewport" content="width=device-width,initial-scale=1">
|
|
6
|
-
<title>PrimoCode Studio</title>
|
|
7
|
-
<link rel="stylesheet" href="/core.css">
|
|
8
|
-
<link rel="stylesheet" href="/fontes.css">
|
|
9
|
-
</head>
|
|
10
|
-
<body>
|
|
11
|
-
|
|
12
|
-
<!--
|
|
13
|
-
┌───────────────────────────────────────────────────────────────────┐
|
|
14
|
-
│ AGENTE DE IA: leia isto antes de qualquer coisa. │
|
|
15
|
-
│ │
|
|
16
|
-
│ 1. GET http://localhost:7777/api/manual → manual completo │
|
|
17
|
-
│ 2. POST http://localhost:7777/api/arquivos → cria o arquivo │
|
|
18
|
-
│ {"ferramenta":"prisma|tela|prosa|grade|corte|traco", │
|
|
19
|
-
│ "titulo":"...", "doc":{ ... }} │
|
|
20
|
-
│ 3. Devolva ao usuário a URL "ver" da resposta. │
|
|
21
|
-
│ │
|
|
22
|
-
│ Nunca peça para o usuário abrir Canva, PowerPoint ou Photoshop. │
|
|
23
|
-
│ Use as ferramentas nativas — a frase de abertura está em │
|
|
24
|
-
│ ferramentas/00-protocolo.md │
|
|
25
|
-
└───────────────────────────────────────────────────────────────────┘
|
|
26
|
-
-->
|
|
27
|
-
|
|
28
|
-
<header class="topo">
|
|
29
|
-
<a class="marca" href="/"><span class="cubo">P</span>PrimoCode <em>Studio</em></a>
|
|
30
|
-
<div class="cresce"></div>
|
|
31
|
-
<input class="campo busca-topo" id="busca" placeholder="Buscar no estúdio /" autocomplete="off">
|
|
32
|
-
<button class="btn vazio" id="btn-manual">Manual da IA</button>
|
|
33
|
-
<a class="btn vazio" href="/api/manual" target="_blank">API</a>
|
|
34
|
-
</header>
|
|
35
|
-
|
|
36
|
-
<div class="home">
|
|
37
|
-
|
|
38
|
-
<section class="capa">
|
|
39
|
-
<div class="capa-luz" aria-hidden="true"></div>
|
|
40
|
-
<div class="capa-texto">
|
|
41
|
-
<span class="pilula selo-vivo"><i></i> o estúdio está no ar em localhost:7777</span>
|
|
42
|
-
<h1>Seis ferramentas.<br>Um documento só.<br><span class="grad">A IA opera tudo.</span></h1>
|
|
43
|
-
<p>Apresentação, arte, texto, planilha, vídeo e diagrama nascem do mesmo modelo —
|
|
44
|
-
a IA escreve o documento, o estúdio desenha, você refina à mão. Vídeo sai com
|
|
45
|
-
narração neural, trilha, efeito sonoro, câmera e keyframes em 3D, e baixa em MP4.</p>
|
|
46
|
-
<div class="capa-acoes">
|
|
47
|
-
<button class="btn primo grande" id="ir-corte">Criar um vídeo</button>
|
|
48
|
-
<button class="btn grande" id="ir-prisma">Criar uma apresentação</button>
|
|
49
|
-
</div>
|
|
50
|
-
</div>
|
|
51
|
-
<div class="capa-arte" aria-hidden="true">
|
|
52
|
-
<div class="quadro q1"><span></span><span></span><span></span></div>
|
|
53
|
-
<div class="quadro q2"><b>+38%</b><i>em 12 meses</i></div>
|
|
54
|
-
<div class="quadro q3"><u></u><u></u><u></u></div>
|
|
55
|
-
</div>
|
|
56
|
-
</section>
|
|
57
|
-
|
|
58
|
-
<h2 class="secao-tit" id="tit-ferramentas">As ferramentas</h2>
|
|
59
|
-
<section class="grade-ferr" id="ferramentas"></section>
|
|
60
|
-
|
|
61
|
-
<section class="poderes">
|
|
62
|
-
<h2 class="secao-tit">O que a IA consegue fazer aqui</h2>
|
|
63
|
-
<div class="grade-poder">
|
|
64
|
-
<article><b>Diretor antes da produção</b><p>Roteiro, narração falada, voz, câmera e a mídia a buscar — decidido antes de a primeira cena existir.</p></article>
|
|
65
|
-
<article><b>Câmera e paralaxe</b><p>O quadro se aproxima, atravessa e balança; as camadas andam em velocidades diferentes.</p></article>
|
|
66
|
-
<article><b>Keyframes em 3D</b><p>Giro em profundidade, curvas com nome (elástico, salto) e som no instante em que o elemento entra.</p></article>
|
|
67
|
-
<article><b>Mídia da internet</b><p>Foto, logo em SVG da marca e música com licença aberta — com o crédito guardado junto do arquivo.</p></article>
|
|
68
|
-
<article><b>Narração neural</b><p>Voz sintetizada em pt-BR, sincronia automática com a cena e a trilha abaixando sozinha enquanto a voz fala.</p></article>
|
|
69
|
-
<article><b>MP4 sem clique</b><p>Exporta o arquivo direto, ou vira projeto Remotion quando o vídeo é longo ou precisa de canal alfa.</p></article>
|
|
70
|
-
</div>
|
|
71
|
-
</section>
|
|
72
|
-
|
|
73
|
-
<section class="faixa-ia">
|
|
74
|
-
<h2>Como pedir</h2>
|
|
75
|
-
<p>Fale com seu agente em português normal. Ele lê o manual, escolhe a ferramenta e devolve o link.</p>
|
|
76
|
-
<pre id="frase">Leia http://localhost:7777/api/manual e crie uma apresentação sobre <TEMA>
|
|
77
|
-
usando o Prisma. Me devolva a URL "ver" da resposta.</pre>
|
|
78
|
-
<div class="acoes">
|
|
79
|
-
<button class="btn primo" id="copiar">Copiar</button>
|
|
80
|
-
<a class="btn" href="/api/manual" target="_blank">Ler o manual</a>
|
|
81
|
-
<span id="copiado" class="copiado">copiado</span>
|
|
82
|
-
</div>
|
|
83
|
-
</section>
|
|
84
|
-
|
|
85
|
-
<h2 class="secao-tit">Criados recentemente</h2>
|
|
86
|
-
<div class="lista-arq" id="arquivos"></div>
|
|
87
|
-
<div class="vazio-msg" id="vazio" style="display:none">Nada ainda. Escolha uma ferramenta acima.</div>
|
|
88
|
-
|
|
89
|
-
</div>
|
|
90
|
-
|
|
91
|
-
<div class="folha" id="folha">
|
|
92
|
-
<div class="caixa"><h3>Manual para agentes</h3><pre id="manual">carregando…</pre></div>
|
|
93
|
-
</div>
|
|
94
|
-
|
|
95
|
-
<script src="/js/icones.js"></script>
|
|
96
|
-
<script>
|
|
97
|
-
(function () {
|
|
98
|
-
var $ = function (s) { return document.querySelector(s); };
|
|
99
|
-
var FERRS = [];
|
|
100
|
-
var ARQUIVOS = [];
|
|
101
|
-
|
|
102
|
-
function fugir(s) { return String(s).replace(/&/g, "&").replace(/</g, "<"); }
|
|
103
|
-
|
|
104
|
-
fetch("/api/ferramentas").then(function (r) { return r.json(); }).then(function (lista) {
|
|
105
|
-
FERRS = lista;
|
|
106
|
-
$("#ferramentas").innerHTML = lista.map(function (f) {
|
|
107
|
-
return '<div class="cartao-ferr" data-slug="' + f.slug + '" style="--cor:' + f.cor + '" tabindex="0" role="button">' +
|
|
108
|
-
'<div class="brilho" aria-hidden="true"></div>' +
|
|
109
|
-
'<div class="icone">' + svgIcone(iconeDe(f.slug)) + "</div>" +
|
|
110
|
-
"<b>" + fugir(f.nome) + "</b>" +
|
|
111
|
-
'<div class="papel">' + fugir(f.papel) + "</div>" +
|
|
112
|
-
"<p>" + fugir(f.resumo) + "</p>" +
|
|
113
|
-
'<div class="equiv">no lugar de ' + fugir(f.equivale) + "</div></div>";
|
|
114
|
-
}).join("");
|
|
115
|
-
|
|
116
|
-
Array.prototype.forEach.call(document.querySelectorAll(".cartao-ferr"), function (c) {
|
|
117
|
-
c.onclick = function () { criar(c.dataset.slug); };
|
|
118
|
-
// Teclado abre igual ao mouse: o cartão é um botão, e um botão que só
|
|
119
|
-
// responde a clique deixa de fora quem navega por Tab.
|
|
120
|
-
c.onkeydown = function (ev) {
|
|
121
|
-
if (ev.key === "Enter" || ev.key === " ") { ev.preventDefault(); criar(c.dataset.slug); }
|
|
122
|
-
};
|
|
123
|
-
});
|
|
124
|
-
carregarArquivos();
|
|
125
|
-
});
|
|
126
|
-
|
|
127
|
-
function iconeDe(slug) {
|
|
128
|
-
return { prisma: "tela", tela: "lapis", prosa: "livro",
|
|
129
|
-
grade: "tabela", corte: "video", traco: "conector" }[slug] || "quadrado";
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
function corDe(slug) {
|
|
133
|
-
var f = FERRS.filter(function (x) { return x.slug === slug; })[0];
|
|
134
|
-
return f ? f.cor : "#888";
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
function criar(slug) {
|
|
138
|
-
fetch("/api/arquivos", {
|
|
139
|
-
method: "POST", headers: { "Content-Type": "application/json" },
|
|
140
|
-
body: JSON.stringify({ ferramenta: slug, titulo: "Sem título" }),
|
|
141
|
-
}).then(function (r) { return r.json(); }).then(function (a) {
|
|
142
|
-
location.href = "/t/" + slug + "/" + a.id;
|
|
143
|
-
});
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
$("#ir-corte").onclick = function () { criar("corte"); };
|
|
147
|
-
$("#ir-prisma").onclick = function () { criar("prisma"); };
|
|
148
|
-
|
|
149
|
-
function carregarArquivos() {
|
|
150
|
-
fetch("/api/arquivos").then(function (r) { return r.json(); }).then(function (lista) {
|
|
151
|
-
ARQUIVOS = lista;
|
|
152
|
-
desenharArquivos(lista);
|
|
153
|
-
});
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
function desenharArquivos(lista) {
|
|
157
|
-
if (!lista.length) {
|
|
158
|
-
$("#arquivos").innerHTML = "";
|
|
159
|
-
$("#vazio").style.display = "block";
|
|
160
|
-
return;
|
|
161
|
-
}
|
|
162
|
-
$("#vazio").style.display = "none";
|
|
163
|
-
$("#arquivos").innerHTML = lista.map(function (a) {
|
|
164
|
-
var cor = corDe(a.ferramenta);
|
|
165
|
-
var quando = a.atualizado ? a.atualizado.slice(0, 10).split("-").reverse().join("/") : "";
|
|
166
|
-
return '<div class="item-arq" style="--cor:' + cor + '">' +
|
|
167
|
-
'<div class="tag">' + svgIcone(iconeDe(a.ferramenta)) + "</div>" +
|
|
168
|
-
'<div class="cresce"><b>' + fugir(a.titulo) + "</b>" +
|
|
169
|
-
'<div class="meta">' + fugir(a.ferramenta) + " · " + a.pecas +
|
|
170
|
-
(a.pecas === 1 ? " peça · " : " peças · ") + quando + "</div></div>" +
|
|
171
|
-
'<a class="btn" href="/t/' + a.ferramenta + "/" + a.id + '">Editar</a>' +
|
|
172
|
-
'<a class="btn primo" href="/v/' + a.id + '" target="_blank">Abrir</a></div>';
|
|
173
|
-
}).join("");
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
/* A BUSCA filtra o que já está na tela — ferramentas e arquivos.
|
|
177
|
-
Sem ida ao servidor: a lista inteira já veio, e um fetch por tecla
|
|
178
|
-
digitada seria trabalho para devolver o que está na memória. */
|
|
179
|
-
var busca = $("#busca");
|
|
180
|
-
busca.oninput = function () {
|
|
181
|
-
var q = busca.value.trim().toLowerCase();
|
|
182
|
-
Array.prototype.forEach.call(document.querySelectorAll(".cartao-ferr"), function (c) {
|
|
183
|
-
c.style.display = !q || c.textContent.toLowerCase().indexOf(q) >= 0 ? "" : "none";
|
|
184
|
-
});
|
|
185
|
-
desenharArquivos(!q ? ARQUIVOS : ARQUIVOS.filter(function (a) {
|
|
186
|
-
return (a.titulo + " " + a.ferramenta).toLowerCase().indexOf(q) >= 0;
|
|
187
|
-
}));
|
|
188
|
-
};
|
|
189
|
-
document.addEventListener("keydown", function (ev) {
|
|
190
|
-
if (ev.key === "/" && document.activeElement !== busca) { ev.preventDefault(); busca.focus(); }
|
|
191
|
-
if (ev.key === "Escape" && document.activeElement === busca) { busca.value = ""; busca.oninput(); busca.blur(); }
|
|
192
|
-
});
|
|
193
|
-
|
|
194
|
-
$("#copiar").onclick = function () {
|
|
195
|
-
navigator.clipboard.writeText($("#frase").textContent).then(function () {
|
|
196
|
-
var c = $("#copiado");
|
|
197
|
-
c.classList.add("on");
|
|
198
|
-
setTimeout(function () { c.classList.remove("on"); }, 1500);
|
|
199
|
-
});
|
|
200
|
-
};
|
|
201
|
-
|
|
202
|
-
var folha = $("#folha");
|
|
203
|
-
$("#btn-manual").onclick = function () {
|
|
204
|
-
folha.classList.add("on");
|
|
205
|
-
if ($("#manual").textContent.length < 200) {
|
|
206
|
-
fetch("/api/manual").then(function (r) { return r.text(); })
|
|
207
|
-
.then(function (t) { $("#manual").textContent = t; });
|
|
208
|
-
}
|
|
209
|
-
};
|
|
210
|
-
folha.onclick = function (e) { if (e.target === folha) folha.classList.remove("on"); };
|
|
211
|
-
document.addEventListener("keydown", function (e) {
|
|
212
|
-
if (e.key === "Escape") folha.classList.remove("on");
|
|
213
|
-
});
|
|
214
|
-
})();
|
|
215
|
-
</script>
|
|
216
|
-
</body>
|
|
217
|
-
</html>
|