Skip to content

Commit 2a11d8d

Browse files
VicVic
authored andcommitted
NoClaw == PyOB
1 parent 7045ea6 commit 2a11d8d

14 files changed

Lines changed: 134 additions & 111 deletions

.gitignore

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,18 @@ __pycache__
44
.DS_STORE
55
dist
66
build
7+
ALF.md
8+
FRE.md
9+
IF.md
10+
observer.html
11+
PCF.md
12+
PF.md
13+
PIR.md
14+
PP.md
15+
RM.md
16+
UM.md
17+
SYMBOLS.json
18+
ANALYSIS.md
719
build_env
820
*.dmg
921
NoClaw.spec

README.md

Lines changed: 48 additions & 48 deletions
Large diffs are not rendered by default.

ROADMAP.md

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
# 🦾 NoClaw Evolution Roadmap (v0.2.0)
1+
# 🦾 PyOB Evolution Roadmap (v0.2.0)
22

33
### 1. TDD Mode (Test-Driven Development)
4-
* **What it does**: Forces NoClaw to write a failing test before writing any feature code, ensuring functional correctness instead of just "it didn't crash."
4+
* **What it does**: Forces PyOB to write a failing test before writing any feature code, ensuring functional correctness instead of just "it didn't crash."
55
* **Implementation**:
66
* Create a new prompt template `UT.md` (Unit Test).
77
* In Phase 3, the AI must generate a `tests/test_feature.py` file first.
@@ -22,16 +22,16 @@
2222
* If the critique is negative, the system auto-regenerates using the critique as feedback.
2323

2424
### 4. Auto-Dependency Locking
25-
* **What it does**: Ensures that the project's `requirements.txt` or `pyproject.toml` is always up-to-date with the libraries NoClaw auto-installs.
25+
* **What it does**: Ensures that the project's `requirements.txt` or `pyproject.toml` is always up-to-date with the libraries PyOB auto-installs.
2626
* **Implementation**:
2727
* Update the `_fix_runtime_errors` method in `autoreviewer.py`.
2828
* After a successful `pip install`, run `pip freeze > requirements.txt` or call `poetry add <pkg>` to lock the version.
2929

3030
### 5. Self-Evolution (Recursive Mode)
31-
* **What it does**: Allows NoClaw to analyze and improve its own source code, effectively making itself smarter over time.
31+
* **What it does**: Allows PyOB to analyze and improve its own source code, effectively making itself smarter over time.
3232
* **Implementation**:
33-
* Launch NoClaw by pointing it at its own root directory: `python entrance.py .`
34-
* Update `IGNORE_FILES` to allow editing of `core_utils.py`, etc., but keep a "Hard Backup" of the last working NoClaw version to prevent accidental self-deletion.
33+
* Launch PyOB by pointing it at its own root directory: `python entrance.py .`
34+
* Update `IGNORE_FILES` to allow editing of `core_utils.py`, etc., but keep a "Hard Backup" of the last working PyOB version to prevent accidental self-deletion.
3535

3636
### 6. Cyberpunk Hardware Extensions
3737
* **What it does**: Expands the target application's (System Monitor) capabilities to include GPU tracking, network packet monitoring, and audio visualization.

autoreviewer.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -738,13 +738,22 @@ def analyze_file(self, filepath: str, current_index: int, total_files: int):
738738
f"⚠️ Issues found and patched in {filename}. Added to {PR_FILE_NAME}.\n"
739739
)
740740

741-
def scan_directory(self):
741+
def scan_directory(self) -> list[str]:
742742
file_list = []
743743
for root, dirs, files in os.walk(self.target_dir):
744+
# Prune ignored directories
744745
dirs[:] = [d for d in dirs if d not in IGNORE_DIRS]
746+
745747
for file in files:
748+
# 1. Ignore specific files listed in IGNORE_FILES
746749
if file in IGNORE_FILES or file == os.path.basename(__file__):
747750
continue
751+
752+
# 2. Ignore PyInstaller and DMG artifacts by extension
753+
if file.endswith(".spec") or file.endswith(".dmg"):
754+
continue
755+
756+
# 3. Only include files with supported extensions
748757
if any(file.endswith(ext) for ext in SUPPORTED_EXTENSIONS):
749758
file_list.append(os.path.join(root, file))
750759
return file_list

