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.
- package/CHANGELOG.md +17 -0
- package/README.md +37 -12
- package/dist/index.js +6853 -2918
- package/docs/installation.md +157 -0
- package/docs/solucao-de-problemas.md +17 -10
- package/docs/troubleshooting.md +62 -0
- package/package.json +1 -1
|
@@ -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
|
|
11
|
-
|
|
|
12
|
-
| `git` indisponível
|
|
13
|
-
| `Node.js >= 20` falha
|
|
14
|
-
| `powershell.exe`
|
|
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
|
-
|
|
38
|
-
|
|
39
|
-
|
|
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
|
+
```
|