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 +6 -1
- package/bin/ts.js +5 -2
- package/lib/meta.js +32 -10
- package/package.json +1 -1
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
|
|
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
|
-
|
|
1308
|
-
|
|
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.
|
|
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.
|
|
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):
|
|
1184
|
-
|
|
1185
|
-
st.status = 'done';
|
|
1186
|
-
st.
|
|
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
|
-
|
|
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 };
|