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.
Files changed (75) hide show
  1. package/dist/cli/init.js +39 -5
  2. package/dist/cli/init.js.map +1 -1
  3. package/dist/harness/hooks.d.ts +9 -4
  4. package/dist/harness/hooks.js +34 -3
  5. package/dist/harness/hooks.js.map +1 -1
  6. package/dist/harness/instalar.d.ts +19 -0
  7. package/dist/harness/instalar.js +42 -1
  8. package/dist/harness/instalar.js.map +1 -1
  9. package/dist/harness/settings.js +6 -0
  10. package/dist/harness/settings.js.map +1 -1
  11. package/dist/nucleo/busca.d.ts +8 -0
  12. package/dist/nucleo/busca.js +27 -2
  13. package/dist/nucleo/busca.js.map +1 -1
  14. package/dist/nucleo/catalogo.d.ts +7 -1
  15. package/dist/nucleo/catalogo.js +73 -9
  16. package/dist/nucleo/catalogo.js.map +1 -1
  17. package/dist/nucleo/layout.d.ts +8 -0
  18. package/dist/nucleo/layout.js +22 -0
  19. package/dist/nucleo/layout.js.map +1 -1
  20. package/dist/parser/descoberta/trabalhos.d.ts +14 -2
  21. package/dist/parser/descoberta/trabalhos.js +59 -0
  22. package/dist/parser/descoberta/trabalhos.js.map +1 -1
  23. package/dist/parser/esquema/cabecalho.d.ts +21 -5
  24. package/dist/parser/esquema/cabecalho.js +24 -5
  25. package/dist/parser/esquema/cabecalho.js.map +1 -1
  26. package/dist/parser/esquema/enums.d.ts +41 -4
  27. package/dist/parser/esquema/enums.js +39 -9
  28. package/dist/parser/esquema/enums.js.map +1 -1
  29. package/dist/parser/esquema/evento.d.ts +1 -0
  30. package/dist/parser/esquema/kinds.d.ts +288 -0
  31. package/dist/parser/esquema/kinds.js +84 -1
  32. package/dist/parser/esquema/kinds.js.map +1 -1
  33. package/dist/plugin/montagem.d.ts +5 -0
  34. package/dist/plugin/montagem.js +67 -1
  35. package/dist/plugin/montagem.js.map +1 -1
  36. package/dist/servidor/http.d.ts +5 -0
  37. package/dist/servidor/http.js +28 -0
  38. package/dist/servidor/http.js.map +1 -1
  39. package/dist/servidor/observador.d.ts +27 -1
  40. package/dist/servidor/observador.js +152 -19
  41. package/dist/servidor/observador.js.map +1 -1
  42. package/dist/servidor/painel.js +13 -3
  43. package/dist/servidor/painel.js.map +1 -1
  44. package/dist/update/comparar.js +2 -2
  45. package/dist/update/comparar.js.map +1 -1
  46. package/dist/watch/desenho/barra.d.ts +29 -0
  47. package/dist/watch/desenho/barra.js +111 -0
  48. package/dist/watch/desenho/barra.js.map +1 -0
  49. package/dist/watch/desenho/desenhar.d.ts +15 -2
  50. package/dist/watch/desenho/desenhar.js +65 -11
  51. package/dist/watch/desenho/desenhar.js.map +1 -1
  52. package/dist/watch/desenho/painel.d.ts +14 -0
  53. package/dist/watch/desenho/painel.js +260 -0
  54. package/dist/watch/desenho/painel.js.map +1 -0
  55. package/dist/watch/fontes/estado-schema.d.ts +7 -0
  56. package/dist/watch/opcoes.d.ts +2 -0
  57. package/dist/watch/opcoes.js +11 -4
  58. package/dist/watch/opcoes.js.map +1 -1
  59. package/dist/watch/terminal/tela.d.ts +15 -12
  60. package/dist/watch/terminal/tela.js +79 -3
  61. package/dist/watch/terminal/tela.js.map +1 -1
  62. package/dist/watch/visao/atividade.d.ts +70 -0
  63. package/dist/watch/visao/atividade.js +0 -0
  64. package/dist/watch/visao/atividade.js.map +1 -0
  65. package/dist/watch/visao/frota.d.ts +46 -0
  66. package/dist/watch/visao/frota.js +67 -0
  67. package/dist/watch/visao/frota.js.map +1 -0
  68. package/dist/watch/visao/projetar.d.ts +9 -0
  69. package/dist/watch/visao/projetar.js +55 -0
  70. package/dist/watch/visao/projetar.js.map +1 -1
  71. package/dist/watch/watch.d.ts +2 -0
  72. package/dist/watch/watch.js +48 -3
  73. package/dist/watch/watch.js.map +1 -1
  74. package/nucleo/hooks/expx-lembrete.sh +136 -0
  75. package/package.json +1 -1
