terminal-smart-cli 0.60.0 → 0.61.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.
package/README.md CHANGED
@@ -29,7 +29,12 @@ ts "como libero a porta 443 no ufw?"
29
29
  | `ts agente --ler` / `--plano` | Modo só-leitura (Ask) / propõe um plano sem agir |
30
30
  | `ts agente --worktree` | Isola a run num git worktree (não toca a árvore principal) |
31
31
  | `ts agente --stream-json` | Modo headless/CI: só NDJSON tipado no stdout |
32
- | `ts meta "objetivo grande"` | Missão: checklist + rodadas até terminar (modo noturno) |
32
+ | `ts diagnosticar "erro"` | **Investiga a causa raiz**: hipótese sonda (só-leitura) → verificação adversarial → veredito. `--remoto "ssh user@host"` investiga uma VPS |
33
+ | `ts sentinela add "nome" --cmd "..."` | **Vigia determinístico (zero token)**: check por regra (`--contem`/`--sem`/`exit0`); falhou → avisa no Telegram (`--escalar` anexa o diagnóstico). `ts sentinela instalar` agenda no cron/Task Scheduler |
34
+ | `ts indexar` · `ts buscar "..."` | **Busca semântica no código** (BM25 local, sem custo); o agente usa via `buscar_codigo` |
35
+ | `ts sonhar` | Consolida a memória episódica do projeto em camadas (dream session); `ts sonhar listar` mostra o histórico |
36
+ | `ts perfil usar <nome>` | Personas com **cofre de memória isolado**; `--perfil <nome>` usa um pontualmente |
37
+ | `ts meta "objetivo grande"` | Missão: checklist + rodadas até terminar (modo noturno). Reporta verificação **honesta**: verificada / build-ok-execução-não / não-verificada |
33
38
  | `ts eval suite.json` | Avalia o agente numa suíte de casos (juiz de IA + nota; `--json`/exit 1 pra CI) |
34
39
  | `ts acp` | Servidor Agent Client Protocol — pluga o `ts` em editores tipo Zed |
35
40
  | `ts run "objetivo"` | Orquestra agentes na nuvem (plano + aprovação) |
