fix: address review feedback — repl_skin, gitignore, README, parser bug

- Replace repl_skin.py with standard 521-line copy
- Add godot entries to .gitignore (steps 4, 5, 6)
- Add Godot Engine to root README.md (table + directory tree)
- Fix list_export_presets() parser to skip [preset.N.options] sections
- Remove unused configparser import from project.py
This commit is contained in:
Ömer
2026-04-04 13:38:42 +03:00
parent 0e23375a2e
commit 47a14ed0a9
5 changed files with 50 additions and 19 deletions
+4
View File
@@ -47,6 +47,7 @@
!/zoom/
!/sketch/
!/drawio/
!/godot/
!/mermaid/
!/comfyui/
!/adguardhome/
@@ -84,6 +85,8 @@
/sketch/.*
/drawio/*
/drawio/.*
/godot/*
/godot/.*
/mermaid/*
/mermaid/.*
/comfyui/*
@@ -115,6 +118,7 @@
!/zoom/agent-harness/
!/sketch/agent-harness/
!/drawio/agent-harness/
!/godot/agent-harness/
!/mermaid/agent-harness/
!/comfyui/agent-harness/
!/adguardhome/agent-harness/
+11 -2
View File
@@ -451,6 +451,7 @@ The catalog auto-updates whenever `registry.json` changes — new community CLIs
| **📊 Data & Analytics** | Enable programmatic data processing, visualization, and statistical analysis workflows | JupyterLab, Apache Superset, Metabase, Redash, DBeaver, KNIME, Orange, OpenSearch Dashboards, Lightdash |
| **💻 Development Tools** | Streamline code editing, building, testing, and deployment processes via command interfaces | Jenkins, Gitea, Hoppscotch, Portainer, pgAdmin, SonarQube, ArgoCD, OpenLens, Insomnia, Beekeeper Studio, **[iTerm2](https://iterm2.com)** |
| **🎨 Creative & Media** | Control content creation, editing, and rendering workflows programmatically | Blender, GIMP, OBS Studio, Audacity, Krita, Kdenlive, Shotcut, Inkscape, Darktable, LMMS, Ardour |
| **🎮 Game Development** | Manage game projects, scenes, exports, and scripting through headless engine interfaces | **[Godot Engine](https://godotengine.org)** |
| **🔬 Scientific Computing** | Automate research workflows, simulations, and complex calculations | ImageJ, FreeCAD, QGIS, ParaView, Gephi, LibreCAD, Stellarium, KiCad, JASP, Jamovi |
| **🏢 Enterprise & Office** | Convert business applications and productivity tools into agent-accessible systems | NextCloud, GitLab, Grafana, Mattermost, LibreOffice, AppFlowy, NocoDB, Odoo (Community), Plane, ERPNext |
| **📞 Communication & Collaboration** | Automate meeting scheduling, participant management, recording retrieval, and reporting through structured CLI | Zoom, Jitsi Meet, BigBlueButton, Mattermost |
@@ -731,12 +732,19 @@ Each application received complete, production-ready CLI interfaces — not demo
<td align="center">✅ 19</td>
</tr>
<tr>
<td align="center"><strong>🎮 Godot Engine</strong></td>
<td>Game Development</td>
<td><code>cli-anything-godot</code></td>
<td>Godot 4.x headless subprocess</td>
<td align="center">✅ 24</td>
</tr>
<tr>
<td align="center" colspan="4"><strong>Total</strong></td>
<td align="center"><strong>✅ 1,858</strong></td>
<td align="center"><strong>✅ 1,882</strong></td>
</tr>
</table>
> **100% pass rate** across all 1,858 tests — 1,355 unit tests + 484 end-to-end tests + 19 Node.js tests.
> **100% pass rate** across all 1,882 tests — 1,379 unit tests + 484 end-to-end tests + 19 Node.js tests.
---
@@ -840,6 +848,7 @@ cli-anything/
├── 🧠 notebooklm/agent-harness/ # NotebookLM CLI (experimental, 21 tests)
├── 🛡️ adguardhome/agent-harness/ # AdGuard Home CLI (36 tests)
├── 🦙 ollama/agent-harness/ # Ollama CLI (98 tests)
├── 🎮 godot/agent-harness/ # Godot Engine CLI (24 tests)
└── 🎨 sketch/agent-harness/ # Sketch CLI (19 tests, Node.js)
```
@@ -80,7 +80,7 @@ def list_export_presets(project_path: str) -> dict:
for line in text.splitlines():
line = line.strip()
if line.startswith("[preset.") and line.endswith("]"):
if line.startswith("[preset.") and line.endswith("]") and ".options]" not in line:
if current:
presets.append(current)
current = {}
@@ -1,7 +1,5 @@
"""Godot project management — create, info, list scenes, validate."""
import configparser
import os
from pathlib import Path
from cli_anything.godot.utils.godot_backend import (
@@ -6,14 +6,14 @@ Copy this file into your CLI package at:
Usage:
from cli_anything.<software>.utils.repl_skin import ReplSkin
skin = ReplSkin("ollama", version="1.0.0")
skin.print_banner()
prompt_text = skin.prompt(project_name="llama3.2", modified=False)
skin.success("Model pulled")
skin.error("Connection failed")
skin.warning("No models loaded")
skin.info("Generating...")
skin.status("Model", "llama3.2:latest")
skin = ReplSkin("shotcut", version="1.0.0")
skin.print_banner() # auto-detects skills/SKILL.md inside the package
prompt_text = skin.prompt(project_name="my_video.mlt", modified=True)
skin.success("Project saved")
skin.error("File not found")
skin.warning("Unsaved changes")
skin.info("Processing 24 clips...")
skin.status("Track 1", "3 clips, 00:02:30")
skin.table(headers, rows)
skin.print_goodbye()
"""
@@ -47,8 +47,6 @@ _ACCENT_COLORS = {
"obs_studio": "\033[38;5;55m", # purple
"kdenlive": "\033[38;5;69m", # slate blue
"shotcut": "\033[38;5;35m", # teal green
"ollama": "\033[38;5;255m", # white (Ollama branding)
"godot": "\033[38;5;74m", # Godot blue (#478cbf)
}
_DEFAULT_ACCENT = "\033[38;5;75m" # default sky blue
@@ -99,18 +97,31 @@ class ReplSkin:
"""
def __init__(self, software: str, version: str = "1.0.0",
history_file: str | None = None):
history_file: str | None = None, skill_path: str | None = None):
"""Initialize the REPL skin.
Args:
software: Software name (e.g., "gimp", "shotcut", "ollama").
software: Software name (e.g., "gimp", "shotcut", "blender").
version: CLI version string.
history_file: Path for persistent command history.
Defaults to ~/.cli-anything-<software>/history
skill_path: Path to the SKILL.md file for agent discovery.
Auto-detected from the package's skills/ directory if not provided.
Displayed in banner for AI agents to know where to read skill info.
"""
self.software = software.lower().replace("-", "_")
self.display_name = software.replace("_", " ").title()
self.version = version
# Auto-detect skill path from package layout:
# cli_anything/<software>/utils/repl_skin.py (this file)
# cli_anything/<software>/skills/SKILL.md (target)
if skill_path is None:
from pathlib import Path
_auto = Path(__file__).resolve().parent.parent / "skills" / "SKILL.md"
if _auto.is_file():
skill_path = str(_auto)
self.skill_path = skill_path
self.accent = _ACCENT_COLORS.get(self.software, _DEFAULT_ACCENT)
# History file
@@ -156,7 +167,7 @@ class ReplSkin:
top = self._c(_DARK_GRAY, f"{_TL}{_H_LINE * inner}{_TR}")
bot = self._c(_DARK_GRAY, f"{_BL}{_H_LINE * inner}{_BR}")
# Title: ◆ cli-anything · Ollama
# Title: ◆ cli-anything · Shotcut
icon = self._c(_CYAN + _BOLD, "")
brand = self._c(_CYAN + _BOLD, "cli-anything")
dot = self._c(_DARK_GRAY, "·")
@@ -167,9 +178,19 @@ class ReplSkin:
tip = f" {self._c(_DARK_GRAY, ' Type help for commands, quit to exit')}"
empty = ""
# Skill path for agent discovery
skill_line = None
if self.skill_path:
skill_icon = self._c(_MAGENTA, "")
skill_label = self._c(_DARK_GRAY, " Skill:")
skill_path_display = self._c(_LIGHT_GRAY, self.skill_path)
skill_line = f" {skill_icon} {skill_label} {skill_path_display}"
print(top)
print(_box_line(title))
print(_box_line(ver))
if skill_line:
print(_box_line(skill_line))
print(_box_line(empty))
print(_box_line(tip))
print(bot)
@@ -497,5 +518,4 @@ _ANSI_256_TO_HEX = {
"\033[38;5;80m": "#5fd7d7", # brand cyan
"\033[38;5;208m": "#ff8700", # blender deep orange
"\033[38;5;214m": "#ffaf00", # gimp warm orange
"\033[38;5;255m": "#eeeeee", # ollama white
}