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/cli/init.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { rmSync, writeFileSync } from "node:fs";
|
|
1
|
+
import { rmSync, statSync, writeFileSync } from "node:fs";
|
|
2
2
|
import { join } from "node:path";
|
|
3
|
-
import {
|
|
3
|
+
import { buscarNoCatalogo } from "../nucleo/catalogo.js";
|
|
4
4
|
import { resolverAlvo } from "../nucleo/versao.js";
|
|
5
5
|
import { buscarSkill } from "../nucleo/busca.js";
|
|
6
6
|
import { detectarLayout } from "../nucleo/layout.js";
|
|
@@ -13,8 +13,26 @@ import { materializarOpenCode } from "../harness/opencode.js";
|
|
|
13
13
|
import { mesclarSettings } from "../harness/settings.js";
|
|
14
14
|
import { instalarHooks } from "../harness/hooks.js";
|
|
15
15
|
import { ORIGEM_DO_PLUGIN } from "../plugin/manifestos.js";
|
|
16
|
+
/**
|
|
17
|
+
* A origem é uma pasta em disco, e não uma URL de repositório?
|
|
18
|
+
*
|
|
19
|
+
* `git clone` aceita as duas, mas só a pasta pode ser copiada com o working
|
|
20
|
+
* tree. A checagem é sobre o disco, não sobre a forma do texto: um caminho que
|
|
21
|
+
* não existe cai no clone e produz a mensagem de erro do git, que é mais útil
|
|
22
|
+
* que um erro de cópia.
|
|
23
|
+
*/
|
|
24
|
+
function ehCaminhoLocal(origem) {
|
|
25
|
+
if (/^[a-z][a-z0-9+.-]*:\/\//i.test(origem) || origem.includes("@"))
|
|
26
|
+
return false;
|
|
27
|
+
try {
|
|
28
|
+
return statSync(origem).isDirectory();
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
16
34
|
function origemDe(nome, origens) {
|
|
17
|
-
return origens?.[nome] ??
|
|
35
|
+
return origens?.[nome] ?? buscarNoCatalogo(nome)?.repositorio;
|
|
18
36
|
}
|
|
19
37
|
export async function executarInit(op) {
|
|
20
38
|
const instaladas = [];
|
|
@@ -37,7 +55,15 @@ export async function executarInit(op) {
|
|
|
37
55
|
}
|
|
38
56
|
if (!alvo.travado)
|
|
39
57
|
naoTravadas.push(nome);
|
|
40
|
-
|
|
58
|
+
// Origem em disco (EXPX_SKILLS_LOCAIS, ou `--origem` apontando para uma
|
|
59
|
+
// pasta) é COPIADA, não clonada: o clone traria só o commitado, e o ciclo
|
|
60
|
+
// de desenvolvimento de skill deixaria de ser curto.
|
|
61
|
+
const busca = await buscarSkill({
|
|
62
|
+
nome,
|
|
63
|
+
repositorio,
|
|
64
|
+
referencia: alvo.referencia,
|
|
65
|
+
...(ehCaminhoLocal(repositorio) ? { local: true } : {}),
|
|
66
|
+
});
|
|
41
67
|
if (!busca.ok) {
|
|
42
68
|
falhas.push({ nome, erro: busca.erro });
|
|
43
69
|
continue;
|
|
@@ -59,7 +85,15 @@ export async function executarInit(op) {
|
|
|
59
85
|
});
|
|
60
86
|
continue;
|
|
61
87
|
}
|
|
62
|
-
montaveis.push({
|
|
88
|
+
montaveis.push({
|
|
89
|
+
nome,
|
|
90
|
+
raizSkill: layout.raizSkill,
|
|
91
|
+
comandos: layout.comandos,
|
|
92
|
+
hooks: layout.hooks,
|
|
93
|
+
// A árvore inteira: é ela que leva os hooks de verdade para o plugin,
|
|
94
|
+
// e sem ela o rastro nunca é escrito (ver `montarHooks`).
|
|
95
|
+
...(layout.arvoreHooks !== undefined ? { arvoreHooks: layout.arvoreHooks } : {}),
|
|
96
|
+
});
|
|
63
97
|
travadas[nome] = {
|
|
64
98
|
repositorio,
|
|
65
99
|
referencia: alvo.referencia,
|
package/dist/cli/init.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"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"}
|
package/dist/harness/hooks.d.ts
CHANGED
|
@@ -18,10 +18,15 @@ export type HookInstalado = {
|
|
|
18
18
|
/** Caminho do hook relativo à raiz do projeto, como vai para o settings.json. */
|
|
19
19
|
relativo: string;
|
|
20
20
|
};
|
|
21
|
-
/** As skills que trazem hook. Sem nenhuma, nada é criado — nem a pasta. */
|
|
22
|
-
export declare function comHooks(skills: readonly SkillMontavel[]): SkillMontavel[];
|
|
23
21
|
/**
|
|
24
|
-
*
|
|
25
|
-
*
|
|
22
|
+
* As skills que trazem hook. Sem nenhuma, nada é criado — nem a pasta.
|
|
23
|
+
*
|
|
24
|
+
* A árvore de hooks conta tanto quanto o arquivo solto. Quando a detecção
|
|
25
|
+
* passou a usar `arvoreHooks`, o `hooks` virou `[]` para TODAS as skills reais
|
|
26
|
+
* — elas guardam os hooks em subpasta — e esta função deixou de devolver
|
|
27
|
+
* qualquer coisa. O efeito não foi "nada é instalado": foi pior, porque a
|
|
28
|
+
* cópia da skill em `.claude/skills/` de instalações anteriores ficou órfã,
|
|
29
|
+
* com a descrição velha, competindo para sempre com a do plugin.
|
|
26
30
|
*/
|
|
31
|
+
export declare function comHooks(skills: readonly SkillMontavel[]): SkillMontavel[];
|
|
27
32
|
export declare function instalarHooks(raizProjeto: string, skills: readonly SkillMontavel[]): HookInstalado[];
|
package/dist/harness/hooks.js
CHANGED
|
@@ -1,13 +1,41 @@
|
|
|
1
1
|
import { chmodSync, cpSync, existsSync, mkdirSync } from "node:fs";
|
|
2
|
-
import { basename, join } from "node:path";
|
|
3
|
-
|
|
2
|
+
import { basename, dirname, join } from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
/**
|
|
5
|
+
* As skills que trazem hook. Sem nenhuma, nada é criado — nem a pasta.
|
|
6
|
+
*
|
|
7
|
+
* A árvore de hooks conta tanto quanto o arquivo solto. Quando a detecção
|
|
8
|
+
* passou a usar `arvoreHooks`, o `hooks` virou `[]` para TODAS as skills reais
|
|
9
|
+
* — elas guardam os hooks em subpasta — e esta função deixou de devolver
|
|
10
|
+
* qualquer coisa. O efeito não foi "nada é instalado": foi pior, porque a
|
|
11
|
+
* cópia da skill em `.claude/skills/` de instalações anteriores ficou órfã,
|
|
12
|
+
* com a descrição velha, competindo para sempre com a do plugin.
|
|
13
|
+
*/
|
|
4
14
|
export function comHooks(skills) {
|
|
5
|
-
return skills.filter((s) => (s.hooks?.length ?? 0) > 0);
|
|
15
|
+
return skills.filter((s) => (s.hooks?.length ?? 0) > 0 || s.arvoreHooks !== undefined);
|
|
6
16
|
}
|
|
7
17
|
/**
|
|
8
18
|
* Copia hooks e skills para `.claude/`. Devolve os hooks instalados, na ordem,
|
|
9
19
|
* para quem for registrá-los no `settings.json`.
|
|
10
20
|
*/
|
|
21
|
+
/**
|
|
22
|
+
* O lembrete de skill, do núcleo.
|
|
23
|
+
*
|
|
24
|
+
* Ele NÃO pertence a nenhuma skill: é do método. Uma descrição de skill só
|
|
25
|
+
* compete depois que o modelo decide procurar uma, e quando ele forma hipótese
|
|
26
|
+
* técnica direto do relato essa decisão não acontece — a descrição, por melhor
|
|
27
|
+
* que seja, nunca é lida. Medido em seis sessões seguidas com três descrições
|
|
28
|
+
* diferentes. O `UserPromptSubmit` é o único ponto que roda antes disso.
|
|
29
|
+
*/
|
|
30
|
+
function instalarLembrete(dirHooks) {
|
|
31
|
+
const origem = join(dirname(fileURLToPath(import.meta.url)), "..", "..", "nucleo", "hooks", "expx-lembrete.sh");
|
|
32
|
+
if (!existsSync(origem))
|
|
33
|
+
return null; // núcleo ausente: falha aberta
|
|
34
|
+
const destino = join(dirHooks, "expx-lembrete.sh");
|
|
35
|
+
cpSync(origem, destino);
|
|
36
|
+
chmodSync(destino, 0o755);
|
|
37
|
+
return { skill: "expx", relativo: ".claude/hooks/expx-lembrete.sh" };
|
|
38
|
+
}
|
|
11
39
|
export function instalarHooks(raizProjeto, skills) {
|
|
12
40
|
const alvos = comHooks(skills);
|
|
13
41
|
if (alvos.length === 0)
|
|
@@ -17,6 +45,9 @@ export function instalarHooks(raizProjeto, skills) {
|
|
|
17
45
|
mkdirSync(dirHooks, { recursive: true });
|
|
18
46
|
mkdirSync(dirSkills, { recursive: true });
|
|
19
47
|
const instalados = [];
|
|
48
|
+
const lembrete = instalarLembrete(dirHooks);
|
|
49
|
+
if (lembrete !== null)
|
|
50
|
+
instalados.push(lembrete);
|
|
20
51
|
for (const s of alvos) {
|
|
21
52
|
// a skill vai junto: é o que o hook procura ao lado de si mesmo
|
|
22
53
|
cpSync(s.raizSkill, join(dirSkills, s.nome), { recursive: true });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/harness/hooks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACnE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/harness/hooks.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,6 +14,25 @@ export type ComandoExterno = {
|
|
|
14
14
|
bin: string;
|
|
15
15
|
args: string[];
|
|
16
16
|
};
|
|
17
|
+
/**
|
|
18
|
+
* O Claude Code roda o plugin de um CACHE, não da pasta do projeto.
|
|
19
|
+
*
|
|
20
|
+
* A cópia vive em `~/.claude/plugins/cache/<marketplace>/<plugin>/<versao>/`, e
|
|
21
|
+
* é dela que saem as skills, os comandos e os hooks da sessão. Montar um
|
|
22
|
+
* `.expx/` novo no projeto não mexe nesse cache.
|
|
23
|
+
*
|
|
24
|
+
* Medido: depois de um `expx init` que montou a 0.5.1, o cache seguia na 0.1.1
|
|
25
|
+
* — com um conjunto de skills antigo, SEM a runx e sem hooks. O efeito para
|
|
26
|
+
* quem usa é a skill simplesmente nunca ser acionada, sem nenhum erro: o
|
|
27
|
+
* modelo não vê a descrição que faria o gatilho disparar, então parte para o
|
|
28
|
+
* trabalho manual.
|
|
29
|
+
*
|
|
30
|
+
* `plugin install` num plugin já instalado não recopia, e `marketplace update`
|
|
31
|
+
* sozinho também não. Desinstalar antes é o que força a cópia nova.
|
|
32
|
+
*
|
|
33
|
+
* O `uninstall` roda em modo tolerante: na primeira instalação não há nada
|
|
34
|
+
* para remover, e o erro dele é esperado — ver `instalarPlugin`.
|
|
35
|
+
*/
|
|
17
36
|
export declare function comandosDeInstalacao(caminhoMarketplace: string): ComandoExterno[];
|
|
18
37
|
/** O que dizer quando o binário `claude` não está disponível. */
|
|
19
38
|
export declare function instrucaoManual(caminhoMarketplace: string): string;
|
package/dist/harness/instalar.js
CHANGED
|
@@ -1,12 +1,45 @@
|
|
|
1
1
|
import { execFile } from "node:child_process";
|
|
2
2
|
import { promisify } from "node:util";
|
|
3
3
|
const exec = promisify(execFile);
|
|
4
|
+
/**
|
|
5
|
+
* O Claude Code roda o plugin de um CACHE, não da pasta do projeto.
|
|
6
|
+
*
|
|
7
|
+
* A cópia vive em `~/.claude/plugins/cache/<marketplace>/<plugin>/<versao>/`, e
|
|
8
|
+
* é dela que saem as skills, os comandos e os hooks da sessão. Montar um
|
|
9
|
+
* `.expx/` novo no projeto não mexe nesse cache.
|
|
10
|
+
*
|
|
11
|
+
* Medido: depois de um `expx init` que montou a 0.5.1, o cache seguia na 0.1.1
|
|
12
|
+
* — com um conjunto de skills antigo, SEM a runx e sem hooks. O efeito para
|
|
13
|
+
* quem usa é a skill simplesmente nunca ser acionada, sem nenhum erro: o
|
|
14
|
+
* modelo não vê a descrição que faria o gatilho disparar, então parte para o
|
|
15
|
+
* trabalho manual.
|
|
16
|
+
*
|
|
17
|
+
* `plugin install` num plugin já instalado não recopia, e `marketplace update`
|
|
18
|
+
* sozinho também não. Desinstalar antes é o que força a cópia nova.
|
|
19
|
+
*
|
|
20
|
+
* O `uninstall` roda em modo tolerante: na primeira instalação não há nada
|
|
21
|
+
* para remover, e o erro dele é esperado — ver `instalarPlugin`.
|
|
22
|
+
*/
|
|
4
23
|
export function comandosDeInstalacao(caminhoMarketplace) {
|
|
5
24
|
return [
|
|
6
25
|
{ bin: "claude", args: ["plugin", "marketplace", "add", caminhoMarketplace] },
|
|
26
|
+
{ bin: "claude", args: ["plugin", "marketplace", "update", "expx-local"] },
|
|
27
|
+
{ bin: "claude", args: ["plugin", "uninstall", "expx@expx-local"] },
|
|
7
28
|
{ bin: "claude", args: ["plugin", "install", "expx@expx-local"] },
|
|
8
29
|
];
|
|
9
30
|
}
|
|
31
|
+
/**
|
|
32
|
+
* Comandos cuja falha não interrompe a sequência.
|
|
33
|
+
*
|
|
34
|
+
* `marketplace add` falha quando o marketplace já é conhecido, e `uninstall`
|
|
35
|
+
* falha quando não há o que desinstalar. Os dois são o caminho normal de uma
|
|
36
|
+
* reinstalação e de uma primeira instalação, respectivamente — tratá-los como
|
|
37
|
+
* erro faria o `init` parar justamente nos dois casos mais comuns.
|
|
38
|
+
*/
|
|
39
|
+
function tolerante(args) {
|
|
40
|
+
const s = args.join(" ");
|
|
41
|
+
return s.startsWith("plugin uninstall") || s.startsWith("plugin marketplace add");
|
|
42
|
+
}
|
|
10
43
|
/** O que dizer quando o binário `claude` não está disponível. */
|
|
11
44
|
export function instrucaoManual(caminhoMarketplace) {
|
|
12
45
|
return [
|
|
@@ -14,9 +47,13 @@ export function instrucaoManual(caminhoMarketplace) {
|
|
|
14
47
|
"O .expx/ foi montado e esta pronto; falta apenas registrar o plugin:",
|
|
15
48
|
"",
|
|
16
49
|
` claude plugin marketplace add ${caminhoMarketplace}`,
|
|
50
|
+
" claude plugin marketplace update expx-local",
|
|
51
|
+
" claude plugin uninstall expx@expx-local",
|
|
17
52
|
" claude plugin install expx@expx-local",
|
|
18
53
|
"",
|
|
19
|
-
"Rode os
|
|
54
|
+
"Rode os comandos acima e o namespace /expx: ficara disponivel.",
|
|
55
|
+
"Os dois do meio nao sao opcionais: o Claude Code roda o plugin de um",
|
|
56
|
+
"cache proprio, e sem eles a sessao continua carregando a versao antiga.",
|
|
20
57
|
].join("\n");
|
|
21
58
|
}
|
|
22
59
|
/**
|
|
@@ -35,6 +72,10 @@ export async function instalarPlugin(caminhoMarketplace) {
|
|
|
35
72
|
if (msg.includes("ENOENT")) {
|
|
36
73
|
return { ok: false, executados, instrucao: instrucaoManual(caminhoMarketplace) };
|
|
37
74
|
}
|
|
75
|
+
// Marketplace já conhecido, ou nada a desinstalar: é o caminho normal,
|
|
76
|
+
// não um defeito. Seguir é o que torna o `init` repetível.
|
|
77
|
+
if (tolerante(c.args))
|
|
78
|
+
continue;
|
|
38
79
|
return { ok: false, executados, erro: msg };
|
|
39
80
|
}
|
|
40
81
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instalar.js","sourceRoot":"","sources":["../../src/harness/instalar.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,IAAI,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAiBjC,MAAM,UAAU,oBAAoB,CAAC,kBAA0B;IAC7D,OAAO;QACL,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,QAAQ,EAAE,aAAa,EAAE,KAAK,EAAE,kBAAkB,CAAC,EAAE;QAC7E,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,iBAAiB,CAAC,EAAE;KAClE,CAAC;AACJ,CAAC;AAED,iEAAiE;AACjE,MAAM,UAAU,eAAe,CAAC,kBAA0B;IACxD,OAAO;QACL,gDAAgD;QAChD,sEAAsE;QACtE,EAAE;QACF,mCAAmC,kBAAkB,EAAE;QACvD,yCAAyC;QACzC,EAAE;QACF,
|
|
1
|
+
{"version":3,"file":"instalar.js","sourceRoot":"","sources":["../../src/harness/instalar.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,IAAI,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAiBjC;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,oBAAoB,CAAC,kBAA0B;IAC7D,OAAO;QACL,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,QAAQ,EAAE,aAAa,EAAE,KAAK,EAAE,kBAAkB,CAAC,EAAE;QAC7E,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,QAAQ,EAAE,aAAa,EAAE,QAAQ,EAAE,YAAY,CAAC,EAAE;QAC1E,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,QAAQ,EAAE,WAAW,EAAE,iBAAiB,CAAC,EAAE;QACnE,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,iBAAiB,CAAC,EAAE;KAClE,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,SAAS,CAAC,IAAuB;IACxC,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACzB,OAAO,CAAC,CAAC,UAAU,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,wBAAwB,CAAC,CAAC;AACpF,CAAC;AAED,iEAAiE;AACjE,MAAM,UAAU,eAAe,CAAC,kBAA0B;IACxD,OAAO;QACL,gDAAgD;QAChD,sEAAsE;QACtE,EAAE;QACF,mCAAmC,kBAAkB,EAAE;QACvD,+CAA+C;QAC/C,2CAA2C;QAC3C,yCAAyC;QACzC,EAAE;QACF,gEAAgE;QAChE,sEAAsE;QACtE,yEAAyE;KAC1E,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAUD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,kBAA0B;IAC7D,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,KAAK,MAAM,CAAC,IAAI,oBAAoB,CAAC,kBAAkB,CAAC,EAAE,CAAC;QACzD,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;YAC1B,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClD,CAAC;QAAC,OAAO,CAAU,EAAE,CAAC;YACpB,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YACtB,IAAI,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC3B,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,eAAe,CAAC,kBAAkB,CAAC,EAAE,CAAC;YACnF,CAAC;YACD,uEAAuE;YACvE,2DAA2D;YAC3D,IAAI,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;gBAAE,SAAS;YAChC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;QAC9C,CAAC;IACH,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;AAClC,CAAC"}
|
package/dist/harness/settings.js
CHANGED
|
@@ -20,6 +20,12 @@ function mesclarEvento(atual, comando) {
|
|
|
20
20
|
function eventoDoHook(relativo) {
|
|
21
21
|
if (relativo.includes("injetar"))
|
|
22
22
|
return "UserPromptSubmit";
|
|
23
|
+
// O lembrete de skill: `UserPromptSubmit` é o único evento que roda ANTES
|
|
24
|
+
// da primeira ação do modelo, e é disso que ele depende — o problema que ele
|
|
25
|
+
// resolve é a etapa de escolher o processo simplesmente não acontecer
|
|
26
|
+
// quando já existe uma hipótese técnica formada.
|
|
27
|
+
if (relativo.includes("lembrete"))
|
|
28
|
+
return "UserPromptSubmit";
|
|
23
29
|
if (relativo.includes("reindexar"))
|
|
24
30
|
return "Stop";
|
|
25
31
|
return null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../../src/harness/settings.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../../src/harness/settings.ts"],"names":[],"mappings":"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"}
|
package/dist/nucleo/busca.d.ts
CHANGED
|
@@ -13,6 +13,14 @@ export type PedidoBusca = {
|
|
|
13
13
|
nome: string;
|
|
14
14
|
repositorio: string;
|
|
15
15
|
referencia: string;
|
|
16
|
+
/**
|
|
17
|
+
* Origem local em desenvolvimento: copia a pasta em vez de clonar.
|
|
18
|
+
*
|
|
19
|
+
* Com `git clone`, mesmo de um caminho local, só chega o que foi COMMITADO —
|
|
20
|
+
* e o ponto do `EXPX_SKILLS_LOCAIS` é justamente editar a skill e ver o
|
|
21
|
+
* efeito no projeto sem commitar. A cópia é o que torna o ciclo curto.
|
|
22
|
+
*/
|
|
23
|
+
local?: boolean;
|
|
16
24
|
};
|
|
17
25
|
export type ResultadoBusca = {
|
|
18
26
|
ok: true;
|
package/dist/nucleo/busca.js
CHANGED
|
@@ -1,13 +1,38 @@
|
|
|
1
1
|
import { execFile } from "node:child_process";
|
|
2
2
|
import { promisify } from "node:util";
|
|
3
|
-
import { mkdtempSync, rmSync } from "node:fs";
|
|
3
|
+
import { cpSync, mkdtempSync, rmSync } from "node:fs";
|
|
4
4
|
import { tmpdir } from "node:os";
|
|
5
|
-
import { join } from "node:path";
|
|
5
|
+
import { basename, join } from "node:path";
|
|
6
6
|
const exec = promisify(execFile);
|
|
7
|
+
/**
|
|
8
|
+
* Copia a pasta local, com o working tree como está — alteração não commitada
|
|
9
|
+
* inclusive. O `.git` fica de fora: é grande e nada no plugin o usa.
|
|
10
|
+
*
|
|
11
|
+
* O commit registrado no lock é o do HEAD quando há repositório, com o sufixo
|
|
12
|
+
* `-local` para que o lock nunca afirme que aquele conteúdo é o daquele commit
|
|
13
|
+
* (ele pode ter edição por cima). Sem `.git`, `local` sozinho.
|
|
14
|
+
*/
|
|
15
|
+
async function copiarLocal(p, destino) {
|
|
16
|
+
cpSync(p.repositorio, destino, {
|
|
17
|
+
recursive: true,
|
|
18
|
+
filter: (origem) => basename(origem) !== ".git",
|
|
19
|
+
});
|
|
20
|
+
let commit = "local";
|
|
21
|
+
try {
|
|
22
|
+
const { stdout } = await exec("git", ["rev-parse", "HEAD"], { cwd: p.repositorio });
|
|
23
|
+
commit = `${stdout.trim().slice(0, 12)}-local`;
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
// pasta sem git é uso legítimo em desenvolvimento
|
|
27
|
+
}
|
|
28
|
+
return { ok: true, nome: p.nome, caminho: destino, commit };
|
|
29
|
+
}
|
|
7
30
|
/** Clona só a referência pedida, com profundidade 1. Devolve a pasta temporária. */
|
|
8
31
|
export async function buscarSkill(p) {
|
|
9
32
|
const destino = mkdtempSync(join(tmpdir(), `expx-busca-${p.nome}-`));
|
|
10
33
|
try {
|
|
34
|
+
if (p.local === true)
|
|
35
|
+
return await copiarLocal(p, destino);
|
|
11
36
|
await exec("git", [
|
|
12
37
|
"clone",
|
|
13
38
|
"--quiet",
|
package/dist/nucleo/busca.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"busca.js","sourceRoot":"","sources":["../../src/nucleo/busca.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"busca.js","sourceRoot":"","sources":["../../src/nucleo/busca.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAE3C,MAAM,IAAI,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAgCjC;;;;;;;GAOG;AACH,KAAK,UAAU,WAAW,CAAC,CAAc,EAAE,OAAe;IACxD,MAAM,CAAC,CAAC,CAAC,WAAW,EAAE,OAAO,EAAE;QAC7B,SAAS,EAAE,IAAI;QACf,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,MAAM;KAChD,CAAC,CAAC;IAEH,IAAI,MAAM,GAAG,OAAO,CAAC;IACrB,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,MAAM,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;QACpF,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC;IACjD,CAAC;IAAC,MAAM,CAAC;QACP,kDAAkD;IACpD,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;AAC9D,CAAC;AAED,oFAAoF;AACpF,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,CAAc;IAC9C,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,cAAc,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;IACrE,IAAI,CAAC;QACH,IAAI,CAAC,CAAC,KAAK,KAAK,IAAI;YAAE,OAAO,MAAM,WAAW,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QAC3D,MAAM,IAAI,CAAC,KAAK,EAAE;YAChB,OAAO;YACP,SAAS;YACT,SAAS;YACT,GAAG;YACH,UAAU;YACV,CAAC,CAAC,UAAU;YACZ,CAAC,CAAC,WAAW;YACb,OAAO;SACR,CAAC,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,MAAM,CAAC,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;QAC9E,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;IAC7E,CAAC;IAAC,OAAO,CAAU,EAAE,CAAC;QACpB,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAClD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IACtD,CAAC;AACH,CAAC"}
|
|
@@ -1,10 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* As
|
|
2
|
+
* As oito skills do ecossistema Expx.
|
|
3
3
|
*
|
|
4
4
|
* Fonte única do que o CLI sabe instalar. `papel` é o texto mostrado na seleção
|
|
5
5
|
* do `init`; `camada` marca as skills que, sozinhas, não fazem nada — elas
|
|
6
6
|
* modificam o comportamento da sprintx/runx em vez de agir por conta própria
|
|
7
7
|
* (ver `docs/expx-cli/base/08-repositorios-reais.md`).
|
|
8
|
+
*
|
|
9
|
+
* A buildx não é camada, e também não é irmã das outras: ela ORQUESTRA a
|
|
10
|
+
* sprintx e a mergex feature a feature. Sem elas instaladas não roda — mas o
|
|
11
|
+
* `init` não modela dependência entre skills, e criar esse conceito por uma
|
|
12
|
+
* única aresta custaria mais do que a skill avisar em tempo de execução, que é
|
|
13
|
+
* o que ela faz.
|
|
8
14
|
*/
|
|
9
15
|
export type Skill = {
|
|
10
16
|
nome: string;
|
package/dist/nucleo/catalogo.js
CHANGED
|
@@ -1,11 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
*
|
|
4
|
-
* Fonte única do que o CLI sabe instalar. `papel` é o texto mostrado na seleção
|
|
5
|
-
* do `init`; `camada` marca as skills que, sozinhas, não fazem nada — elas
|
|
6
|
-
* modificam o comportamento da sprintx/runx em vez de agir por conta própria
|
|
7
|
-
* (ver `docs/expx-cli/base/08-repositorios-reais.md`).
|
|
8
|
-
*/
|
|
1
|
+
import { readdirSync, statSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
9
3
|
export const CATALOGO = [
|
|
10
4
|
{
|
|
11
5
|
nome: "sprintx",
|
|
@@ -49,11 +43,81 @@ export const CATALOGO = [
|
|
|
49
43
|
papel: "camada de produto, decide se o pedido vira trabalho",
|
|
50
44
|
camada: true,
|
|
51
45
|
},
|
|
46
|
+
{
|
|
47
|
+
nome: "buildx",
|
|
48
|
+
repositorio: "https://github.com/bittencourtthulio/buildx",
|
|
49
|
+
papel: "orquestra um projeto inteiro, da descricao ao sistema pronto",
|
|
50
|
+
camada: false,
|
|
51
|
+
},
|
|
52
52
|
];
|
|
53
53
|
/** Os nomes na ordem em que a seleção do `init` os apresenta. */
|
|
54
54
|
export const NOMES = CATALOGO.map((s) => s.nome);
|
|
55
|
+
/**
|
|
56
|
+
* As pastas em que uma skill pode estar, dentro da raiz de desenvolvimento.
|
|
57
|
+
*
|
|
58
|
+
* Os repositórios reais não seguem uma capitalização só (`RunX`, `MemoX`,
|
|
59
|
+
* `SprintX`, mas `Legadox` e `ProdX`), e o macOS não diferencia maiúscula de
|
|
60
|
+
* minúscula enquanto o Linux diferencia. Tentar as variações torna o override
|
|
61
|
+
* previsível nos dois sistemas.
|
|
62
|
+
*/
|
|
63
|
+
function candidatasLocais(nome) {
|
|
64
|
+
const capitalizado = nome.charAt(0).toUpperCase() + nome.slice(1);
|
|
65
|
+
const camelX = capitalizado.replace(/x$/, "X");
|
|
66
|
+
return [...new Set([nome, capitalizado, camelX])];
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* A raiz onde procurar clones locais das skills, quando definida.
|
|
70
|
+
*
|
|
71
|
+
* Serve ao desenvolvimento das próprias skills: sem isto, testar uma alteração
|
|
72
|
+
* num projeto real exige commitar e publicar a cada tentativa, porque o `init`
|
|
73
|
+
* só sabe clonar do GitHub.
|
|
74
|
+
*
|
|
75
|
+
* EXPX_SKILLS_LOCAIS=~/Documents/Projetos npx expxdev init --skills runx --yes
|
|
76
|
+
*
|
|
77
|
+
* Não é um caminho de código novo na busca: `git clone` aceita caminho de
|
|
78
|
+
* sistema de arquivos como origem, então a skill local percorre exatamente o
|
|
79
|
+
* mesmo fluxo da remota — mesmo clone, mesmo commit registrado no lock, mesma
|
|
80
|
+
* montagem. O que muda é só a origem.
|
|
81
|
+
*/
|
|
82
|
+
function raizLocal() {
|
|
83
|
+
const v = process.env["EXPX_SKILLS_LOCAIS"];
|
|
84
|
+
return v === undefined || v.trim() === "" ? undefined : v.trim();
|
|
85
|
+
}
|
|
55
86
|
export function buscarNoCatalogo(nome) {
|
|
56
|
-
|
|
87
|
+
const s = CATALOGO.find((x) => x.nome === nome);
|
|
88
|
+
if (s === undefined)
|
|
89
|
+
return undefined;
|
|
90
|
+
const raiz = raizLocal();
|
|
91
|
+
if (raiz === undefined)
|
|
92
|
+
return s;
|
|
93
|
+
// A pasta é procurada na LISTAGEM, e não com `statSync` em cada candidata:
|
|
94
|
+
// no macOS, que não diferencia maiúscula de minúscula, `statSync("runx")`
|
|
95
|
+
// encontra a pasta `RunX` e devolveria um caminho com a grafia errada — que
|
|
96
|
+
// funciona no mac e quebra no Linux, o pior dos dois mundos.
|
|
97
|
+
let entradas;
|
|
98
|
+
try {
|
|
99
|
+
entradas = readdirSync(raiz);
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
return s; // raiz local inexistente: segue pelo GitHub
|
|
103
|
+
}
|
|
104
|
+
// Pasta ausente cai de volta para o GitHub em vez de falhar: a raiz local
|
|
105
|
+
// costuma ter só as skills em que se está mexendo, e uma origem inexistente
|
|
106
|
+
// produziria erro de clone — que se leria como falha de rede, escondendo a
|
|
107
|
+
// causa real.
|
|
108
|
+
for (const c of candidatasLocais(nome)) {
|
|
109
|
+
if (!entradas.includes(c))
|
|
110
|
+
continue;
|
|
111
|
+
const caminho = join(raiz, c);
|
|
112
|
+
try {
|
|
113
|
+
if (statSync(caminho).isDirectory())
|
|
114
|
+
return { ...s, repositorio: caminho };
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
continue;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return s;
|
|
57
121
|
}
|
|
58
122
|
/** Camada é skill que sozinha não faz nada: precisa de sprintx ou runx junto. */
|
|
59
123
|
export function ehCamada(nome) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"catalogo.js","sourceRoot":"","sources":["../../src/nucleo/catalogo.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"catalogo.js","sourceRoot":"","sources":["../../src/nucleo/catalogo.ts"],"names":[],"mappings":"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"}
|
package/dist/nucleo/layout.d.ts
CHANGED
|
@@ -17,6 +17,14 @@ export type Layout = {
|
|
|
17
17
|
raizSkill: string;
|
|
18
18
|
comandos: string[];
|
|
19
19
|
hooks: string[];
|
|
20
|
+
/**
|
|
21
|
+
* A pasta de hooks do repositório inteira (`.claude/hooks/`), quando ela
|
|
22
|
+
* existe. É o que o plugin precisa levar: os hooks reais das skills vivem
|
|
23
|
+
* em SUBPASTAS (`hooks/runx/`, `hooks/comum/`) e são chamados por um
|
|
24
|
+
* despachante que referencia esses caminhos. Copiar só os arquivos soltos
|
|
25
|
+
* de `hooks` deixava o plugin sem nenhum hook — medido em produção.
|
|
26
|
+
*/
|
|
27
|
+
arvoreHooks?: string;
|
|
20
28
|
} | {
|
|
21
29
|
ok: false;
|
|
22
30
|
erro: string;
|
package/dist/nucleo/layout.js
CHANGED
|
@@ -89,6 +89,26 @@ function acharHooks(raiz, nome) {
|
|
|
89
89
|
}
|
|
90
90
|
return [];
|
|
91
91
|
}
|
|
92
|
+
/**
|
|
93
|
+
* A pasta de hooks do repositório, quando existe.
|
|
94
|
+
*
|
|
95
|
+
* Devolve o DIRETÓRIO, não os arquivos: os hooks reais são chamados por um
|
|
96
|
+
* despachante com caminhos relativos (`comum/rastro`, `runx/escopo-da-task`),
|
|
97
|
+
* então a estrutura tem que chegar inteira ao plugin ou nenhum deles resolve.
|
|
98
|
+
*/
|
|
99
|
+
function acharArvoreHooks(raiz) {
|
|
100
|
+
for (const c of CANDIDATAS_HOOKS) {
|
|
101
|
+
const dir = join(raiz, c);
|
|
102
|
+
try {
|
|
103
|
+
if (statSync(dir).isDirectory())
|
|
104
|
+
return dir;
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return undefined;
|
|
111
|
+
}
|
|
92
112
|
export function detectarLayout(raizRepo, nomeEsperado) {
|
|
93
113
|
const skillMd = acharSkillMd(raizRepo);
|
|
94
114
|
if (skillMd === undefined)
|
|
@@ -98,12 +118,14 @@ export function detectarLayout(raizRepo, nomeEsperado) {
|
|
|
98
118
|
if (nome !== nomeEsperado) {
|
|
99
119
|
return { ok: false, erro: `nome da skill e "${nome}", esperado "${nomeEsperado}"` };
|
|
100
120
|
}
|
|
121
|
+
const arvore = acharArvoreHooks(raizRepo);
|
|
101
122
|
return {
|
|
102
123
|
ok: true,
|
|
103
124
|
nome,
|
|
104
125
|
raizSkill,
|
|
105
126
|
comandos: acharComandos(raizRepo, nome),
|
|
106
127
|
hooks: acharHooks(raizRepo, nome),
|
|
128
|
+
...(arvore !== undefined ? { arvoreHooks: arvore } : {}),
|
|
107
129
|
};
|
|
108
130
|
}
|
|
109
131
|
//# sourceMappingURL=layout.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layout.js","sourceRoot":"","sources":["../../src/nucleo/layout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC1E,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"layout.js","sourceRoot":"","sources":["../../src/nucleo/layout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC1E,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAkC3C,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;AACvE,MAAM,mBAAmB,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,EAAE,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC;AACnI,kFAAkF;AAClF,MAAM,gBAAgB,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;AAE7D,wEAAwE;AACxE,SAAS,YAAY,CAAC,IAAY,EAAE,eAAe,GAAG,CAAC;IACrD,MAAM,IAAI,GAA0C,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;IAC9E,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;QAC3B,IAAI,KAAK,KAAK,SAAS;YAAE,MAAM;QAC/B,IAAI,KAAK,CAAC,KAAK,GAAG,eAAe;YAAE,SAAS;QAC5C,IAAI,QAAkB,CAAC;QACvB,IAAI,CAAC;YACH,QAAQ,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACpC,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QACD,IAAI,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC;YAAE,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;QACtE,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACzB,IAAI,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;gBAAE,SAAS;YAC/B,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YAC7B,IAAI,CAAC;gBACH,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE;oBAAE,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC;YAC/E,CAAC;YAAC,MAAM,CAAC;gBACP,iDAAiD;YACnD,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,mFAAmF;AACnF,SAAS,iBAAiB,CAAC,OAAe;IACxC,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC5C,MAAM,CAAC,GAAG,6BAA6B,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACpD,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IACjC,MAAM,KAAK,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACjD,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;AACxD,CAAC;AAED,oFAAoF;AACpF,SAAS,aAAa,CAAC,IAAY,EAAE,IAAY;IAC/C,KAAK,MAAM,CAAC,IAAI,mBAAmB,EAAE,CAAC;QACpC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAC1B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QAC/B,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,CAAC;aAC9B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;aAChC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,GAAG,IAAI,KAAK,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC;aAC7D,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;QAC5B,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,QAAQ,CAAC;IAC3C,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;;GAGG;AACH,SAAS,UAAU,CAAC,IAAY,EAAE,IAAY;IAC5C,KAAK,MAAM,CAAC,IAAI,gBAAgB,EAAE,CAAC;QACjC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAC1B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QAC/B,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,CAAC;aAC9B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC;aACjF,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YACzB,+EAA+E;YAC/E,0EAA0E;YAC1E,+DAA+D;aAC9D,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;YACZ,IAAI,CAAC;gBACH,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;YAC9B,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC,CAAC,CAAC;QACL,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,QAAQ,CAAC;IAC3C,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;;;;;GAMG;AACH,SAAS,gBAAgB,CAAC,IAAY;IACpC,KAAK,MAAM,CAAC,IAAI,gBAAgB,EAAE,CAAC;QACjC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAC1B,IAAI,CAAC;YACH,IAAI,QAAQ,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE;gBAAE,OAAO,GAAG,CAAC;QAC9C,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,QAAgB,EAAE,YAAoB;IACnE,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;IACvC,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,8BAA8B,QAAQ,EAAE,EAAE,CAAC;IAEhG,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACtC,MAAM,IAAI,GAAG,iBAAiB,CAAC,OAAO,CAAC,IAAI,QAAQ,CAAC,SAAS,CAAC,CAAC;IAC/D,IAAI,IAAI,KAAK,YAAY,EAAE,CAAC;QAC1B,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,oBAAoB,IAAI,gBAAgB,YAAY,GAAG,EAAE,CAAC;IACtF,CAAC;IACD,MAAM,MAAM,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAC1C,OAAO;QACL,EAAE,EAAE,IAAI;QACR,IAAI;QACJ,SAAS;QACT,QAAQ,EAAE,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC;QACvC,KAAK,EAAE,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC;QACjC,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACzD,CAAC;AACJ,CAAC"}
|
|
@@ -6,8 +6,20 @@ import type { ExpxTool, Estagio, StatusTrabalho, TipoTrabalho, TipoOcorrencia }
|
|
|
6
6
|
* `docs/manutencao/<id>-<slug>/` descreve onde as skills gravam, não uma
|
|
7
7
|
* restrição de busca.
|
|
8
8
|
*
|
|
9
|
-
* Pasta sem ORQUESTRADOR é ignorada em silêncio
|
|
10
|
-
* pastas legítimas que não são trabalho.
|
|
9
|
+
* Pasta sem ORQUESTRADOR **nem** `00-OCORRENCIA.md` é ignorada em silêncio
|
|
10
|
+
* (decisão D-12): `docs/` tem pastas legítimas que não são trabalho.
|
|
11
|
+
*
|
|
12
|
+
* ## Por que o `00-OCORRENCIA.md` também abre trabalho
|
|
13
|
+
*
|
|
14
|
+
* O `ORQUESTRADOR.md` só nasce no E2 (`references/02-plano.md`, passo 4). Entre
|
|
15
|
+
* o E1 e o E2 a ocorrência já existe em disco, já tem id, título e ferramenta —
|
|
16
|
+
* e era invisível ao painel e ao watch, que anunciavam "nenhum trabalho aberto"
|
|
17
|
+
* enquanto a investigação rodava. Essa é justamente a janela em que a pessoa
|
|
18
|
+
* mais olha a tela, e a que mais leva tempo.
|
|
19
|
+
*
|
|
20
|
+
* O orquestrador continua sendo a fonte autoritativa: quando ele existe, é ele
|
|
21
|
+
* que descreve o trabalho. A ocorrência só preenche a lacuna do período em que
|
|
22
|
+
* ele ainda não foi escrito, com o que o próprio `00-OCORRENCIA.md` declara.
|
|
11
23
|
*/
|
|
12
24
|
export type Trabalho = {
|
|
13
25
|
trabalho_id: string;
|