expxdev 0.5.1 → 0.5.2
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/cli/init.js +39 -5
- package/dist/cli/init.js.map +1 -1
- package/dist/harness/hooks.d.ts +9 -4
- package/dist/harness/hooks.js +34 -3
- package/dist/harness/hooks.js.map +1 -1
- package/dist/harness/instalar.d.ts +19 -0
- package/dist/harness/instalar.js +42 -1
- package/dist/harness/instalar.js.map +1 -1
- package/dist/harness/settings.js +6 -0
- package/dist/harness/settings.js.map +1 -1
- package/dist/nucleo/busca.d.ts +8 -0
- package/dist/nucleo/busca.js +27 -2
- package/dist/nucleo/busca.js.map +1 -1
- package/dist/nucleo/catalogo.d.ts +7 -1
- package/dist/nucleo/catalogo.js +73 -9
- package/dist/nucleo/catalogo.js.map +1 -1
- package/dist/nucleo/layout.d.ts +8 -0
- package/dist/nucleo/layout.js +22 -0
- package/dist/nucleo/layout.js.map +1 -1
- package/dist/parser/descoberta/trabalhos.d.ts +14 -2
- package/dist/parser/descoberta/trabalhos.js +59 -0
- package/dist/parser/descoberta/trabalhos.js.map +1 -1
- package/dist/parser/esquema/cabecalho.d.ts +21 -5
- package/dist/parser/esquema/cabecalho.js +24 -5
- package/dist/parser/esquema/cabecalho.js.map +1 -1
- package/dist/parser/esquema/enums.d.ts +41 -4
- package/dist/parser/esquema/enums.js +39 -9
- package/dist/parser/esquema/enums.js.map +1 -1
- package/dist/parser/esquema/evento.d.ts +1 -0
- package/dist/parser/esquema/kinds.d.ts +288 -0
- package/dist/parser/esquema/kinds.js +84 -1
- package/dist/parser/esquema/kinds.js.map +1 -1
- package/dist/plugin/montagem.d.ts +5 -0
- package/dist/plugin/montagem.js +67 -1
- package/dist/plugin/montagem.js.map +1 -1
- package/dist/servidor/http.d.ts +5 -0
- package/dist/servidor/http.js +28 -0
- package/dist/servidor/http.js.map +1 -1
- package/dist/servidor/observador.d.ts +27 -1
- package/dist/servidor/observador.js +152 -19
- package/dist/servidor/observador.js.map +1 -1
- package/dist/servidor/painel.js +13 -3
- package/dist/servidor/painel.js.map +1 -1
- package/dist/update/comparar.js +2 -2
- package/dist/update/comparar.js.map +1 -1
- package/dist/watch/desenho/barra.d.ts +29 -0
- package/dist/watch/desenho/barra.js +111 -0
- package/dist/watch/desenho/barra.js.map +1 -0
- package/dist/watch/desenho/desenhar.d.ts +15 -2
- package/dist/watch/desenho/desenhar.js +65 -11
- package/dist/watch/desenho/desenhar.js.map +1 -1
- package/dist/watch/desenho/painel.d.ts +14 -0
- package/dist/watch/desenho/painel.js +260 -0
- package/dist/watch/desenho/painel.js.map +1 -0
- package/dist/watch/fontes/estado-schema.d.ts +7 -0
- package/dist/watch/opcoes.d.ts +2 -0
- package/dist/watch/opcoes.js +11 -4
- package/dist/watch/opcoes.js.map +1 -1
- package/dist/watch/terminal/tela.d.ts +15 -12
- package/dist/watch/terminal/tela.js +79 -3
- package/dist/watch/terminal/tela.js.map +1 -1
- package/dist/watch/visao/atividade.d.ts +70 -0
- package/dist/watch/visao/atividade.js +0 -0
- package/dist/watch/visao/atividade.js.map +1 -0
- package/dist/watch/visao/frota.d.ts +46 -0
- package/dist/watch/visao/frota.js +67 -0
- package/dist/watch/visao/frota.js.map +1 -0
- package/dist/watch/visao/projetar.d.ts +9 -0
- package/dist/watch/visao/projetar.js +55 -0
- package/dist/watch/visao/projetar.js.map +1 -1
- package/dist/watch/watch.d.ts +2 -0
- package/dist/watch/watch.js +48 -3
- package/dist/watch/watch.js.map +1 -1
- package/nucleo/hooks/expx-lembrete.sh +136 -0
- package/package.json +1 -1
package/dist/plugin/montagem.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { cpSync, existsSync, mkdirSync, writeFileSync } from "node:fs";
|
|
1
|
+
import { cpSync, existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
2
2
|
import { basename, dirname, join } from "node:path";
|
|
3
3
|
import { fileURLToPath } from "node:url";
|
|
4
4
|
import { montarPluginJson, montarMarketplaceJson, ORIGEM_DO_PLUGIN } from "./manifestos.js";
|
|
@@ -14,6 +14,70 @@ import { montarPluginJson, montarMarketplaceJson, ORIGEM_DO_PLUGIN } from "./man
|
|
|
14
14
|
function raizDoNucleo() {
|
|
15
15
|
return join(dirname(fileURLToPath(import.meta.url)), "..", "..", "nucleo");
|
|
16
16
|
}
|
|
17
|
+
/**
|
|
18
|
+
* Leva os hooks das skills para dentro do plugin e consolida o `hooks.json`.
|
|
19
|
+
*
|
|
20
|
+
* ## Por que isto existe
|
|
21
|
+
*
|
|
22
|
+
* O plugin montado tinha `skills/`, `commands/` e `nucleo/` — e nenhum hook.
|
|
23
|
+
* Como todo caminho de erro do rastro é falha aberta (regra 3 do contrato
|
|
24
|
+
* `expx-eventos`), nada avisava: `docs/eventos/` nunca era escrito, e o painel
|
|
25
|
+
* e o `expx watch` ficavam sem a seção de eventos e sem o rodapé de atividade.
|
|
26
|
+
* O sintoma que chega à pessoa é uma tela parada.
|
|
27
|
+
*
|
|
28
|
+
* ## Como o Claude Code carrega isto
|
|
29
|
+
*
|
|
30
|
+
* `hooks/hooks.json` na raiz do plugin, detectado automaticamente quando o
|
|
31
|
+
* plugin está habilitado — não precisa ser declarado no `plugin.json`. Os
|
|
32
|
+
* comandos usam `${CLAUDE_PLUGIN_ROOT}`, que resolve para a pasta do plugin
|
|
33
|
+
* instalado, e é por isso que a ÁRVORE toda precisa viajar: o despachante
|
|
34
|
+
* chama `comum/rastro`, `runx/escopo-da-ocorrencia` e afins por caminho
|
|
35
|
+
* relativo, e um arquivo solto não resolveria nenhum deles.
|
|
36
|
+
*
|
|
37
|
+
* ## Conflito entre skills
|
|
38
|
+
*
|
|
39
|
+
* Cada skill traz o seu `hooks.json` e todas caem na mesma pasta. Os arquivos
|
|
40
|
+
* são copiados sob o namespace que a própria skill já usa (`comum/`, `runx/`,
|
|
41
|
+
* `sprintx/`), então a colisão real seria duas skills com o mesmo caminho —
|
|
42
|
+
* que é o `comum/` compartilhado, e nesse caso são o mesmo arquivo por
|
|
43
|
+
* construção. Os eventos são concatenados: dois `PostToolUse` de skills
|
|
44
|
+
* diferentes viram duas entradas, e o Claude Code roda as duas.
|
|
45
|
+
*/
|
|
46
|
+
function montarHooks(destino, skills) {
|
|
47
|
+
const comArvore = skills.filter((s) => s.arvoreHooks !== undefined && existsSync(s.arvoreHooks));
|
|
48
|
+
if (comArvore.length === 0)
|
|
49
|
+
return;
|
|
50
|
+
const dirHooks = join(destino, "hooks");
|
|
51
|
+
mkdirSync(dirHooks, { recursive: true });
|
|
52
|
+
const consolidado = { hooks: {} };
|
|
53
|
+
for (const s of comArvore) {
|
|
54
|
+
// O `hooks.json` de cada skill é consolidado, não copiado: dois arquivos
|
|
55
|
+
// com o mesmo nome se sobrescreveriam e a última skill venceria em
|
|
56
|
+
// silêncio, desligando os hooks de todas as outras.
|
|
57
|
+
cpSync(s.arvoreHooks, dirHooks, {
|
|
58
|
+
recursive: true,
|
|
59
|
+
filter: (origem) => basename(origem) !== "hooks.json",
|
|
60
|
+
});
|
|
61
|
+
const manifesto = join(s.arvoreHooks, "hooks.json");
|
|
62
|
+
if (!existsSync(manifesto))
|
|
63
|
+
continue;
|
|
64
|
+
let lido;
|
|
65
|
+
try {
|
|
66
|
+
lido = JSON.parse(readFileSync(manifesto, "utf8"));
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
continue; // hooks.json quebrado não derruba a instalação inteira
|
|
70
|
+
}
|
|
71
|
+
for (const [evento, grupos] of Object.entries(lido.hooks ?? {})) {
|
|
72
|
+
if (!Array.isArray(grupos))
|
|
73
|
+
continue;
|
|
74
|
+
consolidado.hooks[evento] = [...(consolidado.hooks[evento] ?? []), ...grupos];
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
if (Object.keys(consolidado.hooks).length > 0) {
|
|
78
|
+
writeFileSync(join(dirHooks, "hooks.json"), `${JSON.stringify(consolidado, null, 2)}\n`);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
17
81
|
/** Monta só o plugin, em `destino`. */
|
|
18
82
|
export function montarPlugin(destino, skills, versao) {
|
|
19
83
|
mkdirSync(join(destino, ".claude-plugin"), { recursive: true });
|
|
@@ -35,6 +99,8 @@ export function montarPlugin(destino, skills, versao) {
|
|
|
35
99
|
cpSync(c, join(destino, "commands", basename(c)));
|
|
36
100
|
}
|
|
37
101
|
}
|
|
102
|
+
// Sem isto o plugin sobe sem hook nenhum e o rastro nunca é escrito.
|
|
103
|
+
montarHooks(destino, skills);
|
|
38
104
|
}
|
|
39
105
|
/**
|
|
40
106
|
* Monta marketplace e plugin, com o plugin DENTRO do marketplace.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"montagem.js","sourceRoot":"","sources":["../../src/plugin/montagem.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"montagem.js","sourceRoot":"","sources":["../../src/plugin/montagem.ts"],"names":[],"mappings":"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"}
|
package/dist/servidor/http.d.ts
CHANGED
|
@@ -26,6 +26,11 @@ export type ServidorPainel = {
|
|
|
26
26
|
url: () => string;
|
|
27
27
|
estado: () => EstadoPainel;
|
|
28
28
|
recarregar: () => EstadoPainel;
|
|
29
|
+
/**
|
|
30
|
+
* Relê SÓ o índice do memox e troca `estado.memoria`, sem voltar ao disco
|
|
31
|
+
* para o resto do projeto. Ver o watcher dedicado em `observador.ts`.
|
|
32
|
+
*/
|
|
33
|
+
recarregarMemoria: () => EstadoPainel;
|
|
29
34
|
aoAtualizar: (ouvinte: (e: EstadoPainel) => void) => void;
|
|
30
35
|
http: Server;
|
|
31
36
|
fechar: () => Promise<void>;
|
package/dist/servidor/http.js
CHANGED
|
@@ -2,6 +2,8 @@ import { createServer } from "node:http";
|
|
|
2
2
|
import { readFileSync, existsSync } from "node:fs";
|
|
3
3
|
import { extname, join, normalize, resolve, sep } from "node:path";
|
|
4
4
|
import { lerEstado } from "./estado.js";
|
|
5
|
+
import { lerIndice } from "../parser/memoria/ler.js";
|
|
6
|
+
import { projetar } from "../parser/memoria/projetar.js";
|
|
5
7
|
import { paginaRelatorio } from "../relatorio/pagina.js";
|
|
6
8
|
/**
|
|
7
9
|
* O servidor escuta EXCLUSIVAMENTE em 127.0.0.1.
|
|
@@ -53,6 +55,31 @@ export async function criarServidor(op) {
|
|
|
53
55
|
o(estado);
|
|
54
56
|
return estado;
|
|
55
57
|
}
|
|
58
|
+
/**
|
|
59
|
+
* Releitura barata para o caso em que só o índice mudou.
|
|
60
|
+
*
|
|
61
|
+
* Não remonta o projeto de propósito: montar varre `docs/` inteiro, e o
|
|
62
|
+
* índice nasce justamente quando o memox termina de indexar — remontar ali
|
|
63
|
+
* seria pagar a varredura completa por um dado que não veio de `docs/`.
|
|
64
|
+
*
|
|
65
|
+
* A leitura falha aberta como em toda parte (D-05): índice ausente ou
|
|
66
|
+
* corrompido vira `null`, que é o mesmo estado legítimo de sempre.
|
|
67
|
+
*
|
|
68
|
+
* Só difunde quando a projeção REALMENTE mudou. Sem essa comparação, cada
|
|
69
|
+
* reescrita do índice — o motor reescreve o arquivo inteiro a cada
|
|
70
|
+
* reconstrução — empurraria o estado inteiro para todos os clientes (D-28)
|
|
71
|
+
* sem nada de novo na tela.
|
|
72
|
+
*/
|
|
73
|
+
function recarregarMemoria() {
|
|
74
|
+
const indice = lerIndice(op.raiz);
|
|
75
|
+
const memoria = indice === null ? null : projetar(indice);
|
|
76
|
+
if (JSON.stringify(memoria) === JSON.stringify(estado.memoria))
|
|
77
|
+
return estado;
|
|
78
|
+
estado = { ...estado, memoria };
|
|
79
|
+
for (const o of ouvintes)
|
|
80
|
+
o(estado);
|
|
81
|
+
return estado;
|
|
82
|
+
}
|
|
56
83
|
const http = createServer((req, res) => {
|
|
57
84
|
// O painel é somente leitura: nenhum método além de GET é aceito.
|
|
58
85
|
if (req.method !== "GET") {
|
|
@@ -124,6 +151,7 @@ export async function criarServidor(op) {
|
|
|
124
151
|
url: () => `http://${HOST}:${String(endereco().port)}`,
|
|
125
152
|
estado: () => estado,
|
|
126
153
|
recarregar,
|
|
154
|
+
recarregarMemoria,
|
|
127
155
|
aoAtualizar: (o) => ouvintes.push(o),
|
|
128
156
|
http,
|
|
129
157
|
fechar: () => new Promise((ok) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/servidor/http.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAA0D,MAAM,WAAW,CAAC;AACjG,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AACnE,OAAO,EAAE,SAAS,EAAqB,MAAM,aAAa,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAuB,MAAM,wBAAwB,CAAC;AAE9E;;;;;;;GAOG;AACH,MAAM,IAAI,GAAG,WAAoB,CAAC;AAElC;;;;;;GAMG;AACH,MAAM,OAAO,WAAY,SAAQ,KAAK;IAC3B,KAAK,CAAS;IAEvB,YAAY,KAAa;QACvB,KAAK,CAAC,WAAW,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;QACjD,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;QAC1B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;CACF;
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/servidor/http.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,16 @@
|
|
|
1
1
|
export type Observador = {
|
|
2
2
|
parar: () => Promise<void>;
|
|
3
3
|
};
|
|
4
|
+
export type OpcoesObservador = {
|
|
5
|
+
/** Disparado quando `docs/` muda: releitura total do projeto. */
|
|
6
|
+
aoMudar: () => void;
|
|
7
|
+
/**
|
|
8
|
+
* Disparado quando o índice do memox muda. Opcional: sem ele, o índice
|
|
9
|
+
* volta a só ser lido na montagem, que é o comportamento antigo.
|
|
10
|
+
*/
|
|
11
|
+
aoMudarMemoria?: () => void;
|
|
12
|
+
debounceMs?: number;
|
|
13
|
+
};
|
|
4
14
|
/**
|
|
5
15
|
* Observa a pasta e agrupa alterações próximas num único disparo.
|
|
6
16
|
*
|
|
@@ -8,5 +18,21 @@ export type Observador = {
|
|
|
8
18
|
* de task, e ler o arquivo no instante da gravação produz YAML truncado —
|
|
9
19
|
* uma rejeição transitória que apareceria e sumiria da tela "fora do schema".
|
|
10
20
|
* Esperar o silêncio evita mostrar ao usuário um erro que não existe.
|
|
21
|
+
*
|
|
22
|
+
* São DOIS watchers, com destinos diferentes, e a separação é o que mantém a
|
|
23
|
+
* decisão D-06 de pé enquanto corrige o caso que ela deixou de fora:
|
|
24
|
+
*
|
|
25
|
+
* `docs/` releitura TOTAL do projeto (`aoMudar`).
|
|
26
|
+
* `.expx/memoria/` releitura SÓ do índice (`aoMudarMemoria`).
|
|
27
|
+
*
|
|
28
|
+
* D-06 proibiu observar `.expx` porque reindexar dispararia o watcher, que
|
|
29
|
+
* recarregaria o estado, que releria `docs/` — e uma reindexação disparada por
|
|
30
|
+
* mudança em `docs/` realimentaria a recarga. A trava cortava o laço, mas
|
|
31
|
+
* cortava junto o caso legítimo: o índice NASCER com o painel no ar. Um painel
|
|
32
|
+
* aberto antes da primeira indexação mostrava "sem índice de memória" para
|
|
33
|
+
* sempre, mesmo com o índice pronto no disco.
|
|
34
|
+
*
|
|
35
|
+
* Separar por destino corta o laço na raiz em vez de na porta: a releitura do
|
|
36
|
+
* índice não toca `docs/` e não reindexa nada, então não tem como realimentar.
|
|
11
37
|
*/
|
|
12
|
-
export declare function observar(raiz: string, aoMudar: () => void, debounceMs?: number): Promise<Observador>;
|
|
38
|
+
export declare function observar(raiz: string, aoMudar: (() => void) | OpcoesObservador, debounceMs?: number): Promise<Observador>;
|
|
@@ -1,4 +1,25 @@
|
|
|
1
1
|
import { watch } from "chokidar";
|
|
2
|
+
import { existsSync, mkdirSync } from "node:fs";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
/** Agrupa alterações próximas num único disparo. */
|
|
5
|
+
function debounce(fn, ms) {
|
|
6
|
+
let timer = null;
|
|
7
|
+
return {
|
|
8
|
+
agendar: () => {
|
|
9
|
+
if (timer)
|
|
10
|
+
clearTimeout(timer);
|
|
11
|
+
timer = setTimeout(() => {
|
|
12
|
+
timer = null;
|
|
13
|
+
fn();
|
|
14
|
+
}, ms);
|
|
15
|
+
},
|
|
16
|
+
cancelar: () => {
|
|
17
|
+
if (timer)
|
|
18
|
+
clearTimeout(timer);
|
|
19
|
+
timer = null;
|
|
20
|
+
},
|
|
21
|
+
};
|
|
22
|
+
}
|
|
2
23
|
/**
|
|
3
24
|
* Observa a pasta e agrupa alterações próximas num único disparo.
|
|
4
25
|
*
|
|
@@ -6,35 +27,147 @@ import { watch } from "chokidar";
|
|
|
6
27
|
* de task, e ler o arquivo no instante da gravação produz YAML truncado —
|
|
7
28
|
* uma rejeição transitória que apareceria e sumiria da tela "fora do schema".
|
|
8
29
|
* Esperar o silêncio evita mostrar ao usuário um erro que não existe.
|
|
30
|
+
*
|
|
31
|
+
* São DOIS watchers, com destinos diferentes, e a separação é o que mantém a
|
|
32
|
+
* decisão D-06 de pé enquanto corrige o caso que ela deixou de fora:
|
|
33
|
+
*
|
|
34
|
+
* `docs/` releitura TOTAL do projeto (`aoMudar`).
|
|
35
|
+
* `.expx/memoria/` releitura SÓ do índice (`aoMudarMemoria`).
|
|
36
|
+
*
|
|
37
|
+
* D-06 proibiu observar `.expx` porque reindexar dispararia o watcher, que
|
|
38
|
+
* recarregaria o estado, que releria `docs/` — e uma reindexação disparada por
|
|
39
|
+
* mudança em `docs/` realimentaria a recarga. A trava cortava o laço, mas
|
|
40
|
+
* cortava junto o caso legítimo: o índice NASCER com o painel no ar. Um painel
|
|
41
|
+
* aberto antes da primeira indexação mostrava "sem índice de memória" para
|
|
42
|
+
* sempre, mesmo com o índice pronto no disco.
|
|
43
|
+
*
|
|
44
|
+
* Separar por destino corta o laço na raiz em vez de na porta: a releitura do
|
|
45
|
+
* índice não toca `docs/` e não reindexa nada, então não tem como realimentar.
|
|
9
46
|
*/
|
|
10
47
|
export async function observar(raiz, aoMudar, debounceMs = 300) {
|
|
11
|
-
|
|
12
|
-
const
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
timer = null;
|
|
17
|
-
aoMudar();
|
|
18
|
-
}, debounceMs);
|
|
48
|
+
const op = typeof aoMudar === "function" ? { aoMudar, debounceMs } : aoMudar;
|
|
49
|
+
const ms = op.debounceMs ?? debounceMs;
|
|
50
|
+
const comum = {
|
|
51
|
+
ignoreInitial: true,
|
|
52
|
+
awaitWriteFinish: { stabilityThreshold: Math.max(50, ms / 3), pollInterval: 20 },
|
|
19
53
|
};
|
|
54
|
+
/**
|
|
55
|
+
* A pasta do índice é criada ANTES de qualquer watcher subir, e a ordem é o
|
|
56
|
+
* que evita instabilidade: criada depois, a escrita cai no meio da varredura
|
|
57
|
+
* inicial dos dois watchers, e o principal chega a emitir `change` de arquivo
|
|
58
|
+
* que ninguém tocou. Antes, a árvore já está parada quando a observação
|
|
59
|
+
* começa.
|
|
60
|
+
*
|
|
61
|
+
* Criar não é efeito colateral gratuito, é o que faz o watcher funcionar:
|
|
62
|
+
* medido, o chokidar apontado para um caminho inexistente nunca passa a vê-lo
|
|
63
|
+
* quando ele nasce — fica cego para sempre. E o caminho inexistente é
|
|
64
|
+
* exatamente o caso que este watcher cobre, o painel que sobe num projeto
|
|
65
|
+
* nunca indexado. Uma pasta vazia é inócua: o motor do memox faz `mkdir -p`
|
|
66
|
+
* do mesmo caminho quando indexa.
|
|
67
|
+
*
|
|
68
|
+
* Falha aberta (D-05): sem permissão de escrita, o painel sobe sem o watcher
|
|
69
|
+
* do índice em vez de não subir — a montagem ainda lê o índice.
|
|
70
|
+
*/
|
|
71
|
+
const pastaMemoria = join(raiz, ".expx", "memoria");
|
|
72
|
+
if (op.aoMudarMemoria) {
|
|
73
|
+
try {
|
|
74
|
+
mkdirSync(pastaMemoria, { recursive: true });
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
// segue sem observar o índice
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
const docs = debounce(op.aoMudar, ms);
|
|
81
|
+
/**
|
|
82
|
+
* `ignoreInitial` sozinho NÃO basta quando há `awaitWriteFinish`.
|
|
83
|
+
*
|
|
84
|
+
* Medido neste repositório: com os dois ligados, a varredura inicial ainda
|
|
85
|
+
* entrega `change` de arquivo que ninguém tocou DEPOIS do evento `ready` — o
|
|
86
|
+
* `awaitWriteFinish` segura esses eventos além do ponto em que o
|
|
87
|
+
* `ignoreInitial` os descartaria. Em teste, com a árvore recém-copiada, isso
|
|
88
|
+
* fazia `docs/relatorios/INDICE.md` "mudar" sozinho; em uso real é o mesmo
|
|
89
|
+
* mecanismo, só que disparado por checkout ou sincronização de pasta.
|
|
90
|
+
*
|
|
91
|
+
* O watch de terminal já resolvia assim (`watch/fontes/observar.ts`); o
|
|
92
|
+
* painel não tinha o portão, e por isso recarregava à toa logo depois de
|
|
93
|
+
* subir.
|
|
94
|
+
*
|
|
95
|
+
* Só ligamos os gatilhos depois que a poeira da subida assenta.
|
|
96
|
+
*/
|
|
97
|
+
let armado = false;
|
|
98
|
+
// `.expx` continua FORA do watcher principal: quem cuida dele é o watcher
|
|
99
|
+
// dedicado abaixo, e deixar os dois verem a mesma escrita traria de volta
|
|
100
|
+
// exatamente a realimentação que D-06 evitou.
|
|
20
101
|
const watcher = watch(raiz, {
|
|
21
|
-
|
|
22
|
-
// `.expx` está aqui por um motivo próprio: é onde o memox grava o índice.
|
|
23
|
-
// Sem ignorá-lo, reindexar dispara o watcher, que recarrega o estado, que
|
|
24
|
-
// relê o índice — e uma reindexação disparada por mudança em `docs/`
|
|
25
|
-
// realimentaria a recarga sem dado novo nenhum (decisão D-06).
|
|
102
|
+
...comum,
|
|
26
103
|
ignored: (caminho) => /(^|[/\\])(node_modules|\.git|dist|\.expx)([/\\]|$)/.test(caminho),
|
|
27
|
-
awaitWriteFinish: { stabilityThreshold: Math.max(50, debounceMs / 3), pollInterval: 20 },
|
|
28
104
|
});
|
|
29
|
-
|
|
105
|
+
const eventos = ["add", "change", "unlink", "addDir", "unlinkDir"];
|
|
106
|
+
for (const e of eventos)
|
|
107
|
+
watcher.on(e, () => { if (armado)
|
|
108
|
+
docs.agendar(); });
|
|
30
109
|
// erro de observação (permissão, limite de watchers) não derruba o painel
|
|
31
110
|
watcher.on("error", () => undefined);
|
|
32
|
-
|
|
111
|
+
/**
|
|
112
|
+
* Ancorar na PASTA do índice, e não na raiz, é medido. Um segundo watcher
|
|
113
|
+
* ancorado na raiz faz o `awaitWriteFinish` de ambos varrer os mesmos
|
|
114
|
+
* arquivos, e o watcher principal passa a receber `change` espúrio de arquivo
|
|
115
|
+
* que ninguém tocou — quebrando as garantias de silêncio que `observação de
|
|
116
|
+
* .expx` cobre.
|
|
117
|
+
*
|
|
118
|
+
* A pasta, e não o arquivo: o motor grava de forma atômica (temporário +
|
|
119
|
+
* rename), o que substitui o inode, e um watcher preso ao arquivo pararia de
|
|
120
|
+
* ver mudança depois da primeira gravação.
|
|
121
|
+
*/
|
|
122
|
+
const memoria = op.aoMudarMemoria;
|
|
123
|
+
let wMemoria = null;
|
|
124
|
+
let mem = null;
|
|
125
|
+
if (memoria && existsSync(pastaMemoria)) {
|
|
126
|
+
mem = debounce(memoria, ms);
|
|
127
|
+
wMemoria = watch(pastaMemoria, {
|
|
128
|
+
...comum,
|
|
129
|
+
depth: 0,
|
|
130
|
+
/**
|
|
131
|
+
* Sondagem, não evento do sistema de arquivos.
|
|
132
|
+
*
|
|
133
|
+
* Medido: apontado para uma pasta recém-criada, o watcher por evento
|
|
134
|
+
* perde a primeira gravação em boa parte das execuções — e a primeira
|
|
135
|
+
* gravação é justamente o caso que este watcher existe para pegar, o
|
|
136
|
+
* índice nascendo com o painel no ar. Com sondagem, as dez execuções de
|
|
137
|
+
* medição viram o arquivo nascer e ser reescrito, sem exceção.
|
|
138
|
+
*
|
|
139
|
+
* O custo é um `stat` por intervalo em UM arquivo pequeno, que o memox
|
|
140
|
+
* reescreve poucas vezes por dia. É barato, e o watcher de `docs/` — que
|
|
141
|
+
* vê a árvore inteira — segue por evento.
|
|
142
|
+
*
|
|
143
|
+
* O intervalo acompanha o debounce: sondar mais devagar que a janela de
|
|
144
|
+
* agrupamento faria a detecção, e não o debounce, mandar no atraso.
|
|
145
|
+
*/
|
|
146
|
+
usePolling: true,
|
|
147
|
+
interval: Math.max(50, Math.floor(ms / 2)),
|
|
148
|
+
});
|
|
149
|
+
for (const e of eventos)
|
|
150
|
+
wMemoria.on(e, () => { if (armado)
|
|
151
|
+
mem?.agendar(); });
|
|
152
|
+
wMemoria.on("error", () => undefined);
|
|
153
|
+
}
|
|
154
|
+
await Promise.all([
|
|
155
|
+
new Promise((ok) => watcher.on("ready", () => ok())),
|
|
156
|
+
wMemoria ? new Promise((ok) => wMemoria.on("ready", () => ok())) : Promise.resolve(),
|
|
157
|
+
]);
|
|
158
|
+
// A janela de silêncio: um pouco mais que o `stabilityThreshold`, que é o
|
|
159
|
+
// que atrasa os eventos da varredura inicial.
|
|
160
|
+
await new Promise((ok) => setTimeout(ok, comum.awaitWriteFinish.stabilityThreshold + 60));
|
|
161
|
+
// O que tiver sido agendado durante a subida é descartado: não é mudança.
|
|
162
|
+
docs.cancelar();
|
|
163
|
+
mem?.cancelar();
|
|
164
|
+
armado = true;
|
|
33
165
|
return {
|
|
34
166
|
parar: async () => {
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
167
|
+
armado = false;
|
|
168
|
+
docs.cancelar();
|
|
169
|
+
mem?.cancelar();
|
|
170
|
+
await Promise.all([watcher.close(), wMemoria?.close() ?? Promise.resolve()]);
|
|
38
171
|
},
|
|
39
172
|
};
|
|
40
173
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"observador.js","sourceRoot":"","sources":["../../src/servidor/observador.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAkB,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"observador.js","sourceRoot":"","sources":["../../src/servidor/observador.ts"],"names":[],"mappings":"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"}
|
package/dist/servidor/painel.js
CHANGED
|
@@ -29,9 +29,19 @@ export async function iniciarPainel(op) {
|
|
|
29
29
|
cliente.send(JSON.stringify({ tipo: "estado", estado: servidor.estado() }));
|
|
30
30
|
});
|
|
31
31
|
servidor.aoAtualizar(difundir);
|
|
32
|
-
const observador = await observar(op.raiz,
|
|
33
|
-
|
|
34
|
-
|
|
32
|
+
const observador = await observar(op.raiz, {
|
|
33
|
+
aoMudar: () => {
|
|
34
|
+
servidor.recarregar();
|
|
35
|
+
},
|
|
36
|
+
// O índice do memox tem caminho próprio: nasce e é reescrito fora de
|
|
37
|
+
// `docs/`, e releitura total ali seria varrer o projeto inteiro por um
|
|
38
|
+
// dado que não veio de `docs/`. Ver `observador.ts` para o porquê da
|
|
39
|
+
// separação em dois watchers.
|
|
40
|
+
aoMudarMemoria: () => {
|
|
41
|
+
servidor.recarregarMemoria();
|
|
42
|
+
},
|
|
43
|
+
debounceMs: op.debounceMs ?? 300,
|
|
44
|
+
});
|
|
35
45
|
return {
|
|
36
46
|
url: () => servidor.url(),
|
|
37
47
|
urlWebsocket: () => `${servidor.url().replace("http://", "ws://")}/ws`,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"painel.js","sourceRoot":"","sources":["../../src/servidor/painel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAkB,MAAM,IAAI,CAAC;AACrD,OAAO,EAAE,aAAa,EAAuB,MAAM,WAAW,CAAC;AAC/D,OAAO,EAAE,QAAQ,EAAmB,MAAM,iBAAiB,CAAC;AAmB5D;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,EAAgB;IAClD,MAAM,QAAQ,GAAmB,MAAM,aAAa,CAAC;QACnD,IAAI,EAAE,EAAE,CAAC,IAAI;QACb,KAAK,EAAE,EAAE,CAAC,KAAK;QACf,GAAG,CAAC,EAAE,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,EAAE,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3E,GAAG,CAAC,EAAE,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACnE,CAAC,CAAC;IAEH,MAAM,GAAG,GAAG,IAAI,eAAe,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAExE,SAAS,QAAQ,CAAC,MAAoB;QACpC,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;QACzD,KAAK,MAAM,OAAO,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;YAClC,IAAI,OAAO,CAAC,UAAU,KAAK,CAAC;gBAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IAED,uDAAuD;IACvD,GAAG,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,OAAkB,EAAE,EAAE;QAC1C,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC;IAC9E,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IAE/B,MAAM,UAAU,GAAe,MAAM,QAAQ,
|
|
1
|
+
{"version":3,"file":"painel.js","sourceRoot":"","sources":["../../src/servidor/painel.ts"],"names":[],"mappings":"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"}
|
package/dist/update/comparar.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { execFile } from "node:child_process";
|
|
2
2
|
import { promisify } from "node:util";
|
|
3
|
-
import {
|
|
3
|
+
import { buscarNoCatalogo } from "../nucleo/catalogo.js";
|
|
4
4
|
import { lerLock } from "../nucleo/lock.js";
|
|
5
5
|
import { resolverAlvo } from "../nucleo/versao.js";
|
|
6
6
|
const exec = promisify(execFile);
|
|
7
7
|
function origemDe(nome, lockRepo, origens) {
|
|
8
|
-
return origens?.[nome] ?? lockRepo ??
|
|
8
|
+
return origens?.[nome] ?? lockRepo ?? buscarNoCatalogo(nome)?.repositorio ?? "";
|
|
9
9
|
}
|
|
10
10
|
/**
|
|
11
11
|
* Os títulos dos commits entre duas referências.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"comparar.js","sourceRoot":"","sources":["../../src/update/comparar.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"comparar.js","sourceRoot":"","sources":["../../src/update/comparar.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { Papel } from "./cor.js";
|
|
2
|
+
/**
|
|
3
|
+
* Uma barra de `largura` colunas representando `feitas` de `total`.
|
|
4
|
+
*
|
|
5
|
+
* Duas regras que evitam mentira visual, e que vieram de olhar a tela:
|
|
6
|
+
* - só está cheia quando `feitas === total`: arredondar 9/10 para cheio faz
|
|
7
|
+
* a pessoa achar que acabou;
|
|
8
|
+
* - qualquer progresso maior que zero acende ao menos um oitavo, para não
|
|
9
|
+
* parecer parado quando já começou.
|
|
10
|
+
*/
|
|
11
|
+
export declare function barra(feitas: number, total: number, largura: number): string;
|
|
12
|
+
/**
|
|
13
|
+
* A barra de atividade: uma onda que anda com o tempo.
|
|
14
|
+
*
|
|
15
|
+
* Não representa quanto falta — representa que algo está acontecendo agora.
|
|
16
|
+
* A fase depende do relógio, então o redesenho a move sozinho, sem estado.
|
|
17
|
+
*/
|
|
18
|
+
export declare function barraIndeterminada(largura: number, agora: Date): string;
|
|
19
|
+
/** O papel de cor de uma barra, pelo que a proporção significa. */
|
|
20
|
+
export declare function papelDaBarra(feitas: number, total: number): Papel;
|
|
21
|
+
/** "45%" — inteiro, porque casa decimal em barra de terminal é ruído. */
|
|
22
|
+
export declare function percentual(feitas: number, total: number): string;
|
|
23
|
+
/**
|
|
24
|
+
* Tempo decorrido, curto: "12s", "2m18s", "1h04", "3d".
|
|
25
|
+
*
|
|
26
|
+
* Segundos aparecem até a hora porque é a escala em que a pessoa percebe que
|
|
27
|
+
* a execução travou. Acima disso viram ruído e somem.
|
|
28
|
+
*/
|
|
29
|
+
export declare function decorrido(ms: number): string;
|