@@ -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;AACvE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAwB5F;;;;;;;;GAQG;AACH,SAAS,YAAY;IACnB,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC7E,CAAC;AAED,uCAAuC;AACvC,MAAM,UAAU,YAAY,CAC1B,OAAe,EACf,MAAgC,EAChC,MAAc;IAEd,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,gBAAgB,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChE,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACxD,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE1D,4EAA4E;IAC5E,yEAAyE;IACzE,+DAA+D;IAC/D,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;IAC9B,IAAI,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACvB,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/D,CAAC;IAED,aAAa,CACX,IAAI,CAAC,OAAO,EAAE,gBAAgB,EAAE,aAAa,CAAC,EAC9C,GAAG,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CACzD,CAAC;IAEF,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,sEAAsE;QACtE,8CAA8C;QAC9C,MAAM,CAAC,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1E,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;YAC3B,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAC/B,eAAuB,EACvB,MAAgC,EAChC,MAAc;IAEd,SAAS,CAAC,IAAI,CAAC,eAAe,EAAE,gBAAgB,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACxE,aAAa,CACX,IAAI,CAAC,eAAe,EAAE,gBAAgB,EAAE,kBAAkB,CAAC,EAC3D,GAAG,IAAI,CAAC,SAAS,CAAC,qBAAqB,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CACxD,CAAC;IACF,YAAY,CAAC,IAAI,CAAC,eAAe,EAAE,gBAAgB,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AACxE,CAAC"}
1
+ {"version":3,"file":"montagem.js","sourceRoot":"","sources":["../../src/plugin/montagem.ts"],"names":[],"mappings":"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"}
@@ -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>;
@@ -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;AAoBD,MAAM,KAAK,GAA2B;IACpC,OAAO,EAAE,0BAA0B;IACnC,KAAK,EAAE,gCAAgC;IACvC,MAAM,EAAE,yBAAyB;IACjC,OAAO,EAAE,iCAAiC;IAC1C,MAAM,EAAE,eAAe;IACvB,MAAM,EAAE,cAAc;CACvB,CAAC;AAEF,SAAS,IAAI,CAAC,GAAmB,EAAE,KAAc,EAAE,MAAM,GAAG,GAAG;IAC7D,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACnF,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE;QACpB,cAAc,EAAE,iCAAiC;QACjD,eAAe,EAAE,UAAU;KAC5B,CAAC,CAAC;IACH,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,EAAkB;IACpD,MAAM,YAAY,GAAG,EAAE,CAAC,YAAY,IAAI,CAAC,CAAC;IAC1C,IAAI,MAAM,GAAG,SAAS,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC;IACxD,MAAM,QAAQ,GAAqC,EAAE,CAAC;IAEtD,SAAS,UAAU;QACjB,MAAM,GAAG,SAAS,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC;QACpD,KAAK,MAAM,CAAC,IAAI,QAAQ;YAAE,CAAC,CAAC,MAAM,CAAC,CAAC;QACpC,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,IAAI,GAAG,YAAY,CAAC,CAAC,GAAoB,EAAE,GAAmB,EAAE,EAAE;QACtE,kEAAkE;QAClE,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,4BAA4B,EAAE,EAAE,GAAG,CAAC,CAAC;YACvD,OAAO;QACT,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,UAAU,IAAI,EAAE,CAAC,CAAC;QACtD,MAAM,OAAO,GAAG,GAAG,CAAC,QAAQ,CAAC;QAE7B,gEAAgE;QAChE,8DAA8D;QAC9D,IAAI,OAAO,KAAK,YAAY,IAAI,OAAO,KAAK,eAAe,EAAE,CAAC;YAC5D,eAAe,CAAC,MAAM,EAAE,GAAG,EAAE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC;YAC3D,OAAO;QACT,CAAC;QAED,QAAQ,OAAO,EAAE,CAAC;YAChB,KAAK,cAAc;gBACjB,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;gBAClB,OAAO;YACT,KAAK,mBAAmB;gBACtB,IAAI,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;gBAC3C,OAAO;YACT,KAAK,gBAAgB;gBACnB,IAAI,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;gBAC3C,OAAO;YACT,KAAK,gBAAgB;gBACnB,IAAI,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;gBAC3C,OAAO;YACT,KAAK,cAAc;gBACjB,uEAAuE;gBACvE,uEAAuE;gBACvE,IAAI,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;gBACvC,OAAO;YACT,KAAK,YAAY;gBACf,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;gBACpE,OAAO;QACX,CAAC;QAED,IAAI,EAAE,CAAC,SAAS,EAAE,CAAC;YACjB,MAAM,OAAO,GAAG,cAAc,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;YAC3D,IAAI,OAAO;gBAAE,OAAO;QACtB,CAAC;QAED,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,2BAA2B,EAAE,CAAC,CAAC;QACpE,GAAG,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,2EAA2E;IAC3E,wEAAwE;IACxE,0EAA0E;IAC1E,gDAAgD;IAChD,MAAM,IAAI,OAAO,CAAO,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,OAAO,GAAG,CAAC,CAAwB,EAAQ,EAAE;YACjD,MAAM,CACJ,CAAC,CAAC,IAAI,KAAK,YAAY;gBACrB,CAAC,CAAC,IAAI,WAAW,CAAC,EAAE,CAAC,KAAK,CAAC;gBAC3B,CAAC,CAAC,CAAC,CACN,CAAC;QACJ,CAAC,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC5B,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE;YAC/B,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACtC,EAAE,EAAE,CAAC;QACP,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,GAAsC,EAAE;QACvD,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QACzB,IAAI,CAAC,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,QAAQ;YAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC;QAClF,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC9C,CAAC,CAAC;IAEF,OAAO;QACL,QAAQ;QACR,GAAG,EAAE,GAAG,EAAE,CAAC,UAAU,IAAI,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,EAAE;QACtD,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM;QACpB,UAAU;QACV,WAAW,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;QACpC,IAAI;QACJ,MAAM,EAAE,GAAG,EAAE,CACX,IAAI,OAAO,CAAO,CAAC,EAAE,EAAE,EAAE;YACvB,IAAI,CAAC,mBAAmB,EAAE,EAAE,CAAC;YAC7B,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QACzB,CAAC,CAAC;KACL,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,SAAS,eAAe,CAAC,MAAoB,EAAE,GAAQ,EAAE,MAAe,EAAE,GAAmB;IAC3F,MAAM,EAAE,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,IAAI,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IAExE,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC;IAC7D,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAE9E,IAAI,CAAC,OAAO,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QAC7B,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,0BAA0B,EAAE,CAAC,CAAC;QACnE,GAAG,CAAC,GAAG,CACL,8EAA8E;YAC5E,+DAA+D;YAC/D,0DAA0D;YAC1D,0BAA0B,IAAI,8CAA8C,CAC/E,CAAC;QACF,OAAO;IACT,CAAC;IAED,MAAM,KAAK,GAAG,OAAO,GAAG,CAAC,QAAQ,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACrE,MAAM,WAAW,GAAG,GAAG,OAAO,CAAC,KAAK,IAAI,IAAI,KAAK,CAAC;IAElD,IAAI,MAAM,EAAE,CAAC;QACX,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE;YACjB,cAAc,EAAE,8BAA8B;YAC9C,qBAAqB,EAAE,yBAAyB,WAAW,GAAG;YAC9D,eAAe,EAAE,UAAU;SAC5B,CAAC,CAAC;QACH,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACf,OAAO;IACT,CAAC;IAED,MAAM,KAAK,GAAmB;QAC5B,IAAI;QACJ,MAAM,EAAG,GAAG,CAAC,QAAQ,CAAwB,IAAI,OAAO,CAAC,MAAM;QAC/D,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,eAAe,EAAG,GAAG,CAAC,iBAAiB,CAAwB,IAAI,OAAO,CAAC,eAAe;QAC1F,UAAU,EAAG,GAAG,CAAC,YAAY,CAAwB,IAAI,OAAO,CAAC,UAAU;QAC3E,cAAc,EAAG,GAAG,CAAC,gBAAgB,CAA0B,IAAI,OAAO,CAAC,cAAc;QACzF,KAAK;QACL,WAAW;QACX,GAAG,CAAC,IAAI,KAAK,SAAS;YACpB,CAAC,CAAC;gBACE,kBAAkB,EAAG,GAAG,CAAC,oBAAoB,CAA0B,IAAI,EAAE;gBAC7E,kBAAkB,EAAG,GAAG,CAAC,oBAAoB,CAAwB,IAAI,IAAI;aAC9E;YACH,CAAC,CAAC,EAAE,CAAC;KACR,CAAC;IAEF,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,0BAA0B,EAAE,eAAe,EAAE,UAAU,EAAE,CAAC,CAAC;IAChG,GAAG,CAAC,GAAG,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC;AAClC,CAAC;AAED,4EAA4E;AAC5E,SAAS,cAAc,CAAC,IAAY,EAAE,OAAe,EAAE,GAAmB;IACxE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,MAAM,MAAM,GAAG,OAAO,KAAK,GAAG,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC;IACzD,+DAA+D;IAC/D,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IACjF,MAAM,MAAM,GAAG,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC;IAE5D,MAAM,OAAO,GAAG,MAAM,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IAC7E,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,KAAK,CAAC;IAEvC,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,0BAA0B,EAAE,CAAC,CAAC;IAC9F,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;IAC/B,OAAO,IAAI,CAAC;AACd,CAAC"}
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
- let timer = null;
12
- const agendar = () => {
13
- if (timer)
14
- clearTimeout(timer);
15
- timer = setTimeout(() => {
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
- ignoreInitial: true,
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
- watcher.on("add", agendar).on("change", agendar).on("unlink", agendar).on("addDir", agendar).on("unlinkDir", agendar);
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
- await new Promise((ok) => watcher.on("ready", () => ok()));
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
- if (timer)
36
- clearTimeout(timer);
37
- await watcher.close();
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;AAMjD;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,IAAY,EACZ,OAAmB,EACnB,UAAU,GAAG,GAAG;IAEhB,IAAI,KAAK,GAA0B,IAAI,CAAC;IAExC,MAAM,OAAO,GAAG,GAAS,EAAE;QACzB,IAAI,KAAK;YAAE,YAAY,CAAC,KAAK,CAAC,CAAC;QAC/B,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YACtB,KAAK,GAAG,IAAI,CAAC;YACb,OAAO,EAAE,CAAC;QACZ,CAAC,EAAE,UAAU,CAAC,CAAC;IACjB,CAAC,CAAC;IAEF,MAAM,OAAO,GAAc,KAAK,CAAC,IAAI,EAAE;QACrC,aAAa,EAAE,IAAI;QACnB,0EAA0E;QAC1E,0EAA0E;QAC1E,qEAAqE;QACrE,+DAA+D;QAC/D,OAAO,EAAE,CAAC,OAAe,EAAE,EAAE,CAAC,oDAAoD,CAAC,IAAI,CAAC,OAAO,CAAC;QAChG,gBAAgB,EAAE,EAAE,kBAAkB,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,UAAU,GAAG,CAAC,CAAC,EAAE,YAAY,EAAE,EAAE,EAAE;KACzF,CAAC,CAAC;IAEH,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IACtH,0EAA0E;IAC1E,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IAErC,MAAM,IAAI,OAAO,CAAO,CAAC,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IAEjE,OAAO;QACL,KAAK,EAAE,KAAK,IAAI,EAAE;YAChB,IAAI,KAAK;gBAAE,YAAY,CAAC,KAAK,CAAC,CAAC;YAC/B,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;QACxB,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"observador.js","sourceRoot":"","sources":["../../src/servidor/observador.ts"],"names":[],"mappings":"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"}
@@ -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
- servidor.recarregar();
34
- }, op.debounceMs ?? 300);
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,CAC3C,EAAE,CAAC,IAAI,EACP,GAAG,EAAE;QACH,QAAQ,CAAC,UAAU,EAAE,CAAC;IACxB,CAAC,EACD,EAAE,CAAC,UAAU,IAAI,GAAG,CACrB,CAAC;IAEF,OAAO;QACL,GAAG,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,GAAG,EAAE;QACzB,YAAY,EAAE,GAAG,EAAE,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,KAAK;QACtE,KAAK,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,IAAI;QACrC,MAAM,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE;QAC/B,KAAK,EAAE,KAAK,IAAI,EAAE;YAChB,MAAM,UAAU,CAAC,KAAK,EAAE,CAAC;YACzB,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,OAAO;gBAAE,CAAC,CAAC,SAAS,EAAE,CAAC;YAC3C,MAAM,IAAI,OAAO,CAAO,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;YACvD,MAAM,QAAQ,CAAC,MAAM,EAAE,CAAC;QAC1B,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"painel.js","sourceRoot":"","sources":["../../src/servidor/painel.ts"],"names":[],"mappings":"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"}
@@ -1,11 +1,11 @@
1
1
  import { execFile } from "node:child_process";
2
2
  import { promisify } from "node:util";
3
- import { CATALOGO } from "../nucleo/catalogo.js";
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 ?? CATALOGO.find((s) => s.nome === nome)?.repositorio ?? "";
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":"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"}
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;