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,243 +0,0 @@
1
- /* ==========================================================================
2
- render-grade.js — desenha uma PLANILHA (ferramenta Grade) e resolve fórmulas.
3
- doc = { tema, abas: [ {nome, colunas, linhas, formatos?, totais?, regras?} ] }
4
- Fórmulas na célula: "=SOMA(A1:A9)", "=B2*1.2", "=MEDIA(C1:C4)"
5
- ========================================================================== */
6
-
7
- function _soma(v) { return v.reduce(function (s, x) { return s + x; }, 0); }
8
-
9
- var FUNCOES = {
10
- SOMA: _soma,
11
- MEDIA: function (v) { return v.length ? _soma(v) / v.length : 0; },
12
- MIN: function (v) { return v.length ? Math.min.apply(null, v) : 0; },
13
- MAX: function (v) { return v.length ? Math.max.apply(null, v) : 0; },
14
- CONT: function (v) { return v.length; },
15
- ARRED: function (v) { return v.length > 1 ? +(v[0]).toFixed(v[1]) : Math.round(v[0] || 0); },
16
- ABS: function (v) { return Math.abs(v[0] || 0); },
17
- RAIZ: function (v) { return Math.sqrt(Math.abs(v[0] || 0)); },
18
- POT: function (v) { return Math.pow(v[0] || 0, v[1] || 2); },
19
- TETO: function (v) { return Math.ceil(v[0] || 0); },
20
- PISO: function (v) { return Math.floor(v[0] || 0); },
21
- MEDIANA: function (v) {
22
- if (!v.length) return 0;
23
- var o = v.slice().sort(function (a, b) { return a - b; });
24
- var m = Math.floor(o.length / 2);
25
- return o.length % 2 ? o[m] : (o[m - 1] + o[m]) / 2;
26
- },
27
- MAIOR: function (v) {
28
- var k = v.pop();
29
- return v.sort(function (a, b) { return b - a; })[Math.max(0, (k || 1) - 1)] || 0;
30
- },
31
- MENOR: function (v) {
32
- var k = v.pop();
33
- return v.sort(function (a, b) { return a - b; })[Math.max(0, (k || 1) - 1)] || 0;
34
- },
35
- SE: function (v) { return v[0] ? (v[1] != null ? v[1] : 1) : (v[2] != null ? v[2] : 0); },
36
- };
37
-
38
- /* Compara valores de uma faixa com um critério tipo ">100" ou "<>0". */
39
- function _criterio(texto) {
40
- var m = String(texto).trim().replace(/^["']|["']$/g, "").match(/^(<=|>=|<>|!=|<|>|=)?\s*(-?[\d.,]+)$/);
41
- if (!m) return function () { return false; };
42
- var op = m[1] || "=", alvo = parseFloat(m[2].replace(",", "."));
43
- return function (x) {
44
- switch (op) {
45
- case ">": return x > alvo;
46
- case "<": return x < alvo;
47
- case ">=": return x >= alvo;
48
- case "<=": return x <= alvo;
49
- case "<>": case "!=": return x !== alvo;
50
- default: return x === alvo;
51
- }
52
- };
53
- }
54
-
55
- function _colParaIndice(letras) {
56
- var n = 0;
57
- for (var i = 0; i < letras.length; i++) n = n * 26 + (letras.charCodeAt(i) - 64);
58
- return n - 1;
59
- }
60
-
61
- function _numero(v) {
62
- if (typeof v === "number") return v;
63
- if (v == null || v === "") return 0;
64
- var s = String(v).replace(/[R$\s%.]/g, "").replace(",", ".");
65
- var n = parseFloat(s);
66
- return isNaN(n) ? 0 : n;
67
- }
68
-
69
- /* Resolve todas as fórmulas de uma aba. Retorna matriz de valores calculados. */
70
- function calcular(aba) {
71
- var linhas = (aba.linhas || []).map(function (l) { return l.slice(); });
72
- var cache = {};
73
-
74
- function valorCelula(col, lin, profundidade) {
75
- var chave = col + ":" + lin;
76
- if (cache[chave] !== undefined) return cache[chave];
77
- if (profundidade > 24) return 0;
78
- var bruto = (linhas[lin] || [])[col];
79
- var v;
80
- if (typeof bruto === "string" && bruto.charAt(0) === "=") {
81
- v = avaliar(bruto.slice(1), profundidade + 1);
82
- } else {
83
- v = bruto;
84
- }
85
- cache[chave] = v;
86
- return v;
87
- }
88
-
89
- function faixa(ref, profundidade) {
90
- var m = ref.match(/^([A-Z]+)(\d+):([A-Z]+)(\d+)$/);
91
- if (!m) return [];
92
- var c1 = _colParaIndice(m[1]), l1 = +m[2] - 1;
93
- var c2 = _colParaIndice(m[3]), l2 = +m[4] - 1;
94
- var fora = [];
95
- for (var l = Math.min(l1, l2); l <= Math.max(l1, l2); l++) {
96
- for (var c = Math.min(c1, c2); c <= Math.max(c1, c2); c++) {
97
- fora.push(_numero(valorCelula(c, l, profundidade)));
98
- }
99
- }
100
- return fora;
101
- }
102
-
103
- function avaliar(expr, profundidade) {
104
- var e = expr;
105
-
106
- // funções: NOME(faixa ou lista)
107
- // repete até esgotar: resolve de dentro para fora em fórmula aninhada
108
- var voltas = 0;
109
- while (/[A-ZÇ]+\(/.test(e) && voltas++ < 12) {
110
- e = umaVolta(e);
111
- }
112
-
113
- function umaVolta(expr) {
114
- return expr.replace(/([A-ZÇ]+)\(([^()]*)\)/g, function (_, nome, args) {
115
- var partes = args.split(";").map(function (p) { return p.trim(); });
116
-
117
- // SOMASE(faixa; critério) e CONTSE(faixa; critério)
118
- if (nome === "SOMASE" || nome === "CONTSE") {
119
- var vals0 = /^[A-Z]+\d+:[A-Z]+\d+$/.test(partes[0]) ? faixa(partes[0], profundidade) : [];
120
- var testa = _criterio(partes[1] || "");
121
- var passou = vals0.filter(testa);
122
- return String(nome === "SOMASE" ? _soma(passou) : passou.length);
123
- }
124
-
125
- var fn = FUNCOES[nome];
126
- if (!fn) return "0";
127
- var vals = [];
128
- partes.forEach(function (parte) {
129
- if (/^[A-Z]+\d+:[A-Z]+\d+$/.test(parte)) vals = vals.concat(faixa(parte, profundidade));
130
- // qualquer outro argumento é uma expressão: resolve antes de somar
131
- else if (parte !== "") vals.push(_numero(avaliar(parte, profundidade)));
132
- });
133
- return String(fn(vals));
134
- });
135
- }
136
-
137
- // referências soltas: A1
138
- e = e.replace(/\b([A-Z]+)(\d+)\b/g, function (todo) {
139
- return String(_numero(refCelula(todo, profundidade)));
140
- });
141
-
142
- // comparações são permitidas para o SE funcionar
143
- if (!/^[-+*/().\d\s,<>=!]*$/.test(e)) return "#ERRO";
144
- try {
145
- var pronto = e.replace(/,/g, ".")
146
- .replace(/<>/g, "!==")
147
- .replace(/([^<>!=])=(?!=)/g, "$1===") || "0";
148
- var r = Function('"use strict";return (' + pronto + ")")();
149
- if (typeof r === "boolean") return r ? 1 : 0;
150
- return typeof r === "number" && isFinite(r) ? r : "#ERRO";
151
- } catch (_) {
152
- return "#ERRO";
153
- }
154
- }
155
-
156
- function refCelula(ref, profundidade) {
157
- var m = ref.match(/^([A-Z]+)(\d+)$/);
158
- if (!m) return 0;
159
- return valorCelula(_colParaIndice(m[1]), +m[2] - 1, profundidade);
160
- }
161
-
162
- return linhas.map(function (linha, li) {
163
- return linha.map(function (_, ci) { return valorCelula(ci, li, 0); });
164
- });
165
- }
166
-
167
- function formatar(valor, formato) {
168
- if (valor == null || valor === "") return "";
169
- if (!formato) return String(valor);
170
- var n = _numero(valor);
171
- if (formato === "moeda") return "R$ " + n.toLocaleString("pt-BR", { minimumFractionDigits: 2, maximumFractionDigits: 2 });
172
- if (formato === "percentual") return n.toLocaleString("pt-BR", { maximumFractionDigits: 1 }) + "%";
173
- if (formato === "inteiro") return Math.round(n).toLocaleString("pt-BR");
174
- if (formato === "decimal") return n.toLocaleString("pt-BR", { minimumFractionDigits: 2, maximumFractionDigits: 2 });
175
- return String(valor);
176
- }
177
-
178
- function renderGrade(doc, op) {
179
- op = op || {};
180
- var aba = (doc.abas || [])[op.aba || 0] || { colunas: [], linhas: [] };
181
- var calculadas = calcular(aba);
182
- var formatos = aba.formatos || {};
183
- var regras = aba.regras || [];
184
-
185
- var no = document.createElement("div");
186
- no.className = "planilha";
187
- no.setAttribute("data-tema", doc.tema || "claro");
188
-
189
- var colunas = aba.colunas || [];
190
- var h = ["<table><thead><tr><th></th>"];
191
- colunas.forEach(function (c, i) {
192
- h.push("<th>" + String.fromCharCode(65 + i) + " · " + _pFugir(c) + "</th>");
193
- });
194
- h.push("</tr></thead><tbody>");
195
-
196
- (aba.linhas || []).forEach(function (linha, li) {
197
- h.push("<tr><th>" + (li + 1) + "</th>");
198
- colunas.forEach(function (nomeCol, ci) {
199
- var calc = (calculadas[li] || [])[ci];
200
- var bruto = linha[ci];
201
- var fmt = formatos[nomeCol] || formatos[String.fromCharCode(65 + ci)];
202
- var ehNum = typeof calc === "number" || (fmt && fmt !== "texto");
203
- var cls = [];
204
- if (ehNum) cls.push("num");
205
- if (typeof bruto === "string" && bruto.charAt(0) === "=") cls.push("total");
206
-
207
- regras.forEach(function (r) {
208
- if (r.coluna !== nomeCol) return;
209
- var v = _numero(calc);
210
- if (r.acima != null && v > r.acima) cls.push("alto");
211
- if (r.abaixo != null && v < r.abaixo) cls.push("baixo");
212
- });
213
-
214
- h.push('<td class="' + cls.join(" ") + '" data-l="' + li + '" data-c="' + ci + '">' +
215
- _pFugir(formatar(calc, fmt)) + "</td>");
216
- });
217
- h.push("</tr>");
218
- });
219
-
220
- h.push("</tbody></table>");
221
- no.innerHTML = h.join("");
222
-
223
- if (aba.grafico) {
224
- var dados = (aba.linhas || []).map(function (l, li) {
225
- var ci = colunas.indexOf(aba.grafico.valor);
226
- var ri = colunas.indexOf(aba.grafico.rotulo);
227
- return [l[ri >= 0 ? ri : 0], _numero((calculadas[li] || [])[ci >= 0 ? ci : 1])];
228
- }).filter(function (d) { return d[0] != null && String(d[0]).charAt(0) !== "="; });
229
-
230
- var cx = document.createElement("div");
231
- cx.className = "cena";
232
- cx.setAttribute("data-tema", doc.tema || "claro");
233
- cx.style.cssText = "width:100%;height:340px;margin-top:18px;border-radius:12px;padding:10px";
234
- cx.innerHTML = svgGrafico({ grafico: aba.grafico.tipo || "barras", dados: dados }, 900, 320);
235
- no.appendChild(cx);
236
- }
237
-
238
- return no;
239
- }
240
-
241
- if (typeof module !== "undefined" && module.exports) {
242
- module.exports = { renderGrade: renderGrade, calcular: calcular, formatar: formatar };
243
- }
@@ -1,104 +0,0 @@
1
- /* ==========================================================================
2
- render-prosa.js — desenha um DOCUMENTO (ferramenta Prosa).
3
- doc = { tema, capa?, blocos: [ {tipo, ...} ] }
4
- ========================================================================== */
5
-
6
- function _pFugir(s) {
7
- return String(s == null ? "" : s).replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
8
- }
9
-
10
- function _pRico(s) {
11
- return _pFugir(s)
12
- .replace(/\*\*([^*]+)\*\*/g, "<strong>$1</strong>")
13
- .replace(/(^|[^*])\*([^*\n]+)\*/g, "$1<em>$2</em>")
14
- .replace(/`([^`]+)`/g, "<code>$1</code>")
15
- .replace(/\[([^\]]+)\]\(([^)\s]+)\)/g, '<a href="$2">$1</a>');
16
- }
17
-
18
- function renderProsa(doc, op) {
19
- op = op || {};
20
- var folha = document.createElement("div");
21
- folha.className = "folha-doc";
22
- folha.setAttribute("data-tema", doc.tema || "papel");
23
- if (doc.largura) folha.style.width = doc.largura + "px";
24
-
25
- var h = [];
26
-
27
- if (doc.capa) {
28
- var c = doc.capa;
29
- h.push('<div class="capa-doc" style="min-height:520px;display:flex;flex-direction:column;justify-content:center;gap:10px">');
30
- if (c.chapeu) h.push('<div class="chapeu-doc">' + _pFugir(c.chapeu) + "</div>");
31
- if (c.titulo) h.push("<h1>" + _pRico(c.titulo) + "</h1>");
32
- if (c.apoio) h.push('<p class="apoio">' + _pRico(c.apoio) + "</p>");
33
- if (c.autor || c.data) {
34
- h.push('<p class="apoio" style="font-size:14px;margin-top:20px">' +
35
- _pFugir([c.autor, c.data].filter(Boolean).join(" · ")) + "</p>");
36
- }
37
- h.push("</div><hr>");
38
- }
39
-
40
- var indice = [];
41
- (doc.blocos || []).forEach(function (b, i) {
42
- if (b.tipo === "secao") indice.push({ i: i, texto: b.texto });
43
- });
44
-
45
- (doc.blocos || []).forEach(function (b) {
46
- var t = b.tipo || "paragrafo";
47
- var texto = b.texto || "";
48
-
49
- switch (t) {
50
- case "titulo": h.push("<h1>" + _pRico(texto) + "</h1>"); break;
51
- case "chapeu": h.push('<div class="chapeu-doc">' + _pFugir(texto) + "</div>"); break;
52
- case "apoio": h.push('<p class="apoio">' + _pRico(texto) + "</p>"); break;
53
- case "secao": h.push("<h2>" + _pRico(texto) + "</h2>"); break;
54
- case "subsecao": h.push("<h3>" + _pRico(texto) + "</h3>"); break;
55
- case "citacao":
56
- h.push("<blockquote>" + _pRico(texto) +
57
- (b.autor ? '<div style="font-size:13px;margin-top:8px">— ' + _pFugir(b.autor) + "</div>" : "") +
58
- "</blockquote>");
59
- break;
60
- case "lista":
61
- h.push("<ul>" + (b.itens || []).map(function (i) { return "<li>" + _pRico(i) + "</li>"; }).join("") + "</ul>");
62
- break;
63
- case "numerada":
64
- h.push("<ol>" + (b.itens || []).map(function (i) { return "<li>" + _pRico(i) + "</li>"; }).join("") + "</ol>");
65
- break;
66
- case "codigo":
67
- h.push("<pre>" + _pFugir(texto) + "</pre>");
68
- break;
69
- case "tabela": {
70
- var linhas = b.linhas || [];
71
- var tab = "<table>";
72
- linhas.forEach(function (l, i) {
73
- tab += "<tr>" + l.map(function (cel) {
74
- return i === 0 ? "<th>" + _pFugir(cel) + "</th>" : "<td>" + _pRico(cel) + "</td>";
75
- }).join("") + "</tr>";
76
- });
77
- h.push(tab + "</table>");
78
- break;
79
- }
80
- case "imagem":
81
- h.push("<figure><img src=\"" + _pFugir(b.src) + "\" alt=\"" + _pFugir(b.alt || "") + "\">" +
82
- (b.legenda ? "<figcaption>" + _pRico(b.legenda) + "</figcaption>" : "") + "</figure>");
83
- break;
84
- case "destaque":
85
- h.push('<div style="background:var(--c-cartao);border:1px solid var(--c-linha);' +
86
- 'border-left:3px solid var(--c-tom);border-radius:10px;padding:16px 20px">' +
87
- (b.titulo ? "<strong>" + _pFugir(b.titulo) + "</strong><br>" : "") +
88
- _pRico(texto) + "</div>");
89
- break;
90
- case "sumario":
91
- h.push("<h2>" + _pFugir(texto || "Sumário") + "</h2><ol>" +
92
- indice.map(function (s) { return "<li>" + _pFugir(s.texto) + "</li>"; }).join("") + "</ol>");
93
- break;
94
- case "divisor": h.push("<hr>"); break;
95
- case "quebra": h.push('<div style="break-after:page;page-break-after:always;height:1px"></div>'); break;
96
- default: h.push("<p>" + _pRico(texto) + "</p>");
97
- }
98
- });
99
-
100
- folha.innerHTML = h.join("\n");
101
- return folha;
102
- }
103
-
104
- if (typeof module !== "undefined" && module.exports) module.exports = { renderProsa: renderProsa };