import json, os, inspect, re
from dotenv import load_dotenv
from openai import OpenAI
from pathlib import Path
load_dotenv()
client = OpenAI()
P = Path
def resolve(p):
pt = P(p).expanduser()
return (P.cwd() / pt).resolve() if not pt.is_absolute() else pt
def read_f(filename): return {"path": str(resolve(filename)), "content": resolve(filename).read_text()}
def list_f(path): return {"files": [{"name": i.name, "type": "file" if i.is_file() else "dir"} for i in resolve(path).iterdir()]}
def edit_f(path, old_str, new_str):
p = resolve(path)
if not old_str: p.write_text(new_str); return "created"
if old_str not in (txt := p.read_text()): return "old_str not found"
p.write_text(txt.replace(old_str, new_str, 1)); return "edited"
TOOLS = {"read_file": read_f, "list_files": list_f, "edit_file": edit_f}
SIGS = "\n".join([f"{n}{inspect.signature(f)}" for n, f in TOOLS.items()])
SYS = f"Tools:\n{SIGS}\nTo use, reply single line: 'tool: NAME({{JSON_ARGS}})'. Else reply normally."
msgs = [{"role": "system", "content": SYS}]
while True:
try: usr = input("\033[94mYou:\033[0m ")
except: break
msgs.append({"role": "user", "content": usr})
while True:
resp = client.chat.completions.create(model="gpt-5", messages=msgs, max_completion_tokens=2000).choices[0].message.content
reqs = re.findall(r"^tool: (\w+)\((.*)\)\s*$", resp, re.MULTILINE)
if not reqs:
print(f"\033[93mAI:\033[0m {resp}")
msgs.append({"role": "assistant", "content": resp})
break
msgs.append({"role": "assistant", "content": resp})
for name, args in reqs:
print(f"> {name}({args})")
try: res = TOOLS[name](**json.loads(args))
except Exception as e: res = str(e)
msgs.append({"role": "user", "content": f"tool_result({json.dumps(res)})"})
There, a functional CLI vibe-coding application in 50 lines of python. Give me money.