theforge-cli 0.2.2 → 0.2.4

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.
@@ -0,0 +1,157 @@
1
+ # Guia de instalação por cenário
2
+
3
+ Ciclo 12.1 (`lf-0015`–`lf-0019`). O objetivo é que a instalação de uma
4
+ Forja **não dependa de um único método de aquisição**: PyPI, clone git,
5
+ ZIP do GitHub, pasta copiada ou diretório sem `.git` são entradas
6
+ válidas quando existe um método local compatível, funcional e
7
+ autorizado. A ausência de `.git`, de PowerShell ou de um Python no PATH
8
+ nunca bloqueia isoladamente a instalação.
9
+
10
+ Toda recusa sai com código `FORGE-*`, causa e remédio — veja a tabela
11
+ completa em [troubleshooting.md](troubleshooting.md). `forge doctor`
12
+ diagnostica a instalação depois do fato; `forge env discover --json`
13
+ mostra as rotas/shells/interpretadores que a máquina oferece **antes**
14
+ de instalar.
15
+
16
+ ## Sumário dos cenários
17
+
18
+ | # | Cenário | Comando | Rota |
19
+ | --- | ------------------------------- | ------------------------------------------------------- | --------------------------------------------------- |
20
+ | 1 | PyPI (recomendado) | `forge-cli install <forja> --method registry` | venv isolada em `~/.forge-cli/forges/` |
21
+ | 2 | Clone git | `forge-cli install <forja>` | clone + `install.sh`/`install.ps1` |
22
+ | 3 | ZIP do GitHub | `forge-cli install ./forja-1.2.3` | detecção local + bootstrap no lugar |
23
+ | 4 | Pasta copiada | `forge-cli install ./cópia` | idem — gitless é cidadão de 1ª classe |
24
+ | 5 | Diretório sem `.git` | `forge-cli install ./dir` | idem |
25
+ | 6 | Windows + PowerShell | `forge-cli install <forja>` | `install.ps1`/`setup.ps1` via powershell.exe → pwsh |
26
+ | 7 | Windows sem PowerShell | `forge-cli install <forja>` no Git Bash | `install.windows.sh` via Git Bash |
27
+ | 8 | Python corporativo fora do PATH | `forge-cli install <alvo> --python C:\corp\python.exe` | estágio explícito do pipeline |
28
+ | 9 | Vários Pythons (Linux) | `forge-cli install <alvo>` ou `--python`/`FORGE_PYTHON` | descoberta escolhe o mais novo compatível |
29
+ | 10 | Rede/permissão restrita | `forge-cli install <forja> --method registry --offline` | wheelhouse/cache local; sem admin |
30
+
31
+ ## 1. PyPI — `install --method registry`
32
+
33
+ ```bash
34
+ forge-cli install api-forge --method registry
35
+ forge-cli install --all --method registry
36
+ forge-cli registry # catálogo + o que está instalado
37
+ ```
38
+
39
+ Cada Forja vai para `~/.forge-cli/forges/<nome>/` com
40
+ `pip install <dist>==<versão>` pinado; o interpretador é o mais novo
41
+ que satisfaz `requires_python`. Sem compatível, a instalação é recusada
42
+ (`FORGE-PYTHON-INCOMPATIBLE`) antes de qualquer mutação.
43
+
44
+ ## 2. Clone git — `install <nome>`
45
+
46
+ ```bash
47
+ forge-cli install api-forge platform-forge
48
+ forge-cli install # TUI guiada
49
+ forge-cli install api-forge --version 1.2.0 # pin em tag/sha
50
+ ```
51
+
52
+ Clona no workspace (`--dir`, padrão `./forge-workspace`), provisiona
53
+ `.env` e roda o script do SO. Requer `git` no PATH e credenciais.
54
+
55
+ ## 3–5. Fonte local — `install <dir>` (ZIP, cópia, sem `.git`)
56
+
57
+ ```bash
58
+ forge-cli install ./spark-forge-aws-main # ZIP extraído do GitHub
59
+ forge-cli install ~/minhas/forjas/api-forge # pasta copiada / sem .git
60
+ forge-cli install ./fonte --plan # só classifica, zero escrita
61
+ ```
62
+
63
+ O diretório é classificado por `forge/LocalForgeSourceDetection/v1` em
64
+ oito estados (`GIT_REPOSITORY`, `GIT_WORKTREE`, `GITLESS_VALID_FORGE`,
65
+ `GITLESS_PARTIAL_FORGE`, `UNKNOWN_DIRECTORY`, `CONFLICTING_IDENTITY`,
66
+ `INVALID_MANIFEST`, `UNTRUSTED_SOURCE`) — detecção só por filesystem,
67
+ sem spawn de git e sem rede. Fontes parciais (estrutura incompleta)
68
+ exigem `--yes`. O bootstrap roda **no lugar**: nunca `git init`,
69
+ `clone`, `pull` ou rede.
70
+
71
+ O receipt registra `source_dir`, `is_git`, `manifest_valid`,
72
+ `source_trust` (A/B/C), `integrity`, `execution_environment`,
73
+ `managed_artifacts` e `source_files` — `forge status` e `forge doctor`
74
+ reconhecem a instalação gitless normalmente.
75
+
76
+ Persistência de ambiente: um `.env` existente na fonte **nunca** é
77
+ sobrescrito — `.env.example` só é copiado quando `.env` está ausente
78
+ (e um stub comentado é criado quando nem o exemplo existe). Exemplos
79
+ de config (`*.example.*`) só são copiados quando o destino não existe;
80
+ `.env.example` em si nunca é copiado pela regra genérica. Falha de
81
+ escrita nessa etapa é recusa nomeada `FORGE-ENV-PERSISTENCE-FAILED`,
82
+ antes de qualquer bootstrap.
83
+
84
+ ## 6. Windows + PowerShell
85
+
86
+ Ordem de rota no Windows: `powershell.exe` (5.1) → `pwsh` (7+) → Git
87
+ Bash. Com PowerShell presente a cadeia é `.ps1`
88
+ (`setup.ps1`/`install.ps1`); a política de execução é contornada por
89
+ `-ExecutionPolicy Bypass` no escopo do processo.
90
+
91
+ ## 7. Windows sem PowerShell — rota Git Bash
92
+
93
+ Quando `powershell.exe`/`pwsh` estão ausentes ou bloqueados e o Git
94
+ Bash executa, a rota é `.sh` com `install.windows.sh` primeiro
95
+ (seguido de `setup.sh`/`install.sh`). O bash.exe precisa ser o do **Git
96
+ for Windows** e responder a `-lc 'echo ok'` — WSL, Cygwin e MSYS2 são
97
+ reportados pela descoberta mas **nunca** são rota nativa.
98
+
99
+ ```bash
100
+ # dentro do Git Bash
101
+ bash install.windows.sh # instalador direto da Forja
102
+ forge-cli env discover --json # route.selected deve ser "git_bash"
103
+ ```
104
+
105
+ Cenário coberto em CI como simulação (PATH mascarado no runner
106
+ Windows) — o gate de hardware corporativo real é ação humana
107
+ documentada no acceptance report.
108
+
109
+ ## 8. Python corporativo fora do PATH — `--python` / `FORGE_PYTHON`
110
+
111
+ ```bash
112
+ forge-cli install ./api-forge --python "C:\Python311\python.exe"
113
+ FORGE_PYTHON=/opt/python311/bin/python forge-cli install api-forge
114
+ ```
115
+
116
+ `FORGE_PYTHON` (estágio 0) precede até `--python` (estágio 1). Depois
117
+ vêm o launcher `py`, nomes de PATH, venvs, managers, locais de
118
+ plataforma e caminhos convencionais — todo candidato é **executado**
119
+ com `--version`; alias da Microsoft Store que não executa vira
120
+ `store-stub` (nunca selecionado). Piso padrão `>=3.10`; um `forge.json`
121
+ com campo `python` pode exigir mais.
122
+
123
+ ## 9. Vários Pythons no Linux
124
+
125
+ A descoberta examina `python3.x` decrescentes e escolhe o mais novo que
126
+ satisfaz o piso — um Python 3.13 no PATH vence um 3.10 mesmo sem flag.
127
+ `forge env discover --json` lista todos os candidatos com
128
+ `verdict`/`code` por item.
129
+
130
+ ## 10. Rede ou permissão restrita
131
+
132
+ ```bash
133
+ forge-cli install api-forge --method registry --offline # só cache local
134
+ forge-cli env paths # matriz de alvos de escrita
135
+ forge-cli install <dir> # fonte local: zero rede
136
+ ```
137
+
138
+ - `--offline` resolve do wheelhouse (`~/.forge-cli/cache/wheels/`) e
139
+ metadados — artefato ausente = recusa honesta, nunca fingimento.
140
+ - Nada de `sudo`/admin: alvos de escrita são os diretórios do usuário
141
+ (`env paths` mostra `home`, `bin`, `venvs`, `receipts`…); alvo
142
+ negado sai como `FORGE-INSTALL-PERMISSION-DENIED` com o fallback.
143
+ - Fonte local (`install <dir>`) não toca rede por definição.
144
+
145
+ ## Ciclo de vida da fonte local
146
+
147
+ | Operação | Comando | Comportamento |
148
+ | ------------ | ---------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- |
149
+ | Atualizar | `forge-cli update <dir-mais-novo>` | reconcilia arquivos na fonte registrada (copia novos/alterados; remove só o que o receipt registrou e a fonte nova não traz) |
150
+ | Reparar | `forge-cli reinstall <nome>` | remove artefatos gerenciados registrados e re-executa o bootstrap no lugar |
151
+ | Desinstalar | `forge-cli uninstall <nome> --yes` | remove **só** `managed_artifacts` (com backup dos arquivos em `~/.forge-cli/backups/`); a fonte e os arquivos do usuário nunca são apagados |
152
+ | Diagnosticar | `forge status` / `forge doctor` | receipt local aparece como `install_method: local`; fonte ausente vira `drifted`, nunca erro |
153
+
154
+ `update <nome>` (pelo nome) é recusado para fontes sem git com
155
+ `FORGE-SOURCE-GITLESS` — a semântica de `pull` não existe; aponte o
156
+ diretório-fonte mais novo. `--method git` numa fonte sem `.git` recebe
157
+ a mesma recusa antes de instalar.
@@ -1,17 +1,22 @@
1
1
  # Solução de problemas
