codeshift-ai 0.1.0__tar.gz

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.
Files changed (33) hide show
  1. codeshift_ai-0.1.0/PKG-INFO +249 -0
  2. codeshift_ai-0.1.0/README.md +235 -0
  3. codeshift_ai-0.1.0/_codeshift/__init__.py +0 -0
  4. codeshift_ai-0.1.0/_codeshift/agents/__init__.py +0 -0
  5. codeshift_ai-0.1.0/_codeshift/agents/clean.py +23 -0
  6. codeshift_ai-0.1.0/_codeshift/agents/refactor.py +205 -0
  7. codeshift_ai-0.1.0/_codeshift/agents/response/__init__.py +0 -0
  8. codeshift_ai-0.1.0/_codeshift/agents/response/interface.py +68 -0
  9. codeshift_ai-0.1.0/_codeshift/agents/response/openai.py +38 -0
  10. codeshift_ai-0.1.0/_codeshift/agents/response/transformer.py +39 -0
  11. codeshift_ai-0.1.0/_codeshift/cli.py +269 -0
  12. codeshift_ai-0.1.0/_codeshift/cmd.py +17 -0
  13. codeshift_ai-0.1.0/_codeshift/color.py +47 -0
  14. codeshift_ai-0.1.0/_codeshift/exceptions.py +16 -0
  15. codeshift_ai-0.1.0/_codeshift/logs.py +2 -0
  16. codeshift_ai-0.1.0/_codeshift/prompt/REFACTOR.md +174 -0
  17. codeshift_ai-0.1.0/_codeshift/prompt/__init__.py +0 -0
  18. codeshift_ai-0.1.0/_codeshift/prompt/prompts.py +5 -0
  19. codeshift_ai-0.1.0/_codeshift/schema.py +30 -0
  20. codeshift_ai-0.1.0/_codeshift/settings/__init__.py +0 -0
  21. codeshift_ai-0.1.0/_codeshift/settings/config.py +156 -0
  22. codeshift_ai-0.1.0/_codeshift/ui.py +92 -0
  23. codeshift_ai-0.1.0/_codeshift/utils/__init__.py +0 -0
  24. codeshift_ai-0.1.0/_codeshift/utils/file.py +52 -0
  25. codeshift_ai-0.1.0/_codeshift/utils/tree.py +166 -0
  26. codeshift_ai-0.1.0/codeshift_ai.egg-info/PKG-INFO +249 -0
  27. codeshift_ai-0.1.0/codeshift_ai.egg-info/SOURCES.txt +31 -0
  28. codeshift_ai-0.1.0/codeshift_ai.egg-info/dependency_links.txt +1 -0
  29. codeshift_ai-0.1.0/codeshift_ai.egg-info/entry_points.txt +2 -0
  30. codeshift_ai-0.1.0/codeshift_ai.egg-info/requires.txt +8 -0
  31. codeshift_ai-0.1.0/codeshift_ai.egg-info/top_level.txt +1 -0
  32. codeshift_ai-0.1.0/pyproject.toml +31 -0
  33. codeshift_ai-0.1.0/setup.cfg +4 -0
