primocode 9.8.0-beta.0 → 9.8.0-beta.10
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 +36 -8
- package/app/ansi.js +55 -0
- package/app/app.css +482 -281
- package/app/app.js +888 -315
- package/app/index.html +176 -101
- package/app/primo-marca.js +58 -1
- package/bin/primocode.js +770 -118
- package/comandos/explicar.md +14 -0
- package/comandos/publicar.md +10 -0
- package/comandos/revisar.md +13 -0
- package/lib/act.js +118 -18
- package/lib/api.js +21 -0
- package/lib/app.js +317 -74
- package/lib/browser.js +79 -3
- package/lib/checkpoint-git.js +218 -0
- package/lib/checkpoint.js +249 -0
- package/lib/claude-engine.js +630 -0
- package/lib/codex-engine.js +207 -0
- package/lib/comandos-extra.js +481 -0
- package/lib/comandos.js +104 -0
- package/lib/config.js +21 -4
- package/lib/fala.js +95 -1
- package/lib/local/cerebro.json +2116 -0
- package/lib/local/entrada.js +332 -0
- package/lib/local/motor-cli.js +90 -0
- package/lib/local/motor.js +264 -0
- package/lib/local/provedor.js +169 -0
- package/lib/mencoes.js +98 -0
- package/lib/offline.js +168 -0
- package/lib/painel.js +291 -0
- package/lib/perigo.js +256 -0
- package/lib/pre-leitura.js +118 -0
- package/lib/repeticao.js +4 -2
- package/lib/skills.js +6 -1
- package/lib/tempos.js +62 -0
- package/lib/ui.js +171 -17
- package/package.json +3 -2
- package/skills/apresentacao-pptx/SKILL.md +52 -0
- package/skills/cartaz-de-arte/LICENSE.txt +202 -0
- package/skills/cartaz-de-arte/SKILL.md +47 -0
- package/skills/criar-skill/LICENSE.txt +202 -0
- package/skills/criar-skill/SKILL.md +49 -0
- package/skills/depurar-de-verdade/LICENSE.txt +21 -0
- package/skills/depurar-de-verdade/SKILL.md +14 -5
- package/skills/design-de-verdade/LICENSE.txt +177 -0
- package/skills/design-de-verdade/SKILL.md +42 -0
- package/skills/documento-word/SKILL.md +57 -0
- package/skills/interface-revisada/SKILL.md +47 -0
- package/skills/me-ensina/LICENSE.txt +21 -0
- package/skills/me-ensina/SKILL.md +27 -0
- package/skills/me-entrevista/LICENSE.txt +21 -0
- package/skills/me-entrevista/SKILL.md +27 -0
- package/skills/motion-de-primeira/SKILL.md +1 -1
- package/skills/pdf-bonito/SKILL.md +48 -0
- package/skills/planilha-excel/SKILL.md +47 -0
- package/skills/react-sem-dor/SKILL.md +48 -0
- package/skills/revisao-antes-de-entregar/LICENSE.txt +21 -0
- package/skills/revisao-antes-de-entregar/SKILL.md +6 -1
- package/skills/site-com-motion/SKILL.md +39 -0
- package/skills/temas-prontos/LICENSE.txt +202 -0
- package/skills/temas-prontos/SKILL.md +50 -0
- package/skills/testar-o-site/LICENSE.txt +202 -0
- package/skills/testar-o-site/SKILL.md +46 -0
- package/skills/video-no-remotion/SKILL.md +48 -0
package/README.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# PrimoCode v9.
|
|
1
|
+
# PrimoCode v9.8.0-beta.10
|
|
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.
|
|
12
|
+
▐▛███▜▌ Primo Code v9.8.0-beta.10
|
|
13
13
|
▝▜█████▛▘ Bem-vindo de volta, Joel
|
|
14
14
|
▘▘ ▝▝ ~/primocode · /dir <pasta> muda
|
|
15
15
|
```
|
|
@@ -27,7 +27,7 @@ veja `/mascot` e `/name`.
|
|
|
27
27
|
| **Memória** | Cada projeto lembra o que foi feito, entre sessões | Esquece ao fechar |
|
|
28
28
|
| **Instalação** | Node puro, **zero dependências** — segundos | Pacotes e dependências |
|
|
29
29
|
| **Cara própria** | Mascote, nome e temas que você escolhe | Fixo |
|
|
30
|
-
| **Modelos** | Escolhidos pelo produto
|
|
30
|
+
| **Modelos** | Escolhidos pelo produto (`/effort` regula o esforço), ou a sua própria chave com `/api` | Preso ao provedor do fabricante |
|
|
31
31
|
|
|
32
32
|
Em uma frase: **é o poder de um agente de código no terminal, em português, controlando o seu computador de verdade — sem você precisar configurar chave de API nenhuma.**
|
|
33
33
|
|
|
@@ -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,21 +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
|
-
| `/effort` | O esforço do agente, num slider (←/→, Enter confirma): do `low` ao `ultracode`. O modelo sai daí
|
|
294
|
+
| `/effort` | O esforço do agente, num slider (←/→, Enter confirma): do `low` ao `ultracode`. O modelo sai daí |
|
|
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 |
|
|
291
299
|
| `/attach <arquivo>` | Anexa arquivo ao próximo pedido |
|
|
292
300
|
| `/detach` · `/files` | Remove / lista anexos |
|
|
293
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 |
|
|
294
303
|
| `/tree [n]` | Árvore do projeto atual |
|
|
295
304
|
| `/read <arquivo>` | Mostra um arquivo do projeto |
|
|
296
305
|
| `/run <comando>` | Executa no shell, dentro da pasta do projeto |
|
|
297
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` |
|
|
298
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… |
|
|
299
318
|
| `/name <nome>` | Como o Primo te chama na saudação |
|
|
300
|
-
| `/mascot
|
|
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 |
|
|
301
320
|
| `/config` | Mostra suas preferências e onde ficam salvas |
|
|
302
321
|
| `/clear` · `/cls` | Limpa conversa / tela |
|
|
303
322
|
| `/uninstall` | Remove o PrimoCode (seus projetos ficam) |
|
|
@@ -325,9 +344,18 @@ export PRIMOCODE_TOKEN="..." # só se o servidor exigir
|
|
|
325
344
|
|
|
326
345
|
## Segurança
|
|
327
346
|
|
|
328
|
-
Todo
|
|
329
|
-
Caminho absoluto ou com `../` é
|
|
330
|
-
|
|
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.
|
|
331
359
|
|
|
332
360
|
## Arquitetura
|
|
333
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, "&").replace(/</g, "<").replace(/>/g, ">");
|
|
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);
|