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.
- codeshift_ai-0.1.0/PKG-INFO +249 -0
- codeshift_ai-0.1.0/README.md +235 -0
- codeshift_ai-0.1.0/_codeshift/__init__.py +0 -0
- codeshift_ai-0.1.0/_codeshift/agents/__init__.py +0 -0
- codeshift_ai-0.1.0/_codeshift/agents/clean.py +23 -0
- codeshift_ai-0.1.0/_codeshift/agents/refactor.py +205 -0
- codeshift_ai-0.1.0/_codeshift/agents/response/__init__.py +0 -0
- codeshift_ai-0.1.0/_codeshift/agents/response/interface.py +68 -0
- codeshift_ai-0.1.0/_codeshift/agents/response/openai.py +38 -0
- codeshift_ai-0.1.0/_codeshift/agents/response/transformer.py +39 -0
- codeshift_ai-0.1.0/_codeshift/cli.py +269 -0
- codeshift_ai-0.1.0/_codeshift/cmd.py +17 -0
- codeshift_ai-0.1.0/_codeshift/color.py +47 -0
- codeshift_ai-0.1.0/_codeshift/exceptions.py +16 -0
- codeshift_ai-0.1.0/_codeshift/logs.py +2 -0
- codeshift_ai-0.1.0/_codeshift/prompt/REFACTOR.md +174 -0
- codeshift_ai-0.1.0/_codeshift/prompt/__init__.py +0 -0
- codeshift_ai-0.1.0/_codeshift/prompt/prompts.py +5 -0
- codeshift_ai-0.1.0/_codeshift/schema.py +30 -0
- codeshift_ai-0.1.0/_codeshift/settings/__init__.py +0 -0
- codeshift_ai-0.1.0/_codeshift/settings/config.py +156 -0
- codeshift_ai-0.1.0/_codeshift/ui.py +92 -0
- codeshift_ai-0.1.0/_codeshift/utils/__init__.py +0 -0
- codeshift_ai-0.1.0/_codeshift/utils/file.py +52 -0
- codeshift_ai-0.1.0/_codeshift/utils/tree.py +166 -0
- codeshift_ai-0.1.0/codeshift_ai.egg-info/PKG-INFO +249 -0
- codeshift_ai-0.1.0/codeshift_ai.egg-info/SOURCES.txt +31 -0
- codeshift_ai-0.1.0/codeshift_ai.egg-info/dependency_links.txt +1 -0
- codeshift_ai-0.1.0/codeshift_ai.egg-info/entry_points.txt +2 -0
- codeshift_ai-0.1.0/codeshift_ai.egg-info/requires.txt +8 -0
- codeshift_ai-0.1.0/codeshift_ai.egg-info/top_level.txt +1 -0
- codeshift_ai-0.1.0/pyproject.toml +31 -0
- 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()
|