engine-kit 0.2.0 → 0.2.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/CONTRATO-MOTOR.md CHANGED
@@ -133,6 +133,7 @@ polui o histórico e obriga todo consumidor a decidir se atualiza — para desco
133
133
  ```
134
134
  [ ] chave gerada em ~/.engine-signing/<motor>_ed25519_private.key
135
135
  [ ] entrada do motor existe no manifest.json (kind, home, install.entry, platforms)
136
+ [ ] pagesUrl (página de produto com vídeo, nascida no repo do motor) ou pagesPendente com o motivo — tests/test-pages-gate.mjs
136
137
  [ ] build produz artefato self-contained, com package.json na versão certa
137
138
  [ ] publish-base.ps1 rodado em -DryRun sem erro
138
139
  [ ] release publicada no engine-registry com .tgz + .sig + .sha256
package/README.md CHANGED
@@ -27,10 +27,11 @@ vive num lugar só e o consumidor apenas **declara a dependência**.
27
27
  |---|---|---|---|
28
28
  | `embed-house` | 1.0.5 | `daemon` (http) | Casa de embeddings (MiniLM-L6-v2, 384-dim): carrega o modelo uma vez e serve vetores a N consumidores. |
29
29
  | `vox-engine` | 0.28.7 | `daemon` (pipe), **self-managed** | Motor de voz (STT/TTS) compartilhado, com auto-unload quando ocioso. Traz o próprio instalador e updater. |
30
- | `mcp-gateway` | 0.15.0 | `daemon` (http) | Agregador MCP: conecta uma vez em cada servidor MCP e reexpõe tudo num endpoint único. |
30
+ | `mcp-gateway` | 0.16.4 | `daemon` (http) | Agregador MCP: conecta uma vez em cada servidor MCP e reexpõe tudo num endpoint único. |
31
31
  | `neural-link` | 0.7.15 | `cli` | Dispatcher adaptativo de hooks: recebe o evento por stdin, pontua os handlers e devolve uma decisão composta. |
32
32
  | `vxk` | 0.18.0 | `cli` | Explicações visuais animadas e narradas como servidor MCP (stdio): devolve UM HTML autocontido e offline. A narração vem do `vox-engine`. |
33
33
  | `cerne` | 0.4.10 | `daemon`, **self-managed** | Leitura ativa de vídeo (captura, quadros, transcrição, tradução) exposta via MCP. Instalador Inno por usuário, Windows. |
34
+ | `skill-engine` | 0.1.0 | `cli` | Gerencia skills de agentes fora de qualquer IDE: busca repositórios em quarentena, varre com regras determinísticas e só ativa o que sai limpo. |
34
35
 
35
36
  **Todos** são publicados aqui, assinados com Ed25519 e verificados antes de instalar.
36
37
 
package/kit/budget.mjs CHANGED
@@ -50,7 +50,9 @@ const BUDGETS = {
50
50
  // `split("\n")` num arquivo terminado em newline devolve um elemento vazio no fim — linha
51
51
  // fantasma. Sem o `replace`, cada arquivo inflava a conta em 1 e o kill-switch disparava
52
52
  // por medição errada (foi o que aconteceu na primeira execução deste arquivo).
53
- const linesOf = (f) => readFileSync(f, "utf8").replace(/\n$/, "").split("\n");
53
+ // `\r?\n`: o checkout do Windows (autocrlf) traz CRLF, e o `\r` contaria 1 byte por linha — a mesma
54
+ // árvore mediria diferente no Linux e no Windows.
55
+ const linesOf = (f) => readFileSync(f, "utf8").replace(/\r?\n$/, "").split(/\r?\n/);
54
56
  const lines = (f) => linesOf(f).length;
55
57
 
56
58
  /** Bytes que não são linha em branco nem comentário de linha inteira. */
package/kit/provision.mjs CHANGED
@@ -38,12 +38,12 @@ export function tarBinary({ platform = process.platform, systemRoot = process.en
38
38
  function extractTgz(tgz, dest) {
39
39
  const tar = tarBinary();
40
40
  try {
41
- execFileSync(tar, ["--version"], { stdio: "ignore" });
41
+ execFileSync(tar, ["--version"], { stdio: "ignore", windowsHide: true });
42
42
  } catch {
43
43
  return { ok: false, reason: "`tar` não encontrado no PATH — necessário para extrair o artefato (Windows 10 1803+, macOS e Linux já trazem). Instale-o e tente de novo." };
44
44
  }
45
45
  try {
46
- execFileSync(tar, ["-xzf", tgz, "-C", dest], { stdio: "ignore" });
46
+ execFileSync(tar, ["-xzf", tgz, "-C", dest], { stdio: "ignore", windowsHide: true });
47
47
  return { ok: true };
48
48
  } catch (e) {
49
49
  return { ok: false, reason: `extração (tar) falhou: ${e?.message || e}` };
package/kit/update.mjs CHANGED
@@ -8,7 +8,8 @@
8
8
  // ENGINE_KIT_NO_AUTO_UPDATE=1 desliga: o kit não se troca nem troca motor já instalado, só AVISA da versão nova.
9
9
  // ENGINE_KIT_UPDATED_FROM marca o processo relançado, para não entrar em laço.
10
10
  import { spawnSync } from "node:child_process";
11
- import { readFileSync } from "node:fs";
11
+ import { readFileSync, existsSync } from "node:fs";
12
+ import { dirname, join } from "node:path";
12
13
 
13
14
  export const LATEST_URL = "https://registry.npmjs.org/engine-kit/latest";
14
15
 
@@ -30,9 +31,21 @@ async function fetchLatest() {
30
31
  return (await res.json()).version;
31
32
  }
32
33
 
34
+ /**
35
+ * Como relançar sem shell: npx no Windows é npx.cmd, e spawn de .cmd exige shell (argumentos concatenados, DEP0190
36
+ * no Node 24). Rodado pelo npx, `npm_execpath` aponta o npm-cli.js do npm em uso: node + esse arquivo não passa por shell.
37
+ * Fora do npx: o npm-cli.js que acompanha o node, ou o `npx` do PATH (Unix, sem shell).
38
+ */
39
+ export function relaunchCommand(version, args, { env = process.env, execPath = process.execPath, exists = existsSync } = {}) {
40
+ const npmArgs = ["exec", "--yes", `--package=engine-kit@${version}`, "--", "engine-kit", ...args];
41
+ const bundled = join(dirname(execPath), "node_modules", "npm", "bin", "npm-cli.js");
42
+ const cli = /npm-cli\.js$/.test(env.npm_execpath ?? "") ? env.npm_execpath : exists(bundled) ? bundled : null;
43
+ return cli ? { file: execPath, args: [cli, ...npmArgs] } : { file: "npx", args: ["--yes", `engine-kit@${version}`, ...args] };
44
+ }
45
+
33
46
  function runLatest(version, args, env) {
34
- // npx no Windows é npx.cmd: o spawn de .cmd exige shell. Argumentos aqui são nome de motor e flags simples.
35
- const r = spawnSync("npx", ["--yes", `engine-kit@${version}`, ...args], { stdio: "inherit", shell: process.platform === "win32", windowsHide: true, env });
47
+ const c = relaunchCommand(version, args, { env });
48
+ const r = spawnSync(c.file, c.args, { stdio: "inherit", windowsHide: true, env });
36
49
  return r.error ? { status: 1, error: r.error.message } : { status: r.status ?? 1 };
37
50
  }
38
51
 
package/manifest.json CHANGED
@@ -14,6 +14,7 @@
14
14
  "version": "1.0.5",
15
15
  "kind": "daemon",
16
16
  "summary": "Casa de embeddings compartilhada (MiniLM-L6-v2, 384-dim): carrega o modelo UMA vez e serve vetores a N consumidores via 127.0.0.1, em vez de cada sessão carregar ~147 MB.",
17
+ "pagesPendente": "sem página de produto com vídeo; ela nasce do repositório do próprio motor e este registro só aponta para ela",
17
18
  "home": "~/.embed-house",
18
19
  "install": {
19
20
  "type": "github-release",
@@ -48,6 +49,8 @@
48
49
  "kind": "daemon",
49
50
  "status": "self-managed",
50
51
  "summary": "Motor de voz (STT/TTS) compartilhado: transcreve e sintetiza para N consumidores a partir de uma única instância, com auto-unload quando ocioso.",
52
+ "pagesUrl": "https://allansantos-dv.github.io/vox-engine/",
53
+ "pagesPendente": "a página no ar não tem o vídeo de apresentação nem o botão Apresentar no cabeçalho",
51
54
  "home": "~/.vox-engine",
52
55
  "install": {
53
56
  "type": "github-release",
@@ -77,9 +80,10 @@
77
80
  },
78
81
  {
79
82
  "name": "mcp-gateway",
80
- "version": "0.15.0",
83
+ "version": "0.16.4",
81
84
  "kind": "daemon",
82
85
  "summary": "Agregador MCP: conecta UMA vez em cada servidor MCP e reexpõe todas as tools num endpoint Streamable HTTP único, com auth bearer, namespacing condicional, resiliência e auditoria. Mata a multiplicação de processos por sessão.",
86
+ "pagesPendente": "sem página de produto com vídeo; ela nasce do repositório do próprio motor e este registro só aponta para ela",
83
87
  "home": "~/.mcp-gateway",
84
88
  "install": {
85
89
  "type": "github-release",
@@ -112,6 +116,7 @@
112
116
  "version": "0.7.15",
113
117
  "kind": "cli",
114
118
  "summary": "Dispatcher adaptativo de hooks para agentes LLM: recebe o evento por stdin, pontua e executa os handlers registrados, e devolve UMA decisão composta. Não é daemon — é invocado a cada evento de hook, por qualquer host (Copilot CLI, VS Code, Claude Code).",
119
+ "pagesPendente": "sem página de produto com vídeo; ela nasce do repositório do próprio motor e este registro só aponta para ela",
115
120
  "home": "~/.copilot/neural-link",
116
121
  "install": {
117
122
  "type": "github-release",
@@ -135,6 +140,8 @@
135
140
  "version": "0.18.0",
136
141
  "kind": "cli",
137
142
  "summary": "VXK — explicações visuais animadas e narradas como servidor MCP (stdio): qualquer cliente MCP (Claude Code, Codex, Copilot) compõe a biblioteca de componentes, ícones e o controle único de reprodução e recebe UM HTML autocontido e offline. A narração é assada pelo motor vox-engine.",
143
+ "pagesUrl": "https://allansantos-dv.github.io/visual-explainer/",
144
+ "pagesPendente": "a página no ar não oferece o caminho Ver o que o produto faz antes do vídeo",
138
145
  "home": "~/.vxk",
139
146
  "install": {
140
147
  "type": "github-release",
@@ -159,6 +166,7 @@
159
166
  "kind": "daemon",
160
167
  "status": "self-managed",
161
168
  "summary": "Leitura ativa de vídeo por link ou arquivo: captura, seleção de quadros, transcrição, tradução e consolidação em memória, exposta via servidor MCP por um único daemon local (CerneEngine) compartilhado entre os consumidores.",
169
+ "pagesPendente": "sem página de produto com vídeo; ela nasce do repositório do próprio motor e este registro só aponta para ela",
162
170
  "home": "~/AppData/Local/Programs/Cerne",
163
171
  "install": {
164
172
  "type": "github-release",
@@ -177,6 +185,30 @@
177
185
  "platforms": [
178
186
  "win32-x64"
179
187
  ]
188
+ },
189
+ {
190
+ "name": "skill-engine",
191
+ "version": "0.1.0",
192
+ "kind": "cli",
193
+ "summary": "Skill Manager v2: motor portátil que gerencia skills de agentes fora de qualquer IDE — busca repositórios de skills em quarentena, varre com regras determinísticas e só ativa o que sai limpo, nas pastas que Claude Code, Codex, Copilot e OpenCode leem. CLI `skill-engine`, não é daemon.",
194
+ "pagesPendente": "sem página de produto com vídeo; ela nasce do repositório do próprio motor e este registro só aponta para ela (a sessão do skill-manager a constrói)",
195
+ "home": "~/.skill-engine",
196
+ "install": {
197
+ "type": "github-release",
198
+ "repo": "AllanSantos-DV/engine-registry",
199
+ "tag": "skill-engine-v{version}",
200
+ "asset": "skill-engine-any.tgz",
201
+ "checksum": "{asset}.sha256",
202
+ "extractTo": "runtimes/skill-engine",
203
+ "entry": "runtimes/skill-engine/bin/skill-engine.mjs",
204
+ "publicKey": "c34697186f45e8e91d0f49fa34d1c2d0055213aac2cdbe1490ac51eb2e42f704",
205
+ "signatureAlgorithm": "ed25519-sha256-raw",
206
+ "signatureRequired": true
207
+ },
208
+ "platforms": [
209
+ "any"
210
+ ],
211
+ "notes": "kind=cli: o lifecycle entrega o binário e NÃO sobe processo. `extractTo` é aninhado como no neural-link: o home guarda ESTADO que sobrevive ao update, e só `runtimes/skill-engine` é trocado. Código-fonte no repo privado AllanSantos-DV/skill-engine; a release pública mora aqui."
180
212
  }
181
213
  ]
182
214
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "engine-kit",
3
- "version": "0.2.0",
3
+ "version": "0.2.2",
4
4
  "description": "Cliente das dependências compartilhadas (motores) do engine-registry: resolve, provisiona com SHA256 e assinatura Ed25519 fail-closed, e mantém o motor vivo — uma instalação por máquina, N consumidores.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -24,7 +24,8 @@
24
24
  "node": ">=18"
25
25
  },
26
26
  "scripts": {
27
- "test": "node kit/budget.mjs && node tests/smoke.mjs && node tests/test-edge.mjs && node tests/test-signature.mjs && node tests/test-ensure.mjs && node tests/test-update.mjs && node tests/test-trust.mjs && node tests/test-tar.mjs && node tests/test-apps.mjs && node tests/test-resolve-cache.mjs && node tests/test-doctor-exit.mjs && node tests/test-mcp-gateway-token.mjs && node tests/test-gateway-provision.mjs && node tests/test-neural-link-alignment.mjs && node tests/test-site.mjs && node tests/test-pages-branch.mjs && node tests/test-readme-versions.mjs",
27
+ "test": "node kit/budget.mjs && node tests/test-silencio.mjs && node tests/smoke.mjs && node tests/test-edge.mjs && node tests/test-signature.mjs && node tests/test-ensure.mjs && node tests/test-update.mjs && node tests/test-trust.mjs && node tests/test-tar.mjs && node tests/test-apps.mjs && node tests/test-resolve-cache.mjs && node tests/test-doctor-exit.mjs && node tests/test-mcp-gateway-token.mjs && node tests/test-gateway-provision.mjs && node tests/test-neural-link-alignment.mjs && node tests/test-site.mjs && node tests/test-pages-branch.mjs && node tests/test-readme-versions.mjs && node tests/test-pages-gate.mjs",
28
+ "test:pages-live": "node tests/test-pages-gate.mjs --live",
28
29
  "test:network": "node tests/smoke.mjs --network && node tests/test-signature.mjs --network",
29
30
  "test:e2e": "node tests/e2e-install.mjs",
30
31
  "gen-key": "node kit/gen-key.mjs",