package/bin/ts.js CHANGED
@@ -1304,8 +1304,11 @@ async function metaCmd() {
1304
1304
  console.log('\n' + _metaChecklistBox(st.checklist));
1305
1305
  if (JSON_OUT) { console.log(JSON.stringify(st)); }
1306
1306
  if (st.status === 'done') {
1307
- console.log(ui.okLine(C.bold(T.meta_done) + C.dim(` · ${st.rounds.length} rodada(s) · ${st.creditsSpent} créditos · ${secs} min` + (st.escalations ? ` · ${st.escalations} escalonamento(s)` : ''))));
1308
- metaMod.notify(token, T.meta_notify_done(st.goal, done, st.creditsSpent));
1307
+ const _vl = metaMod.verificationLabel(st.verification, cfg.lang);
1308
+ const _vtag = (_vl.ok ? C.ok : C.warn)(` · ${_vl.icon} ${_vl.txt}`);
1309
+ console.log((_vl.ok ? ui.okLine : ui.infoLine)(C.bold(T.meta_done) + C.dim(` · ${st.rounds.length} rodada(s) · ${st.creditsSpent} créditos · ${secs} min` + (st.escalations ? ` · ${st.escalations} escalonamento(s)` : '')) + _vtag));
1310
+ if (!_vl.ok) console.log(' ' + C.dim((cfg.lang === 'en' ? 'Heads up: the deliverable was produced but NOT fully proven — check it before relying on it.' : 'Atenção: o entregável foi produzido mas NÃO foi totalmente provado — confira antes de confiar.') + (st.runNote ? ' (' + String(st.runNote).trim() + ')' : '')));
1311
+ metaMod.notify(token, T.meta_notify_done(st.goal, done, st.creditsSpent) + (_vl.ok ? '' : `\n⚠️ ${_vl.txt}`));
1309
1312
  } else if (st.pause_reason === 'awaiting_human' && st.humanRequest) {
1310
1313
  console.log(ui.infoLine(C.bold('🙋 Preciso de você: ') + st.humanRequest.motivo));
1311
1314
  console.log(' ' + C.dim(st.humanRequest.o_que_fazer));
package/lib/meta.js CHANGED
@@ -1100,7 +1100,7 @@ async function run(goal, opts = {}) {
1100
1100
  if (runGate && (b.kind === 'android' || b.kind === 'flutter')) {
1101
1101
  onRound({ n: st.rounds.length + 1, item: (lang === 'en' ? 'Launching the app on the emulator (run gate)…' : 'Abrindo o app no emulador (run gate)…'), attempt: 1 });
1102
1102
  const rg = runApp(b, dir, onAlert);
1103
- if (rg.skipped) { st.buildVerified = true; st.visualOk = true; st.status = 'done'; st.runNote = 'run gate pulado: ' + rg.reason; st.finished_at = new Date().toISOString(); save(st, dir); onRoundDone({ checklist: st.checklist, spent: st.creditsSpent }); return st; }
1103
+ if (rg.skipped) { st.buildVerified = true; st.verification = 'built_not_run'; st.status = 'done'; st.runNote = 'run gate pulado: ' + rg.reason; st.finished_at = new Date().toISOString(); save(st, dir); onRoundDone({ checklist: st.checklist, spent: st.creditsSpent }); return st; }
1104
1104
  if (rg.ok) {
1105
1105
  st.buildVerified = true; st.runVerified = true;
1106
1106
  // ── VISUAL GATE: app abre → tira print e o "olho" critica o layout.
@@ -1126,9 +1126,9 @@ async function run(goal, opts = {}) {
1126
1126
  // Aprovado: impecável OU só com nitpicks cosméticos (não vale queimar rodada cara).
1127
1127
  st.visualOk = true;
1128
1128
  if (vg.severity === 'ressalvas') { st.runNote = (st.runNote || '') + ' visual aprovado com ressalvas cosméticas (sem defeito estrutural)'; onAlert({ type: 'design', text: `👁 ts: visual APROVADO — sobrou só nitpick cosmético (sem defeito estrutural). Não vou gastar polimento caro à toa.` }); }
1129
- st.status = 'done'; st.finished_at = new Date().toISOString(); save(st, dir); onRoundDone({ checklist: st.checklist, spent: st.creditsSpent }); return st;
1129
+ st.verification = 'verified'; st.status = 'done'; st.finished_at = new Date().toISOString(); save(st, dir); onRoundDone({ checklist: st.checklist, spent: st.creditsSpent }); return st;
1130
1130
  }
1131
- } else { st.visualOk = true; st.status = 'done'; st.finished_at = new Date().toISOString(); save(st, dir); onRoundDone({ checklist: st.checklist, spent: st.creditsSpent }); return st; }
1131
+ } else { st.visualOk = true; st.verification = 'verified'; st.status = 'done'; st.finished_at = new Date().toISOString(); save(st, dir); onRoundDone({ checklist: st.checklist, spent: st.creditsSpent }); return st; }
1132
1132
  } else {
1133
1133
  // CRASHOU ao abrir → trata como erro pro executor corrigir (loop igual ao build)
1134
1134
  st.buildFixes = (st.buildFixes || 0) + 1;
@@ -1143,7 +1143,7 @@ async function run(goal, opts = {}) {
1143
1143
  let wg = { ok: true }; try { wg = await webRunGate(b, { token, eye, eyeGate: !!eye && (st.visualFixes || 0) < MAX_VISUAL_FIXES }); } catch (_) {}
1144
1144
  st.creditsSpent += wg.credits || 0;
1145
1145
  if (wg.ok) {
1146
- st.buildVerified = true; st.runVerified = true; st.visualOk = true;
1146
+ st.buildVerified = true; st.runVerified = true; st.visualOk = true; st.verification = 'verified';
1147
1147
  if (wg.shot) st.webShot = wg.shot;
1148
1148
  st.status = 'done'; st.finished_at = new Date().toISOString(); save(st, dir); onRoundDone({ checklist: st.checklist, spent: st.creditsSpent }); return st;
1149
1149
  } else {
@@ -1156,7 +1156,7 @@ async function run(goal, opts = {}) {
1156
1156
  st.buildError = errText;
1157
1157
  }
1158
1158
  } else {
1159
- st.buildVerified = true; st.visualOk = true; st.status = 'done'; st.finished_at = new Date().toISOString(); save(st, dir); onRoundDone({ checklist: st.checklist, spent: st.creditsSpent }); return st;
1159
+ st.buildVerified = true; st.verification = 'built_not_run'; st.runNote = (st.runNote || '') + ' sem gate de execução pra este tipo de projeto — build ok, execução NÃO verificada'; st.status = 'done'; st.finished_at = new Date().toISOString(); save(st, dir); onRoundDone({ checklist: st.checklist, spent: st.creditsSpent }); return st;
1160
1160
  }
1161
1161
  } else { st.buildFixes = (st.buildFixes || 0) + 1; errText = r.out; st.buildError = r.out; }
1162
1162
  // ── ESCALONAMENTO: só em erro REAL de build/crash. Mesmo erro de novo → PENSADOR caro diagnostica ──
@@ -1180,12 +1180,18 @@ async function run(goal, opts = {}) {
1180
1180
  pend = [fixItem];
1181
1181
  }
1182
1182
  } else if (!st.buildVerified || (eye && !st.visualOk)) {
1183
- // Portão precisava rodar mas estourou o teto (build ou visual): encerra registrando a limitação.
1184
- st.buildVerified = true; st.visualOk = true;
1185
- st.status = 'done'; st.finished_at = new Date().toISOString();
1186
- st.runNote = (st.runNote || '') + (visualCapLeft ? '' : ' visual: teto de polimentos atingido');
1183
+ // Portão precisava rodar mas estourou o teto (build ou visual). HONESTIDADE: NÃO forjar
1184
+ // buildVerified/visualOk (ausência de prova NÃO é sucesso). Encerra com status honesto.
1185
+ st.status = 'done';
1186
+ st.verification = st.buildVerified ? 'built_not_run' : 'unverified';
1187
+ st.runNote = (st.runNote || '') + (st.buildVerified
1188
+ ? ' visual: teto de polimentos atingido — aprovação visual NÃO confirmada'
1189
+ : ' build: teto de correções atingido — NÃO compilou/rodou de forma verificada');
1190
+ st.finished_at = new Date().toISOString();
1187
1191
  save(st, dir); onRoundDone({ checklist: st.checklist, spent: st.creditsSpent }); return st;
1188
1192
  } else {
1193
+ // Não precisava de gate (tarefa não-compilável: análise/relatório/config). Honesto: sem gate a aplicar.
1194
+ st.verification = st.verification || 'no_gate';
1189
1195
  st.status = 'done'; st.finished_at = new Date().toISOString(); save(st, dir);
1190
1196
  return st;
1191
1197
  }
@@ -1359,4 +1365,20 @@ async function notify(token, text) {
1359
1365
  try { await api('/api/cli/notify', { method: 'POST', token, body: { text }, timeoutMs: 15000 }); } catch (_) {}
1360
1366
  }
1361
1367
 
1362
- module.exports = { webRunGate, run, load, notify, stateFile, detectBuild, ensureToolchain, runBuild, escalate, designPhase, archPhase, looksVisual, looksComplex, runApp, visualGate, ensureEmulator, _projKind, _llmVision };
1368
+ // Rótulo HONESTO da verificação da missão (nunca finge que provou o que não provou).
1369
+ // verified = build + execução (e visual, se houve olho) passaram de verdade nos gates
1370
+ // built_not_run = compilou, mas a execução não foi verificada (sem gate do tipo, gate pulado, teto visual)
1371
+ // unverified = teto de correções esgotado SEM compilar/rodar de forma verificada
1372
+ // no_gate = tarefa não-compilável (análise/relatório/config) — não havia o que verificar
1373
+ function verificationLabel(ver, lang) {
1374
+ const en = lang === 'en';
1375
+ switch (ver) {
1376
+ case 'verified': return { icon: '✓', txt: en ? 'verified (build + run)' : 'verificada (build + execução)', ok: true };
1377
+ case 'built_not_run': return { icon: '≈', txt: en ? 'build OK — run NOT verified' : 'build OK — execução NÃO verificada', ok: false };
1378
+ case 'unverified': return { icon: '⚠', txt: en ? 'NOT verified (fix limit reached)' : 'NÃO verificada (teto de correções atingido)', ok: false };
1379
+ case 'no_gate': return { icon: '·', txt: en ? 'no build/run gate for this task' : 'sem gate de build/execução p/ esta tarefa', ok: true };
1380
+ default: return { icon: '·', txt: en ? 'not applicable' : 'não aplicável', ok: true };
1381
+ }
1382
+ }
1383
+
1384
+ module.exports = { webRunGate, run, load, notify, stateFile, detectBuild, ensureToolchain, runBuild, escalate, designPhase, archPhase, looksVisual, looksComplex, runApp, visualGate, ensureEmulator, _projKind, _llmVision, verificationLabel };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "terminal-smart-cli",
3
- "version": "0.60.0",
3
+ "version": "0.61.0",
4
4
  "description": "Terminal Smart no seu terminal — pergunte, analise logs por pipe e orquestre agentes de IA. Comando: ts",
5
5
  "bin": {
6
6
  "ts": "bin/ts.js"