primocode 9.8.0-beta.1 → 9.8.0-beta.11

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 (67) hide show
  1. package/README.md +34 -7
  2. package/app/ansi.js +55 -0
  3. package/app/app.css +482 -281
  4. package/app/app.js +888 -315
  5. package/app/index.html +176 -101
  6. package/app/primo-marca.js +58 -1
  7. package/bin/primocode.js +713 -121
  8. package/comandos/explicar.md +14 -0
  9. package/comandos/publicar.md +10 -0
  10. package/comandos/revisar.md +13 -0
  11. package/lib/act.js +118 -18
  12. package/lib/api.js +5 -2
  13. package/lib/app.js +317 -74
  14. package/lib/browser.js +79 -3
  15. package/lib/catalogo.js +4 -1
  16. package/lib/checkpoint-git.js +218 -0
  17. package/lib/checkpoint.js +249 -0
  18. package/lib/claude-engine.js +630 -0
  19. package/lib/codex-engine.js +207 -0
  20. package/lib/comandos-extra.js +481 -0
  21. package/lib/comandos.js +104 -0
  22. package/lib/config.js +21 -4
  23. package/lib/estudio/edicao.js +331 -0
  24. package/lib/estudio/index.js +65 -1
  25. package/lib/estudio/remotion.js +66 -3
  26. package/lib/fala.js +95 -1
  27. package/lib/local/cerebro.json +334 -185
  28. package/lib/local/entrada.js +18 -8
  29. package/lib/local/motor-cli.js +90 -0
  30. package/lib/local/provedor.js +20 -2
  31. package/lib/mencoes.js +98 -0
  32. package/lib/offline.js +168 -0
  33. package/lib/painel.js +291 -0
  34. package/lib/perigo.js +256 -0
  35. package/lib/pre-leitura.js +118 -0
  36. package/lib/repeticao.js +4 -2
  37. package/lib/skills.js +6 -1
  38. package/lib/tempos.js +62 -0
  39. package/lib/ui.js +171 -17
  40. package/package.json +3 -2
  41. package/skills/apresentacao-pptx/SKILL.md +52 -0
  42. package/skills/cartaz-de-arte/LICENSE.txt +202 -0
  43. package/skills/cartaz-de-arte/SKILL.md +47 -0
  44. package/skills/criar-skill/LICENSE.txt +202 -0
  45. package/skills/criar-skill/SKILL.md +49 -0
  46. package/skills/depurar-de-verdade/LICENSE.txt +21 -0
  47. package/skills/depurar-de-verdade/SKILL.md +14 -5
  48. package/skills/design-de-verdade/LICENSE.txt +177 -0
  49. package/skills/design-de-verdade/SKILL.md +42 -0
  50. package/skills/documento-word/SKILL.md +57 -0
  51. package/skills/interface-revisada/SKILL.md +47 -0
  52. package/skills/me-ensina/LICENSE.txt +21 -0
  53. package/skills/me-ensina/SKILL.md +27 -0
  54. package/skills/me-entrevista/LICENSE.txt +21 -0
  55. package/skills/me-entrevista/SKILL.md +27 -0
  56. package/skills/motion-de-primeira/SKILL.md +1 -1
  57. package/skills/pdf-bonito/SKILL.md +48 -0
  58. package/skills/planilha-excel/SKILL.md +47 -0
  59. package/skills/react-sem-dor/SKILL.md +48 -0
  60. package/skills/revisao-antes-de-entregar/LICENSE.txt +21 -0
  61. package/skills/revisao-antes-de-entregar/SKILL.md +6 -1
  62. package/skills/site-com-motion/SKILL.md +39 -0
  63. package/skills/temas-prontos/LICENSE.txt +202 -0
  64. package/skills/temas-prontos/SKILL.md +50 -0
  65. package/skills/testar-o-site/LICENSE.txt +202 -0
  66. package/skills/testar-o-site/SKILL.md +46 -0
  67. package/skills/video-no-remotion/SKILL.md +48 -0
package/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # PrimoCode v9.8.0-beta.1
1
+ # PrimoCode v9.8.0-beta.11
2
2
 
3
3
  Agente de engenharia brasileiro para o terminal, no estilo Claude Code.
4
4
  Cria arquivos de verdade, roda comandos, **controla o navegador e o desktop** —
