theforge-cli 0.0.0-stage → 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/CHANGELOG.md ADDED
@@ -0,0 +1,230 @@
1
+ # Changelog
2
+
3
+ Todas as mudanças notáveis deste projeto são documentadas aqui, no
4
+ formato [Keep a Changelog](https://keepachangelog.com/pt-BR/1.1.0/).
5
+
6
+ ## [Não lançado]
7
+
8
+ ### Programa ecosystem-2026 (cyc8-05)
9
+
10
+ #### Added
11
+
12
+ - **Compatibilidade com o manifesto do ecossistema**: `src/compat.ts`
13
+ consome `forge/EcosystemCompatibility/v1` (the-forge
14
+ `ecosystem-compatibility.json`) — `update --check` reporta
15
+ `installed_compat: certified|incompatible|unknown` por repositório e o
16
+ banner do manifesto (release + sha256) na saída texto.
17
+ - **Validação estrita do manifesto**: `manifestProblems()` espelha
18
+ `load_manifest(strict=True)` do Python — release `YYYY.MM`, `created_at`
19
+ ISO, ids de componente/família/contrato, versão pinada (rejeita
20
+ `latest`/`""`) no scheme declarado, `source` obrigatório, janelas
21
+ `min_major`/`max_major`, famílias únicas. Manifesto inválido → `null`
22
+ (nunca certifica silenciosamente).
23
+
24
+ #### Changed
25
+
26
+ - **`update --check --json`**: o payload passa de array puro de
27
+ repositórios para envelope `{manifest: {release, sha256, path} | null,
28
+ repos: [...]}` — a identidade do manifesto avaliado agora é evidência no
29
+ JSON. Consumidores do array anterior devem ler `payload.repos`.
30
+ - **`compat:` → `installed_compat:`** no texto e no JSON: o veredito se
31
+ refere à versão **instalada**, não ao update pendente (repos `behind`
32
+ não sugerem mais que a atualização é certificada).
33
+
34
+ ### Programa evo-cli-portal (F0→C6, ciclos `audit/f0-baseline`→`cycle/c6-intelligence`)
35
+
36
+ #### Added
37
+
38
+ - **Contratos canônicos (C1)**: família `forge/<Name>/v1` como JSON Schemas
39
+ em `contracts/schemas/` (Descriptor, Capability, EnvironmentSchema,
40
+ HostDescriptor, InstallContract, OperationPlan, OperationReceipt,
41
+ HealthReport), validator Python vendorizável (`contracts/forge_contracts.py`,
42
+ stdlib-only), política de descoberta com os sete estados
43
+ (`declared/detected/configured/integrated/validated/degraded/unknown`) e
44
+ precedência explícita (`src/discovery/negotiate.ts`).
45
+ - **Descoberta e recomendação (C2)**: `forge-cli discover` (walk bounded por
46
+ budget, sinais de stack, probes de host, `truncated` honesto) e
47
+ `forge-cli recommend` (recomendações explicáveis com confidence).
48
+ - **Wizard de instalação (C2)**: fluxo interativo de 7 passos + planner que
49
+ emite `forge/ForgeOperationPlan/v1` com hash sha256 canônico verificável.
50
+ - **Env Intelligence (C2)**: `forge-cli env inspect|plan|init|validate|
51
+ migrate|doctor` — valores nunca exibidos, migração com rollback.
52
+ - **Host Intelligence (C2/C4)**: adapters por host (`forge-cli hosts
53
+ list|plan|register|validate|rollback`) — detecção ≠ validação
54
+ (`verified|absent|unknown`), comando copiável em vez de escrita opaca.
55
+ - **Ciclo de vida (C2)**: `lock`, `profile`, `recover`, análise de
56
+ breaking-changes, estado persistido.
57
+ - **Doctor 2.0 + self-healing (C5)**: `forge-cli doctor` cobre 5 domínios
58
+ (`forge/DoctorReport/v1`, health score gated — `HEALTH_MODEL.md`);
59
+ `forge-cli heal` com classificação `SAFE_AUTOMATIC`/`REVIEW_REQUIRED`/
60
+ `MANUAL_ONLY`/`UNSUPPORTED`, fluxo de reparo em 8 passos, receipts
61
+ imutáveis (`forge/RepairReceipt/v1`) com correlation IDs.
62
+ - **Observabilidade e versões (C5)**: métricas locais, `versions`,
63
+ overhead medido (PERFORMANCE_BASELINE.md).
64
+ - **Forge Intelligence Engine (C6)**: `forge-cli ask <domínio>`
65
+ (discovery/recommendation/repair — respostas com evidência, confidence,
66
+ ordenação estável), `forge-cli predict` (compatibilidade preditiva com
67
+ evidência/versão/certainty — silêncio honesto sem evidência),
68
+ `forge-cli context` (`forge/ForgeContext/v1`, 8 KiB bounded).
69
+ - **Modo IA opcional (C6)**: `forge-cli ai <task>` — opt-in, BYOK via
70
+ bridge configurável (`ai.command`), sanitize tripla de segredos,
71
+ propostas schema-validadas (`forge/AiProposal/v1`) com refs
72
+ re-validados e rechecagem determinística; **zero execução** de conteúdo
73
+ do modelo; fallback tipado para determinístico (`AI_MODE_POLICY.md`).
74
+ - **Portabilidade (C6)**: `forge-cli bundle export|import|verify`
75
+ (`forge-cli/Bundle/v1`) — profile, env lock + check, pins, manifesto de
76
+ integridade sha256 (`forge/IntegrityManifest/v1`); valores de segredo
77
+ excluídos por default (`env-values.json` só com whitelist explícita e
78
+ recusa fail-closed de chaves secretas); `planReinstall` gera plano
79
+ verificável (`PORTABILITY.md`).
80
+ - **Aprendizado local (C6)**: `forge-cli learning status|enable|disable|
81
+ report` — opt-in, `.forge-cli/learning.json` bounded a 1000
82
+ observações, redacted, FIFO, nunca altera política (`LEARNING_EVAL.md`).
83
+
84
+ #### Changed
85
+
86
+ - `forge.json` passa a ser validado contra `ForgeDescriptor/v1` quando o
87
+ campo `schema` é declarado — fail-closed, aditivo.
88
+ - Ordenações em intel/predict usam comparação por code-unit (estável,
89
+ independente de locale).
90
+ - `bundle export` aceita chaves não-secretas posicionais para inclusão
91
+ explícita de valores.
92
+
93
+ #### Fixed
94
+
95
+ - `doctor`/`env`/`hosts`/`discover`/`recommend`/`context`/`predict`
96
+ respeitam `--json` sem banner (via `JSON_QUERY_COMMANDS`).
97
+ - `bundle export` captura `SecretKeysRefusedError` e exibe recusa clara.
98
+ - Heal: `REVIEW_REQUIRED` nunca é aplicado por `--yes` — aguarda revisão
99
+ por chave (Gate C5).
100
+
101
+ #### Security
102
+
103
+ - Logs, receipts e erros mascaram segredos (`redactSecrets`); contexto de
104
+ IA usa denylist de chave + redact + detecção de valor-secret-shaped
105
+ (`sk-live-`, `ghp_`, JWT, `AKIA`, `xox*`).
106
+ - `assertNoSecrets` devolve paths ofensores ordenados; cache de IA bounded
107
+ (32 entradas, TTL, anti clock-skew, chave sha256 de JSON canônico).
108
+ - Bridge de IA tem boundary injetável único, timeout, cap de contexto e
109
+ nenhum payload de comando na saída do modelo.
110
+ - `npm ci` auditado, zero vulnerabilidades; runtime deps congeladas.
111
+
112
+ #### Compatibility
113
+
114
+ - Sem novas dependências de runtime desde F0; Node >= 20, npm >= 10.
115
+ - Contratos são aditivos: `forge/PortalApi/1` intocado; Forjas
116
+ consumidoras não requerem mudança.
117
+ - `--offline` usa apenas clones locais; clone ausente → recusa explícita
118
+ (sem tentativa de rede).
119
+
120
+ #### Migration
121
+
122
+ - Nenhuma migração obrigatória. `forge.json` legado continua válido
123
+ (campos desconhecidos ignorados); `env migrate` oferece plano+rollback.
124
+
125
+ #### Known limitations
126
+
127
+ - Preview de plano exibe `git pull` mesmo com `--offline` (cosmético —
128
+ execução honra a flag; P3).
129
+ - Sem lock cross-process entre dois CLIs no mesmo target (P2).
130
+ - Manifests de Forja (`forge/SpecialistAgenticManifest/v1`) ainda não
131
+ emitidos pelos repos consumidores — engine reporta silêncio correto.
132
+ - Defect pré-existente em `forge-doctor-api`
133
+ (`test_malformed_stdio_input_resilient`) descoberto na homologação —
134
+ escopo do especialista, P2.
135
+
136
+ ### Adicionado
137
+
138
+ - Licença MIT (`LICENSE`, campo `license`), alinhada às demais Forjas.
139
+ - `forge-doctor-api`: `update`/`uninstall` nativos e `--host`/`--gateway-profile`
140
+ confirmados em `scripts/forge_install.py`.
141
+ - Testes de TUI com teclas reais simuladas (menu e seleção com busca) e fluxo
142
+ do menu testável sem TTY (`applyMenu`).
143
+
144
+ ### Corrigido
145
+
146
+ - Ajuda da seleção de Forjas dizia "espaço marca"; a tecla correta é Tab.
147
+ - Instaladores nativos (itens 6/7/9/10): `forge-doctor-api` via
148
+ `scripts/forge_install.py` (Python resolvido em runtime), `--host` e
149
+ `--gateway-profile` repassados onde a Forja suporta, `--native` em
150
+ `update` e `uninstall`, e `forge.json` opcional (campos validados)
151
+ para derivar a verificação de Forjas sem `verify` no catálogo.
152
+ - `--json` em `status`, `list`, `versions`, `components`, `update --check`
153
+ e `doctor`: só JSON no stdout, sem banner.
154
+ - TUI: seleção de Forjas com busca (digite para filtrar) e dica de fase/versão
155
+ por Forja; `--verbose` para saída completa dos comandos; logs com
156
+ timestamp. Código de saída 1 quando alguma Forja falha.
157
+
158
+ ### Corrigido
159
+
160
+ - O log da execução (`.forge-cli/logs`) agora mascara segredos e URLs com
161
+ credenciais; antes só relatórios e mensagens de erro eram mascarados.
162
+ - Aprovação e estados (pós-roadmap): resumo de execução (origem, revisão,
163
+ confiança, comandos exatos) antes da confirmação, aprovação por
164
+ repositório customizado, e fases persistidas (`cloned`, `prepared`,
165
+ `installed`, `validated`, `partial`, `failed`, `drifted`) no `status`.
166
+ - `help`, `components [forjas]` (flags do instalador nativo por Forja),
167
+ `doctor <forja>` e `--offline` (usa só clones existentes; nunca clona
168
+ nem faz pull/fetch).
169
+ - Adaptadores leves (Cycle 0/6): `--profile`, `--scope` e `--components`
170
+ acionam o instalador nativo da Forja (`<cli> install ...`) depois do
171
+ bootstrap, somente para Forjas que o documentam; sempre `--dry-run`
172
+ salvo `--yes`. Matriz de capacidades real em `docs/capabilities.md`.
173
+ - Portabilidade/distribuição (Cycle 8/9): `self update` respeitando o
174
+ método de instalação (npm global automático com `--yes`; shim e
175
+ código-fonte mostram o passo manual), CI em Linux/Windows/macOS e
176
+ testes dos cenários de independência A–F.
177
+ - TUI (Cycle 2): menu principal ao rodar `forge-cli` em terminal
178
+ interativo (instalar, atualizar, reinstalar, reparar, versões, estado,
179
+ desinstalar, diagnosticar, sair). Sem TTY ou com comando/flags de
180
+ seleção, o comportamento anterior é mantido. `uninstall` pede
181
+ confirmação interativa quando não há `--yes`.
182
+ - Ciclo de vida (Cycle 4/5/7): `pin`/`unpin` (install/update respeitam a
183
+ fixação), `rollback` (só o checkout Git, ao HEAD anterior registrado),
184
+ `reinstall` (mantém a revisão atual; `--clean` remove e reclona com
185
+ backup) e `uninstall <forjas>` (plano por padrão, exige `--yes`; recusa
186
+ tree suja, remote diferente, symlink e diretórios sem .git; faz backup
187
+ de `.env`/configs em `.forge-cli/backups`).
188
+ - Versões e revisões (Cycle 3/5): `update [forjas]` (sem nomes: todas as
189
+ clonadas), `update --check` (só fetch, sem alterar), `versions`,
190
+ `--ref <sha|tag>` e `--version <tag>` (checkout destacado; recusa
191
+ working tree modificada; exige uma única Forja).
192
+ - Subcomandos (Cycle 3): `install [forjas]`, `clone <forjas>` (sem
193
+ scripts), `status [forjas]`, `self install|uninstall`. **Mudança:**
194
+ `forge-cli install` sem nomes agora abre o fluxo interativo; o
195
+ registro no PATH é `forge-cli self install`.
196
+ - Sync Git (Cycle 1): detecta remote divergente do catálogo e classifica
197
+ falhas de pull (divergente/rede/autenticação). Scripts não rodam após
198
+ falha de sync sem `--run-after-sync-failure`; repositórios de
199
+ `forge-cli.repos.json` só executam scripts com `--trust-custom`.
200
+ - Segurança (Cycle 1): validação de nomes/URLs de repositórios (bloqueia
201
+ path traversal, `--opção`, `ext::`, `file://` e credenciais embutidas),
202
+ recusa de destino symlink/junction, `git clone --`, redação de
203
+ segredos em logs/relatórios/erros e escrita atômica de estado.
204
+ - Provisionamento de `.env` por repositório antes do script de
205
+ instalação: copia `.env.example`, cria modelo comentado ou preserva
206
+ `.env` existente (lf-0002).
207
+ - Verificação de ambiente (preflight): `git`, Node.js >= 20 e
208
+ `powershell.exe` no Windows, com saída `exit 1` antes dos prompts.
209
+ - UI/UX: banner animado, tema de cores centralizado, ícones emoji,
210
+ spinners com cronômetro, tempo por repositório e relatório final
211
+ enriquecido.
212
+
213
+ ### Alterado
214
+
215
+ - Refatoração interna: `index.ts` reduzido a orquestrador; novos
216
+ módulos `prompts`, `runner`, `report`, `env`, `preflight` e
217
+ `ui/{theme,strings}` (lf-0002).
218
+
219
+ ## [0.1.0] - 2026-10-11
220
+
221
+ ### Adicionado
222
+
223
+ - CLI interativa que clona/atualiza os 8 repositórios do ecossistema
224
+ Forge e executa `install.ps1` (Windows) ou `install.sh`
225
+ (Linux/macOS) (lf-0001).
226
+ - Fluxo `@clack/prompts`: diretório de destino (padrão
227
+ `./forge-workspace`), multiseleção, confirmação, spinners e
228
+ relatório `[OK]`/`[AVISO]`/`[ERRO]`.
229
+ - Cancelamento limpo via `isCancel()` e `SIGINT`.
230
+ - Testes `vitest` para o catálogo e utilitários de sistema.
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,246 @@
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
+ Clone este repositório e instale as dependências:
45
+
46
+ ```bash
47
+ git clone https://github.com/EdgarSocrates98/forge-cli.git
48
+ cd forge-cli
49
+ npm install
50
+ ```
51
+
52
+ Para rodar sem compilar:
53
+
54
+ ```bash
55
+ npm run dev
56
+ ```
57
+
58
+ Para compilar e usar como comando global:
59
+
60
+ ```bash
61
+ npm run build
62
+ npm link # registra o binário `forge-cli`
63
+ forge-cli # em qualquer diretório
64
+ ```
65
+
66
+ Alternativa sem npm global — o próprio CLI se registra no PATH do usuário
67
+ (sem admin), copiando o bundle para `~/.forge-cli/bin`:
68
+
69
+ ```bash
70
+ npm run build
71
+ node dist/index.js self install # Windows: forge-cli.cmd + PATH do usuário
72
+ # Linux/macOS: shim sh + bloco nos profiles
73
+ forge-cli self uninstall # desfaz tudo (PATH, shims e bundle)
74
+ ```
75
+
76
+ Após `self install`, abra um terminal novo — o PATH do usuário só é lido por
77
+ processos novos. `forge-cli doctor` avisa quando o binário não está
78
+ acessível no PATH.
79
+
80
+ ## Quickstart
81
+
82
+ 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).
83
+ 2. Abra um terminal novo e rode `forge-cli`.
84
+ 3. Escolha **Instalar Forjas**, selecione as Forjas desejadas e confirme.
85
+ 4. Use os comandos oficiais de cada Forja (a seção "próximos passos" do relatório lista os principais).
86
+
87
+ 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).
88
+
89
+ ## Instalador nativo (perfil, escopo, componentes)
90
+
91
+ ```bash
92
+ forge-cli install spark-forge-aws --profile recommended --scope project --components skills,agents # plano (--dry-run)
93
+ forge-cli install spark-forge-aws --profile recommended --scope project --components skills,agents --yes # aplica
94
+ ```
95
+
96
+ O forge-cli só delega ao `<cli> install` que a Forja documenta; Forjas sem
97
+ instalador nativo (ex.: forge-portal) recebem um aviso, sem substituto
98
+ silencioso. Veja [docs/capabilities.md](docs/capabilities.md).
99
+
100
+ ## Independência
101
+
102
+ 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`.
103
+
104
+ ## Comandos
105
+
106
+ ```bash
107
+ forge-cli install api-forge platform-forge # instala Forjas escolhidas
108
+ forge-cli install # fluxo interativo
109
+ forge-cli clone api-forge # só clona/sincroniza, sem scripts
110
+ forge-cli status # estado local (clonado, versão, alterações)
111
+ forge-cli update [--check] # atualiza (ou só verifica) Forjas clonadas
112
+ forge-cli versions api-forge # revisão e tags
113
+ forge-cli install api-forge --version 1.2.0 # fixa em tag/sha (checkout destacado)
114
+ forge-cli pin|unpin|rollback api-forge # fixação e retorno ao HEAD anterior
115
+ forge-cli reinstall api-forge [--clean] # mantém a revisão; --clean reclona com backup
116
+ forge-cli uninstall api-forge [--yes] # plano + backup de .env/configs
117
+ forge-cli components [forjas] # flags do instalador nativo por Forja
118
+ forge-cli doctor [forjas] [--fix] # diagnostica (ou repara) Forjas
119
+ forge-cli install api-forge --offline # só usa clone existente, sem rede
120
+ forge-cli update api-forge --native # também a operação nativa (--dry-run sem --yes)
121
+ forge-cli uninstall api-forge --native --yes # desinstala nativamente e depois remove o clone
122
+ forge-cli status --json # saída estruturada (também list, versions, components, doctor)
123
+ forge-cli self install | self uninstall | self update
124
+ forge-cli help
125
+ ```
126
+
127
+ Segurança: scripts não rodam após falha de sync (`--run-after-sync-failure`
128
+ libera) e repositórios de `forge-cli.repos.json` só executam scripts com
129
+ `--trust-custom`. `--yes` não autoriza o instalador nativo a escrever sem
130
+ que seja passado explicitamente.
131
+
132
+ > `forge-cli install` agora instala Forjas; o registro no PATH passou a
133
+ > ser `forge-cli self install`.
134
+
135
+ ## Uso
136
+
137
+ Execute `npm run dev` (ou `forge-cli`, se instalado globalmente) e siga
138
+ o fluxo interativo:
139
+
140
+ 1. **Banner e verificação de ambiente.** O CLI exibe o banner do Forge
141
+ e valida `git`, a versão do Node.js e o `powershell.exe` (no
142
+ Windows). Falhas encerram o processo antes de qualquer prompt.
143
+ 2. **Diretório de instalação.** Informe onde os repositórios serão
144
+ clonados. O padrão é `./forge-workspace`; o caminho é convertido
145
+ para absoluto e o diretório criado se não existir.
146
+ 3. **Seleção de repositórios.** Marque ou desmarque itens com `Espaço`.
147
+ Todos os oito vêm selecionados por padrão; ao menos um é obrigatório.
148
+ 4. **Confirmação.** Revise o resumo (destino e quantidade) e confirme.
149
+ 5. **Execução.** Para cada repositório, um spinner mostra a fase atual:
150
+ `Sincronizando`, `Provisionando .env` e `Executando script`.
151
+ 6. **Relatório final.** Status por repositório com tempo de execução e
152
+ totais agregados.
153
+
154
+ Para cancelar em qualquer etapa, pressione `Ctrl+C`. O processo
155
+ encerra de forma limpa (código `130` em `SIGINT`).
156
+
157
+ ## Repositórios do ecossistema
158
+
159
+ | Repositório | Descrição |
160
+ | ------------------- | -------------------------------- |
161
+ | `the-forge` | Framework base e utilitários |
162
+ | `spark-forge-aws` | Pipelines Spark para AWS |
163
+ | `spark-forge-azure` | Pipelines Spark para Azure |
164
+ | `platform-forge` | Serviços e infra de plataforma |
165
+ | `api-forge` | Backend central e APIs |
166
+ | `forge-doctor-api` | API de diagnóstico e telemetria |
167
+ | `forge-doctor-data` | Pipeline de dados de diagnóstico |
168
+ | `forge-portal` | Frontend / Portal Web |
169
+
170
+ Todos os repositórios ficam na organização
171
+ [`EdgarSocrates98`](https://github.com/EdgarSocrates98) no GitHub.
172
+
173
+ ## Provisionamento do `.env`
174
+
175
+ Antes do script de instalação, cada repositório recebe um `.env`:
176
+
177
+ | Condição | Ação | Indicador no relatório |
178
+ | --------------------- | ----------------------------- | -------------------------------------- |
179
+ | `.env` já existe | Nada — nunca sobrescreve | `.env já existia` |
180
+ | `.env.example` existe | Copiado para `.env` | `.env criado a partir de .env.example` |
181
+ | Nenhum dos dois | Modelo com comentários criado | `.env criado (modelo vazio…)` |
182
+
183
+ Se o provisionamento falhar (por exemplo, permissão negada), o
184
+ repositório é marcado como `[ERRO]` e o script de instalação **não**
185
+ é executado para ele.
186
+
187
+ ## Status de execução
188
+
189
+ | Status | Significado |
190
+ | ------------ | -------------------------------------------------- |
191
+ | ✅ `[OK]` | Clonado/atualizado e script executado com sucesso |
192
+ | ⚠️ `[AVISO]` | Clonado, mas sem script de instalação para este SO |
193
+ | ❌ `[ERRO]` | Falha no clone/pull, no `.env` ou no script |
194
+
195
+ ## Scripts do projeto
196
+
197
+ | Comando | Ação |
198
+ | ------------------- | -------------------------------------- |
199
+ | `npm run dev` | Executa o CLI via `tsx`, sem compilar |
200
+ | `npm run build` | Compila `src/` para `dist/` via `tsup` |
201
+ | `npm start` | Executa `dist/index.js` |
202
+ | `npm test` | Testes unitários via `vitest` |
203
+ | `npm run typecheck` | Verificação de tipos (`tsc --noEmit`) |
204
+
205
+ ## Estrutura do projeto
206
+
207
+ ```text
208
+ src/
209
+ index.ts # despacho: args, menu, subcomando
210
+ cmd/ # implementação dos comandos (query, manage, run, batch, shared)
211
+ prompts.ts # prompts: diretório, seleção, confirmação
212
+ menu.ts # menu principal (TUI)
213
+ commands.ts # resolução de subcomandos
214
+ safety.ts # nomes/URLs seguros, symlinks, redação de segredos
215
+ git-revs.ts # tags, checkout por ref, update --check
216
+ lifecycle.ts # uninstall seguro, rollback
217
+ native-install.ts # adaptador do instalador nativo (profile/scope/components)
218
+ status.ts # estado local por Forja
219
+ self.ts # self update por método de instalação
220
+ runner.ts # pipeline por repositório (clone → .env → script)
221
+ env.ts # provisionamento do .env
222
+ preflight.ts # verificações de ambiente
223
+ report.ts # relatório final
224
+ ui/
225
+ theme.ts # paleta de cores e ícones (picocolors)
226
+ strings.ts # todas as mensagens PT-BR
227
+ constants/
228
+ repos.ts # catálogo dos 8 repositórios
229
+ utils/
230
+ system.ts # caminhos, .git, scripts por SO, execução
231
+ types.ts # tipos compartilhados
232
+ tests/ # testes unitários (vitest)
233
+ factory/ # fluxo spec-driven (Loop Factory)
234
+ ```
235
+
236
+ ## Documentação
237
+
238
+ - [Arquitetura e decisões de design](docs/arquitetura.md)
239
+ - [Matriz de capacidades das Forjas](docs/capabilities.md)
240
+ - [Solução de problemas](docs/solucao-de-problemas.md)
241
+ - [Como contribuir](CONTRIBUTING.md)
242
+ - [Registro de mudanças](CHANGELOG.md)
243
+
244
+ ## Licença
245
+
246
+ [MIT](LICENSE) © 2026 Edgar Sócrates Caria