expxdev 0.2.0 → 0.3.0
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/expx.d.ts +2 -0
- package/dist/cli/expx.js +55 -6
- package/dist/cli/expx.js.map +1 -1
- package/dist/cli/perguntar.d.ts +37 -0
- package/dist/cli/perguntar.js +76 -0
- package/dist/cli/perguntar.js.map +1 -0
- package/dist/cli/wizard.d.ts +21 -0
- package/dist/cli/wizard.js +101 -0
- package/dist/cli/wizard.js.map +1 -0
- package/package.json +1 -1
package/dist/cli/expx.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type Perguntador } from "./perguntar.js";
|
|
1
2
|
/**
|
|
2
3
|
* O entrypoint do binário `expx`.
|
|
3
4
|
*
|
|
@@ -10,4 +11,5 @@ export type Saida = {
|
|
|
10
11
|
escreverErro?: (texto: string) => void;
|
|
11
12
|
};
|
|
12
13
|
export type Executor = (resto: readonly string[], saida: Required<Saida>) => Promise<number>;
|
|
14
|
+
export declare function usarPerguntador(fabrica: () => Perguntador): void;
|
|
13
15
|
export declare function executarExpx(argv: readonly string[], saida?: Saida): Promise<number>;
|
package/dist/cli/expx.js
CHANGED
|
@@ -6,8 +6,36 @@ import { adicionarSkills, removerSkills } from "./selecionar.js";
|
|
|
6
6
|
import { interpretarFlagsUpdate, executarUpdate } from "../update/flags.js";
|
|
7
7
|
import { diagnosticar } from "../doctor/verificadores.js";
|
|
8
8
|
import { avaliarSelecao } from "./selecao.js";
|
|
9
|
+
import { executarWizard } from "./wizard.js";
|
|
10
|
+
import { perguntadorDeTerminal } from "./perguntar.js";
|
|
11
|
+
import { NOMES } from "../nucleo/catalogo.js";
|
|
9
12
|
import { instalarPlugin } from "../harness/instalar.js";
|
|
10
13
|
import { join } from "node:path";
|
|
14
|
+
/**
|
|
15
|
+
* Há um humano capaz de responder?
|
|
16
|
+
*
|
|
17
|
+
* Precisa dos DOIS lados: `stdout` sozinho não basta, porque escrever no
|
|
18
|
+
* terminal não prova que existe teclado do outro lado — num `expx init < /dev/null`
|
|
19
|
+
* o `stdout` continua TTY e o wizard travaria esperando uma resposta que não vem.
|
|
20
|
+
* É `stdin` que decide se dá para perguntar.
|
|
21
|
+
*/
|
|
22
|
+
function ehInterativo() {
|
|
23
|
+
return process.stdin.isTTY === true && process.stdout.isTTY === true;
|
|
24
|
+
}
|
|
25
|
+
/** Injetável para o teste trocar o terminal por um roteiro de respostas. */
|
|
26
|
+
let criarPerguntador = () => perguntadorDeTerminal();
|
|
27
|
+
export function usarPerguntador(fabrica) {
|
|
28
|
+
criarPerguntador = fabrica;
|
|
29
|
+
}
|
|
30
|
+
function comoEscolherSkills() {
|
|
31
|
+
return [
|
|
32
|
+
"escolha as skills com --skills, ou rode num terminal para responder na hora:",
|
|
33
|
+
"",
|
|
34
|
+
` npx expxdev init --skills ${NOMES.slice(0, 2).join(",")} --yes`,
|
|
35
|
+
"",
|
|
36
|
+
`disponiveis: ${NOMES.join(", ")}`,
|
|
37
|
+
].join("\n");
|
|
38
|
+
}
|
|
11
39
|
const EXECUTORES = {
|
|
12
40
|
panel: async (resto) => principalPainel(resto),
|
|
13
41
|
init: async (resto, saida) => {
|
|
@@ -16,20 +44,41 @@ const EXECUTORES = {
|
|
|
16
44
|
saida.escreverErro(`${f.erro}\n`);
|
|
17
45
|
return 1;
|
|
18
46
|
}
|
|
19
|
-
|
|
47
|
+
let opcoes = f.opcoes;
|
|
48
|
+
// Faltou o que instalar e há alguém para responder? Pergunta, em vez de
|
|
49
|
+
// sair com "nenhuma skill selecionada" — que era o beco sem saída do
|
|
50
|
+
// `npx expxdev init` puro.
|
|
51
|
+
if (opcoes.skills.length === 0 && ehInterativo()) {
|
|
52
|
+
const p = criarPerguntador();
|
|
53
|
+
try {
|
|
54
|
+
const w = await executarWizard(p, opcoes, process.cwd());
|
|
55
|
+
if (!w.ok) {
|
|
56
|
+
saida.escreverErro(`${w.erro}\n`);
|
|
57
|
+
return 1;
|
|
58
|
+
}
|
|
59
|
+
opcoes = w.opcoes;
|
|
60
|
+
}
|
|
61
|
+
finally {
|
|
62
|
+
p.fechar();
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
const aval = avaliarSelecao(opcoes.skills);
|
|
20
66
|
if (!aval.permitido) {
|
|
21
67
|
saida.escreverErro(`${aval.erros.join("\n")}\n`);
|
|
68
|
+
// Sem terminal para perguntar, a saída precisa dizer como resolver:
|
|
69
|
+
// o erro sozinho não ensina a próxima ação.
|
|
70
|
+
if (!ehInterativo())
|
|
71
|
+
saida.escreverErro(`\n${comoEscolherSkills()}\n`);
|
|
22
72
|
return 1;
|
|
23
73
|
}
|
|
24
74
|
for (const a of aval.avisos)
|
|
25
75
|
saida.escrever(`aviso: ${a}\n`);
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
saida.escrever(`instalaria: ${f.opcoes.skills.join(", ")}\nuse --yes para aplicar sem perguntar\n`);
|
|
76
|
+
if (!opcoes.sim && !ehInterativo()) {
|
|
77
|
+
saida.escrever(`instalaria: ${opcoes.skills.join(", ")}\nuse --yes para aplicar sem perguntar\n`);
|
|
29
78
|
return 0;
|
|
30
79
|
}
|
|
31
|
-
const harness =
|
|
32
|
-
const r = await executarInit({ raiz: process.cwd(), skills:
|
|
80
|
+
const harness = opcoes.harness.length > 0 ? opcoes.harness : ["claude"];
|
|
81
|
+
const r = await executarInit({ raiz: process.cwd(), skills: opcoes.skills, harness });
|
|
33
82
|
for (const a of r.avisos)
|
|
34
83
|
saida.escrever(`aviso: ${a}\n`);
|
|
35
84
|
for (const x of r.falhas)
|
package/dist/cli/expx.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"expx.js","sourceRoot":"","sources":["../../src/cli/expx.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,UAAU,EAAmB,MAAM,kBAAkB,CAAC;AACtF,OAAO,EAAE,SAAS,IAAI,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAC9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACjE,OAAO,EAAE,sBAAsB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAC5E,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAiBjC,MAAM,UAAU,GAA0C;IACxD,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,eAAe,CAAC,KAAK,CAAC;IAE9C,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;QAC3B,MAAM,CAAC,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;QACtC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;YACV,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;YAClC,OAAO,CAAC,CAAC;QACX,CAAC;
|
|
1
|
+
{"version":3,"file":"expx.js","sourceRoot":"","sources":["../../src/cli/expx.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { Readable, Writable } from "node:stream";
|
|
2
|
+
/**
|
|
3
|
+
* A camada de pergunta e resposta do terminal — e só ela.
|
|
4
|
+
*
|
|
5
|
+
* O wizard do `init` não fala com `process.stdin` diretamente: recebe um
|
|
6
|
+
* `Perguntador`. É o que torna o fluxo testável sem subprocesso e sem TTY
|
|
7
|
+
* falso, do mesmo jeito que `expx.ts` já injeta a saída para não capturar
|
|
8
|
+
* `process.stdout` global.
|
|
9
|
+
*/
|
|
10
|
+
export type Perguntador = {
|
|
11
|
+
/** Uma linha de texto livre, já sem espaço nas pontas. */
|
|
12
|
+
linha: (rotulo: string) => Promise<string>;
|
|
13
|
+
escrever: (texto: string) => void;
|
|
14
|
+
fechar: () => void;
|
|
15
|
+
};
|
|
16
|
+
export declare function perguntadorDeTerminal(entrada?: Readable, saida?: Writable): Perguntador;
|
|
17
|
+
/**
|
|
18
|
+
* Um perguntador de roteiro, para teste: consome respostas em ordem.
|
|
19
|
+
*
|
|
20
|
+
* Acabaram as respostas do roteiro? Devolve string vazia — que todo passo do
|
|
21
|
+
* wizard trata como "aceito o padrão". Um teste que esquece uma resposta
|
|
22
|
+
* termina com o padrão em vez de travar o processo esperando `stdin`.
|
|
23
|
+
*/
|
|
24
|
+
export declare function perguntadorDeRoteiro(respostas: readonly string[]): Perguntador & {
|
|
25
|
+
escrito: () => string;
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Lê uma escolha múltipla por número: `1,3` ou `1 3`.
|
|
29
|
+
*
|
|
30
|
+
* Devolve `undefined` quando algum número está fora da faixa, para o chamador
|
|
31
|
+
* repetir a pergunta em vez de instalar a coisa errada em silêncio. Resposta
|
|
32
|
+
* vazia é escolha vazia — quem decide se isso vale é a regra de seleção, não
|
|
33
|
+
* a leitura.
|
|
34
|
+
*/
|
|
35
|
+
export declare function interpretarEscolhaMultipla(resposta: string, total: number): number[] | undefined;
|
|
36
|
+
/** `sim`/`s`/`y`/`yes` é sim; vazio devolve o padrão; o resto é não. */
|
|
37
|
+
export declare function interpretarSimNao(resposta: string, padrao: boolean): boolean;
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { createInterface } from "node:readline";
|
|
2
|
+
export function perguntadorDeTerminal(entrada = process.stdin, saida = process.stdout) {
|
|
3
|
+
let rl;
|
|
4
|
+
const obter = () => {
|
|
5
|
+
rl ??= createInterface({ input: entrada, output: saida });
|
|
6
|
+
return rl;
|
|
7
|
+
};
|
|
8
|
+
return {
|
|
9
|
+
linha: async (rotulo) => {
|
|
10
|
+
const resposta = await new Promise((resolver) => {
|
|
11
|
+
obter().question(rotulo, resolver);
|
|
12
|
+
});
|
|
13
|
+
return resposta.trim();
|
|
14
|
+
},
|
|
15
|
+
escrever: (texto) => {
|
|
16
|
+
saida.write(texto);
|
|
17
|
+
},
|
|
18
|
+
fechar: () => {
|
|
19
|
+
rl?.close();
|
|
20
|
+
rl = undefined;
|
|
21
|
+
},
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Um perguntador de roteiro, para teste: consome respostas em ordem.
|
|
26
|
+
*
|
|
27
|
+
* Acabaram as respostas do roteiro? Devolve string vazia — que todo passo do
|
|
28
|
+
* wizard trata como "aceito o padrão". Um teste que esquece uma resposta
|
|
29
|
+
* termina com o padrão em vez de travar o processo esperando `stdin`.
|
|
30
|
+
*/
|
|
31
|
+
export function perguntadorDeRoteiro(respostas) {
|
|
32
|
+
const restantes = [...respostas];
|
|
33
|
+
let escrito = "";
|
|
34
|
+
return {
|
|
35
|
+
linha: (rotulo) => {
|
|
36
|
+
escrito += rotulo;
|
|
37
|
+
return Promise.resolve(restantes.shift() ?? "");
|
|
38
|
+
},
|
|
39
|
+
escrever: (texto) => {
|
|
40
|
+
escrito += texto;
|
|
41
|
+
},
|
|
42
|
+
fechar: () => { },
|
|
43
|
+
escrito: () => escrito,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Lê uma escolha múltipla por número: `1,3` ou `1 3`.
|
|
48
|
+
*
|
|
49
|
+
* Devolve `undefined` quando algum número está fora da faixa, para o chamador
|
|
50
|
+
* repetir a pergunta em vez de instalar a coisa errada em silêncio. Resposta
|
|
51
|
+
* vazia é escolha vazia — quem decide se isso vale é a regra de seleção, não
|
|
52
|
+
* a leitura.
|
|
53
|
+
*/
|
|
54
|
+
export function interpretarEscolhaMultipla(resposta, total) {
|
|
55
|
+
if (resposta.trim() === "")
|
|
56
|
+
return [];
|
|
57
|
+
const indices = [];
|
|
58
|
+
for (const parte of resposta.split(/[,\s]+/).filter((p) => p !== "")) {
|
|
59
|
+
if (!/^\d+$/.test(parte))
|
|
60
|
+
return undefined;
|
|
61
|
+
const n = Number(parte);
|
|
62
|
+
if (n < 1 || n > total)
|
|
63
|
+
return undefined;
|
|
64
|
+
if (!indices.includes(n - 1))
|
|
65
|
+
indices.push(n - 1);
|
|
66
|
+
}
|
|
67
|
+
return indices;
|
|
68
|
+
}
|
|
69
|
+
/** `sim`/`s`/`y`/`yes` é sim; vazio devolve o padrão; o resto é não. */
|
|
70
|
+
export function interpretarSimNao(resposta, padrao) {
|
|
71
|
+
const v = resposta.trim().toLowerCase();
|
|
72
|
+
if (v === "")
|
|
73
|
+
return padrao;
|
|
74
|
+
return v === "s" || v === "sim" || v === "y" || v === "yes";
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=perguntar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"perguntar.js","sourceRoot":"","sources":["../../src/cli/perguntar.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type OpcoesInitCli } from "./init-flags.js";
|
|
2
|
+
import { type Perguntador } from "./perguntar.js";
|
|
3
|
+
/**
|
|
4
|
+
* As quatro perguntas do `init` interativo (especificação, promptcli1.md:51-68).
|
|
5
|
+
*
|
|
6
|
+
* O wizard não instala nada: ele só transforma "nenhuma flag" em uma seleção
|
|
7
|
+
* completa e devolve. Quem escreve em disco continua sendo `executarInit`, com
|
|
8
|
+
* exatamente o mesmo caminho que as flags percorrem — é o que garante que o
|
|
9
|
+
* modo interativo e o modo `--skills` não divirjam em comportamento.
|
|
10
|
+
*
|
|
11
|
+
* Toda pergunta respeita o que já veio por flag: quem passou `--harness` não é
|
|
12
|
+
* perguntado de novo. Isso permite responder metade por flag e metade na mão.
|
|
13
|
+
*/
|
|
14
|
+
export type ResultadoWizard = {
|
|
15
|
+
ok: true;
|
|
16
|
+
opcoes: OpcoesInitCli;
|
|
17
|
+
} | {
|
|
18
|
+
ok: false;
|
|
19
|
+
erro: string;
|
|
20
|
+
};
|
|
21
|
+
export declare function executarWizard(p: Perguntador, parciais: OpcoesInitCli, raiz: string): Promise<ResultadoWizard>;
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { CATALOGO } from "../nucleo/catalogo.js";
|
|
2
|
+
import { avaliarSelecao } from "./selecao.js";
|
|
3
|
+
import { detectarProjeto } from "./projeto.js";
|
|
4
|
+
import { HARNESS_VALIDOS } from "./init-flags.js";
|
|
5
|
+
import { interpretarEscolhaMultipla, interpretarSimNao } from "./perguntar.js";
|
|
6
|
+
const TENTATIVAS = 3;
|
|
7
|
+
function listarSkills(p) {
|
|
8
|
+
p.escrever("\nQuais skills instalar neste projeto?\n\n");
|
|
9
|
+
CATALOGO.forEach((s, i) => {
|
|
10
|
+
const marca = s.camada ? " (camada)" : "";
|
|
11
|
+
p.escrever(` ${String(i + 1)}. ${s.nome}${marca} — ${s.papel}\n`);
|
|
12
|
+
});
|
|
13
|
+
p.escrever("\nResponda com os numeros separados por virgula (ex.: 1,5).\n");
|
|
14
|
+
}
|
|
15
|
+
async function escolherSkills(p) {
|
|
16
|
+
listarSkills(p);
|
|
17
|
+
for (let tentativa = 0; tentativa < TENTATIVAS; tentativa++) {
|
|
18
|
+
const resposta = await p.linha("skills: ");
|
|
19
|
+
const indices = interpretarEscolhaMultipla(resposta, CATALOGO.length);
|
|
20
|
+
if (indices === undefined) {
|
|
21
|
+
p.escrever(`numero invalido: responda entre 1 e ${String(CATALOGO.length)}\n`);
|
|
22
|
+
continue;
|
|
23
|
+
}
|
|
24
|
+
if (indices.length === 0) {
|
|
25
|
+
p.escrever("nenhuma skill escolhida: escolha ao menos uma\n");
|
|
26
|
+
continue;
|
|
27
|
+
}
|
|
28
|
+
const selecao = indices.map((i) => CATALOGO[i]?.nome ?? "");
|
|
29
|
+
const aval = avaliarSelecao(selecao);
|
|
30
|
+
// Aviso nunca impede: a combinação incomum pode ser exatamente a pedida.
|
|
31
|
+
// O CLI explica a consequência e deixa a pessoa confirmar (selecao.ts).
|
|
32
|
+
if (aval.precisaConfirmar) {
|
|
33
|
+
for (const a of aval.avisos)
|
|
34
|
+
p.escrever(`\naviso: ${a}\n`);
|
|
35
|
+
const segue = interpretarSimNao(await p.linha("seguir assim mesmo? [s/N] "), false);
|
|
36
|
+
if (!segue) {
|
|
37
|
+
p.escrever("\nescolha de novo:\n");
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
for (const i of aval.integracoes) {
|
|
42
|
+
p.escrever(`integracao disponivel: ${i} se conecta com as skills escolhidas\n`);
|
|
43
|
+
}
|
|
44
|
+
return selecao;
|
|
45
|
+
}
|
|
46
|
+
return undefined;
|
|
47
|
+
}
|
|
48
|
+
async function escolherHarness(p) {
|
|
49
|
+
p.escrever("\nQual harness configurar?\n\n");
|
|
50
|
+
p.escrever(" 1. claude — Claude Code\n");
|
|
51
|
+
p.escrever(" 2. opencode — OpenCode\n");
|
|
52
|
+
p.escrever("\nOs dois: 1,2. Vazio usa claude.\n");
|
|
53
|
+
for (let tentativa = 0; tentativa < TENTATIVAS; tentativa++) {
|
|
54
|
+
const resposta = await p.linha("harness [1]: ");
|
|
55
|
+
if (resposta.trim() === "")
|
|
56
|
+
return ["claude"];
|
|
57
|
+
const indices = interpretarEscolhaMultipla(resposta, HARNESS_VALIDOS.length);
|
|
58
|
+
if (indices === undefined || indices.length === 0) {
|
|
59
|
+
p.escrever("responda 1, 2 ou 1,2\n");
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
return indices.map((i) => HARNESS_VALIDOS[i] ?? "claude");
|
|
63
|
+
}
|
|
64
|
+
return undefined;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Reconfiguração nunca apaga sem confirmar (promptcli1.md:51-53).
|
|
68
|
+
*
|
|
69
|
+
* O `.expx/` existente é remontado do zero pelo `init`, então seguir sem
|
|
70
|
+
* perguntar destruiria a seleção anterior em silêncio.
|
|
71
|
+
*/
|
|
72
|
+
async function confirmarReconfiguracao(p, raiz) {
|
|
73
|
+
if (!detectarProjeto(raiz).existe)
|
|
74
|
+
return true;
|
|
75
|
+
p.escrever("\nEste projeto ja tem um .expx/ instalado.\n");
|
|
76
|
+
p.escrever("Seguir remonta a instalacao a partir da nova selecao, substituindo a atual.\n");
|
|
77
|
+
return interpretarSimNao(await p.linha("reconfigurar? [s/N] "), false);
|
|
78
|
+
}
|
|
79
|
+
export async function executarWizard(p, parciais, raiz) {
|
|
80
|
+
if (!(await confirmarReconfiguracao(p, raiz))) {
|
|
81
|
+
return { ok: false, erro: "reconfiguracao cancelada: nada foi alterado" };
|
|
82
|
+
}
|
|
83
|
+
const skills = parciais.skills.length > 0 ? parciais.skills : await escolherSkills(p);
|
|
84
|
+
if (skills === undefined)
|
|
85
|
+
return { ok: false, erro: "selecao de skills invalida apos varias tentativas" };
|
|
86
|
+
const harness = parciais.harness.length > 0 ? parciais.harness : await escolherHarness(p);
|
|
87
|
+
if (harness === undefined)
|
|
88
|
+
return { ok: false, erro: "harness invalido apos varias tentativas" };
|
|
89
|
+
const painel = parciais.painel
|
|
90
|
+
? true
|
|
91
|
+
: interpretarSimNao(await p.linha("\nInstalar o painel como devDependency? [s/N] "), false);
|
|
92
|
+
p.escrever(`\nvai instalar: ${skills.join(", ")}\n`);
|
|
93
|
+
p.escrever(`harness: ${harness.join(", ")}\n`);
|
|
94
|
+
if (painel)
|
|
95
|
+
p.escrever("painel: sim\n");
|
|
96
|
+
if (!interpretarSimNao(await p.linha("\nconfirmar? [S/n] "), true)) {
|
|
97
|
+
return { ok: false, erro: "cancelado: nada foi alterado" };
|
|
98
|
+
}
|
|
99
|
+
return { ok: true, opcoes: { skills: [...skills], harness: [...harness], painel, sim: true, simular: parciais.simular } };
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=wizard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wizard.js","sourceRoot":"","sources":["../../src/cli/wizard.ts"],"names":[],"mappings":"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"}
|