@@ -9,7 +9,7 @@ OpenRouter, e cada apelido (`top`/`main`/`fast`) é uma **corrente**: se um mode
9
9
  está no limite de pedidos, o próximo atende. Você não vê o erro, e não paga nada.
10
10
 
11
11
  ```
12
- ▐▛███▜▌ Primo Code v9.8.0-beta.1
12
+ ▐▛███▜▌ Primo Code v9.8.0-beta.11
13
13
  ▝▜█████▛▘ Bem-vindo de volta, Joel
14
14
  ▘▘ ▝▝ ~/primocode · /dir <pasta> muda
15
15
  ```
@@ -275,6 +275,7 @@ caminho fora do projeto.
275
275
  primocode # interativo
276
276
  primocode "crie um jogo de carro" # one-shot
277
277
  primocode -f app.js "onde está o bug?" # com arquivo anexado
278
+ primocode -c # continua a última conversa salva (--continue)
278
279
  ```
279
280
 
280
281
  ## Comandos
@@ -283,22 +284,39 @@ primocode -f app.js "onde está o bug?" # com arquivo anexado
283
284
  |---|---|
284
285
  | `/dir <caminho>` | Trabalha numa pasta que já existe, onde você quiser |
285
286
  | `/project` | Lista projetos. `/project <nome>` cria em `~/primocode` |
287
+ | `/projetos [n]` | Os projetos de `~/primocode` do mais recente para o mais antigo, com quando mexeu e o tamanho. `/projetos 2` entra no segundo (o `/project` sem nome mostra a mesma lista) |
288
+ | `/novo <descrição>` | Começa um projeto NOVO do zero, em pasta própria com nome escolhido pelo modelo — sem cair num projeto parecido que já existe |
286
289
  | `/mode primocode\|chat\|auto` | Alterna o modo (fica guardado) |
287
290
  | `/voice` | Modo voz: uma orb, você fala, ele faz. O cérebro é o mesmo do terminal |
291
+ | `/comandos` | Seus comandos: um `.md` em `~/.primocode/comandos/` (ou `<projeto>/.primocode/comandos/`) vira `/nome`, e `$ARGUMENTOS` recebe o que vem depois. Já vêm `/revisar`, `/explicar` e `/publicar`. `/comandos novo <nome>` cria um |
288
292
  | `/skills` · `/marketplace` | O que ele sabe fazer bem. Tela navegável pelas setas, e "New Skill" para escrever a sua |
289
293
  | `/connectors` | Quem está atendendo os seus pedidos (só mostra — não há o que configurar) |
290
294
  | `/effort` | O esforço do agente, num slider (←/→, Enter confirma): do `low` ao `ultracode`. O modelo sai daí |
291
- | `/api` | Roda com a SUA chave (Gemini, ChatGPT, Claude, Groq, OpenRouter, DeepSeek), direto do seu computador, sem o limite do servidor. `/api modelo <nome>` troca o modelo · `/api off` volta ao servidor |
295
+ | `/permissoes auto\|perguntar\|livre` | Quando ele pede licença. `auto` (padrão) roda tudo, mas pergunta antes do que não tem volta; `perguntar` pede antes de todo comando e toda escrita; `livre` nunca pergunta (fica guardado) |
296
+ | `/api` | Roda com a SUA assinatura (Claude Code, Codex, sem chave) ou a SUA chave (Gemini, ChatGPT, Claude, Groq, OpenRouter, DeepSeek), direto do seu computador, sem o limite do servidor. `/api modelo <nome>` troca o modelo · `/api off` volta ao servidor |
297
+ | `/init` | Estuda o projeto e escreve um `PRIMO.md` na raiz: o que é, como rodar, stack, convenções. Ele é lido em todo pedido (vale também `AGENTS.md` ou `CLAUDE.md`, e `~/.primocode/PRIMO.md` para todos os projetos) |
298
+ | `@arquivo` | No meio do pedido (`melhora o @index.html`, `@"nome com espaço.txt"`) anexa aquele arquivo do projeto só a esse pedido. Até 40 KB por arquivo, 120 KB no total |
292
299
  | `/attach <arquivo>` | Anexa arquivo ao próximo pedido |
293
300
  | `/detach` · `/files` | Remove / lista anexos |
294
301
  | `/all` | Lista as 46 ferramentas que ele sabe usar, por grupo |
302
+ | `/desfazer` · `/undo` | Volta o projeto para como estava antes do último pedido — inclusive o que um comando apagou, moveu ou gerou (com git instalado, cada pedido tira uma foto do projeto num git à parte, que não toca no seu `.git`; `node_modules`, `dist` e o que o `.gitignore` ignora ficam de fora). Sem git, volta o que o agente escreveu com as ferramentas de arquivo. `/desfazer lista` mostra os pedidos e quantos arquivos cada um mudou · `/desfazer N` volta os N últimos |
295
303
  | `/tree [n]` | Árvore do projeto atual |
296
304
  | `/read <arquivo>` | Mostra um arquivo do projeto |
297
305
  | `/run <comando>` | Executa no shell, dentro da pasta do projeto |
298
306
  | `/open <arquivo\|url>` | Abre no navegador |
307
+ | `/rc` | Abre a janela do PrimoCode, um app de mesa: barra lateral com **Novo chat**, **Projetos** (de `~/primocode`) e **Recentes**; a conversa no meio, com cada ação do Primo numa linha ("Editou style.css +12 −3", "Rodou npm test ✓") que abre para mostrar o detalhe; e o compositor embaixo com **Escolher projeto**, **+** (anexa arquivo, como o `/attach`), a permissão (`/permissoes`: *Pergunta antes do perigoso* · *Pergunta sempre* · *Acesso completo*), o esforço (`/effort`), o microfone (`/voice`) e enviar/parar (Esc Esc para). O botão **Terminal** mostra a saída crua do CLI |
308
+ | `/ide` | Abre a mesma janela do `/rc`, já com o painel da direita: **Prévia** (o `index.html` do projeto, que recarrega sozinho quando ele mexe num arquivo) e **Arquivos** (a pasta do projeto, só leitura). O editor de código antigo saiu |
309
+ | `primo ide` | Do shell: abre o PrimoCode já com a janela e a prévia abertas (`primo "pedido"` continua sendo o modo de um pedido só) |
310
+ | `/abrir` | Abre o projeto atual no navegador: o servidor dele, se estiver de pé, ou a `index.html` (o `/open` sem nada faz o mesmo) |
311
+ | `/copiar` | Copia a última resposta para a área de transferência (pbcopy, clip, wl-copy/xclip/xsel) |
312
+ | `/historico [termo]` | Procura nos seus pedidos guardados nesta máquina (`~/.primocode/history.jsonl`), do mais recente. As conversas inteiras da conta ficam no `/chats` |
299
313
  | `/status` | Health check do servidor |
314
+ | `/offline` | Temporário: sobe o `primocode-server` no seu computador (a pasta ao lado do CLI, ou `/offline <caminho>`) com as chaves de `~/.primocode/servidor.env` e aponta a sessão pra ele. `/offline off` volta ao servidor de antes |
315
+ | `/doctor` | Confere tudo com ✓/✗: Node, servidor, `/api`, Chrome, Python+PyObjC (cursor, macOS), disco e config. Cada ✗ diz como consertar |
316
+ | `/custo` | Tokens enviados e recebidos e pedidos feitos nesta sessão, por provedor (estimado em caracteres ÷ 4 quando o provedor não manda o número) |
317
+ | `/atalhos` | As teclas: Esc Esc para o agente, `!` roda no shell, Alt+Enter quebra linha… |
300
318
  | `/name <nome>` | Como o Primo te chama na saudação |
301
- | `/mascot primo\|fox\|cat` | Escolhe o mascote (mostra os três) |
319
+ | `/mascot [nome\|n]` | Galeria dos 10 mascotes lado a lado (primo, fox, cat, robo, coruja, dragao, fantasma, capivara, polvo, pinguim), cada um com nome e bordão na abertura. Escolha por nome ou número. Depois de cada tarefa ele reage numa linha (`(^‿^)` pronto, `(°_°)` não terminou); `/mascot reacoes off` desliga |
302
320
  | `/config` | Mostra suas preferências e onde ficam salvas |
303
321
  | `/clear` · `/cls` | Limpa conversa / tela |
304
322
  | `/uninstall` | Remove o PrimoCode (seus projetos ficam) |
@@ -326,9 +344,18 @@ export PRIMOCODE_TOKEN="..." # só se o servidor exigir
326
344
 
327
345
  ## Segurança
328
346
 
329
- Todo caminho que o modelo pede é resolvido **dentro** da pasta do projeto.
330
- Caminho absoluto ou com `../` é recusado — o agente não escreve fora da sua
331
- área de trabalho.
347
+ Todo arquivo que o agente escreve (`write_file`, `edit_file`, `multi_edit`) é
348
+ resolvido **dentro** da pasta do projeto. Caminho absoluto ou com `../` é
349
+ recusado.
350
+
351
+ Os **comandos** de terminal não têm essa cerca: eles rodam com as suas
352
+ permissões. Por isso, no modo padrão (`/permissoes auto`), ele **pergunta antes
353
+ do que não tem volta** — `rm -rf` fora do projeto ou em `~` e `/`, `sudo`,
354
+ `git push --force`, `git reset --hard`, `git clean -fd`, `curl … | sh`, `dd`,
355
+ `mkfs`, `npm publish`, desligar o computador. Apagar `node_modules` ou `dist`
356
+ dentro do projeto não pergunta. A régua está em `lib/perigo.js`.
357
+
358
+ Mexer no mouse e no teclado (controle do computador) sempre pede licença.
332
359
 
333
360
  ## Arquitetura
334
361
 
package/app/ansi.js ADDED
@@ -0,0 +1,55 @@
1
+ /* ansi.js — a saída do terminal virando HTML com as cores do PrimoCode.
2
+ *
3
+ * A mesma tradução do app.js (a janela do /rc), agora num arquivo que a IDE
4
+ * também carrega. Só o que o PrimoCode realmente emite: cor 256 (38;5;N),
5
+ * negrito e reset. O resto dos códigos (mover cursor, apagar linha) é desenho
6
+ * de terminal e é descartado — na página quem rola é o navegador.
7
+ *
8
+ * O `estado` atravessa os pedaços: o Node corta a saída onde der, e um
9
+ * "\x1b[38;5;45m" pode chegar num pedaço e o texto colorido no seguinte.
10
+ */
11
+ (function (raiz) {
12
+ "use strict";
13
+ var ANSI = /\x1b\[([0-9;?]*)([a-zA-Z])/g;
14
+
15
+ function fugir(s) {
16
+ return s.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
17
+ }
18
+
19
+ function paraHtml(texto, estado) {
20
+ var fora = "";
21
+ var ultimo = 0;
22
+ var m;
23
+ ANSI.lastIndex = 0;
24
+ function abrir() {
25
+ var classes = [];
26
+ if (estado.cor) classes.push("c" + estado.cor);
27
+ if (estado.forte) classes.push("forte");
28
+ return classes.length ? '<span class="' + classes.join(" ") + '">' : "";
29
+ }
30
+ function fechar() { return (estado.cor || estado.forte) ? "</span>" : ""; }
31
+
32
+ while ((m = ANSI.exec(texto)) !== null) {
33
+ var pedaco = texto.slice(ultimo, m.index);
34
+ if (pedaco) fora += abrir() + fugir(pedaco) + fechar();
35
+ ultimo = m.index + m[0].length;
36
+ if (m[2] !== "m") continue;
37
+ var partes = m[1].split(";");
38
+ for (var i = 0; i < partes.length; i++) {
39
+ var n = partes[i];
40
+ if (n === "" || n === "0") { estado.cor = null; estado.forte = false; }
41
+ else if (n === "1") estado.forte = true;
42
+ else if (n === "38" && partes[i + 1] === "5") { estado.cor = partes[i + 2]; i += 2; }
43
+ else if (n === "39") estado.cor = null;
44
+ else if (n === "22") estado.forte = false;
45
+ }
46
+ }
47
+ var resto = texto.slice(ultimo);
48
+ if (resto) fora += abrir() + fugir(resto) + fechar();
49
+ // \r sozinho é o terminal voltando ao começo da linha para redesenhar;
50
+ // na página ele só deixaria um caractere invisível no meio do texto.
51
+ return fora.replace(/\r(?!\n)/g, "");
52
+ }
53
+
54
+ raiz.PrimoAnsi = { paraHtml: paraHtml, fugir: fugir };
55
+ })(window);