@@ -0,0 +1,249 @@
1
+ Metadata-Version: 2.4
2
+ Name: codeshift-ai
3
+ Version: 0.1.0
4
+ Summary: CLI que migra projetos Python para C++ usando IA
5
+ Requires-Python: >=3.10
6
+ Description-Content-Type: text/markdown
7
+ Requires-Dist: pydantic>=2
8
+ Requires-Dist: python-dotenv
9
+ Requires-Dist: openai
10
+ Requires-Dist: WatchGuardian
11
+ Provides-Extra: local
12
+ Requires-Dist: transformers; extra == "local"
13
+ Requires-Dist: torch; extra == "local"
14
+
15
+ <p align="center">
16
+ <img src="assets/logo.svg" alt="CodeShift" width="520">
17
+ </p>
18
+
19
+ <p align="center">
20
+ Migre projetos <b>Python</b> para <b>C++</b> com um agente de IA, direto do terminal.
21
+ </p>
22
+
23
+ <p align="center">
24
+ <img alt="Python" src="https://img.shields.io/badge/Python-3.10%2B-3776AB?style=for-the-badge&logo=python&logoColor=3776AB&labelColor=1c1c24">
25
+ <img alt="C++" src="https://img.shields.io/badge/alvo-C%2B%2B20-00599C?style=for-the-badge&logo=cplusplus&logoColor=00599C&labelColor=1c1c24">
26
+ <img alt="Versao" src="https://img.shields.io/badge/vers%C3%A3o-0.1.0-d97757?style=for-the-badge&logo=semver&logoColor=d97757&labelColor=1c1c24">
27
+ <img alt="Status" src="https://img.shields.io/badge/status-alpha-f5c518?style=for-the-badge&logo=statuspage&logoColor=f5c518&labelColor=1c1c24">
28
+ <img alt="CLI" src="https://img.shields.io/badge/interface-CLI-a78bfa?style=for-the-badge&logo=gnubash&logoColor=a78bfa&labelColor=1c1c24">
29
+ </p>
30
+
31
+ <p align="center">
32
+ <img alt="Pydantic" src="https://img.shields.io/badge/Pydantic-v2-E92063?style=for-the-badge&logo=pydantic&logoColor=E92063&labelColor=1c1c24">
33
+ <img alt="OpenAI" src="https://img.shields.io/badge/OpenAI%20SDK-compat%C3%ADvel-412991?style=for-the-badge&logo=openaigym&logoColor=a78bfa&labelColor=1c1c24">
34
+ <img alt="LM Studio" src="https://img.shields.io/badge/LM%20Studio-local-1f6feb?style=for-the-badge&logo=lmstudio&logoColor=1f6feb&labelColor=1c1c24">
35
+ <img alt="Transformers" src="https://img.shields.io/badge/Transformers-opcional-FFD21E?style=for-the-badge&logo=huggingface&logoColor=FFD21E&labelColor=1c1c24">
36
+ <img alt="Qwen" src="https://img.shields.io/badge/Qwen-Coder-6f42c1?style=for-the-badge&logo=alibabacloud&logoColor=6f42c1&labelColor=1c1c24">
37
+ <img alt="dotenv" src="https://img.shields.io/badge/dotenv-.env-3fb950?style=for-the-badge&logo=dotenv&logoColor=3fb950&labelColor=1c1c24">
38
+ </p>
39
+
40
+ ---
41
+
42
+ ## Índice
43
+
44
+ - [O que é](#o-que-é)
45
+ - [Instalação](#instalação)
46
+ - [Início rápido](#início-rápido)
47
+ - [Configuração](#configuração)
48
+ - [Uso](#uso)
49
+ - [Como funciona](#como-funciona)
50
+ - [Estrutura](#estrutura)
51
+ - [Desenvolvimento](#desenvolvimento)
52
+
53
+ ## O que é
54
+
55
+ O **CodeShift** percorre o seu projeto Python arquivo por arquivo e pede a um modelo de código que escreva a versão equivalente em C++. Tudo roda num menu de terminal, e o modelo pode ser local (LM Studio, Ollama ou qualquer servidor compatível com a API da OpenAI) ou carregado via `transformers`.
56
+
57
+ > ⚠️ **A migração substitui os arquivos `.py` pelos arquivos C++.** Faça um commit ou backup antes de rodar.
58
+
59
+ ## Instalação
60
+
61
+ Requer **Python 3.10** ou mais novo.
62
+
63
+ ```bash
64
+ pip install codeshift-ai
65
+ ```
66
+
67
+ Para usar um modelo **local** pelo `transformers` (baixa o `torch`, então é pesado):
68
+
69
+ ```bash
70
+ pip install "codeshift-ai[local]"
71
+ ```
72
+
73
+ Confira se deu certo:
74
+
75
+ ```bash
76
+ codeshift --version
77
+ ```
78
+
79
+ > 💡 **Dica:** para instalar o comando de forma isolada, sem misturar com as bibliotecas do seu sistema, use o [pipx](https://pipx.pypa.io): `pipx install codeshift-ai`.
80
+
81
+ Para atualizar:
82
+
83
+ ```bash
84
+ pip install --upgrade codeshift-ai
85
+ ```
86
+
87
+ Depois de instalado, só o comando `codeshift` fica disponível. Não há API para importar.
88
+
89
+ ## Início rápido
90
+
91
+ ```bash
92
+ # 1. suba um servidor de modelo (exemplo com o LM Studio)
93
+ lms server start
94
+ lms load qwen2.5-coder-7b-instruct --context-length 16384 -y
95
+
96
+ # 2. entre na pasta do projeto Python que você quer migrar
97
+ cd meu-projeto
98
+
99
+ # 3. crie o .env apontando para o servidor
100
+ printf 'url = http://localhost:1234/v1\napi_key = lm-studio\n' > .env
101
+
102
+ # 4. abra o CodeShift, escolha "3 Configurar modelo" e depois "1 Migrar projeto"
103
+ codeshift
104
+ ```
105
+
106
+ ## Configuração
107
+
108
+ ### 1. Servidor do modelo
109
+
110
+ O jeito mais simples é o [LM Studio](https://lmstudio.ai):
111
+
112
+ ```bash
113
+ lms server start
114
+ lms load qwen2.5-coder-7b-instruct --context-length 16384 -y
115
+ ```
116
+
117
+ Crie um `.env` na pasta do projeto que você quer migrar:
118
+
119
+ ```env
120
+ url = http://localhost:1234/v1
121
+ api_key = lm-studio
122
+ ```
123
+
124
+ | Variável | Para que serve |
125
+ |---|---|
126
+ | `url` | endereço do servidor compatível com a API da OpenAI |
127
+ | `api_key` | chave enviada ao servidor (no LM Studio pode ser qualquer texto) |
128
+
129
+ Sem a variável `url`, o CodeShift usa o modelo local via `transformers` (requer `pip install "codeshift-ai[local]"`).
130
+
131
+ ### 2. Modelo e temperatura
132
+
133
+ Abra o `codeshift` e use a opção **Configurar modelo**. A escolha fica salva em `.codeshift/config.json`, dentro do projeto.
134
+
135
+ | Modelo | Observação |
136
+ |---|---|
137
+ | `Qwen/Qwen3-Coder-Next` | o mais capaz |
138
+ | `Qwen/Qwen2.5-Coder-14B-Instruct` | bom equilíbrio |
139
+ | `Qwen/Qwen2.5-Coder-7B-Instruct` | padrão para testar |
140
+ | `Qwen/Qwen2.5-Coder-3B-Instruct` | leve |
141
+
142
+ Temperaturas entre `0.2` e `0.3` costumam gerar JSON mais estável.
143
+
144
+ ## Uso
145
+
146
+ Entre na pasta do projeto Python e rode:
147
+
148
+ ```bash
149
+ cd meu-projeto
150
+ codeshift
151
+ ```
152
+
153
+ ```
154
+ ╭────────────────────────────────────────────────────────╮
155
+ │ ██████ CodeShift v0.1.0 │
156
+ │ ██████████ Migração de código para C++ com IA │
157
+ │ ████ ████ Modelo Qwen2.5-Coder-7B · temp 0.2 │
158
+ │ ████████ Servidor ● http://localhost:1234/v1 │
159
+ │ ██ ██ Pasta ~/meu-projeto │
160
+ ╰────────────────────────────────────────────────────────╯
161
+ ```
162
+
163
+ | Opção | O que faz |
164
+ |---|---|
165
+ | **1** Migrar projeto para C++ | Roda o agente e substitui os `.py` por C++ |
166
+ | **2** Carregar modelo agora | Prepara o modelo antes de usar |
167
+ | **3** Configurar modelo | Escolhe modelo, temperatura e arquivo `.env` |
168
+ | **4** Atualizar configurações | Muda uma configuração já salva |
169
+ | **5** Ver árvore do projeto | Lista pastas e arquivos |
170
+ | **0** Sair | Fecha o programa |
171
+
172
+ | Comando | O que faz |
173
+ |---|---|
174
+ | `codeshift` | abre o menu |
175
+ | `codeshift --version` | mostra a versão instalada |
176
+
177
+ ### Arquivos criados no seu projeto
178
+
179
+ | Caminho | Conteúdo |
180
+ |---|---|
181
+ | `.codeshift/config.json` | modelo, temperatura e arquivo `.env` escolhidos |
182
+ | `.codeshift/tree.json` | árvore do projeto com o status de cada arquivo |
183
+
184
+ Adicione `.codeshift/` ao `.gitignore` do projeto migrado.
185
+
186
+ ## Como funciona
187
+
188
+ ```
189
+ ┌──────────────────────────────────────────────┐
190
+ │ .codeshift/tree.json │
191
+ │ árvore binária: pastas, arquivos e status │
192
+ └───────────────┬──────────────────────────────┘
193
+ │ a cada turno
194
+ ▼
195
+ ┌──────────┐ árvore + resultado ┌──────────────┐
196
+ │ CodeShift│ ───────────────────────▶ │ Modelo │
197
+ │ (loop) │ ◀─────────────────────── │ (Qwen etc.) │
198
+ └────┬─────┘ JSON com ações └──────────────┘
199
+ │ executa: read · save · update · update_status · quit
200
+ ▼
201
+ arquivos do projeto
202
+ ```
203
+
204
+ 1. O CodeShift monta uma **árvore binária** do projeto (`left` = primeiro filho, `right` = próximo irmão). Cada arquivo tem o status `pending` ou `visited`.
205
+ 2. A cada turno o modelo recebe a lista de arquivos pendentes, a árvore e o resultado da rodada anterior.
206
+ 3. Ele responde com **um JSON** de ações, executadas em ordem:
207
+
208
+ | Ação | `arg` | Efeito |
209
+ |---|---|---|
210
+ | `read` | `"caminho"` | devolve o texto do arquivo |
211
+ | `save` | `["caminho", "conteúdo"]` | cria um arquivo novo (ex.: um `.hpp`) |
212
+ | `update` | `["caminho", "novo_caminho", "novo_conteúdo"]` | troca o conteúdo e renomeia (`.py` → `.cpp`) |
213
+ | `update_status` | `["caminho", "visited"]` | marca o arquivo como tratado |
214
+ | `quit` | — | encerra |
215
+
216
+ 4. O agente só termina quando não sobra nenhum `.py` pendente. O código recusa caminhos fora do projeto e pastas como `.git`, `.venv` e `.env*`.
217
+
218
+ O prompt completo do agente está em [`_codeshift/prompt/REFACTOR.md`](_codeshift/prompt/REFACTOR.md).
219
+
220
+ ## Estrutura
221
+
222
+ ```
223
+ CodeShift/
224
+ ├── assets/logo.svg
225
+ ├── pyproject.toml
226
+ └── _codeshift/
227
+ ├── cli.py # menu e telas do terminal
228
+ ├── ui.py # cores, caixas e componentes visuais
229
+ ├── cmd.py # roda comandos no terminal
230
+ ├── schema.py # modelos pydantic (config e ações)
231
+ ├── agents/
232
+ │ ├── refactor.py # loop do agente
233
+ │ ├── clean.py # limpa cercas de markdown do JSON
234
+ │ └── response/ # OpenAI-compatível e transformers
235
+ ├── prompt/REFACTOR.md # prompt do agente
236
+ ├── settings/config.py # configuração e .env
237
+ └── utils/ # arquivos e árvore binária
238
+ ```
239
+
240
+ ## Desenvolvimento
241
+
242
+ Para mexer no código, clone o repositório e instale em modo editável (as mudanças valem na hora):
243
+
244
+ ```bash
245
+ git clone https://github.com/BrayanDevZN/CodeShift.git
246
+ cd CodeShift
247
+ python -m venv .venv && source .venv/bin/activate
248
+ pip install -e ".[local]"
249
+ ```
@@ -0,0 +1,235 @@
1
+ <p align="center">
2
+ <img src="assets/logo.svg" alt="CodeShift" width="520">
3
+ </p>
4
+
5
+ <p align="center">
6
+ Migre projetos <b>Python</b> para <b>C++</b> com um agente de IA, direto do terminal.
7
+ </p>
8
+
9
+ <p align="center">
10
+ <img alt="Python" src="https://img.shields.io/badge/Python-3.10%2B-3776AB?style=for-the-badge&logo=python&logoColor=3776AB&labelColor=1c1c24">
11
+ <img alt="C++" src="https://img.shields.io/badge/alvo-C%2B%2B20-00599C?style=for-the-badge&logo=cplusplus&logoColor=00599C&labelColor=1c1c24">
12
+ <img alt="Versao" src="https://img.shields.io/badge/vers%C3%A3o-0.1.0-d97757?style=for-the-badge&logo=semver&logoColor=d97757&labelColor=1c1c24">
13
+ <img alt="Status" src="https://img.shields.io/badge/status-alpha-f5c518?style=for-the-badge&logo=statuspage&logoColor=f5c518&labelColor=1c1c24">
14
+ <img alt="CLI" src="https://img.shields.io/badge/interface-CLI-a78bfa?style=for-the-badge&logo=gnubash&logoColor=a78bfa&labelColor=1c1c24">
15
+ </p>
16
+
17
+ <p align="center">
18
+ <img alt="Pydantic" src="https://img.shields.io/badge/Pydantic-v2-E92063?style=for-the-badge&logo=pydantic&logoColor=E92063&labelColor=1c1c24">
19
+ <img alt="OpenAI" src="https://img.shields.io/badge/OpenAI%20SDK-compat%C3%ADvel-412991?style=for-the-badge&logo=openaigym&logoColor=a78bfa&labelColor=1c1c24">
20
+ <img alt="LM Studio" src="https://img.shields.io/badge/LM%20Studio-local-1f6feb?style=for-the-badge&logo=lmstudio&logoColor=1f6feb&labelColor=1c1c24">
21
+ <img alt="Transformers" src="https://img.shields.io/badge/Transformers-opcional-FFD21E?style=for-the-badge&logo=huggingface&logoColor=FFD21E&labelColor=1c1c24">
22
+ <img alt="Qwen" src="https://img.shields.io/badge/Qwen-Coder-6f42c1?style=for-the-badge&logo=alibabacloud&logoColor=6f42c1&labelColor=1c1c24">
23
+ <img alt="dotenv" src="https://img.shields.io/badge/dotenv-.env-3fb950?style=for-the-badge&logo=dotenv&logoColor=3fb950&labelColor=1c1c24">
24
+ </p>
25
+
26
+ ---
27
+
28
+ ## Índice
29
+
30
+ - [O que é](#o-que-é)
31
+ - [Instalação](#instalação)
32
+ - [Início rápido](#início-rápido)
33
+ - [Configuração](#configuração)
34
+ - [Uso](#uso)
35
+ - [Como funciona](#como-funciona)
36
+ - [Estrutura](#estrutura)
37
+ - [Desenvolvimento](#desenvolvimento)
38
+
39
+ ## O que é
40
+
41
+ O **CodeShift** percorre o seu projeto Python arquivo por arquivo e pede a um modelo de código que escreva a versão equivalente em C++. Tudo roda num menu de terminal, e o modelo pode ser local (LM Studio, Ollama ou qualquer servidor compatível com a API da OpenAI) ou carregado via `transformers`.
42
+
43
+ > ⚠️ **A migração substitui os arquivos `.py` pelos arquivos C++.** Faça um commit ou backup antes de rodar.
44
+
45
+ ## Instalação
46
+
47
+ Requer **Python 3.10** ou mais novo.
48
+
49
+ ```bash
50
+ pip install codeshift-ai
51
+ ```
52
+
53
+ Para usar um modelo **local** pelo `transformers` (baixa o `torch`, então é pesado):
54
+
55
+ ```bash
56
+ pip install "codeshift-ai[local]"
57
+ ```
58
+
59
+ Confira se deu certo:
60
+
61
+ ```bash
62
+ codeshift --version
63
+ ```
64
+
65
+ > 💡 **Dica:** para instalar o comando de forma isolada, sem misturar com as bibliotecas do seu sistema, use o [pipx](https://pipx.pypa.io): `pipx install codeshift-ai`.
66
+
67
+ Para atualizar:
68
+
69
+ ```bash
70
+ pip install --upgrade codeshift-ai
71
+ ```
72
+
73
+ Depois de instalado, só o comando `codeshift` fica disponível. Não há API para importar.
74
+
75
+ ## Início rápido
76
+
77
+ ```bash
78
+ # 1. suba um servidor de modelo (exemplo com o LM Studio)
79
+ lms server start
80
+ lms load qwen2.5-coder-7b-instruct --context-length 16384 -y
81
+
82
+ # 2. entre na pasta do projeto Python que você quer migrar
83
+ cd meu-projeto
84
+
85
+ # 3. crie o .env apontando para o servidor
86
+ printf 'url = http://localhost:1234/v1\napi_key = lm-studio\n' > .env
87
+
88
+ # 4. abra o CodeShift, escolha "3 Configurar modelo" e depois "1 Migrar projeto"
89
+ codeshift
90
+ ```
91
+
92
+ ## Configuração
93
+
94
+ ### 1. Servidor do modelo
95
+
96
+ O jeito mais simples é o [LM Studio](https://lmstudio.ai):
97
+
98
+ ```bash
99
+ lms server start
100
+ lms load qwen2.5-coder-7b-instruct --context-length 16384 -y
101
+ ```
102
+
103
+ Crie um `.env` na pasta do projeto que você quer migrar:
104
+
105
+ ```env
106
+ url = http://localhost:1234/v1
107
+ api_key = lm-studio
108
+ ```
109
+
110
+ | Variável | Para que serve |
111
+ |---|---|
112
+ | `url` | endereço do servidor compatível com a API da OpenAI |
113
+ | `api_key` | chave enviada ao servidor (no LM Studio pode ser qualquer texto) |
114
+
115
+ Sem a variável `url`, o CodeShift usa o modelo local via `transformers` (requer `pip install "codeshift-ai[local]"`).
116
+
117
+ ### 2. Modelo e temperatura
118
+
119
+ Abra o `codeshift` e use a opção **Configurar modelo**. A escolha fica salva em `.codeshift/config.json`, dentro do projeto.
120
+
121
+ | Modelo | Observação |
122
+ |---|---|
123
+ | `Qwen/Qwen3-Coder-Next` | o mais capaz |
124
+ | `Qwen/Qwen2.5-Coder-14B-Instruct` | bom equilíbrio |
125
+ | `Qwen/Qwen2.5-Coder-7B-Instruct` | padrão para testar |
126
+ | `Qwen/Qwen2.5-Coder-3B-Instruct` | leve |
127
+
128
+ Temperaturas entre `0.2` e `0.3` costumam gerar JSON mais estável.
129
+
130
+ ## Uso
131
+
132
+ Entre na pasta do projeto Python e rode:
133
+
134
+ ```bash
135
+ cd meu-projeto
136
+ codeshift
137
+ ```
138
+
139
+ ```
140
+ ╭────────────────────────────────────────────────────────╮
141
+ │ ██████ CodeShift v0.1.0 │
142
+ │ ██████████ Migração de código para C++ com IA │
143
+ │ ████ ████ Modelo Qwen2.5-Coder-7B · temp 0.2 │
144
+ │ ████████ Servidor ● http://localhost:1234/v1 │
145
+ │ ██ ██ Pasta ~/meu-projeto │
146
+ ╰────────────────────────────────────────────────────────╯
147
+ ```
148
+
149
+ | Opção | O que faz |
150
+ |---|---|
151
+ | **1** Migrar projeto para C++ | Roda o agente e substitui os `.py` por C++ |
152
+ | **2** Carregar modelo agora | Prepara o modelo antes de usar |
153
+ | **3** Configurar modelo | Escolhe modelo, temperatura e arquivo `.env` |
154
+ | **4** Atualizar configurações | Muda uma configuração já salva |
155
+ | **5** Ver árvore do projeto | Lista pastas e arquivos |
156
+ | **0** Sair | Fecha o programa |
157
+
158
+ | Comando | O que faz |
159
+ |---|---|
160
+ | `codeshift` | abre o menu |
161
+ | `codeshift --version` | mostra a versão instalada |
162
+
163
+ ### Arquivos criados no seu projeto
164
+
165
+ | Caminho | Conteúdo |
166
+ |---|---|
167
+ | `.codeshift/config.json` | modelo, temperatura e arquivo `.env` escolhidos |
168
+ | `.codeshift/tree.json` | árvore do projeto com o status de cada arquivo |
169
+
170
+ Adicione `.codeshift/` ao `.gitignore` do projeto migrado.
171
+
172
+ ## Como funciona
173
+
174
+ ```
175
+ ┌──────────────────────────────────────────────┐
176
+ │ .codeshift/tree.json │
177
+ │ árvore binária: pastas, arquivos e status │
178
+ └───────────────┬──────────────────────────────┘
179
+ │ a cada turno
180
+ ▼
181
+ ┌──────────┐ árvore + resultado ┌──────────────┐
182
+ │ CodeShift│ ───────────────────────▶ │ Modelo │
183
+ │ (loop) │ ◀─────────────────────── │ (Qwen etc.) │
184
+ └────┬─────┘ JSON com ações └──────────────┘
185
+ │ executa: read · save · update · update_status · quit
186
+ ▼
187
+ arquivos do projeto
188
+ ```
189
+
190
+ 1. O CodeShift monta uma **árvore binária** do projeto (`left` = primeiro filho, `right` = próximo irmão). Cada arquivo tem o status `pending` ou `visited`.
191
+ 2. A cada turno o modelo recebe a lista de arquivos pendentes, a árvore e o resultado da rodada anterior.
192
+ 3. Ele responde com **um JSON** de ações, executadas em ordem:
193
+
194
+ | Ação | `arg` | Efeito |
195
+ |---|---|---|
196
+ | `read` | `"caminho"` | devolve o texto do arquivo |
197
+ | `save` | `["caminho", "conteúdo"]` | cria um arquivo novo (ex.: um `.hpp`) |
198
+ | `update` | `["caminho", "novo_caminho", "novo_conteúdo"]` | troca o conteúdo e renomeia (`.py` → `.cpp`) |
199
+ | `update_status` | `["caminho", "visited"]` | marca o arquivo como tratado |
200
+ | `quit` | — | encerra |
201
+
202
+ 4. O agente só termina quando não sobra nenhum `.py` pendente. O código recusa caminhos fora do projeto e pastas como `.git`, `.venv` e `.env*`.
203
+
204
+ O prompt completo do agente está em [`_codeshift/prompt/REFACTOR.md`](_codeshift/prompt/REFACTOR.md).
205
+
206
+ ## Estrutura
207
+
208
+ ```
209
+ CodeShift/
210
+ ├── assets/logo.svg
211
+ ├── pyproject.toml
212
+ └── _codeshift/
213
+ ├── cli.py # menu e telas do terminal
214
+ ├── ui.py # cores, caixas e componentes visuais
215
+ ├── cmd.py # roda comandos no terminal
216
+ ├── schema.py # modelos pydantic (config e ações)
217
+ ├── agents/
218
+ │ ├── refactor.py # loop do agente
219
+ │ ├── clean.py # limpa cercas de markdown do JSON
220
+ │ └── response/ # OpenAI-compatível e transformers
221
+ ├── prompt/REFACTOR.md # prompt do agente
222
+ ├── settings/config.py # configuração e .env
223
+ └── utils/ # arquivos e árvore binária
224
+ ```
225
+
226
+ ## Desenvolvimento
227
+
228
+ Para mexer no código, clone o repositório e instale em modo editável (as mudanças valem na hora):
229
+
230
+ ```bash
231
+ git clone https://github.com/BrayanDevZN/CodeShift.git
232
+ cd CodeShift
233
+ python -m venv .venv && source .venv/bin/activate
234
+ pip install -e ".[local]"
235
+ ```
File without changes
File without changes
@@ -0,0 +1,23 @@
1
+ import re
2
+
3
+ # ```json ... ``` ou ``` ... ```
4
+ _FENCE = re.compile(r"```[a-zA-Z0-9_-]*\s*(.*?)```", re.DOTALL)
5
+
6
+
7
+ def clean_json(text: str) -> str:
8
+ """Remove cercas de markdown e texto solto em volta, deixando só o objeto JSON."""
9
+
10
+ text = text.strip()
11
+
12
+ fenced = _FENCE.search(text)
13
+ if fenced:
14
+ text = fenced.group(1).strip()
15
+
16
+ # cerca aberta e nunca fechada (resposta cortada)
17
+ text = text.removeprefix("```json").removeprefix("```").strip()
18
+
19
+ start, end = text.find("{"), text.rfind("}")
20
+ if start != -1 and end > start:
21
+ text = text[start:end + 1]
22
+
23
+ return text.strip()