primocode 8.38.0 → 8.38.1

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/app/app.js CHANGED
@@ -316,12 +316,16 @@
316
316
  marcarEscolha("cores", "cor", cor);
317
317
  }
318
318
 
319
+ /* A LOGO — a mesma do ícone do sistema e da barra lateral do Conecta. Onde
320
+ o produto se apresenta vai ela; o mascote em pixel fica para onde ele é
321
+ personagem. */
319
322
  function desenharMarca() {
320
323
  if (!window.PrimoMarca) return;
321
324
  var t = document.getElementById("marcaTopo");
322
325
  var g = document.getElementById("marcaGrande");
323
- if (t) t.innerHTML = window.PrimoMarca.svg({ tamanho: 22 });
324
- if (g) g.innerHTML = window.PrimoMarca.svg({ tamanho: 82, rotulo: "PrimoCode" });
326
+ var desenha = window.PrimoMarca.logo || window.PrimoMarca.svg;
327
+ if (t) t.innerHTML = desenha({ tamanho: 22 });
328
+ if (g) g.innerHTML = desenha({ tamanho: 82, rotulo: "PrimoCode" });
325
329
  }
326
330
 
327
331
  function quando(iso) {
@@ -1,12 +1,6 @@
1
1
  /**
2
2
  * primo-marca.js — o mascote do PrimoCode, desenhado em pixel.
3
3
  *
4
- * CÓPIA de conecta-primo-ai/frontend/primo-marca.js. São repositórios
5
- * diferentes e não há como importar de um para o outro; o que dá para fazer é
6
- * manter os dois IDÊNTICOS e o teste conferir isso — um mascote que muda num
7
- * lado e não no outro é a marca do produto se partindo em duas sem ninguém
8
- * ver.
9
- *
10
4
  * ── POR QUE MATRIZ, E NÃO O PNG ──────────────────────────────────────────
11
5
  * O logo veio como imagem. Guardar o PNG funcionaria, mas ele já é pixel art:
12
6
  * redesenhá-lo como MATRIZ dá o mesmo desenho nítido em qualquer tamanho —
@@ -103,11 +97,39 @@
103
97
  + '" height="' + lado + '"' + acessivel + ">" + partes.join("") + "</svg>";
104
98
  }
105
99
 
106
- /** O mesmo bicho como favicon, sem pedir arquivo ao servidor. */
100
+ /* A LOGO — a que o dono mandou, e a mesma do ícone do sistema
101
+ (`app/icone.svg` no PrimoCode): quadrado escuro arredondado, o chevron do
102
+ prompt e o sublinhado do cursor, em ciano. Onde o produto se apresenta
103
+ (botão da barra lateral, cabeçalho, favicon) vai ELA; o mascote em pixel
104
+ acima fica para onde ele é personagem, não marca. Foi por confundir os
105
+ dois que a barra lateral mostrou o bicho onde devia estar a logo. */
106
+ var LOGO_FUNDO = "#0a0f16";
107
+ var LOGO_TRACO = "#22d3ee";
108
+
109
+ /**
110
+ * A logo como SVG.
111
+ * @param {object} op
112
+ * @param {number} [op.tamanho] lado em px
113
+ * @param {string} [op.rotulo] texto alternativo; vazio = decorativo
114
+ */
115
+ function logo(op) {
116
+ op = op || {};
117
+ var lado = op.tamanho || 32;
118
+ var acessivel = op.rotulo
119
+ ? ' role="img" aria-label="' + String(op.rotulo).replace(/"/g, "&quot;") + '"'
120
+ : ' aria-hidden="true"';
121
+ return '<svg viewBox="0 0 32 32" width="' + lado + '" height="' + lado + '"' + acessivel + ">"
122
+ + '<rect width="32" height="32" rx="7" fill="' + LOGO_FUNDO + '"/>'
123
+ + '<path d="M8 10.5 13 16l-5 5.5" fill="none" stroke="' + LOGO_TRACO
124
+ + '" stroke-width="2.6" stroke-linecap="round" stroke-linejoin="round"/>'
125
+ + '<path d="M16.5 22H24" fill="none" stroke="' + LOGO_TRACO + '" stroke-width="2.6" stroke-linecap="round"/>'
126
+ + "</svg>";
127
+ }
128
+
129
+ /** A logo como favicon, sem pedir arquivo ao servidor. */
107
130
  function favicon() {
108
- var s = svg({ tamanho: 32, fundo: "#0a0f16" });
109
- return "data:image/svg+xml," + encodeURIComponent(s);
131
+ return "data:image/svg+xml," + encodeURIComponent(logo({ tamanho: 32 }));
110
132
  }
111
133
 
112
- raiz.PrimoMarca = { svg: svg, favicon: favicon, MATRIZ: MATRIZ, CORPO: CORPO, DETALHE: DETALHE };
134
+ raiz.PrimoMarca = { svg: svg, logo: logo, favicon: favicon, MATRIZ: MATRIZ, CORPO: CORPO, DETALHE: DETALHE };
113
135
  })(typeof window !== "undefined" ? window : globalThis);
