expxdev 0.1.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/LICENSE +21 -0
- package/README.md +137 -0
- package/dist/cli/argumentos.d.ts +22 -0
- package/dist/cli/argumentos.js +85 -0
- package/dist/cli/argumentos.js.map +1 -0
- package/dist/cli/expx-bin.d.ts +2 -0
- package/dist/cli/expx-bin.js +40 -0
- package/dist/cli/expx-bin.js.map +1 -0
- package/dist/cli/expx.d.ts +13 -0
- package/dist/cli/expx.js +123 -0
- package/dist/cli/expx.js.map +1 -0
- package/dist/cli/init-flags.d.ts +34 -0
- package/dist/cli/init-flags.js +83 -0
- package/dist/cli/init-flags.js.map +1 -0
- package/dist/cli/init.d.ts +34 -0
- package/dist/cli/init.js +103 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/principal.d.ts +2 -0
- package/dist/cli/principal.js +107 -0
- package/dist/cli/principal.js.map +1 -0
- package/dist/cli/projeto.d.ts +19 -0
- package/dist/cli/projeto.js +28 -0
- package/dist/cli/projeto.js.map +1 -0
- package/dist/cli/selecao.d.ts +19 -0
- package/dist/cli/selecao.js +28 -0
- package/dist/cli/selecao.js.map +1 -0
- package/dist/cli/selecionar.d.ts +23 -0
- package/dist/cli/selecionar.js +45 -0
- package/dist/cli/selecionar.js.map +1 -0
- package/dist/cli/subcomandos.d.ts +25 -0
- package/dist/cli/subcomandos.js +43 -0
- package/dist/cli/subcomandos.js.map +1 -0
- package/dist/doctor/efeito.d.ts +17 -0
- package/dist/doctor/efeito.js +18 -0
- package/dist/doctor/efeito.js.map +1 -0
- package/dist/doctor/verificadores.d.ts +21 -0
- package/dist/doctor/verificadores.js +158 -0
- package/dist/doctor/verificadores.js.map +1 -0
- package/dist/harness/backup.d.ts +15 -0
- package/dist/harness/backup.js +29 -0
- package/dist/harness/backup.js.map +1 -0
- package/dist/harness/instalar.d.ts +31 -0
- package/dist/harness/instalar.js +43 -0
- package/dist/harness/instalar.js.map +1 -0
- package/dist/harness/opencode.d.ts +18 -0
- package/dist/harness/opencode.js +32 -0
- package/dist/harness/opencode.js.map +1 -0
- package/dist/harness/settings.d.ts +36 -0
- package/dist/harness/settings.js +66 -0
- package/dist/harness/settings.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/nucleo/busca.d.ts +28 -0
- package/dist/nucleo/busca.js +29 -0
- package/dist/nucleo/busca.js.map +1 -0
- package/dist/nucleo/caminhos.d.ts +21 -0
- package/dist/nucleo/caminhos.js +64 -0
- package/dist/nucleo/caminhos.js.map +1 -0
- package/dist/nucleo/catalogo.d.ts +20 -0
- package/dist/nucleo/catalogo.js +50 -0
- package/dist/nucleo/catalogo.js.map +1 -0
- package/dist/nucleo/integridade.d.ts +20 -0
- package/dist/nucleo/integridade.js +75 -0
- package/dist/nucleo/integridade.js.map +1 -0
- package/dist/nucleo/layout.d.ts +23 -0
- package/dist/nucleo/layout.js +73 -0
- package/dist/nucleo/layout.js.map +1 -0
- package/dist/nucleo/lock.d.ts +61 -0
- package/dist/nucleo/lock.js +96 -0
- package/dist/nucleo/lock.js.map +1 -0
- package/dist/nucleo/versao.d.ts +35 -0
- package/dist/nucleo/versao.js +63 -0
- package/dist/nucleo/versao.js.map +1 -0
- package/dist/parser/conformidade/regras.d.ts +41 -0
- package/dist/parser/conformidade/regras.js +209 -0
- package/dist/parser/conformidade/regras.js.map +1 -0
- package/dist/parser/descoberta/trabalhos.d.ts +35 -0
- package/dist/parser/descoberta/trabalhos.js +28 -0
- package/dist/parser/descoberta/trabalhos.js.map +1 -0
- package/dist/parser/descoberta/varredura.d.ts +4 -0
- package/dist/parser/descoberta/varredura.js +79 -0
- package/dist/parser/descoberta/varredura.js.map +1 -0
- package/dist/parser/esquema/cabecalho.d.ts +60 -0
- package/dist/parser/esquema/cabecalho.js +57 -0
- package/dist/parser/esquema/cabecalho.js.map +1 -0
- package/dist/parser/esquema/enums.d.ts +114 -0
- package/dist/parser/esquema/enums.js +64 -0
- package/dist/parser/esquema/enums.js.map +1 -0
- package/dist/parser/esquema/kinds.d.ts +768 -0
- package/dist/parser/esquema/kinds.js +231 -0
- package/dist/parser/esquema/kinds.js.map +1 -0
- package/dist/parser/leitura/arquivo.d.ts +9 -0
- package/dist/parser/leitura/arquivo.js +25 -0
- package/dist/parser/leitura/arquivo.js.map +1 -0
- package/dist/parser/leitura/frontmatter.d.ts +31 -0
- package/dist/parser/leitura/frontmatter.js +77 -0
- package/dist/parser/leitura/frontmatter.js.map +1 -0
- package/dist/parser/leitura/rejeicao.d.ts +43 -0
- package/dist/parser/leitura/rejeicao.js +73 -0
- package/dist/parser/leitura/rejeicao.js.map +1 -0
- package/dist/parser/projeto/montar.d.ts +62 -0
- package/dist/parser/projeto/montar.js +149 -0
- package/dist/parser/projeto/montar.js.map +1 -0
- package/dist/plugin/atomico.d.ts +13 -0
- package/dist/plugin/atomico.js +42 -0
- package/dist/plugin/atomico.js.map +1 -0
- package/dist/plugin/manifestos.d.ts +38 -0
- package/dist/plugin/manifestos.js +57 -0
- package/dist/plugin/manifestos.js.map +1 -0
- package/dist/plugin/montagem.d.ts +22 -0
- package/dist/plugin/montagem.js +30 -0
- package/dist/plugin/montagem.js.map +1 -0
- package/dist/relatorio/markdown.d.ts +22 -0
- package/dist/relatorio/markdown.js +0 -0
- package/dist/relatorio/markdown.js.map +1 -0
- package/dist/relatorio/pagina.d.ts +22 -0
- package/dist/relatorio/pagina.js +338 -0
- package/dist/relatorio/pagina.js.map +1 -0
- package/dist/servidor/estado.d.ts +16 -0
- package/dist/servidor/estado.js +16 -0
- package/dist/servidor/estado.js.map +1 -0
- package/dist/servidor/http.d.ts +22 -0
- package/dist/servidor/http.js +164 -0
- package/dist/servidor/http.js.map +1 -0
- package/dist/servidor/observador.d.ts +12 -0
- package/dist/servidor/observador.js +37 -0
- package/dist/servidor/observador.js.map +1 -0
- package/dist/servidor/painel.d.ts +24 -0
- package/dist/servidor/painel.js +49 -0
- package/dist/servidor/painel.js.map +1 -0
- package/dist/teste/layouts-fixture.d.ts +16 -0
- package/dist/teste/layouts-fixture.js +9 -0
- package/dist/teste/layouts-fixture.js.map +1 -0
- package/dist/teste/projeto-temporario.d.ts +14 -0
- package/dist/teste/projeto-temporario.js +16 -0
- package/dist/teste/projeto-temporario.js.map +1 -0
- package/dist/teste/repo-fixture.d.ts +27 -0
- package/dist/teste/repo-fixture.js +49 -0
- package/dist/teste/repo-fixture.js.map +1 -0
- package/dist/update/comparar.d.ts +33 -0
- package/dist/update/comparar.js +67 -0
- package/dist/update/comparar.js.map +1 -0
- package/dist/update/compatibilidade.d.ts +19 -0
- package/dist/update/compatibilidade.js +36 -0
- package/dist/update/compatibilidade.js.map +1 -0
- package/dist/update/flags.d.ts +47 -0
- package/dist/update/flags.js +123 -0
- package/dist/update/flags.js.map +1 -0
- package/dist/update/modificacao.d.ts +23 -0
- package/dist/update/modificacao.js +36 -0
- package/dist/update/modificacao.js.map +1 -0
- package/package.json +73 -0
- package/ui/dist/assets/index-BmDTogQZ.js +14 -0
- package/ui/dist/assets/index-DUzbt2M7.css +1 -0
- package/ui/dist/index.html +13 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Expx
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
# expxdev
|
|
2
|
+
|
|
3
|
+
CLI do método Expx. Instala, atualiza e diagnostica o ecossistema de skills por projeto,
|
|
4
|
+
e sobe o painel de operação que lê a pasta `docs/`.
|
|
5
|
+
|
|
6
|
+
## Instalação das skills
|
|
7
|
+
|
|
8
|
+
```bash
|
|
9
|
+
npx expxdev init
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
O `init` busca as skills escolhidas nos repositórios oficiais, empacota as selecionadas
|
|
13
|
+
como um plugin local chamado `expx` e configura o harness. Os comandos ficam com namespace
|
|
14
|
+
no Claude Code (`/expx:sprintx-sprints`) e sem namespace no OpenCode (`/sprintx-sprints`).
|
|
15
|
+
|
|
16
|
+
| Skill | O que faz |
|
|
17
|
+
|---|---|
|
|
18
|
+
| [`sprintx`](https://github.com/bittencourtthulio/sprintx) | planeja e executa features novas |
|
|
19
|
+
| [`runx`](https://github.com/bittencourtthulio/runx) | ocorrências de manutenção do dia a dia |
|
|
20
|
+
| [`legadox`](https://github.com/bittencourtthulio/legadox) | camada para projetos legados |
|
|
21
|
+
| [`stackx`](https://github.com/bittencourtthulio/stackx) | descobre o dialeto técnico do repositório |
|
|
22
|
+
| [`mergex`](https://github.com/bittencourtthulio/mergex) | versionamento, entrega e revisão de PRs |
|
|
23
|
+
|
|
24
|
+
### Subcomandos
|
|
25
|
+
|
|
26
|
+
| Comando | O que faz |
|
|
27
|
+
|---|---|
|
|
28
|
+
| `expx init` | instala as skills escolhidas neste projeto |
|
|
29
|
+
| `expx panel` | sobe o painel lendo o `docs/` do projeto |
|
|
30
|
+
| `expx add <skill...>` | acrescenta skills à seleção |
|
|
31
|
+
| `expx remove <skill...>` | remove skills da seleção |
|
|
32
|
+
| `expx update [skill...]` | atualiza as skills instaladas |
|
|
33
|
+
| `expx doctor` | diagnostica uma instalação quebrada |
|
|
34
|
+
|
|
35
|
+
O painel funciona sem `init`: ele não precisa de nada instalado.
|
|
36
|
+
|
|
37
|
+
Flags do `init` (todas as perguntas têm equivalente por flag, para uso em script):
|
|
38
|
+
`--skills sprintx,runx` · `--harness claude,opencode` · `--painel` · `--yes`
|
|
39
|
+
|
|
40
|
+
Flags do `update`: `--check` (só mostra) · `--to <ref>` · `--latest` · `--yes`
|
|
41
|
+
|
|
42
|
+
### Versão, lock e atualização
|
|
43
|
+
|
|
44
|
+
A instalação é travada por `.expx/expx-lock.json`, que é **commitado** junto com `.expx/`.
|
|
45
|
+
Quem clona o projeto recebe as skills já em disco. Por padrão o CLI busca a maior tag de
|
|
46
|
+
versão semântica de cada repositório; sem nenhuma tag, segue a branch padrão e **avisa**
|
|
47
|
+
que a skill não está travada em versão publicada.
|
|
48
|
+
|
|
49
|
+
O `update` compara com o lock, mostra o que mudou e pede confirmação antes de aplicar.
|
|
50
|
+
Se algum arquivo da skill foi alterado à mão, ele **não sobrescreve**: lista os arquivos e
|
|
51
|
+
pede a decisão. Para desfazer uma atualização, reverta o `.expx/` pelo versionador.
|
|
52
|
+
|
|
53
|
+
> **Registro do plugin no Claude Code.** Declarar o marketplace no `settings.json` do
|
|
54
|
+
> projeto não instala o plugin — o `init` chama `claude plugin marketplace add` e
|
|
55
|
+
> `claude plugin install`. Como esse registro grava um caminho absoluto na configuração do
|
|
56
|
+
> usuário, ele não viaja no commit: cada pessoa roda `expx init` na própria máquina.
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
# O painel
|
|
61
|
+
|
|
62
|
+
Lê a pasta `docs/` de um projeto, descobre os trabalhos gravados pelas skills
|
|
63
|
+
[`sprintx`](https://github.com/bittencourtthulio/sprintx) e
|
|
64
|
+
[`runx`](https://github.com/bittencourtthulio/runx), e mostra no navegador o que foi
|
|
65
|
+
planejado, o que está em execução, o que travou e o histórico do que já foi entregue.
|
|
66
|
+
|
|
67
|
+
**Somente leitura.** O painel nunca escreve nos arquivos do projeto e nunca executa comando algum.
|
|
68
|
+
|
|
69
|
+
## Uso
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
npx expxdev panel
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
| Flag | Padrão | O que faz |
|
|
76
|
+
|---|---|---|
|
|
77
|
+
| `--porta <n>` | `4000` | porta do servidor local |
|
|
78
|
+
| `--dir <caminho>` | `./docs` | pasta de documentação a observar |
|
|
79
|
+
| `--no-open` | — | não abre o navegador |
|
|
80
|
+
| `--dias-bloqueio <n>` | `7` | a partir de quantos dias um bloqueio aberto é "antigo" |
|
|
81
|
+
| `--ajuda` | — | mostra a ajuda |
|
|
82
|
+
|
|
83
|
+
## O que o painel mostra
|
|
84
|
+
|
|
85
|
+
- **Visão global** — trabalhos em planejamento, execução, bloqueados e concluídos, separando feature de ocorrência; bloqueios abertos; ocorrências por tipo.
|
|
86
|
+
- **Quadro por estágio** — 11 colunas (`f1`–`f6` da sprintx, `e1`–`e5` da runx), com filtro por ferramenta, tipo e status.
|
|
87
|
+
- **Detalhe do trabalho** — sprints, fases e tasks com barra de progresso, dependências, destaque do paralelizável e do caminho crítico, bloqueios em evidência.
|
|
88
|
+
- **Conformidade com o método** — violações mecanicamente detectáveis pelo frontmatter, cada uma apontando arquivo e linha.
|
|
89
|
+
- **Histórico** — linha do tempo de `docs/relatorios/`, com busca por módulo e tipo. O relatório de uso fica em aba própria, com botão de copiar: é o texto que o suporte devolve ao cliente.
|
|
90
|
+
- **Fora do schema** — arquivos que não puderam ser lidos, com o motivo. Nunca derrubam o servidor.
|
|
91
|
+
|
|
92
|
+
## Segurança
|
|
93
|
+
|
|
94
|
+
O servidor escuta **exclusivamente em `127.0.0.1`**. Não há flag, variável de ambiente ou
|
|
95
|
+
opção que mude isso: o painel serve documentação interna sem autenticação nenhuma, e expô-la
|
|
96
|
+
na rede local entregaria o conteúdo a qualquer um no mesmo Wi-Fi. Todo método HTTP que não
|
|
97
|
+
seja `GET` responde `405`.
|
|
98
|
+
|
|
99
|
+
## Desenvolvimento
|
|
100
|
+
|
|
101
|
+
```bash
|
|
102
|
+
npm install
|
|
103
|
+
npm test # 89 testes
|
|
104
|
+
npm run build # tsc strict + vite
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
O projeto segue o próprio método que ele exibe. O planejamento inteiro está em
|
|
108
|
+
[`docs/expx-panel/`](docs/expx-panel/): base de conhecimento, decisões, plano de sprints,
|
|
109
|
+
auditoria e orquestrador. Apontar o painel para o próprio `docs/` deste repositório é o
|
|
110
|
+
teste de aceitação mais honesto que existe:
|
|
111
|
+
|
|
112
|
+
```bash
|
|
113
|
+
node dist/cli/principal.js --dir docs
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
### Arquitetura
|
|
117
|
+
|
|
118
|
+
Três camadas, sem regra de negócio vazando para cima:
|
|
119
|
+
|
|
120
|
+
```
|
|
121
|
+
src/parser/ recebe um caminho, devolve objeto tipado + rejeições + violações
|
|
122
|
+
src/servidor/ expõe a API de leitura, observa o disco, difunde por websocket
|
|
123
|
+
ui/src/ consome a API e renderiza — nenhuma regra de negócio aqui
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
O parser é testável sozinho, contra `fixtures/` em disco: `projeto-ok` cobre os 13 kinds
|
|
127
|
+
do contrato; `projeto-ruim` cobre YAML inválido, enum errado, chave ausente, versão de
|
|
128
|
+
schema futura, pasta sem orquestrador e task paralelizável com dependência.
|
|
129
|
+
|
|
130
|
+
### O contrato
|
|
131
|
+
|
|
132
|
+
[`docs/contrato/CONTRATO-expx-schema-v1.md`](docs/contrato/CONTRATO-expx-schema-v1.md) é a
|
|
133
|
+
referência do formato. Onde ele diverge do que as skills realmente gravam, o painel segue
|
|
134
|
+
as **skills** — elas é que escrevem os arquivos que ele lê. As duas divergências estão
|
|
135
|
+
registradas em [`docs/expx-panel/00-DECISOES.md`](docs/expx-panel/00-DECISOES.md) (D-01 e
|
|
136
|
+
D-02) e o parser aceita o superconjunto, de modo que nenhum arquivo real se perde seja qual
|
|
137
|
+
for o lado que venha a ser atualizado.
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/** Contrato de linha de comando do `expx-painel`. */
|
|
2
|
+
export declare const PADROES: {
|
|
3
|
+
readonly porta: 4000;
|
|
4
|
+
readonly dir: "./docs";
|
|
5
|
+
readonly diasBloqueio: 7;
|
|
6
|
+
};
|
|
7
|
+
export type Opcoes = {
|
|
8
|
+
porta: number;
|
|
9
|
+
dir: string;
|
|
10
|
+
abrir: boolean;
|
|
11
|
+
diasBloqueio: number;
|
|
12
|
+
ajuda: boolean;
|
|
13
|
+
};
|
|
14
|
+
export type Resultado = {
|
|
15
|
+
ok: true;
|
|
16
|
+
opcoes: Opcoes;
|
|
17
|
+
} | {
|
|
18
|
+
ok: false;
|
|
19
|
+
erro: string;
|
|
20
|
+
};
|
|
21
|
+
export declare function textoDeAjuda(): string;
|
|
22
|
+
export declare function interpretar(argv: readonly string[]): Resultado;
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/** Contrato de linha de comando do `expx-painel`. */
|
|
2
|
+
export const PADROES = {
|
|
3
|
+
porta: 4000,
|
|
4
|
+
dir: "./docs",
|
|
5
|
+
diasBloqueio: 7,
|
|
6
|
+
};
|
|
7
|
+
const AJUDA = `
|
|
8
|
+
expx-painel — painel de operacao do metodo Expx (somente leitura)
|
|
9
|
+
|
|
10
|
+
npx expx-painel [opcoes]
|
|
11
|
+
|
|
12
|
+
--porta <n> porta do servidor local (padrao ${String(PADROES.porta)})
|
|
13
|
+
--dir <caminho> pasta de documentacao a observar (padrao ${PADROES.dir})
|
|
14
|
+
--no-open nao abrir o navegador automaticamente
|
|
15
|
+
--dias-bloqueio <n> dias a partir dos quais um bloqueio e antigo (padrao ${String(PADROES.diasBloqueio)})
|
|
16
|
+
--ajuda mostra esta ajuda
|
|
17
|
+
|
|
18
|
+
O servidor escuta apenas em 127.0.0.1 e nunca escreve nos arquivos do projeto.
|
|
19
|
+
`.trim();
|
|
20
|
+
export function textoDeAjuda() {
|
|
21
|
+
return AJUDA;
|
|
22
|
+
}
|
|
23
|
+
function inteiro(valor, campo) {
|
|
24
|
+
if (valor === undefined)
|
|
25
|
+
return `${campo} exige um valor`;
|
|
26
|
+
const n = Number(valor);
|
|
27
|
+
if (!Number.isInteger(n))
|
|
28
|
+
return `${campo} exige um numero inteiro, recebeu ${JSON.stringify(valor)}`;
|
|
29
|
+
return n;
|
|
30
|
+
}
|
|
31
|
+
export function interpretar(argv) {
|
|
32
|
+
const opcoes = {
|
|
33
|
+
porta: PADROES.porta,
|
|
34
|
+
dir: PADROES.dir,
|
|
35
|
+
abrir: true,
|
|
36
|
+
diasBloqueio: PADROES.diasBloqueio,
|
|
37
|
+
ajuda: false,
|
|
38
|
+
};
|
|
39
|
+
for (let i = 0; i < argv.length; i++) {
|
|
40
|
+
const bruto = argv[i] ?? "";
|
|
41
|
+
const [nome, embutido] = bruto.includes("=")
|
|
42
|
+
? [bruto.slice(0, bruto.indexOf("=")), bruto.slice(bruto.indexOf("=") + 1)]
|
|
43
|
+
: [bruto, undefined];
|
|
44
|
+
const proximo = () => embutido ?? argv[++i];
|
|
45
|
+
switch (nome) {
|
|
46
|
+
case "--porta": {
|
|
47
|
+
const n = inteiro(proximo(), "--porta");
|
|
48
|
+
if (typeof n === "string")
|
|
49
|
+
return { ok: false, erro: n };
|
|
50
|
+
if (n < 0 || n > 65535)
|
|
51
|
+
return { ok: false, erro: `--porta fora da faixa valida: ${String(n)}` };
|
|
52
|
+
opcoes.porta = n;
|
|
53
|
+
break;
|
|
54
|
+
}
|
|
55
|
+
case "--dir": {
|
|
56
|
+
const v = proximo();
|
|
57
|
+
if (v === undefined || v === "")
|
|
58
|
+
return { ok: false, erro: "--dir exige um caminho" };
|
|
59
|
+
opcoes.dir = v;
|
|
60
|
+
break;
|
|
61
|
+
}
|
|
62
|
+
case "--dias-bloqueio": {
|
|
63
|
+
const n = inteiro(proximo(), "--dias-bloqueio");
|
|
64
|
+
if (typeof n === "string")
|
|
65
|
+
return { ok: false, erro: n };
|
|
66
|
+
if (n < 0)
|
|
67
|
+
return { ok: false, erro: "--dias-bloqueio nao pode ser negativo" };
|
|
68
|
+
opcoes.diasBloqueio = n;
|
|
69
|
+
break;
|
|
70
|
+
}
|
|
71
|
+
case "--no-open":
|
|
72
|
+
opcoes.abrir = false;
|
|
73
|
+
break;
|
|
74
|
+
case "--ajuda":
|
|
75
|
+
case "--help":
|
|
76
|
+
case "-h":
|
|
77
|
+
opcoes.ajuda = true;
|
|
78
|
+
break;
|
|
79
|
+
default:
|
|
80
|
+
return { ok: false, erro: `opcao desconhecida: ${nome}` };
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return { ok: true, opcoes };
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=argumentos.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"argumentos.js","sourceRoot":"","sources":["../../src/cli/argumentos.ts"],"names":[],"mappings":"AAAA,qDAAqD;AAErD,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,KAAK,EAAE,IAAI;IACX,GAAG,EAAE,QAAQ;IACb,YAAY,EAAE,CAAC;CACP,CAAC;AAcX,MAAM,KAAK,GAAG;;;;;0DAK4C,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;mEACZ,OAAO,CAAC,GAAG;;+EAEC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC;;;;CAI1G,CAAC,IAAI,EAAE,CAAC;AAET,MAAM,UAAU,YAAY;IAC1B,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,OAAO,CAAC,KAAyB,EAAE,KAAa;IACvD,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,GAAG,KAAK,iBAAiB,CAAC;IAC1D,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IACxB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;QAAE,OAAO,GAAG,KAAK,qCAAqC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;IACtG,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAuB;IACjD,MAAM,MAAM,GAAW;QACrB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,KAAK,EAAE,IAAI;QACX,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,KAAK,EAAE,KAAK;KACb,CAAC;IAEF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC5B,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC;YAC1C,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;YAC3E,CAAC,CAAC,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QACvB,MAAM,OAAO,GAAG,GAAuB,EAAE,CAAC,QAAQ,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QAEhE,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,SAAS,CAAC,CAAC,CAAC;gBACf,MAAM,CAAC,GAAG,OAAO,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;gBACxC,IAAI,OAAO,CAAC,KAAK,QAAQ;oBAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;gBACzD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK;oBAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,iCAAiC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;gBACjG,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC;gBACjB,MAAM;YACR,CAAC;YACD,KAAK,OAAO,CAAC,CAAC,CAAC;gBACb,MAAM,CAAC,GAAG,OAAO,EAAE,CAAC;gBACpB,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,EAAE;oBAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,wBAAwB,EAAE,CAAC;gBACtF,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC;gBACf,MAAM;YACR,CAAC;YACD,KAAK,iBAAiB,CAAC,CAAC,CAAC;gBACvB,MAAM,CAAC,GAAG,OAAO,CAAC,OAAO,EAAE,EAAE,iBAAiB,CAAC,CAAC;gBAChD,IAAI,OAAO,CAAC,KAAK,QAAQ;oBAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;gBACzD,IAAI,CAAC,GAAG,CAAC;oBAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,uCAAuC,EAAE,CAAC;gBAC/E,MAAM,CAAC,YAAY,GAAG,CAAC,CAAC;gBACxB,MAAM;YACR,CAAC;YACD,KAAK,WAAW;gBACd,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;gBACrB,MAAM;YACR,KAAK,SAAS,CAAC;YACf,KAAK,QAAQ,CAAC;YACd,KAAK,IAAI;gBACP,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC;gBACpB,MAAM;YACR;gBACE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,uBAAuB,IAAI,EAAE,EAAE,CAAC;QAC9D,CAAC;IACH,CAAC;IAED,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AAC9B,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { realpathSync } from "node:fs";
|
|
3
|
+
import { resolve } from "node:path";
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
5
|
+
import { executarExpx } from "./expx.js";
|
|
6
|
+
/**
|
|
7
|
+
* Só roda quando executado como programa.
|
|
8
|
+
*
|
|
9
|
+
* Comparar `argv[1]` com `import.meta.url` diretamente NÃO funciona quando o
|
|
10
|
+
* pacote está instalado: o npm cria `node_modules/.bin/expx` como symlink, a
|
|
11
|
+
* igualdade falha e o CLI simplesmente não roda, sem erro nenhum. `realpath`
|
|
12
|
+
* resolve os dois lados para o mesmo caminho. É o mesmo cuidado que
|
|
13
|
+
* `principal.ts` já tomava.
|
|
14
|
+
*/
|
|
15
|
+
function executadoComoPrograma() {
|
|
16
|
+
const argv = process.argv[1];
|
|
17
|
+
if (argv === undefined)
|
|
18
|
+
return false;
|
|
19
|
+
const real = (p) => {
|
|
20
|
+
try {
|
|
21
|
+
return realpathSync(p);
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return resolve(p);
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
return real(argv) === real(fileURLToPath(import.meta.url));
|
|
28
|
+
}
|
|
29
|
+
if (executadoComoPrograma()) {
|
|
30
|
+
executarExpx(process.argv.slice(2))
|
|
31
|
+
.then((codigo) => {
|
|
32
|
+
if (codigo !== 0)
|
|
33
|
+
process.exit(codigo);
|
|
34
|
+
})
|
|
35
|
+
.catch((e) => {
|
|
36
|
+
process.stderr.write(`erro no expx: ${String(e)}\n`);
|
|
37
|
+
process.exit(1);
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=expx-bin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"expx-bin.js","sourceRoot":"","sources":["../../src/cli/expx-bin.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAEzC;;;;;;;;GAQG;AACH,SAAS,qBAAqB;IAC5B,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC7B,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IACrC,MAAM,IAAI,GAAG,CAAC,CAAS,EAAU,EAAE;QACjC,IAAI,CAAC;YACH,OAAO,YAAY,CAAC,CAAC,CAAC,CAAC;QACzB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC;IACH,CAAC,CAAC;IACF,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC7D,CAAC;AAED,IAAI,qBAAqB,EAAE,EAAE,CAAC;IAC5B,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;SAChC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;QACf,IAAI,MAAM,KAAK,CAAC;YAAE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACzC,CAAC,CAAC;SACD,KAAK,CAAC,CAAC,CAAU,EAAE,EAAE;QACpB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,iBAAiB,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACrD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* O entrypoint do binário `expx`.
|
|
3
|
+
*
|
|
4
|
+
* A saída é injetável para que os testes leiam o que o comando escreveu sem
|
|
5
|
+
* capturar `process.stdout` global — captura global vaza entre testes que rodam
|
|
6
|
+
* em paralelo e produz falha intermitente.
|
|
7
|
+
*/
|
|
8
|
+
export type Saida = {
|
|
9
|
+
escrever?: (texto: string) => void;
|
|
10
|
+
escreverErro?: (texto: string) => void;
|
|
11
|
+
};
|
|
12
|
+
export type Executor = (resto: readonly string[], saida: Required<Saida>) => Promise<number>;
|
|
13
|
+
export declare function executarExpx(argv: readonly string[], saida?: Saida): Promise<number>;
|
package/dist/cli/expx.js
ADDED
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { interpretarSubcomando, ajudaGeral } from "./subcomandos.js";
|
|
2
|
+
import { principal as principalPainel } from "./principal.js";
|
|
3
|
+
import { interpretarFlagsInit } from "./init-flags.js";
|
|
4
|
+
import { executarInit } from "./init.js";
|
|
5
|
+
import { adicionarSkills, removerSkills } from "./selecionar.js";
|
|
6
|
+
import { interpretarFlagsUpdate, executarUpdate } from "../update/flags.js";
|
|
7
|
+
import { diagnosticar } from "../doctor/verificadores.js";
|
|
8
|
+
import { avaliarSelecao } from "./selecao.js";
|
|
9
|
+
import { instalarPlugin } from "../harness/instalar.js";
|
|
10
|
+
import { join } from "node:path";
|
|
11
|
+
const EXECUTORES = {
|
|
12
|
+
panel: async (resto) => principalPainel(resto),
|
|
13
|
+
init: async (resto, saida) => {
|
|
14
|
+
const f = interpretarFlagsInit(resto);
|
|
15
|
+
if (!f.ok) {
|
|
16
|
+
saida.escreverErro(`${f.erro}\n`);
|
|
17
|
+
return 1;
|
|
18
|
+
}
|
|
19
|
+
const aval = avaliarSelecao(f.opcoes.skills);
|
|
20
|
+
if (!aval.permitido) {
|
|
21
|
+
saida.escreverErro(`${aval.erros.join("\n")}\n`);
|
|
22
|
+
return 1;
|
|
23
|
+
}
|
|
24
|
+
for (const a of aval.avisos)
|
|
25
|
+
saida.escrever(`aviso: ${a}\n`);
|
|
26
|
+
const interativo = process.stdout.isTTY === true;
|
|
27
|
+
if (!f.opcoes.sim && !interativo) {
|
|
28
|
+
saida.escrever(`instalaria: ${f.opcoes.skills.join(", ")}\nuse --yes para aplicar sem perguntar\n`);
|
|
29
|
+
return 0;
|
|
30
|
+
}
|
|
31
|
+
const harness = f.opcoes.harness.length > 0 ? f.opcoes.harness : ["claude"];
|
|
32
|
+
const r = await executarInit({ raiz: process.cwd(), skills: f.opcoes.skills, harness });
|
|
33
|
+
for (const a of r.avisos)
|
|
34
|
+
saida.escrever(`aviso: ${a}\n`);
|
|
35
|
+
for (const x of r.falhas)
|
|
36
|
+
saida.escreverErro(`falhou ${x.nome}: ${x.erro}\n`);
|
|
37
|
+
if (!r.ok)
|
|
38
|
+
return 1;
|
|
39
|
+
saida.escrever(`instaladas: ${r.instaladas.join(", ")}\n`);
|
|
40
|
+
if (harness.includes("claude")) {
|
|
41
|
+
const inst = await instalarPlugin(join(process.cwd(), ".expx", "marketplace"));
|
|
42
|
+
if (inst.instrucao !== undefined)
|
|
43
|
+
saida.escrever(`\n${inst.instrucao}\n`);
|
|
44
|
+
else if (inst.erro !== undefined)
|
|
45
|
+
saida.escreverErro(`nao foi possivel registrar o plugin: ${inst.erro}\n`);
|
|
46
|
+
else
|
|
47
|
+
saida.escrever("plugin registrado: os comandos /expx: estao disponiveis\n");
|
|
48
|
+
}
|
|
49
|
+
return 0;
|
|
50
|
+
},
|
|
51
|
+
add: async (resto, saida) => {
|
|
52
|
+
const r = await adicionarSkills({ raiz: process.cwd(), skills: resto });
|
|
53
|
+
if (!r.ok) {
|
|
54
|
+
saida.escreverErro(`${r.erro}\n`);
|
|
55
|
+
return 1;
|
|
56
|
+
}
|
|
57
|
+
saida.escrever(`selecao agora: ${r.selecao.join(", ")}\n`);
|
|
58
|
+
return 0;
|
|
59
|
+
},
|
|
60
|
+
remove: async (resto, saida) => {
|
|
61
|
+
const r = await removerSkills({ raiz: process.cwd(), skills: resto });
|
|
62
|
+
if (!r.ok) {
|
|
63
|
+
saida.escreverErro(`${r.erro}\n`);
|
|
64
|
+
return 1;
|
|
65
|
+
}
|
|
66
|
+
saida.escrever(`selecao agora: ${r.selecao.join(", ")}\n`);
|
|
67
|
+
return 0;
|
|
68
|
+
},
|
|
69
|
+
update: async (resto, saida) => {
|
|
70
|
+
const f = interpretarFlagsUpdate(resto);
|
|
71
|
+
if (!f.ok) {
|
|
72
|
+
saida.escreverErro(`${f.erro}\n`);
|
|
73
|
+
return 1;
|
|
74
|
+
}
|
|
75
|
+
const r = await executarUpdate({
|
|
76
|
+
raiz: process.cwd(),
|
|
77
|
+
skills: f.opcoes.skills,
|
|
78
|
+
check: f.opcoes.check,
|
|
79
|
+
latest: f.opcoes.latest,
|
|
80
|
+
sim: f.opcoes.sim,
|
|
81
|
+
interativo: process.stdout.isTTY === true,
|
|
82
|
+
...(f.opcoes.to !== undefined ? { to: f.opcoes.to } : {}),
|
|
83
|
+
});
|
|
84
|
+
for (const m of r.mensagens)
|
|
85
|
+
saida.escrever(`${m}\n`);
|
|
86
|
+
for (const b of r.bloqueadas)
|
|
87
|
+
saida.escrever(`bloqueada ${b.nome}: ${b.motivo}\n`);
|
|
88
|
+
if (r.emDia.length > 0)
|
|
89
|
+
saida.escrever(`em dia: ${r.emDia.join(", ")}\n`);
|
|
90
|
+
return r.ok ? 0 : 1;
|
|
91
|
+
},
|
|
92
|
+
doctor: async (_resto, saida) => {
|
|
93
|
+
const d = diagnosticar(process.cwd());
|
|
94
|
+
if (d.achados.length === 0) {
|
|
95
|
+
saida.escrever("nenhum problema encontrado\n");
|
|
96
|
+
return 0;
|
|
97
|
+
}
|
|
98
|
+
for (const a of d.achados) {
|
|
99
|
+
saida.escrever(`[${a.severidade}] ${a.problema}\n correcao: ${a.correcao}\n`);
|
|
100
|
+
}
|
|
101
|
+
return d.saudavel ? 0 : 1;
|
|
102
|
+
},
|
|
103
|
+
};
|
|
104
|
+
export async function executarExpx(argv, saida = {}) {
|
|
105
|
+
const escrever = saida.escrever ?? ((t) => process.stdout.write(t));
|
|
106
|
+
const escreverErro = saida.escreverErro ?? ((t) => process.stderr.write(t));
|
|
107
|
+
const r = interpretarSubcomando(argv);
|
|
108
|
+
if (!r.ok) {
|
|
109
|
+
escreverErro(`${r.erro}\n\n${ajudaGeral()}\n`);
|
|
110
|
+
return 1;
|
|
111
|
+
}
|
|
112
|
+
if (r.ajuda) {
|
|
113
|
+
escrever(`${ajudaGeral()}\n`);
|
|
114
|
+
return 0;
|
|
115
|
+
}
|
|
116
|
+
const executor = EXECUTORES[r.subcomando];
|
|
117
|
+
if (executor === undefined) {
|
|
118
|
+
escreverErro(`o subcomando ${r.subcomando} ainda nao esta disponivel nesta versao\n`);
|
|
119
|
+
return 1;
|
|
120
|
+
}
|
|
121
|
+
return executor(r.resto, { escrever, escreverErro });
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=expx.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"expx.js","sourceRoot":"","sources":["../../src/cli/expx.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Flags do `init` — o equivalente não interativo de cada pergunta.
|
|
3
|
+
*
|
|
4
|
+
* Sem isto o `init` só existiria com um humano na frente do terminal, e o CLI
|
|
5
|
+
* ficaria inutilizável em script, CI ou container. A regra que acompanha:
|
|
6
|
+
* sem interatividade e sem `--yes`, o comando mostra o que faria e sai sem
|
|
7
|
+
* aplicar — nunca assume a resposta que não recebeu.
|
|
8
|
+
*/
|
|
9
|
+
export declare const HARNESS_VALIDOS: readonly ["claude", "opencode"];
|
|
10
|
+
export type Harness = (typeof HARNESS_VALIDOS)[number];
|
|
11
|
+
export type OpcoesInitCli = {
|
|
12
|
+
skills: string[];
|
|
13
|
+
harness: Harness[];
|
|
14
|
+
painel: boolean;
|
|
15
|
+
sim: boolean;
|
|
16
|
+
/** Mostra o que faria e sai sem escrever. */
|
|
17
|
+
simular: boolean;
|
|
18
|
+
};
|
|
19
|
+
export type ResultadoFlags = {
|
|
20
|
+
ok: true;
|
|
21
|
+
opcoes: OpcoesInitCli;
|
|
22
|
+
} | {
|
|
23
|
+
ok: false;
|
|
24
|
+
erro: string;
|
|
25
|
+
};
|
|
26
|
+
export declare function interpretarFlagsInit(argv: readonly string[]): ResultadoFlags;
|
|
27
|
+
/**
|
|
28
|
+
* Pode aplicar mudança sem perguntar?
|
|
29
|
+
*
|
|
30
|
+
* Só com `--yes` explícito ou com um terminal de verdade para responder. Em
|
|
31
|
+
* pipe/CI sem `--yes`, a resposta é não — e o chamador mostra o plano em vez
|
|
32
|
+
* de executá-lo.
|
|
33
|
+
*/
|
|
34
|
+
export declare function podeAplicarSemPerguntar(op: OpcoesInitCli, interativo: boolean): boolean;
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Flags do `init` — o equivalente não interativo de cada pergunta.
|
|
3
|
+
*
|
|
4
|
+
* Sem isto o `init` só existiria com um humano na frente do terminal, e o CLI
|
|
5
|
+
* ficaria inutilizável em script, CI ou container. A regra que acompanha:
|
|
6
|
+
* sem interatividade e sem `--yes`, o comando mostra o que faria e sai sem
|
|
7
|
+
* aplicar — nunca assume a resposta que não recebeu.
|
|
8
|
+
*/
|
|
9
|
+
export const HARNESS_VALIDOS = ["claude", "opencode"];
|
|
10
|
+
function ehHarness(v) {
|
|
11
|
+
return HARNESS_VALIDOS.includes(v);
|
|
12
|
+
}
|
|
13
|
+
/** `a,b` e a repetição da flag acumulam na mesma lista, sem duplicar. */
|
|
14
|
+
function acumular(destino, valor) {
|
|
15
|
+
for (const parte of valor.split(",").map((p) => p.trim())) {
|
|
16
|
+
if (parte !== "" && !destino.includes(parte))
|
|
17
|
+
destino.push(parte);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
export function interpretarFlagsInit(argv) {
|
|
21
|
+
const opcoes = {
|
|
22
|
+
skills: [],
|
|
23
|
+
harness: [],
|
|
24
|
+
painel: false,
|
|
25
|
+
sim: false,
|
|
26
|
+
simular: false,
|
|
27
|
+
};
|
|
28
|
+
for (let i = 0; i < argv.length; i++) {
|
|
29
|
+
const bruto = argv[i] ?? "";
|
|
30
|
+
const igual = bruto.indexOf("=");
|
|
31
|
+
const nome = igual === -1 ? bruto : bruto.slice(0, igual);
|
|
32
|
+
const embutido = igual === -1 ? undefined : bruto.slice(igual + 1);
|
|
33
|
+
const proximo = () => embutido ?? argv[++i];
|
|
34
|
+
switch (nome) {
|
|
35
|
+
case "--skills": {
|
|
36
|
+
const v = proximo();
|
|
37
|
+
if (v === undefined || v === "")
|
|
38
|
+
return { ok: false, erro: "--skills exige uma lista de skills" };
|
|
39
|
+
acumular(opcoes.skills, v);
|
|
40
|
+
break;
|
|
41
|
+
}
|
|
42
|
+
case "--harness": {
|
|
43
|
+
const v = proximo();
|
|
44
|
+
if (v === undefined || v === "")
|
|
45
|
+
return { ok: false, erro: "--harness exige claude, opencode ou os dois" };
|
|
46
|
+
const lidos = [];
|
|
47
|
+
acumular(lidos, v);
|
|
48
|
+
for (const h of lidos) {
|
|
49
|
+
if (!ehHarness(h))
|
|
50
|
+
return { ok: false, erro: `harness desconhecido: ${h}` };
|
|
51
|
+
if (!opcoes.harness.includes(h))
|
|
52
|
+
opcoes.harness.push(h);
|
|
53
|
+
}
|
|
54
|
+
break;
|
|
55
|
+
}
|
|
56
|
+
case "--painel":
|
|
57
|
+
opcoes.painel = true;
|
|
58
|
+
break;
|
|
59
|
+
case "--yes":
|
|
60
|
+
case "--sim":
|
|
61
|
+
opcoes.sim = true;
|
|
62
|
+
break;
|
|
63
|
+
case "--check":
|
|
64
|
+
case "--simular":
|
|
65
|
+
opcoes.simular = true;
|
|
66
|
+
break;
|
|
67
|
+
default:
|
|
68
|
+
return { ok: false, erro: `opcao desconhecida em init: ${nome}` };
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return { ok: true, opcoes };
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Pode aplicar mudança sem perguntar?
|
|
75
|
+
*
|
|
76
|
+
* Só com `--yes` explícito ou com um terminal de verdade para responder. Em
|
|
77
|
+
* pipe/CI sem `--yes`, a resposta é não — e o chamador mostra o plano em vez
|
|
78
|
+
* de executá-lo.
|
|
79
|
+
*/
|
|
80
|
+
export function podeAplicarSemPerguntar(op, interativo) {
|
|
81
|
+
return op.sim || interativo;
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=init-flags.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init-flags.js","sourceRoot":"","sources":["../../src/cli/init-flags.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,QAAQ,EAAE,UAAU,CAAU,CAAC;AAgB/D,SAAS,SAAS,CAAC,CAAS;IAC1B,OAAQ,eAAqC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AAC5D,CAAC;AAED,yEAAyE;AACzE,SAAS,QAAQ,CAAC,OAAiB,EAAE,KAAa;IAChD,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;QAC1D,IAAI,KAAK,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACpE,CAAC;AACH,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,IAAuB;IAC1D,MAAM,MAAM,GAAkB;QAC5B,MAAM,EAAE,EAAE;QACV,OAAO,EAAE,EAAE;QACX,MAAM,EAAE,KAAK;QACb,GAAG,EAAE,KAAK;QACV,OAAO,EAAE,KAAK;KACf,CAAC;IAEF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC5B,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACjC,MAAM,IAAI,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QAC1D,MAAM,QAAQ,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QACnE,MAAM,OAAO,GAAG,GAAuB,EAAE,CAAC,QAAQ,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QAEhE,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,UAAU,CAAC,CAAC,CAAC;gBAChB,MAAM,CAAC,GAAG,OAAO,EAAE,CAAC;gBACpB,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,EAAE;oBAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,oCAAoC,EAAE,CAAC;gBAClG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;gBAC3B,MAAM;YACR,CAAC;YACD,KAAK,WAAW,CAAC,CAAC,CAAC;gBACjB,MAAM,CAAC,GAAG,OAAO,EAAE,CAAC;gBACpB,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,EAAE;oBAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,6CAA6C,EAAE,CAAC;gBAC3G,MAAM,KAAK,GAAa,EAAE,CAAC;gBAC3B,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;gBACnB,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;oBACtB,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;wBAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,yBAAyB,CAAC,EAAE,EAAE,CAAC;oBAC5E,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;wBAAE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAC1D,CAAC;gBACD,MAAM;YACR,CAAC;YACD,KAAK,UAAU;gBACb,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC;gBACrB,MAAM;YACR,KAAK,OAAO,CAAC;YACb,KAAK,OAAO;gBACV,MAAM,CAAC,GAAG,GAAG,IAAI,CAAC;gBAClB,MAAM;YACR,KAAK,SAAS,CAAC;YACf,KAAK,WAAW;gBACd,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;gBACtB,MAAM;YACR;gBACE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,+BAA+B,IAAI,EAAE,EAAE,CAAC;QACtE,CAAC;IACH,CAAC;IAED,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AAC9B,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,uBAAuB,CAAC,EAAiB,EAAE,UAAmB;IAC5E,OAAO,EAAE,CAAC,GAAG,IAAI,UAAU,CAAC;AAC9B,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { ORIGEM_DO_PLUGIN } from "../plugin/manifestos.js";
|
|
2
|
+
/**
|
|
3
|
+
* O fluxo do `init`: busca, monta, configura e trava.
|
|
4
|
+
*
|
|
5
|
+
* Uma skill inacessível NUNCA aborta as outras — é reportada em `falhas` e a
|
|
6
|
+
* instalação segue com as que deram certo, porque perder a instalação inteira
|
|
7
|
+
* por causa de um repositório fora do ar é pior que uma instalação parcial
|
|
8
|
+
* declarada.
|
|
9
|
+
*
|
|
10
|
+
* A montagem inteira acontece dentro de `escreverAtomico`: ou o `.expx/` novo
|
|
11
|
+
* aparece completo, ou o anterior permanece intocado.
|
|
12
|
+
*/
|
|
13
|
+
export type OpcoesInit = {
|
|
14
|
+
raiz: string;
|
|
15
|
+
skills: readonly string[];
|
|
16
|
+
harness: readonly string[];
|
|
17
|
+
/** Origem de cada skill. Nos testes, repositórios locais; em produção, o catálogo. */
|
|
18
|
+
origens?: Record<string, string>;
|
|
19
|
+
/** Referência fixa por skill, quando o usuário pediu uma específica. */
|
|
20
|
+
referencias?: Record<string, string>;
|
|
21
|
+
};
|
|
22
|
+
export type Falha = {
|
|
23
|
+
nome: string;
|
|
24
|
+
erro: string;
|
|
25
|
+
};
|
|
26
|
+
export type ResultadoInit = {
|
|
27
|
+
ok: boolean;
|
|
28
|
+
instaladas: string[];
|
|
29
|
+
falhas: Falha[];
|
|
30
|
+
naoTravadas: string[];
|
|
31
|
+
avisos: string[];
|
|
32
|
+
};
|
|
33
|
+
export declare function executarInit(op: OpcoesInit): Promise<ResultadoInit>;
|
|
34
|
+
export { ORIGEM_DO_PLUGIN };
|