synthesisui 0.16.184 → 0.16.186
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/dist/commands/doctor.js +8 -1
- package/dist/commands/upgrade.js +34 -20
- package/dist/doctor/ledger.js +26 -0
- package/dist/repo-state.js +3 -0
- package/package.json +1 -1
package/dist/commands/doctor.js
CHANGED
|
@@ -8,7 +8,7 @@ import { emptyTally, internalSpecifiers, scanComponentsInto, tallyToInventory, }
|
|
|
8
8
|
import { checkContracts } from "../doctor/contract-check.js";
|
|
9
9
|
import { describeMissing, missingDependencies, summarizeMissing, } from "../doctor/dependencies.js";
|
|
10
10
|
import { findFrozenBindings } from "../doctor/frozen.js";
|
|
11
|
-
import { appendEvent, readEvents, summarize } from "../doctor/ledger.js";
|
|
11
|
+
import { appendEvent, readEvents, suggestionsFrom, summarize, } from "../doctor/ledger.js";
|
|
12
12
|
import { bindingsFromDocument, countComponents, findOverrides, } from "../doctor/overrides.js";
|
|
13
13
|
import { checkableName, readRequests, verifyAndCloseRequests, } from "../doctor/requests.js";
|
|
14
14
|
import { diagnose, scanSource, siblingTokens, } from "../doctor/scan.js";
|
|
@@ -706,6 +706,9 @@ export async function doctor(opts) {
|
|
|
706
706
|
...(d.findings.some((f) => f.crossFamily)
|
|
707
707
|
? { crossFamily: d.findings.filter((f) => f.crossFamily).length }
|
|
708
708
|
: {}),
|
|
709
|
+
...(d.repeats.some((r) => r.token)
|
|
710
|
+
? { matched: suggestionsFrom(d.repeats) }
|
|
711
|
+
: {}),
|
|
709
712
|
}).catch(() => { });
|
|
710
713
|
console.log("");
|
|
711
714
|
if (opts.fix) {
|
|
@@ -796,6 +799,10 @@ export async function doctor(opts) {
|
|
|
796
799
|
coverage: d.coverage,
|
|
797
800
|
named: d.named,
|
|
798
801
|
...(crossFamily > 0 ? { crossFamily } : {}),
|
|
802
|
+
/** E os pares em si, para a plataforma reavaliar sem esperar outra medição - ver `matched`. */
|
|
803
|
+
...(d.repeats.some((r) => r.token)
|
|
804
|
+
? { matched: suggestionsFrom(d.repeats) }
|
|
805
|
+
: {}),
|
|
799
806
|
});
|
|
800
807
|
}
|
|
801
808
|
if (hasSystem && fullRun) {
|
package/dist/commands/upgrade.js
CHANGED
|
@@ -137,6 +137,28 @@ async function rewireIfBehind(root, cli) {
|
|
|
137
137
|
console.log(`↻ the check after every write moved from ${pinned} to ${cli}`);
|
|
138
138
|
console.log(" Reopen your editor session - hooks are read at startup.");
|
|
139
139
|
}
|
|
140
|
+
/**
|
|
141
|
+
* O RECIBO DO PRÓPRIO UPGRADE - e há UM lugar que o emite, para os dois caminhos de escrita.
|
|
142
|
+
*
|
|
143
|
+
* Um upgrade que entrega arquivos novos e depois pede para alguém lembrar de conferir deixa a pessoa
|
|
144
|
+
* sem saber se funcionou (dono, 01/08). Então a checagem roda daqui, sobre a mesma raiz, e o
|
|
145
|
+
* relatório dela é o recibo.
|
|
146
|
+
*
|
|
147
|
+
* ELE VIROU UMA FUNÇÃO SÓ em 08/08 porque a duplicata custou caro: a chamada morava no fim do
|
|
148
|
+
* caminho de troca de VERSÃO, e o caminho de rematerialização - o comum, o que o alerta do terminal
|
|
149
|
+
* aciona - saía antes por um `return`. Os dois números do alerta fechavam e a medição continuava
|
|
150
|
+
* parada. Um spec textual passava, porque a chamada existia; ela é que não era alcançada.
|
|
151
|
+
*
|
|
152
|
+
* NUNCA `strict`. Um achado é informação, não falha do upgrade, e sair com erro por causa do drift da
|
|
153
|
+
* própria pessoa transformaria uma instalação bem-sucedida num terminal vermelho.
|
|
154
|
+
*/
|
|
155
|
+
async function checkAfterWriting(root, version) {
|
|
156
|
+
console.log(section(`Checking the app against ${version}`));
|
|
157
|
+
await doctor({ dir: root }).catch((err) => {
|
|
158
|
+
/** Um doctor que não roda não é um upgrade que falhou: os artefatos já estão em disco e certos. */
|
|
159
|
+
console.log(body(`The check could not run (${err instanceof Error ? err.message : "unknown"}). Run \`npx synthesisui doctor\` when you can.`));
|
|
160
|
+
});
|
|
161
|
+
}
|
|
140
162
|
async function theOnlyInstalled(root) {
|
|
141
163
|
const dsDir = join(root, "_synthesisui", "ds");
|
|
142
164
|
const entries = await readdir(dsDir, { withFileTypes: true }).catch(() => []);
|
|
@@ -188,6 +210,17 @@ export async function upgrade(asked, opts) {
|
|
|
188
210
|
...(opts.cli ? { cli: opts.cli } : {}),
|
|
189
211
|
});
|
|
190
212
|
await rewireIfBehind(root, opts.cli);
|
|
213
|
+
/**
|
|
214
|
+
* E ESTE CAMINHO MEDE TAMBÉM - ele não media, e é justamente o que o alerta do terminal manda
|
|
215
|
+
* rodar (dono, 08/08).
|
|
216
|
+
*
|
|
217
|
+
* A rematerialização é o caso comum agora: a versão do DS não mudou, mudou o LEITOR. Só que
|
|
218
|
+
* ela saía por este `return` antes de chegar ao doctor lá embaixo, então a pessoa via os dois
|
|
219
|
+
* números do alerta fecharem e a medição continuar sendo a de dias atrás. Na máquina do dono o
|
|
220
|
+
* `sync` seguinte respondeu `6 checks sent, 0 new` - o comando disse que atualizou e nada foi
|
|
221
|
+
* medido.
|
|
222
|
+
*/
|
|
223
|
+
await checkAfterWriting(root, `v${installed}`);
|
|
191
224
|
await reportWhatIsLeft(root, opts.cli ? { cli: opts.cli } : {});
|
|
192
225
|
return;
|
|
193
226
|
}
|
|
@@ -326,26 +359,7 @@ export async function upgrade(asked, opts) {
|
|
|
326
359
|
console.log("");
|
|
327
360
|
console.log(body(`⚠ Could not regenerate: ${failed.join(", ")} (removed/renamed in v${latest.version}?)`));
|
|
328
361
|
}
|
|
329
|
-
|
|
330
|
-
* THE CHECK RUNS ITSELF - closing the loop the owner asked for end to end
|
|
331
|
-
* (dono, 01/08).
|
|
332
|
-
*
|
|
333
|
-
* An upgrade that lands a v2 whose whole point is "these literals are tokens
|
|
334
|
-
* now" and then says "ask your agent to migrate" leaves the person with no
|
|
335
|
-
* way to know whether it worked. The doctor is the answer and it is one
|
|
336
|
-
* command, so it is not somebody's job to remember: it runs here, over the
|
|
337
|
-
* same root, and its report IS the receipt.
|
|
338
|
-
*
|
|
339
|
-
* Never strict. A finding is information, not a failure of the upgrade, and
|
|
340
|
-
* exiting non-zero on somebody's own drift would turn a successful install
|
|
341
|
-
* into a red terminal.
|
|
342
|
-
*/
|
|
343
|
-
console.log(section("Checking the app against v" + latest.version));
|
|
344
|
-
await doctor({ dir: root }).catch((err) => {
|
|
345
|
-
// A doctor that cannot run is not an upgrade that failed - the artifacts
|
|
346
|
-
// are already on disk and correct.
|
|
347
|
-
console.log(body(`The check could not run (${err instanceof Error ? err.message : "unknown"}). Run \`npx synthesisui doctor\` when you can.`));
|
|
348
|
-
});
|
|
362
|
+
await checkAfterWriting(root, `v${latest.version}`);
|
|
349
363
|
console.log(section("Migrate the app"));
|
|
350
364
|
console.log(body(`The migration brief is at _synthesisui/ds/${slug}/UPGRADE.md`));
|
|
351
365
|
console.log("");
|
package/dist/doctor/ledger.js
CHANGED
|
@@ -27,6 +27,32 @@ import { join } from "node:path";
|
|
|
27
27
|
* same contract every log file that survives a decade has.
|
|
28
28
|
*/
|
|
29
29
|
export const LEDGER_FILE = "ledger.jsonl";
|
|
30
|
+
/**
|
|
31
|
+
* TETO, porque isto viaja e cai num campo `jsonb`.
|
|
32
|
+
*
|
|
33
|
+
* 72 no repo do dono, e a lista já vem ordenada por frequência - então o corte pega a cauda, que é
|
|
34
|
+
* onde mora o valor escrito uma vez em um arquivo. Um repo que passe disso perde a cauda e mantém
|
|
35
|
+
* inteiro o que decide alguma coisa.
|
|
36
|
+
*/
|
|
37
|
+
const MATCHED_CAP = 300;
|
|
38
|
+
/**
|
|
39
|
+
* Os pares a mandar, do agregado que o doctor já monta.
|
|
40
|
+
*
|
|
41
|
+
* Só o que casou com um token: uma sugestão que não existe não tem família para comparar, e as 714
|
|
42
|
+
* sem token do repo do dono são 90% do volume e 0% da informação. A forma é estrutural de propósito -
|
|
43
|
+
* `Diagnosis` mora em `scan.ts`, e importar de lá para cá fecharia um ciclo.
|
|
44
|
+
*/
|
|
45
|
+
export function suggestionsFrom(repeats) {
|
|
46
|
+
return repeats
|
|
47
|
+
.filter((r) => Boolean(r.token))
|
|
48
|
+
.slice(0, MATCHED_CAP)
|
|
49
|
+
.map((r) => ({
|
|
50
|
+
literal: r.literal,
|
|
51
|
+
kind: r.kind,
|
|
52
|
+
token: r.token,
|
|
53
|
+
count: r.count,
|
|
54
|
+
}));
|
|
55
|
+
}
|
|
30
56
|
const ledgerPath = (root) => join(root, "_synthesisui", LEDGER_FILE);
|
|
31
57
|
/** Keep the file from growing forever: past ~1MB, keep the newest half. A
|
|
32
58
|
* trend needs recent history, not an archive. */
|
package/dist/repo-state.js
CHANGED
|
@@ -53,6 +53,9 @@ export async function repoStateOf(projectRoot, slug, cli) {
|
|
|
53
53
|
...(typeof doctor?.crossFamily === "number"
|
|
54
54
|
? { crossFamily: doctor.crossFamily }
|
|
55
55
|
: {}),
|
|
56
|
+
...(doctor?.matched && doctor.matched.length > 0
|
|
57
|
+
? { matched: doctor.matched }
|
|
58
|
+
: {}),
|
|
56
59
|
...(typeof lock?.fetchedAt === "string"
|
|
57
60
|
? { installedAt: lock.fetchedAt }
|
|
58
61
|
: {}),
|
package/package.json
CHANGED