build_pyinstaller_multiOS.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,10 @@ def main():
99
project_root = Path(__file__).parent.absolute()
1010

1111
# --- Configuration ---
12-
VERSION = "0.1.3-beta5"
13-
APP_NAME = "NoClaw"
12+
VERSION = "0.2.0"
13+
APP_NAME = "PyOuroBoros"
1414

15-
print(f"🚀 Building {APP_NAME} v{VERSION} for {os_name}...")
15+
print(f"🚀 Forging {APP_NAME} v{VERSION} for {os_name}...")
1616

1717
# Base configuration for all platforms
1818
# We include all new mixins and external dependencies
@@ -30,7 +30,7 @@ def main():
3030
"--collect-all=ruff",
3131
"--collect-all=mypy",
3232
"--collect-all=ollama",
33-
"noclaw_launcher.py",
33+
"pyob_launcher.py",
3434
]
3535

3636
if os_name == "darwin":
@@ -41,7 +41,7 @@ def main():
4141
+ common
4242
+ [
4343
"--windowed",
44-
"--icon=no-claw.icns",
44+
"--icon=pyob.icns",
4545
]
4646
)
4747
dist_output = project_root / "dist" / f"{APP_NAME}.app"

core_utils.py

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,10 @@
2222
OLLAMA_AVAILABLE = False
2323
print("Warning: 'ollama' package not found. Local LLM fallback disabled.")
2424

25-
env_keys = os.environ.get("NOCLAW_GEMINI_KEYS", "")
25+
env_keys = os.environ.get("PYOB_GEMINI_KEYS", "")
2626
GEMINI_API_KEYS = [k.strip() for k in env_keys.split(",") if k.strip()]
27-
GEMINI_MODEL = os.environ.get("NOCLAW_GEMINI_MODEL", "gemini-2.5-flash")
28-
LOCAL_MODEL = os.environ.get("NOCLAW_LOCAL_MODEL", "qwen3-coder:30b")
27+
GEMINI_MODEL = os.environ.get("PYOB_GEMINI_MODEL", "gemini-2.5-flash")
28+
LOCAL_MODEL = os.environ.get("PYOB_LOCAL_MODEL", "qwen3-coder:30b")
2929
PR_FILE_NAME = "PEER_REVIEW.md"
3030
FEATURE_FILE_NAME = "FEATURE.md"
3131
FAILED_PR_FILE_NAME = "FAILED_PEER_REVIEW.md"
@@ -39,7 +39,8 @@
3939
".git",
4040
"autovenv",
4141
"build_env",
42-
"--no-dashboard",
42+
"build", # PyInstaller build artifacts
43+
"dist", # PyInstaller output folder
4344
"docs",
4445
"venv",
4546
".venv",
@@ -53,9 +54,10 @@
5354
".vscode",
5455
".idea",
5556
}
57+
5658
IGNORE_FILES = {
5759
"package-lock.json",
58-
"noclaw_launcher.py",
60+
"pyob_launcher.py",
5961
"build_pyinstaller_multiOS.py",
6062
"ROADMAP.md",
6163
"README.md",
@@ -101,7 +103,7 @@ def format(self, record: logging.LogRecord) -> str:
101103
return formatted_msg
102104

103105

104-
logger = logging.getLogger("NoClaw")
106+
logger = logging.getLogger("PyOuroBoros")
105107
logger.setLevel(logging.INFO)
106108
handler = logging.StreamHandler(sys.stdout)
107109
handler.setFormatter(CyberpunkFormatter())
@@ -609,7 +611,7 @@ def _find_entry_file(self) -> str | None:
609611
"main.py",
610612
"app.py",
611613
"gui.py",
612-
"noclaw_launcher.py",
614+
"pyob_launcher.py",
613615
]
614616
for f_name in priority_files:
615617
target = os.path.join(self.target_dir, f_name)

