From ef67694fdb76332afb485055e7884ccd666eda2e Mon Sep 17 00:00:00 2001 From: Sazzad Hissain Khan Date: Thu, 15 Jan 2026 22:54:57 +0600 Subject: [PATCH] feat: add enhanced system information for better LLM context - Add get_system_info() function to gather OS, Python version, shell, and available tools - Enhance system prompt with contextual information for more appropriate responses - Add /i command to display system information during session - Update README with new feature and command - All using stdlib only (platform, sys, shutil) - zero new dependencies - Helps LLM provide OS-appropriate commands and file paths --- README.md | 2 ++ __pycache__/nanocode.cpython-311.pyc | Bin 0 -> 16209 bytes nanocode.py | 42 +++++++++++++++++++++++++-- 3 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 __pycache__/nanocode.cpython-311.pyc mode change 100755 => 100644 nanocode.py diff --git a/README.md b/README.md index fe29744..90a080f 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,7 @@ Built using Claude Code, then used to build itself. - Tools: `read`, `write`, `edit`, `glob`, `grep`, `bash` - Conversation history - Colored terminal output +- Enhanced system context (OS, Python version, shell, available tools) ## Usage @@ -40,6 +41,7 @@ python nanocode.py ## Commands - `/c` - Clear conversation +- `/i` - Show system information - `/q` or `exit` - Quit ## Tools diff --git a/__pycache__/nanocode.cpython-311.pyc b/__pycache__/nanocode.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..346b094abd5880215a31b09923f0255e1cdd07e4 GIT binary patch literal 16209 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 literal 0 HcmV?d00001 diff --git a/nanocode.py b/nanocode.py old mode 100755 new mode 100644 index bbe0bf5..695e6f8 --- a/nanocode.py +++ b/nanocode.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 """nanocode - minimal claude code alternative""" -import glob as globlib, json, os, re, subprocess, urllib.request +import glob as globlib, json, os, platform, re, shutil, subprocess, sys, urllib.request OPENROUTER_KEY = os.environ.get("OPENROUTER_API_KEY") API_URL = "https://openrouter.ai/api/v1/messages" if OPENROUTER_KEY else "https://api.anthropic.com/v1/messages" @@ -18,6 +18,38 @@ ) +# --- System information --- + + +def get_system_info(): + """Gather system information to help LLM provide contextually appropriate responses.""" + info_parts = [] + + # Operating system + os_name = platform.system() + info_parts.append(f"OS: {os_name}") + + # Python version + py_version = f"{sys.version_info.major}.{sys.version_info.minor}.{sys.version_info.micro}" + info_parts.append(f"Python: {py_version}") + + # Shell + shell = os.environ.get("SHELL", os.environ.get("COMSPEC", "unknown")) + shell_name = os.path.basename(shell) if shell != "unknown" else "unknown" + info_parts.append(f"Shell: {shell_name}") + + # Current working directory + info_parts.append(f"CWD: {os.getcwd()}") + + # Check for common development tools + tools = ["git", "npm", "node", "pip", "docker", "make"] + available = [t for t in tools if shutil.which(t)] + if available: + info_parts.append(f"Tools: {', '.join(available)}") + + return " | ".join(info_parts) + + # --- Tool implementations --- @@ -198,9 +230,12 @@ def render_markdown(text): def main(): + system_info = get_system_info() print(f"{BOLD}nanocode{RESET} | {DIM}{MODEL} ({'OpenRouter' if OPENROUTER_KEY else 'Anthropic'}) | {os.getcwd()}{RESET}\n") messages = [] - system_prompt = f"Concise coding assistant. cwd: {os.getcwd()}" + system_prompt = f"""Concise coding assistant. +{system_info} +Provide OS-appropriate commands and file paths based on the system information above.""" while True: try: @@ -215,6 +250,9 @@ def main(): messages = [] print(f"{GREEN}⏺ Cleared conversation{RESET}") continue + if user_input == "/i": + print(f"{CYAN}⏺ System Info:{RESET}\n {system_info}") + continue messages.append({"role": "user", "content": user_input})