2
2
 
3
- Falhas comuns do forge-cli e como resolver cada uma.
3
+ Falhas comuns do forge-cli e como resolver cada uma. Para os códigos de
4
+ recusa `FORGE-*` (fonte local, shells, Python, permissões), a tabela
5
+ completa está em [troubleshooting.md](troubleshooting.md) — cada código
6
+ carrega causa e remédio acionável. O guia por cenário de instalação
7
+ (PyPI, git, ZIP, Git Bash, Python fora do PATH, offline) está em
8
+ [installation.md](installation.md).
4
9
 
5
10
  ## O preflight falha
6
11
 
7
12
  O preflight roda antes de qualquer prompt e encerra com código `1`
8
13
  quando algo falta:
9
14
 
10
- | Falha | Causa | Correção |
11
- | ----------------------------- | ----------------------------------- | ------------------------------------------------------ |
12
- | `git` indisponível | Git não instalado ou fora do `PATH` | Instale o Git e abra um terminal novo |
13
- | `Node.js >= 20` falha | Versão antiga | Atualize via [nodejs.org](https://nodejs.org) ou `nvm` |
14
- | `powershell.exe` indisponível | Somente Windows; fora do `PATH` | Reinstale o PowerShell ou ajuste o `PATH` |
15
+ | Falha | Causa | Correção |
16
+ | --------------------------------- | --------------------------------------------------- | ----------------------------------------------------------------------------------------------- |
17
+ | `git` indisponível | Git não instalado ou fora do `PATH` | Instale o Git e abra um terminal novo |
18
+ | `Node.js >= 20` falha | Versão antiga | Atualize via [nodejs.org](https://nodejs.org) ou `nvm` |
19
+ | shell de instalação ausente (Win) | `powershell.exe`/`pwsh` fora do PATH e sem Git Bash | Instale Git for Windows (o Git Bash cobre a rota `install.windows.sh`) ou habilite o PowerShell |
15
20
 
16
21
  ## Falha no clone/pull (`[ERRO]`)
17
22
 
@@ -33,10 +38,12 @@ quando algo falta:
33
38
 
34
39
  ## O script de instalação falha
35
40
 
36
- - **Windows**: o CLI executa
37
- `powershell.exe -NoProfile -ExecutionPolicy Bypass -File install.ps1`.
38
- Se a política de execução estiver restrita demais ou o PowerShell for
39
- o Core (`pwsh`), ajuste o script ou o ambiente.
41
+ - **Windows**: o CLI executa `.ps1` via `powershell.exe -NoProfile
42
+ -ExecutionPolicy Bypass` (ou `pwsh` quando o 5.1 está ausente). Sem
43
+ nenhum PowerShell, o Git Bash executa `install.windows.sh`/`setup.sh`
44
+ — a rota é escolhida pelo que executa, não pelo PATH declarado. Se a
45
+ política de execução estiver restrita demais, ajuste o script ou o
46
+ ambiente (`FORGE-SHELL-UNAVAILABLE`).
40
47
  - **Linux/macOS**: o CLI executa `chmod +x install.sh && ./install.sh`.
41
48
  Confirme que o script é válido para o seu shell.
42
49
  - **Sem script para o SO**: o repositório sai como `[AVISO]`, não
@@ -0,0 +1,62 @@
1
+ # Códigos `FORGE-*` — taxonomia de recusa (ciclo 12.1)
2
+
3
+ Toda recusa nomeada sai com código estável + causa + remédio acionável,
4
+ no texto do erro e no `--json` (`results[].code`/`cause`/`remedy`).
5
+ Contrato de exit code: `2` = recusa nomeada (nada foi escrito),
6
+ `1` = falha operacional (script/setup quebrou depois de autorizado —
7
+ sem código inventado), `0` = ok. O mesmo código significa a mesma coisa
8
+ em POSIX e Windows; os remédios abaixo cobrem os dois.
9
+
10
+ ## Códigos do CLI (`src/errors.ts`)
11
+
12
+ | Código | Causa | Remédio |
13
+ | ----------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
14
+ | `FORGE-SOURCE-NOT-FOUND` | Caminho inexistente, não é diretório ou não tem nenhum marcador de Forja (sem `.git` e sem `forge.json`); também: update/repair/uninstall sem receipt registrado, ou `source_dir` registrado sumiu | Verifique o caminho; instale pelo catálogo (`install <nome>`/`--method registry`); se a fonte registrada foi movida, `uninstall <nome>` limpa o registro |
15
+ | `FORGE-SOURCE-GITLESS` | A operação exige git (`--method git`, `update <nome>` por nome, `clone`) mas a fonte não tem `.git`; ou fonte parcial instalada sem confirmação | Remova `--method git`, passe o diretório ao `update` (`update <dir-novo>`) ou confirme fonte parcial com `--yes` |
16
+ | `FORGE-SOURCE-INVALID` | `forge.json` malformado/ausente na rota local, sem script executável e sem fallback `scripts/forge_bootstrap.py`, fonte não confiável (symlink/junction), ou ação registry-only num receipt local | Corrija `forge.json` (JSON válido + `forge_id`), forneça `install.sh`/`setup.sh`/`install.windows.sh` ou aponte o diretório real; para receipt local use a rota sem `--method` |
17
+ | `FORGE-SOURCE-CONFLICT` | Identidade contraditória: nome do diretório/cli aponta uma Forja do catálogo diferente do `forge_id` declarado; ou receipt PyPI pré-existente para o mesmo `forge_id` | Corrija `forge.json` ou aponte o diretório certo; para reinstalar por fonte local uma Forja do PyPI, `uninstall --method registry <nome>` primeiro |
18
+ | `FORGE-INSTALL-VERIFICATION-FAILED` | Bootstrap executou mas o verify pós-install (`<cli> --help`) saiu não-zero — instalação registrada, entrada quebrada | Rode o cli manualmente dentro da fonte para ver o erro; o receipt já está gravado para diagnóstico |
19
+ | `FORGE-SHELL-NOT-FOUND` | Windows sem nenhuma shell de instalação utilizável: `powershell.exe`/`pwsh` ausentes e Git Bash inexistente | Instale PowerShell 7+ (`winget install Microsoft.PowerShell`), habilite o `powershell.exe` 5.1 ou instale Git for Windows (o Git Bash vira a rota de `install.windows.sh`). WSL nunca substitui shell nativo |
20
+ | `FORGE-SHELL-UNAVAILABLE` | Shell candidata existe no disco mas não executa (política/AppLocker/WDAC bloqueando ou instalação quebrada) | Verifique `Get-ExecutionPolicy` e a política corporativa, ou reinstale PowerShell 7+/Git for Windows |
21
+ | `FORGE-INSTALL-PERMISSION-DENIED` | Alvo de escrita resolvido nega permissão (home, bin, venvs, receipts…) | Rode `forge-cli env paths` para ver a matriz de alvos e o fallback concreto; ajuste permissões ou aponte outro diretório |
22
+ | `FORGE-ENV-PERSISTENCE-FAILED` | Provisionamento de ambiente falhou na escrita (`.env`/configs de exemplo) — diretório da fonte ou alvo sem permissão de escrita | Dê permissão de escrita no diretório da fonte e reexecute; o instalador grava `.env` e copia `*.example.*` antes do bootstrap |
23
+ | `FORGE-PYTHON-NOT-FOUND` | Pipeline não achou nenhum interpretador (ou só aliases da Microsoft Store, que não executam) | Instale Python ≥3.10 ou aponte explicitamente com `--python <exe>`/`FORGE_PYTHON` |
24
+ | `FORGE-PYTHON-INCOMPATIBLE` | Candidatos executaram mas todos abaixo do piso (`requires_python` do release ou `python` do `forge.json` — piso padrão ≥3.10) | Aponte um interpretador compatível com `--python`/`FORGE_PYTHON` |
25
+ | `FORGE-PYTHON-UNEXECUTABLE` | Candidato existe mas `--version` falha, expira ou não parseia (stub da Store, exe quebrado, shim morto) | Teste `<exe> --version` manualmente; aponte outro interpretador com `--python`/`FORGE_PYTHON` |
26
+
27
+ ## Códigos do instalador compartilhado (`scripts/forge_bootstrap.py` + `install.windows.sh`)
28
+
29
+ Emitidos pela camada Python/bash vendored nas Forjas — mesma
30
+ convenção: código no stderr/JSON e remédio explícito.
31
+
32
+ | Código | Causa | Remédio |
33
+ | ----------------------------------- | ------------------------------------------------------------------------------------ | ---------------------------------------------------------------------- |
34
+ | `FORGE-INSTALL-NO-CONFIG` | `forge.json` ausente no diretório onde o bootstrap rodou | Rode dentro de um checkout/fonte de Forja com `forge.json` |
35
+ | `FORGE-INSTALL-BAD-CONFIG` | `forge.json` inválido ou faltando chaves | Corrija o manifesto |
36
+ | `FORGE-INSTALL-DIST-INVALID` | `--dist` fora da whitelist do instalador | Use a distribuição publicada da Forja |
37
+ | `FORGE-INSTALL-DIST-URL` | `--dist-url` fora do esquema/host permitido | Aponte uma URL `https://` autorizada |
38
+ | `FORGE-INSTALL-DIST-MISMATCH` | Dist/url divergem do esperado pelo manifesto | Alinhe dist e url com a Forja instalada |
39
+ | `FORGE-INSTALL-MODE-CONFLICT` | Combinação inválida de flags de modo | Rode com um modo só (`--help` lista) |
40
+ | `FORGE-INSTALL-PYTHON-INCOMPATIBLE` | Interpretador abaixo do `requires-python` da Forja | Aponte Python compatível na flag/`FORGE_PYTHON` |
41
+ | `FORGE-INSTALL-VENV-FAILED` | `python -m venv` falhou ou a venv ficou incompleta | Verifique `python3-venv`/`ensurepip` instalados e permissão de escrita |
42
+ | `FORGE-INSTALL-RUNTIME-FAILED` | Falha de runtime do bootstrap (pip/wheel interno) | Veja o log impresso; rede offline exige wheelhouse |
43
+ | `FORGE-INSTALL-CLI-MISSING` | Binário `<cli>` ausente no `bin/` da venv após o install | Reinstale; entry-point do pacote quebrado |
44
+ | `FORGE-INSTALL-VERIFY-FAILED` | Smoke pós-install falhou (equivalente ao `FORGE-INSTALL-VERIFICATION-FAILED` do CLI) | Rode o binário da venv manualmente |
45
+ | `FORGE-INSTALL-BOOTSTRAP-FAILED` | `install.windows.sh` repassou falha não-zero do bootstrap | Veja o log `forge-install-*.log` ao lado da fonte |
46
+ | `FORGE-ENV-PERSISTENCE-FAILED` | `--persist-env` não conseguiu gravar PATH/perfil do usuário | Ajuste permissões do perfil ou rode sem `--persist-env` |
47
+
48
+ ## Recusas de pipeline sem script
49
+
50
+ Quando a fonte não tem script executável **e** o fallback
51
+ `forge_bootstrap.py` falhou por descoberta de Python, o código
52
+ `FORGE-PYTHON-*` da descoberta é propagado no lugar de
53
+ `FORGE-SOURCE-INVALID` — a causa real é o interpretador, não a fonte.
54
+
55
+ ## Diagnóstico rápido
56
+
57
+ ```bash
58
+ forge env discover --json # shells, rota escolhida, pythons sondados
59
+ forge env paths # alvos de escrita + fallbacks
60
+ forge doctor --json # checks por domínio (fontes locais incl.)
61
+ forge status --json # estado por Forja (receipts locais incl.)
62
+ ```
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "theforge-cli",
3
- "version": "0.2.2",
3
+ "version": "0.2.4",
4
4
  "description": "CLI interativa para clonar e configurar o ecossistema Forge",
5
5
  "type": "module",
6
6
  "bin": {