angelo-programmer 1.0.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/bin/angelo.js ADDED
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/env node
2
+
3
+ const { spawn } = require('child_process');
4
+ const path = require('path');
5
+
6
+ // Aponta para onde está o seu Python, dentro da pasta 'core'
7
+ const pythonScript = path.join(__dirname, '..', 'core', 'Angelo.py');
8
+
9
+ // Executa o comando python chamando o script
10
+ const child = spawn('python', [pythonScript], {
11
+ stdio: 'inherit', // Isso faz o terminal do usuário interagir com o seu Python
12
+ shell: true
13
+ });
14
+
15
+ child.on('close', (code) => {
16
+ process.exit(code);
17
+ });
package/core/Angelo.py ADDED
@@ -0,0 +1,232 @@
1
+ import os
2
+ import sys
3
+
4
+ # --- Verificação de Dependências ---
5
+ try:
6
+ import requests
7
+ # Silencia os avisos amarelos de InsecureRequestWarning
8
+ requests.packages.urllib3.disable_warnings()
9
+ except ImportError:
10
+ print("O Angelo não pode ser executado pois faltam as seguintes bibliotecas")
11
+ print("requests")
12
+ print("Como instalar:")
13
+ print("1- Abra um terminal qualquer (Terminal ou powershell)")
14
+ print("2- Digite \"pip install requests\"")
15
+ print("3- Ele vai mostrar um montes de barras e vai encher de mensagens, mais é só o procedimento")
16
+ print("4- Após a biblioteca ser instalada, o Angelo pode rodar certinho")
17
+ sys.exit()
18
+
19
+ # --- Configuração de Memória ---
20
+ def obter_caminho_memoria():
21
+ # Cria pasta .angelo no diretório home do usuário para ser compatível com futuros installs
22
+ home_dir = os.path.expanduser("~")
23
+ pasta_angelo = os.path.join(home_dir, ".angelo")
24
+ pasta_memory = os.path.join(pasta_angelo, "memory")
25
+
26
+ if not os.path.exists(pasta_memory):
27
+ os.makedirs(pasta_memory, exist_ok=True)
28
+ return pasta_memory
29
+
30
+ # --- Funções do Angelo ---
31
+
32
+ def limpar_tela():
33
+ os.system('cls' if os.name == 'nt' else 'clear')
34
+
35
+ def verificar_permissao():
36
+ limpar_tela()
37
+ print("==================================================")
38
+ print(" Você permite que o Angelo acesse todas as pastas")
39
+ print(" e arquivos nesta sessão? (s/n)")
40
+ print("==================================================")
41
+
42
+ resposta = input("> ").strip().lower()
43
+ if resposta == 's':
44
+ return True
45
+ else:
46
+ print("\nAcesso negado. O Angelo Programmer não pode ser iniciado.")
47
+ sys.exit()
48
+
49
+ def executar_comando_sistema(comando_ia):
50
+ print("\n\033[93m[Angelo detectou uma ação do sistema]\033[0m")
51
+ print(f"Comando a ser executado: {comando_ia}")
52
+ confirmar = input("Aceitar execução? (s/n): ").strip().lower()
53
+
54
+ if confirmar == 's':
55
+ try:
56
+ os.system(comando_ia)
57
+ except Exception as e:
58
+ print(f"Erro ao executar comando: {e}")
59
+ else:
60
+ print("Execução cancelada pelo usuário.")
61
+
62
+ def chamar_ia(historico, mensagem_usuario):
63
+ contexto_sistema = (
64
+ "Você é o Angelo Programmer, uma IA de terminal especializada em programação e automação de sistemas. "
65
+ "Você ajuda o usuário a gerenciar o computador e criar códigos. "
66
+ "Se você sugerir um comando de terminal para o usuário executar, adicione na última linha do seu texto "
67
+ "a tag exata [CMD] seguida pelo comando de terminal do Windows. Fale sempre em português do Brasil de forma direta."
68
+ )
69
+
70
+ historico_curto = historico[-3:] if len(historico) > 3 else historico
71
+
72
+ prompt_final = f"Diretriz: {contexto_sistema}\n\n"
73
+ for msg in historico_curto:
74
+ role_nome = "Usuário" if msg["role"] == "user" else "Angelo"
75
+ prompt_final += f"{role_nome}: {msg['content']}\n"
76
+ prompt_final += f"Usuário: {mensagem_usuario}\nAngelo:"
77
+
78
+ url = "https://text.pollinations.ai/"
79
+ payload = {
80
+ "messages": [{"role": "user", "content": prompt_final}],
81
+ "jsonMode": False
82
+ }
83
+
84
+ try:
85
+ print("\nAngelo: ", end="", flush=True)
86
+ resposta = requests.post(url, json=payload, timeout=60, verify=False)
87
+
88
+ if resposta.status_code == 200 and resposta.text.strip():
89
+ texto_gerado = resposta.text.strip()
90
+ print(texto_gerado)
91
+ print("\n")
92
+ return texto_gerado
93
+ else:
94
+ print("O servidor de IA falhou ao processar. Tentando novamente...")
95
+ return None
96
+
97
+ except Exception as e:
98
+ print(f"\n[Erro de Rede]: Conexão instável ou demorou demais. ({e})\n")
99
+ return None
100
+
101
+ def salvar_conversa_na_pasta(num_conversa, historico):
102
+ pasta_memory = obter_caminho_memoria()
103
+ nome_arquivo = f"Conversa{num_conversa}.txt"
104
+ try:
105
+ with open(os.path.join(pasta_memory, nome_arquivo), "w", encoding="utf-8") as f:
106
+ for msg in historico:
107
+ role = "Usuário" if msg["role"] == "user" else "Angelo"
108
+ f.write(f"{role}: {msg['content']}\n")
109
+ except Exception as e:
110
+ print(f"[Erro ao auto-salvar histórico]: {e}")
111
+
112
+ def carregar_memoria(num_conversa):
113
+ pasta_memory = obter_caminho_memoria()
114
+ nome_arquivo = f"Conversa{num_conversa}.txt"
115
+ caminho_completo = os.path.join(pasta_memory, nome_arquivo)
116
+
117
+ if not os.path.exists(caminho_completo):
118
+ print(f"\n[Erro de Memória]: O arquivo '{caminho_completo}' não foi encontrado!")
119
+ return None
120
+
121
+ try:
122
+ novo_historico = []
123
+ with open(caminho_completo, "r", encoding="utf-8") as f:
124
+ linhas = f.readlines()
125
+
126
+ for linha in linhas:
127
+ if linha.startswith("Usuário:"):
128
+ conteudo = linha.replace("Usuário:", "").strip()
129
+ novo_historico.append({"role": "user", "content": conteudo})
130
+ elif linha.startswith("Angelo:"):
131
+ conteudo = linha.replace("Angelo:", "").strip()
132
+ novo_historico.append({"role": "assistant", "content": conteudo})
133
+
134
+ print(f"\n[Memória Carregada]: {len(novo_historico)} mensagens recuperadas de '{nome_arquivo}'!")
135
+ return novo_historico
136
+ except Exception as e:
137
+ print(f"\n[Erro ao ler arquivo]: {e}")
138
+ return None
139
+
140
+ def listar_memorias():
141
+ pasta_memory = obter_caminho_memoria()
142
+ lista_arquivos = [f for f in os.listdir(pasta_memory) if f.startswith("Conversa") and f.endswith(".txt")]
143
+
144
+ if not lista_arquivos:
145
+ print("\n[Aviso]: Nenhuma conversa antiga encontrada na pasta 'memory/'.")
146
+ return
147
+
148
+ print("\n================ CONVERSAS SALVAS ================")
149
+ for arquivo in lista_arquivos:
150
+ print(f" - {arquivo}")
151
+ print("==================================================\n")
152
+
153
+ def mostrar_help():
154
+ print("\n=================== AJUDA ANGELO ===================")
155
+ print("Como mexer no Angelo Programmer:")
156
+ print("1. Peça tarefas em texto puro. Ex: 'Crie uma pasta chamada projeto'")
157
+ print("2. Comandos especiais:")
158
+ print(" /Remember [número] -> Carrega uma conversa salva da pasta memory.")
159
+ print(" /Remember -> Lista todas as conversas salvas.")
160
+ print(" /help -> Mostra este menu de ajuda.")
161
+ print(" /clear -> Limpa a tela do terminal.")
162
+ print(" /exit -> Fecha o Angelo Programmer.")
163
+ print("====================================================\n")
164
+
165
+ def main():
166
+ try:
167
+ verificar_permissao()
168
+
169
+ historico_conversa = []
170
+ id_conversa_atual = "1"
171
+
172
+ limpar_tela()
173
+ print("ANGELO PROGRAMMER")
174
+ print("Digite /help para ele te ensinar a como mexer\n")
175
+
176
+ while True:
177
+ print("=====================================")
178
+ print("Digite o que quer que ele faça...")
179
+ print("=====================================")
180
+
181
+ entrada = input("> ").strip()
182
+
183
+ if not entrada:
184
+ continue
185
+
186
+ if entrada.lower().startswith('/remember'):
187
+ partes = entrada.split()
188
+ if len(partes) > 1:
189
+ num_conversa = partes[1]
190
+ historico_recuperado = carregar_memoria(num_conversa)
191
+ if historico_recuperado is not None:
192
+ historico_conversa = historico_recuperado
193
+ id_conversa_atual = num_conversa
194
+ else:
195
+ listar_memorias()
196
+ continue
197
+
198
+ if entrada == '/exit':
199
+ print("Encerrando o Angelo Programmer. Até mais!")
200
+ break
201
+ elif entrada == '/help':
202
+ mostrar_help()
203
+ continue
204
+ elif entrada == '/clear':
205
+ limpar_tela()
206
+ print("ANGELO PROGRAMMER")
207
+ print("Digite /help para ele te ensinar a como mexer\n")
208
+ continue
209
+
210
+ historico_conversa.append({"role": "user", "content": entrada})
211
+ salvar_conversa_na_pasta(id_conversa_atual, historico_conversa)
212
+
213
+ resposta_ia = chamar_ia(historico_conversa, entrada)
214
+
215
+ if resposta_ia:
216
+ historico_conversa.append({"role": "assistant", "content": resposta_ia})
217
+ salvar_conversa_na_pasta(id_conversa_atual, historico_conversa)
218
+
219
+ if len(historico_conversa) > 10:
220
+ historico_conversa = historico_conversa[-10:]
221
+
222
+ if "[CMD]" in resposta_ia:
223
+ partes = resposta_ia.split("[CMD]")
224
+ comando_extraido = partes[-1].strip().split('\n')[0]
225
+ executar_comando_sistema(comando_extraido)
226
+
227
+ except KeyboardInterrupt:
228
+ print("\n\nPrograma interrompido pelo usuário. Fechando o Angelo...")
229
+ sys.exit()
230
+
231
+ if __name__ == "__main__":
232
+ main()
package/package.json ADDED
@@ -0,0 +1,12 @@
1
+ {
2
+ "name": "angelo-programmer",
3
+ "version": "1.0.0",
4
+ "description": "O Angelo Programmer é uma IA programadora que ajuda a criar sites, projetos python e muito mais!",
5
+ "main": "bin/angelo.js",
6
+ "bin": {
7
+ "AngeloProgrammer": "bin/angelo.js"
8
+ },
9
+ "keywords": ["ai", "python", "automation"],
10
+ "author": "Angelo Guilherme",
11
+ "license": "MIT"
12
+ }