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.
Files changed (104) hide show
  1. package/README.md +41 -37
  2. package/bin/primocode.js +598 -360
  3. package/lib/acervo.js +8 -1
  4. package/lib/act.js +205 -114
  5. package/lib/api.js +35 -4
  6. package/lib/boas-vindas.js +42 -195
  7. package/lib/catalogo.js +100 -61
  8. package/lib/config.js +1 -1
  9. package/lib/conta.js +3 -24
  10. package/lib/diff.js +161 -0
  11. package/lib/diretor.js +37 -47
  12. package/lib/entrada.js +576 -0
  13. package/lib/especialistas.js +2 -2
  14. package/lib/estudio/assets.js +343 -0
  15. package/lib/estudio/identidade.js +560 -0
  16. package/lib/estudio/index.js +565 -0
  17. package/lib/estudio/plano.js +327 -0
  18. package/lib/estudio/projeto.js +246 -0
  19. package/lib/estudio/remotion.js +644 -0
  20. package/lib/estudio/slides.js +190 -0
  21. package/lib/estudio/video.js +296 -0
  22. package/lib/fala.js +49 -6
  23. package/lib/marca.js +4 -1
  24. package/lib/markdown.js +376 -0
  25. package/lib/marketplace.js +189 -0
  26. package/lib/pasta.js +15 -4
  27. package/lib/permissao.js +137 -0
  28. package/lib/registro.js +229 -0
  29. package/lib/skills.js +329 -0
  30. package/lib/tools.js +106 -187
  31. package/lib/ui.js +7 -3
  32. package/lib/voz.js +239 -0
  33. package/package.json +12 -3
  34. package/skills/acessibilidade/SKILL.md +28 -0
  35. package/skills/api-que-nao-quebra/SKILL.md +27 -0
  36. package/skills/depurar-de-verdade/SKILL.md +29 -0
  37. package/skills/editar-meu-video/SKILL.md +59 -0
  38. package/skills/escrever-em-portugues/SKILL.md +28 -0
  39. package/skills/git-limpo/SKILL.md +28 -0
  40. package/skills/motion-de-primeira/SKILL.md +62 -0
  41. package/skills/pagina-que-converte/SKILL.md +28 -0
  42. package/skills/performance-web/SKILL.md +28 -0
  43. package/skills/revisao-antes-de-entregar/SKILL.md +27 -0
  44. package/skills/slides-que-prendem/SKILL.md +40 -0
  45. package/studio/edge.py +16 -66
  46. package/studio/narrar.py +274 -0
  47. package/studio/pessoa.py +199 -0
  48. package/voz/primo_voz/__init__.py +0 -0
  49. package/voz/primo_voz/__main__.py +383 -0
  50. package/voz/primo_voz/escuta.py +235 -0
  51. package/voz/primo_voz/orbe.py +216 -0
  52. package/lib/audio-livre.js +0 -177
  53. package/lib/chaves.js +0 -149
  54. package/lib/claude-engine.js +0 -631
  55. package/lib/codex-engine.js +0 -208
  56. package/lib/remotion.js +0 -663
  57. package/lib/studio.js +0 -960
  58. package/studio/PRIMOCODE.md +0 -58
  59. package/studio/README.md +0 -154
  60. package/studio/__pycache__/edge.cpython-311.pyc +0 -0
  61. package/studio/__pycache__/elevenlabs.cpython-311.pyc +0 -0
  62. package/studio/__pycache__/voz.cpython-311.pyc +0 -0
  63. package/studio/arquivos/corte-teste-de-camera-fb823.json +0 -57
  64. package/studio/ferramentas/00-protocolo.md +0 -125
  65. package/studio/ferramentas/01-modelos.md +0 -270
  66. package/studio/ferramentas/README.md +0 -32
  67. package/studio/ferramentas/corte.md +0 -919
  68. package/studio/ferramentas/grade.md +0 -92
  69. package/studio/ferramentas/prisma.md +0 -107
  70. package/studio/ferramentas/prosa.md +0 -86
  71. package/studio/ferramentas/tela.md +0 -93
  72. package/studio/ferramentas/traco.md +0 -79
  73. package/studio/server.py +0 -2254
  74. package/studio/studio.log +0 -57
  75. package/studio/voz.py +0 -388
  76. package/studio/web/analise.html +0 -52
  77. package/studio/web/core.css +0 -1167
  78. package/studio/web/fontes/bebas.woff2 +0 -0
  79. package/studio/web/fontes/grotesk-700.woff2 +0 -0
  80. package/studio/web/fontes/inter-400.woff2 +0 -0
  81. package/studio/web/fontes/inter-700.woff2 +0 -0
  82. package/studio/web/fontes/jetbrains-400.woff2 +0 -0
  83. package/studio/web/fontes/playfair-700.woff2 +0 -0
  84. package/studio/web/fontes.css +0 -23
  85. package/studio/web/home.html +0 -217
  86. package/studio/web/js/analise.js +0 -510
  87. package/studio/web/js/audio.js +0 -607
  88. package/studio/web/js/editor.js +0 -1802
  89. package/studio/web/js/exportar.js +0 -222
  90. package/studio/web/js/ferramentas.js +0 -108
  91. package/studio/web/js/icones.js +0 -120
  92. package/studio/web/js/midia.js +0 -157
  93. package/studio/web/js/narracao.js +0 -325
  94. package/studio/web/js/player.js +0 -903
  95. package/studio/web/js/render-grade.js +0 -243
  96. package/studio/web/js/render-prosa.js +0 -104
  97. package/studio/web/js/render.js +0 -1852
  98. package/studio/web/js/sfx.js +0 -233
  99. package/studio/web/js/video.js +0 -464
  100. package/studio/web/js/voz-neural.js +0 -152
  101. package/studio/web/render.css +0 -1352
  102. package/studio/web/tf.html +0 -15
  103. package/studio/web/tool.html +0 -78
  104. package/studio/web/view.html +0 -27
@@ -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 &lt;TEMA&gt;
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, "&amp;").replace(/</g, "&lt;"); }
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>