theforge-cli 0.0.0-stage → 0.2.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/CHANGELOG.md +662 -0
- package/LICENSE +21 -0
- package/README.md +271 -2
- package/dist/index.js +24307 -0
- package/docs/arquitetura.md +149 -0
- package/docs/capabilities.md +155 -0
- package/docs/registry-state-contract.md +81 -0
- package/docs/solucao-de-problemas.md +85 -0
- package/package.json +71 -4
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Edgar Sócrates Caria
|
|
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
CHANGED
|
@@ -1,3 +1,272 @@
|
|
|
1
|
-
|
|
1
|
+
<p align="center">
|
|
2
|
+
<img src="docs/assets/logo.png" alt="Forge Cli" width="440">
|
|
3
|
+
</p>
|
|
2
4
|
|
|
3
|
-
|
|
5
|
+
# Forge-CLI
|
|
6
|
+
|
|
7
|
+
CLI interativa para clonar e configurar o ecossistema **Forge**: oito
|
|
8
|
+
repositórios, um comando. O forge-cli resolve o diretório de destino,
|
|
9
|
+
sincroniza cada repositório (clone ou pull), provisiona o arquivo `.env`
|
|
10
|
+
e executa o script de instalação do sistema operacional — tudo com
|
|
11
|
+
feedback visual em tempo real.
|
|
12
|
+
|
|
13
|
+
## Funcionalidades
|
|
14
|
+
|
|
15
|
+
- **Fluxo 100% interativo** com `@clack/prompts`: banner animado,
|
|
16
|
+
prompts, spinners com cronômetro e relatório final consolidado.
|
|
17
|
+
- **Sincronização inteligente**: faz `git clone` quando o repositório
|
|
18
|
+
não existe e `git pull` quando a pasta já contém `.git`.
|
|
19
|
+
- **Provisionamento de `.env`**: antes de qualquer script de
|
|
20
|
+
instalação, copia `.env.example` para `.env` ou cria um modelo com
|
|
21
|
+
comentários. Um `.env` existente nunca é sobrescrito.
|
|
22
|
+
- **Scripts por sistema operacional**: `install.ps1` no Windows e
|
|
23
|
+
`install.sh` no Linux/macOS, detectados automaticamente.
|
|
24
|
+
- **Verificação de ambiente (preflight)**: confirma `git`, Node.js
|
|
25
|
+
> = 20 e `powershell.exe` (Windows) antes de qualquer alteração.
|
|
26
|
+
- **Isolamento de falhas**: o erro em um repositório não interrompe os
|
|
27
|
+
demais; o relatório final mostra `[OK]`, `[AVISO]` ou `[ERRO]` por
|
|
28
|
+
item, com tempo de execução.
|
|
29
|
+
- **Saída limpa**: cancelamento via `Ctrl+C` em qualquer prompt
|
|
30
|
+
ou `SIGINT` durante a execução.
|
|
31
|
+
|
|
32
|
+
## Requisitos
|
|
33
|
+
|
|
34
|
+
| Requisito | Versão | Observação |
|
|
35
|
+
| --------------- | ---------------- | -------------------------------- |
|
|
36
|
+
| Node.js | >= 20 | Verificado no preflight |
|
|
37
|
+
| npm | >= 10 | Gerenciador de pacotes fixo |
|
|
38
|
+
| Git | qualquer recente | Precisa estar no `PATH` |
|
|
39
|
+
| PowerShell | qualquer | Somente Windows — `install.ps1` |
|
|
40
|
+
| Credenciais Git | — | Acesso aos repositórios privados |
|
|
41
|
+
|
|
42
|
+
## Instalação
|
|
43
|
+
|
|
44
|
+
**Usuário final — via npm (recomendado):**
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
npm i -g theforge-cli # pacote publicado — sem clone necessário
|
|
48
|
+
forge-cli # TUI guiada
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
**Contribuidor — via clone:**
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
git clone https://github.com/EdgarSocrates98/forge-cli.git
|
|
55
|
+
cd forge-cli
|
|
56
|
+
npm install
|
|
57
|
+
npm run build
|
|
58
|
+
npm link # registra o binário `forge-cli`
|
|
59
|
+
forge-cli # em qualquer diretório
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
Alternativa sem npm global — o próprio CLI se registra no PATH do usuário
|
|
63
|
+
(sem admin), copiando o bundle para `~/.forge-cli/bin`:
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
npm run build
|
|
67
|
+
node dist/index.js self install # Windows: forge-cli.cmd + PATH do usuário
|
|
68
|
+
# Linux/macOS: shim sh + bloco nos profiles
|
|
69
|
+
forge-cli self uninstall # desfaz tudo (PATH, shims e bundle)
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
Após `self install`, abra um terminal novo — o PATH do usuário só é lido por
|
|
73
|
+
processos novos. `forge-cli doctor` avisa quando o binário não está
|
|
74
|
+
acessível no PATH.
|
|
75
|
+
|
|
76
|
+
## Quickstart
|
|
77
|
+
|
|
78
|
+
1. Instale o forge-cli (`npm run build && node dist/index.js self install` a partir do clone, ou `npm i -g theforge-cli` quando publicado).
|
|
79
|
+
2. Abra um terminal novo e rode `forge-cli`.
|
|
80
|
+
3. Escolha **Instalar Forjas**, selecione as Forjas desejadas e confirme.
|
|
81
|
+
4. Use os comandos oficiais de cada Forja (a seção "próximos passos" do relatório lista os principais).
|
|
82
|
+
|
|
83
|
+
Para atualizar o próprio CLI: `forge-cli self update` (npm global executa `npm i -g theforge-cli` com `--yes`; demais métodos mostram o passo manual).
|
|
84
|
+
|
|
85
|
+
## Instalador nativo (perfil, escopo, componentes)
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
forge-cli install spark-forge-aws --profile recommended --scope project --components skills,agents # plano (--dry-run)
|
|
89
|
+
forge-cli install spark-forge-aws --profile recommended --scope project --components skills,agents --yes # aplica
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
O forge-cli só delega ao `<cli> install` que a Forja documenta; Forjas sem
|
|
93
|
+
instalador nativo (ex.: forge-portal) recebem um aviso, sem substituto
|
|
94
|
+
silencioso. Veja [docs/capabilities.md](https://github.com/EdgarSocrates98/forge-cli/blob/v0.1.0/docs/capabilities.md).
|
|
95
|
+
|
|
96
|
+
## Instalação via PyPI (registry-first — método recomendado)
|
|
97
|
+
|
|
98
|
+
`forge-cli` sem argumentos abre a TUI guiada com **registry como opção
|
|
99
|
+
recomendada** para as distribuições oficiais. O método git (clone +
|
|
100
|
+
scripts) continua disponível para contribuidores — registry-first, não
|
|
101
|
+
registry-only. `install --method registry`
|
|
102
|
+
instala cada Forja direto do PyPI — sem clonar o repositório e sem
|
|
103
|
+
exigir o The Forge. Cada Forja vai para uma venv isolada em
|
|
104
|
+
`~/.forge-cli/forges/<nome>/` com `pip install <dist>==<versão>`
|
|
105
|
+
pinado na estável mais nova (ou `--version`/`--ref` para pinar, uma
|
|
106
|
+
Forja por comando). O interpretador escolhido é o mais novo que
|
|
107
|
+
satisfaz `requires_python` do release; sem compatível, o install é
|
|
108
|
+
recusado antes de qualquer mutação.
|
|
109
|
+
|
|
110
|
+
- `forge-cli registry` lista o catálogo (7 dists) e o instalado.
|
|
111
|
+
- Receipts em `install.json`/`state.json`: dist, versão, interpretador,
|
|
112
|
+
digests sha256 e verify — o artefato da dist é conferido byte a byte
|
|
113
|
+
após o download.
|
|
114
|
+
- `--offline` resolve do cache local (metadados em
|
|
115
|
+
`~/.forge-cli/cache/pypi/`, wheels em `cache/wheels/<dist>/`);
|
|
116
|
+
artefato ausente = recusa honesta, nunca instalação fingida.
|
|
117
|
+
- Releases yanked (PEP 592) são puladas na escolha automática; só
|
|
118
|
+
instalam por pin explícito e ficam marcadas no receipt.
|
|
119
|
+
- `uninstall --method registry` remove venv + receipt com plano e
|
|
120
|
+
confirmação (`--yes`); `--all`/`--only` resolvem o conjunto instalado.
|
|
121
|
+
|
|
122
|
+
## Independência
|
|
123
|
+
|
|
124
|
+
O forge-cli é uma conveniência opcional: nenhuma Forja depende dele e remover o CLI (`self uninstall`) não afeta Forjas já instaladas. Instalações feitas à mão são reconhecidas (`forge-cli status`) sem precisar reinstalar. Estes cenários estão cobertos em `tests/independence.test.ts`.
|
|
125
|
+
|
|
126
|
+
## Comandos
|
|
127
|
+
|
|
128
|
+
```bash
|
|
129
|
+
forge-cli install api-forge platform-forge # instala Forjas escolhidas
|
|
130
|
+
forge-cli install # fluxo interativo
|
|
131
|
+
forge-cli clone api-forge # só clona/sincroniza, sem scripts
|
|
132
|
+
forge-cli status # estado local (clonado, versão, alterações)
|
|
133
|
+
forge-cli update [--check] # atualiza (ou só verifica) Forjas clonadas
|
|
134
|
+
forge-cli versions api-forge # revisão e tags
|
|
135
|
+
forge-cli install api-forge --version 1.2.0 # fixa em tag/sha (checkout destacado)
|
|
136
|
+
forge-cli install api-forge --method registry # instala do PyPI em venv isolada (~/.forge-cli/forges/)
|
|
137
|
+
forge-cli install --all --method registry # todas as Forjas publicadas via PyPI
|
|
138
|
+
forge-cli registry # catálogo PyPI + instaladas (--json estrutura)
|
|
139
|
+
forge-cli uninstall api-forge --method registry --yes # remove venv + receipt registry
|
|
140
|
+
forge-cli pin|unpin|rollback api-forge # fixação e retorno ao HEAD anterior
|
|
141
|
+
forge-cli reinstall api-forge [--clean] # mantém a revisão; --clean reclona com backup
|
|
142
|
+
forge-cli uninstall api-forge [--yes] # plano + backup de .env/configs
|
|
143
|
+
forge-cli components [forjas] # flags do instalador nativo por Forja
|
|
144
|
+
forge-cli doctor [forjas] [--fix] # diagnostica (ou repara) Forjas
|
|
145
|
+
forge-cli install api-forge --offline # só usa clone existente, sem rede
|
|
146
|
+
forge-cli update api-forge --native # também a operação nativa (--dry-run sem --yes)
|
|
147
|
+
forge-cli uninstall api-forge --native --yes # desinstala nativamente e depois remove o clone
|
|
148
|
+
forge-cli status --json # saída estruturada (também list, versions, components, doctor)
|
|
149
|
+
forge-cli self install | self uninstall | self update
|
|
150
|
+
forge-cli help
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
Segurança: scripts não rodam após falha de sync (`--run-after-sync-failure`
|
|
154
|
+
libera) e repositórios de `forge-cli.repos.json` só executam scripts com
|
|
155
|
+
`--trust-custom`. `--yes` não autoriza o instalador nativo a escrever sem
|
|
156
|
+
que seja passado explicitamente.
|
|
157
|
+
|
|
158
|
+
> `forge-cli install` agora instala Forjas; o registro no PATH passou a
|
|
159
|
+
> ser `forge-cli self install`.
|
|
160
|
+
|
|
161
|
+
## Uso
|
|
162
|
+
|
|
163
|
+
Execute `npm run dev` (ou `forge-cli`, se instalado globalmente) e siga
|
|
164
|
+
o fluxo interativo:
|
|
165
|
+
|
|
166
|
+
1. **Banner e verificação de ambiente.** O CLI exibe o banner do Forge
|
|
167
|
+
e valida `git`, a versão do Node.js e o `powershell.exe` (no
|
|
168
|
+
Windows). Falhas encerram o processo antes de qualquer prompt.
|
|
169
|
+
2. **Diretório de instalação.** Informe onde os repositórios serão
|
|
170
|
+
clonados. O padrão é `./forge-workspace`; o caminho é convertido
|
|
171
|
+
para absoluto e o diretório criado se não existir.
|
|
172
|
+
3. **Seleção de repositórios.** Marque ou desmarque itens com `Espaço`.
|
|
173
|
+
Todos os oito vêm selecionados por padrão; ao menos um é obrigatório.
|
|
174
|
+
4. **Confirmação.** Revise o resumo (destino e quantidade) e confirme.
|
|
175
|
+
5. **Execução.** Para cada repositório, um spinner mostra a fase atual:
|
|
176
|
+
`Sincronizando`, `Provisionando .env` e `Executando script`.
|
|
177
|
+
6. **Relatório final.** Status por repositório com tempo de execução e
|
|
178
|
+
totais agregados.
|
|
179
|
+
|
|
180
|
+
Para cancelar em qualquer etapa, pressione `Ctrl+C`. O processo
|
|
181
|
+
encerra de forma limpa (código `130` em `SIGINT`).
|
|
182
|
+
|
|
183
|
+
## Repositórios do ecossistema
|
|
184
|
+
|
|
185
|
+
| Repositório | Descrição |
|
|
186
|
+
| ------------------- | -------------------------------- |
|
|
187
|
+
| `the-forge` | Framework base e utilitários |
|
|
188
|
+
| `spark-forge-aws` | Pipelines Spark para AWS |
|
|
189
|
+
| `spark-forge-azure` | Pipelines Spark para Azure |
|
|
190
|
+
| `platform-forge` | Serviços e infra de plataforma |
|
|
191
|
+
| `api-forge` | Backend central e APIs |
|
|
192
|
+
| `forge-doctor-api` | API de diagnóstico e telemetria |
|
|
193
|
+
| `forge-doctor-data` | Pipeline de dados de diagnóstico |
|
|
194
|
+
| `forge-portal` | Frontend / Portal Web |
|
|
195
|
+
|
|
196
|
+
Todos os repositórios ficam na organização
|
|
197
|
+
[`EdgarSocrates98`](https://github.com/EdgarSocrates98) no GitHub.
|
|
198
|
+
|
|
199
|
+
## Provisionamento do `.env`
|
|
200
|
+
|
|
201
|
+
Antes do script de instalação, cada repositório recebe um `.env`:
|
|
202
|
+
|
|
203
|
+
| Condição | Ação | Indicador no relatório |
|
|
204
|
+
| --------------------- | ----------------------------- | -------------------------------------- |
|
|
205
|
+
| `.env` já existe | Nada — nunca sobrescreve | `.env já existia` |
|
|
206
|
+
| `.env.example` existe | Copiado para `.env` | `.env criado a partir de .env.example` |
|
|
207
|
+
| Nenhum dos dois | Modelo com comentários criado | `.env criado (modelo vazio…)` |
|
|
208
|
+
|
|
209
|
+
Se o provisionamento falhar (por exemplo, permissão negada), o
|
|
210
|
+
repositório é marcado como `[ERRO]` e o script de instalação **não**
|
|
211
|
+
é executado para ele.
|
|
212
|
+
|
|
213
|
+
## Status de execução
|
|
214
|
+
|
|
215
|
+
| Status | Significado |
|
|
216
|
+
| ------------ | -------------------------------------------------- |
|
|
217
|
+
| ✅ `[OK]` | Clonado/atualizado e script executado com sucesso |
|
|
218
|
+
| ⚠️ `[AVISO]` | Clonado, mas sem script de instalação para este SO |
|
|
219
|
+
| ❌ `[ERRO]` | Falha no clone/pull, no `.env` ou no script |
|
|
220
|
+
|
|
221
|
+
## Scripts do projeto
|
|
222
|
+
|
|
223
|
+
| Comando | Ação |
|
|
224
|
+
| ------------------- | -------------------------------------- |
|
|
225
|
+
| `npm run dev` | Executa o CLI via `tsx`, sem compilar |
|
|
226
|
+
| `npm run build` | Compila `src/` para `dist/` via `tsup` |
|
|
227
|
+
| `npm start` | Executa `dist/index.js` |
|
|
228
|
+
| `npm test` | Testes unitários via `vitest` |
|
|
229
|
+
| `npm run typecheck` | Verificação de tipos (`tsc --noEmit`) |
|
|
230
|
+
|
|
231
|
+
## Estrutura do projeto
|
|
232
|
+
|
|
233
|
+
```text
|
|
234
|
+
src/
|
|
235
|
+
index.ts # despacho: args, menu, subcomando
|
|
236
|
+
cmd/ # implementação dos comandos (query, manage, run, batch, shared)
|
|
237
|
+
prompts.ts # prompts: diretório, seleção, confirmação
|
|
238
|
+
menu.ts # menu principal (TUI)
|
|
239
|
+
commands.ts # resolução de subcomandos
|
|
240
|
+
safety.ts # nomes/URLs seguros, symlinks, redação de segredos
|
|
241
|
+
git-revs.ts # tags, checkout por ref, update --check
|
|
242
|
+
lifecycle.ts # uninstall seguro, rollback
|
|
243
|
+
native-install.ts # adaptador do instalador nativo (profile/scope/components)
|
|
244
|
+
status.ts # estado local por Forja
|
|
245
|
+
self.ts # self update por método de instalação
|
|
246
|
+
runner.ts # pipeline por repositório (clone → .env → script)
|
|
247
|
+
env.ts # provisionamento do .env
|
|
248
|
+
preflight.ts # verificações de ambiente
|
|
249
|
+
report.ts # relatório final
|
|
250
|
+
ui/
|
|
251
|
+
theme.ts # paleta de cores e ícones (picocolors)
|
|
252
|
+
strings.ts # todas as mensagens PT-BR
|
|
253
|
+
constants/
|
|
254
|
+
repos.ts # catálogo dos 8 repositórios
|
|
255
|
+
utils/
|
|
256
|
+
system.ts # caminhos, .git, scripts por SO, execução
|
|
257
|
+
types.ts # tipos compartilhados
|
|
258
|
+
tests/ # testes unitários (vitest)
|
|
259
|
+
factory/ # fluxo spec-driven (Loop Factory)
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
## Documentação
|
|
263
|
+
|
|
264
|
+
- [Arquitetura e decisões de design](https://github.com/EdgarSocrates98/forge-cli/blob/v0.1.0/docs/arquitetura.md)
|
|
265
|
+
- [Matriz de capacidades das Forjas](https://github.com/EdgarSocrates98/forge-cli/blob/v0.1.0/docs/capabilities.md)
|
|
266
|
+
- [Solução de problemas](https://github.com/EdgarSocrates98/forge-cli/blob/v0.1.0/docs/solucao-de-problemas.md)
|
|
267
|
+
- [Como contribuir](https://github.com/EdgarSocrates98/forge-cli/blob/v0.1.0/CONTRIBUTING.md)
|
|
268
|
+
- [Registro de mudanças](https://github.com/EdgarSocrates98/forge-cli/blob/v0.1.0/CHANGELOG.md)
|
|
269
|
+
|
|
270
|
+
## Licença
|
|
271
|
+
|
|
272
|
+
[MIT](https://github.com/EdgarSocrates98/forge-cli/blob/v0.1.0/LICENSE) © 2026 Edgar Sócrates Caria
|