docs/DOCUMENTATION.md

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# NoClaw — Complete Technical Documentation
1+
# PyOB — Complete Technical Documentation
22

33
> **Version**: 1.0 · **Last Updated**: March 2026
44
> **Architecture**: Python 3.10+ · Gemini 2.5 Flash / Ollama Local LLM
@@ -31,7 +31,7 @@
3131

3232
## 1. System Philosophy: Constrained Surgical Autonomy
3333

34-
NoClaw is built on the principle of **constrained agency**. Rather than giving an AI free reign to rewrite files, NoClaw forces every modification through:
34+
PyOB is built on the principle of **constrained agency**. Rather than giving an AI free reign to rewrite files, PyOB forces every modification through:
3535

3636
1. **Surgical XML blocks** — Small, verifiable `<SEARCH>/<REPLACE>` patches instead of full file rewrites
3737
2. **Symbolic verification** — A persistent dependency ledger that tracks the global impact of every change
@@ -234,7 +234,7 @@ The core review and modification engine. Inherits from both `CoreUtilsMixin` and
234234

235235
##### `get_valid_edit()` — The Core Edit Loop
236236

237-
This is the most complex method in NoClaw. It handles:
237+
This is the most complex method in PyOB. It handles:
238238

239239
1. **Pre-LLM Checkpoint**: User can `EDIT_PROMPT`, `AUGMENT_PROMPT`, or `SKIP`
240240
2. **Key Rotation**: Cycles through available Gemini keys; falls back to Ollama
@@ -281,7 +281,7 @@ Provides foundational infrastructure shared across all components.
281281
| `HISTORY_FILE` | `"HISTORY.md"` | Change history filename |
282282
| `SYMBOLS_FILE` | `"SYMBOLS.json"` | Dependency graph filename |
283283
| `IGNORE_DIRS` | `set` | Directories excluded from scanning |
284-
| `IGNORE_FILES` | `set` | Files excluded from scanning (includes NoClaw's own source files) |
284+
| `IGNORE_FILES` | `set` | Files excluded from scanning (includes PyOB's own source files) |
285285
| `SUPPORTED_EXTENSIONS` | `set` | `.py`, `.js`, `.ts`, `.html`, `.css`, `.json`, `.sh` |
286286

287287
#### Class: `CoreUtilsMixin`
@@ -324,7 +324,7 @@ Manages the prompt template lifecycle and persistent memory.
324324

325325
## 4. The Verification & Healing Pipeline
326326

327-
This is the most critical logic path in NoClaw, ensuring codebase integrity through four distinct layers.
327+
This is the most critical logic path in PyOB, ensuring codebase integrity through four distinct layers.
328328

329329
### Layer 1: Atomic XML Matching
330330

@@ -347,7 +347,7 @@ Immediately after file modification via `run_linter_fix_loop()`:
347347

348348
### Layer 3: Context-Aware Self-Healing (PIR)
349349

350-
If Layer 2 or Layer 4 detects an error, NoClaw initiates a **Post-Implementation Repair (PIR)**.
350+
If Layer 2 or Layer 4 detects an error, PyOB initiates a **Post-Implementation Repair (PIR)**.
351351

352352
| Fixer Type | Context Provided |
353353
|---|---|
@@ -373,7 +373,7 @@ Controlled by both `autoreviewer.py` (`run_and_verify_app`) and `entrance.py` (`
373373

374374
## 5. Symbolic Dependency Management
375375

376-
NoClaw tracks the "Global Impact" of code changes via `SYMBOLS.json`.
376+
PyOB tracks the "Global Impact" of code changes via `SYMBOLS.json`.
377377

378378
### Schema
379379

@@ -509,7 +509,7 @@ If **any** of the `<EDIT>` blocks fails all 5 strategies:
509509

510510
### Template Architecture
511511

512-
All 8 templates are defined as Python strings in `prompts_and_memory.py``_ensure_prompt_files()` and written to the target directory as `.md` files on every initialization. This ensures templates are always fresh and match the current NoClaw version.
512+
All 8 templates are defined as Python strings in `prompts_and_memory.py``_ensure_prompt_files()` and written to the target directory as `.md` files on every initialization. This ensures templates are always fresh and match the current PyOB version.
513513

514514
### Template Variable Substitution
515515

@@ -562,7 +562,7 @@ for key, value in kwargs.items():
562562

563563
## 8. Human-in-the-Loop Bridging
564564

565-
NoClaw allows for "Supervised Autonomy" through interactive terminal checkpoints.
565+
PyOB allows for "Supervised Autonomy" through interactive terminal checkpoints.
566566

567567
### Pre-LLM Checkpoints
568568

@@ -784,7 +784,7 @@ if r not in self.cascade_queue:
784784
| `LOCAL_MODEL` | `"qwen3-coder:30b"` | Ollama model identifier |
785785
| `IGNORE_DIRS` | 12 directories | Directories excluded from scanning |
786786
| `IGNORE_FILES` | 14 files | Files excluded from scanning |
787-
| `SUPPORTED_EXTENSIONS` | 7 extensions | File types NoClaw can review |
787+
| `SUPPORTED_EXTENSIONS` | 7 extensions | File types PyOB can review |
788788

789789
### Timing Constants
790790

@@ -903,16 +903,16 @@ Iteration N+1: cascade_queue is not empty
903903
|---|---|---|
904904
| `Warning: 'ollama' package not found` | Ollama Python package not installed | `pip install ollama` |
905905
| All keys rate-limited, no Ollama | Both backends unavailable | Install Ollama and pull `qwen3-coder:30b` |
906-
| `ruff` / `mypy` not found | Linting tools not installed | `pip install ruff mypy` (NoClaw will skip these checks gracefully) |
907-
| `Node.js not installed` | JS validation unavailable | Install Node.js (NoClaw will skip JS checks) |
906+
| `ruff` / `mypy` not found | Linting tools not installed | `pip install ruff mypy` (PyOB will skip these checks gracefully) |
907+
| `Node.js not installed` | JS validation unavailable | Install Node.js (PyOB will skip JS checks) |
908908
| Edits keep failing to match | AI generating incorrect `<SEARCH>` blocks | System auto-retries; if persistent, use `EDIT_XML` to fix manually |
909909
| App crashes during runtime test | Feature implementation introduced a bug | System auto-heals up to 3 times; then rolls back |
910910
| Memory growing too large | Many iterations without refactoring | Memory auto-refactors every 2 iterations; can manually delete `MEMORY.md` |
911911
| `FAILED_PEER_REVIEW.md` appears | PR implementation failed and was rolled back | Review the failed file; issues will be re-detected on next scan |
912912

913913
### Logging
914914

915-
NoClaw uses Python's built-in `logging` module at the `INFO` level:
915+
PyOB uses Python's built-in `logging` module at the `INFO` level:
916916

917917
```
918918
2026-03-04 12:30:45,123 | [1/5] Scanning game.py (Python) - Reading 245 lines into AI context...
@@ -922,4 +922,4 @@ All output includes timestamps for debugging timing-related issues.
922922

923923
---
924924

925-
> **NoClaw** — Surgical precision, never destructive. 🦅
925+
> **PyOB** — Surgical precision, never destructive. 🦅

entrance.py

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -71,19 +71,19 @@ def run_server():
7171

7272
# 4. Notify the user with a Cyberpunk banner
7373
print("\n" + "=" * 60)
74-
print("⚡ NOCLAW OBSERVER IS LIVE")
74+
print("⚡ PyOuroBoros (PyOB) OBSERVER IS LIVE")
7575
print("🔗 URL: http://localhost:5000")
7676
print(f"📂 FILE: {obs_path}")
7777
print("=" * 60 + "\n")
7878

79-
def reboot_noclaw(self):
79+
def reboot_pyob(self):
8080
"""Standard Hot-Reboot: Replaces the current process with a fresh one."""
81-
logger.warning("🔄 SELF-EVOLUTION COMPLETE: Rebooting fresh NoClaw engine...")
81+
logger.warning("🔄 SELF-EVOLUTION COMPLETE: Rebooting fresh PYOB engine...")
8282
# Ensure we pass the same arguments (like the target directory)
8383
os.execv(sys.executable, [sys.executable] + sys.argv)
8484

8585
def trigger_production_build(self):
86-
"""Advanced Build: Compiles NoClaw into a DMG and replaces the system version."""
86+
"""Advanced Build: Compiles PYOB into a DMG and replaces the system version."""
8787
build_script = os.path.join(self.target_dir, "build_pyinstaller_multiOS.py")
8888
if not os.path.exists(build_script):
8989
logger.error("❌ Build script not found. Skipping production deploy.")
@@ -95,7 +95,7 @@ def trigger_production_build(self):
9595
subprocess.run([sys.executable, build_script], check=True)
9696

9797
# 2. Define Mac paths
98-
app_name = "NoClaw.app"
98+
app_name = "PyOuroBoros.app"
9999
dist_path = os.path.join(self.target_dir, "dist", app_name)
100100
applications_path = f"/Applications/{app_name}"
101101

@@ -153,7 +153,7 @@ def run_master_loop(self):
153153
f"\n\n{'=' * 70}\n🎯 TARGETED PIPELINE LOOP (Iteration {iteration})\n{'=' * 70}"
154154
)
155155

156-
# Track if NoClaw's own logic was upgraded this turn
156+
# Track if PYOB's own logic was upgraded this turn
157157
self_evolved = False
158158

159159
try:
@@ -190,7 +190,7 @@ def run_master_loop(self):
190190
self.trigger_production_build()
191191
else:
192192
logger.warning("🐍 SCRIPT ENGINE EVOLVED: Initiating Hot-Reboot.")
193-
self.reboot_noclaw()
193+
self.reboot_pyob()
194194
# -------------------------------
195195

196196
iteration += 1
@@ -225,7 +225,7 @@ def execute_targeted_iteration(self, iteration: int):
225225
timestamp = time.strftime("%Y%m%d_%H%M%S")
226226
project_name = os.path.basename(self.target_dir)
227227
base_backup_path = (
228-
Path.home() / "Documents" / "NoClaw_Backups" / project_name
228+
Path.home() / "Documents" / "PYOB_Backups" / project_name
229229
)
230230
pod_path = base_backup_path / f"safety_pod_v{iteration}_{timestamp}"
231231

@@ -674,7 +674,7 @@ def _read_file(self, f: str) -> str:
674674
<html lang="en">
675675
<head>
676676
<meta charset="UTF-8">
677-
<title>NOCLAW // OBSERVER</title>
677+
<title>PyOB // OBSERVER</title>
678678
<style>
679679
body { background: #050505; color: #00FF41; font-family: 'Menlo', monospace; margin: 0; padding: 20px; overflow-x: hidden; }
680680
.glow { text-shadow: 0 0 10px #00FF41, 0 0 20px #00FF41; }
@@ -690,7 +690,7 @@ def _read_file(self, f: str) -> str:
690690
</style>
691691
</head>
692692
<body>
693-
<h1 class="glow">NOCLAW_OS // OBSERVER_DASHBOARD</h1>
693+
<h1 class="glow">PYOB_OS // OBSERVER_DASHBOARD</h1>
694694
<div class="stat-bar border card">
695695
<div>ITERATION: <span id="iteration" class="glow">--</span></div>
696696
<div>LEDGER: <span id="ledger">--</span> symbols</div>

no-claw.icns

-245 KB
Binary file not shown.

no-claw.png

-212 KB
Binary file not shown.

0 commit comments

Comments
 (0)