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/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
- # Temporary Holding Version
1
+ <p align="center">
2
+ <img src="docs/assets/logo.png" alt="Forge Cli" width="440">
3
+ </p>
2
4
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
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