package/bin/primocode.js CHANGED
@@ -1269,26 +1269,33 @@ async function handleSlash(text) {
1269
1269
  abrir: (u) => tools.openInBrowser(u),
1270
1270
  contar: (info) => {
1271
1271
  sp.stop();
1272
- /* O código continua aparecendo — grande, partido em dois,
1273
- porque é o que se lê de uma tela e se confere noutra. Mas
1274
- agora ele já FOI para a página: o CLI serve o código em
1275
- 127.0.0.1 e a página pergunta ali; e foi para a área de
1276
- transferência, para o "Colar" de um toque onde o
1277
- navegador bloqueia o 127.0.0.1 (Safari). Digitar virou a
1278
- terceira saída, não a primeira. */
1279
1272
  const meio = info.codigo.length === 8
1280
1273
  ? info.codigo.slice(0, 4) + '-' + info.codigo.slice(4) : info.codigo;
1281
1274
  console.log(c.muted(' Abrindo no navegador:'));
1282
1275
  console.log(' ' + c.brand(info.url.replace(/[?&]porta=\d+/, '')));
1283
1276
  console.log('');
1284
- console.log(' ' + c.bold(c.brand(meio.split('').join(' '))));
1285
- console.log('');
1286
- const como = [];
1287
- if (info.porta) como.push('a página preenche sozinha');
1288
- if (info.copiado) como.push('e o código já está copiado');
1289
- console.log(c.dim(' ' + (como.length ? como.join(', ').replace(/^e /, '') + '.'
1290
- : 'Digite o código na página.')));
1291
- console.log(c.dim(' Esperando você aprovar…'));
1277
+ if (info.porta) {
1278
+ /* COM O SERVIDOR LOCAL DE PÉ, NÃO HÁ CÓDIGO PARA LER. A
1279
+ página pergunta ao 127.0.0.1 desta máquina, recebe o
1280
+ código e aprova sozinha assim que a pessoa entra com a
1281
+ conta — "não precisa colocar código, não precisa pra
1282
+ nada, porque ele já libera". Mostrar as oito letras
1283
+ grandes aqui era pedir para ler o que ninguém precisa
1284
+ mais; elas ficam numa linha apagada, só para o caso
1285
+ de o navegador bloquear o 127.0.0.1 (Safari) e a
1286
+ página voltar a pedir. */
1287
+ console.log(' ' + c.white('Entre com a sua conta na página que abriu — o resto é automático.'));
1288
+ console.log(c.dim(` Se a página pedir um código: ${meio}${info.copiado ? ' (já copiado)' : ''}.`));
1289
+ } else {
1290
+ /* Sem porta local (ocupadas, ou bloqueadas), o código
1291
+ volta a ser o caminho — grande, partido em dois,
1292
+ porque é o que se lê de uma tela e se confere noutra. */
1293
+ console.log(' ' + c.bold(c.brand(meio.split('').join(' '))));
1294
+ console.log('');
1295
+ console.log(c.dim(' ' + (info.copiado ? 'O código já está copiado — cole na página.'
1296
+ : 'Digite o código na página.')));
1297
+ }
1298
+ console.log(c.dim(' Esperando o navegador…'));
1292
1299
  },
1293
1300
  });
1294
1301
  sp.stop();
@@ -157,13 +157,13 @@ async function rodar({ perguntar, mostrar, cores: c, interativo = true,
157
157
  mostrar('');
158
158
  mostrar(c.bold(c.brand(' Bem-vindo ao PrimoCode.')));
159
159
  mostrar(c.muted(' Primeiro, entre na sua conta do Conecta Primo AI.'));
160
- mostrar(c.dim(' Vou abrir o navegador; é só confirmar por lá.'));
160
+ mostrar(c.dim(' Vou abrir o navegador; é só entrar com a conta por lá — o resto é automático.'));
161
161
  mostrar('');
162
162
  const r = await conectar();
163
163
  if (!r || r.ok === false) {
164
164
  mostrar('');
165
165
  mostrar(c.err(' Não deu para conectar' + (r && r.error ? `: ${r.error}` : '.')));
166
- mostrar(c.muted(' Tente de novo com ') + c.brand('/conectar') + c.muted('.'));
166
+ mostrar(c.muted(' Tente de novo com ') + c.brand('/connect') + c.muted('.'));
167
167
  return { liberado: false, motivo: 'sem-login' };
168
168
  }
169
169
  credencial = conectado ? conectado() : { plano: r.plano };
@@ -181,7 +181,7 @@ async function rodar({ perguntar, mostrar, cores: c, interativo = true,
181
181
  } else if (!s || !s.ok) {
182
182
  mostrar('');
183
183
  mostrar(c.err(' Não consegui confirmar sua conta' + (s && s.error ? `: ${s.error}` : '.')));
184
- mostrar(c.muted(' Entre de novo com ') + c.brand('/conectar') + c.muted('.'));
184
+ mostrar(c.muted(' Entre de novo com ') + c.brand('/connect') + c.muted('.'));
185
185
  return { liberado: false, motivo: 'sessao-invalida' };
186
186
  }
187
187
 
@@ -195,7 +195,7 @@ async function rodar({ perguntar, mostrar, cores: c, interativo = true,
195
195
  mostrar('');
196
196
  mostrar(c.dim(' Assine em ') + c.brand('conecta-primo-ai.vercel.app')
197
197
  + c.dim(' e rode ') + c.brand('primo') + c.dim(' de novo.'));
198
- mostrar(c.dim(' Já assinou? ') + c.brand('/conectar')
198
+ mostrar(c.dim(' Já assinou? ') + c.brand('/connect')
199
199
  + c.dim(' atualiza o plano nesta máquina.'));
200
200
  mostrar('');
201
201
  return { liberado: false, motivo: 'sem-plano', plano };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "primocode",
3
- "version": "8.38.0",
3
+ "version": "8.38.1",
4
4
  "description": "PrimoCode — agente de engenharia com IA e cursor próprio. Requer conta Conecta Primo AI (Premium ou Super). Cria arquivos, roda comandos, controla navegador e desktop: abre apps, clica em botões e ícones pelo nome, digita e usa atalhos.",
5
5
  "main": "bin/primocode.js",
6
6
  "bin": {