feat: Add skill path display in CLI banner and generate SKILL.md for all harnesses

## Changes

### 1. Display skill path in CLI header (repl_skin.py)
- Added `skill_path` parameter to ReplSkin class
- Banner now displays skill path when provided: `◇ Skill: skills/<software>_SKILL.md`
- This enables AI agents to discover where to read the skill documentation

### 2. Generate SKILL.md files for all 11 existing CLI harnesses
- anygen/agent-harness/skills/anygen_SKILL.md
- audacity/agent-harness/skills/audacity_SKILL.md
- blender/agent-harness/skills/blender_SKILL.md
- drawio/agent-harness/skills/drawio_SKILL.md
- gimp/agent-harness/skills/gimp_SKILL.md
- inkscape/agent-harness/skills/inkscape_SKILL.md
- kdenlive/agent-harness/skills/kdenlive_SKILL.md
- libreoffice/agent-harness/skills/libreoffice_SKILL.md
- obs-studio/agent-harness/skills/obs_studio_SKILL.md
- shotcut/agent-harness/skills/shotcut_SKILL.md
- zoom/agent-harness/skills/zoom_SKILL.md

### 3. Update HARNESS.md with skill path guidance
- Updated Phase 3 (REPL section) to show skill_path parameter usage
- Added "Display Skill Path in CLI Banner" section in Phase 6.5

### 4. Fix skill_generator.py syntax error
- Fixed list comprehension indentation on line 80-81

Addresses maintainer feedback from PR #47 comment:
- "displaying the skill path on the cli header so that agents can know where to read it"
- "generate skill.md files for all existing CLIs we have in the repo"

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Alon Tevet
2026-03-14 12:44:51 +02:00
co-authored by Claude Opus 4.6
parent 71230bca77
commit 167b8a8b51
14 changed files with 2207 additions and 5 deletions
+21 -2
View File
@@ -74,8 +74,8 @@ designed for humans, without needing a display or mouse.
```python
from cli_anything.<software>.utils.repl_skin import ReplSkin
skin = ReplSkin("<software>", version="1.0.0")
skin.print_banner() # Branded startup box
skin = ReplSkin("<software>", version="1.0.0", skill_path="skills/<software>_SKILL.md")
skin.print_banner() # Branded startup box (includes skill path for agents)
pt_session = skin.create_prompt_session() # prompt_toolkit with history + styling
line = skin.get_input(pt_session, project_name="my_project", modified=True)
skin.help(commands_dict) # Formatted help listing
@@ -88,6 +88,8 @@ designed for humans, without needing a display or mouse.
skin.progress(3, 10, "...") # Progress bar
skin.print_goodbye() # Styled exit message
```
- **Important**: Include `skill_path` parameter to display the SKILL.md location in the
banner. This allows AI agents to discover where to read the skill documentation.
- Make REPL the default behavior: use `invoke_without_command=True` on the main
Click group, and invoke the `repl` command when no subcommand is given:
```python
@@ -304,6 +306,23 @@ skill definition.
- List all command groups with brief descriptions
- Provide realistic examples that demonstrate common workflows
**Display Skill Path in CLI Banner:**
After generating SKILL.md, update the CLI's REPL initialization to display the skill
path in the startup banner. This helps AI agents discover where to read the skill
documentation when using the CLI:
```python
# In the REPL initialization (e.g., shotcut_cli.py)
from cli_anything.<software>.utils.repl_skin import ReplSkin
skin = ReplSkin("<software>", version="1.0.0", skill_path="skills/<software>_SKILL.md")
skin.print_banner() # Now displays: ◇ Skill: skills/<software>_SKILL.md
```
This enables agents to know exactly where to find the skill definition when they
encounter the CLI.
## Critical Lessons Learned
### Use the Real Software — Don't Reimplement It
+15 -2
View File
@@ -6,7 +6,7 @@ Copy this file into your CLI package at:
Usage:
from cli_anything.<software>.utils.repl_skin import ReplSkin
skin = ReplSkin("shotcut", version="1.0.0")
skin = ReplSkin("shotcut", version="1.0.0", skill_path="skills/shotcut_SKILL.md")
skin.print_banner()
prompt_text = skin.prompt(project_name="my_video.mlt", modified=True)
skin.success("Project saved")
@@ -97,7 +97,7 @@ 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:
@@ -105,10 +105,13 @@ class ReplSkin:
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.
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
self.skill_path = skill_path
self.accent = _ACCENT_COLORS.get(self.software, _DEFAULT_ACCENT)
# History file
@@ -165,9 +168,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)
+1 -1
View File
@@ -77,7 +77,7 @@ def extract_cli_metadata(harness_path: str) -> SkillMetadata:
f"cli_anything directory not found in {harness_path}. "
"Ensure the harness structure includes cli_anything/<software>/"
)
software_dirs = [d for d in cli_anything_dir.iterdir()]
software_dirs = [d for d in cli_anything_dir.iterdir()
if d.is_dir() and (d / "__init__.py").exists()]
if not software_dirs: