mirror of
https://github.com/HKUDS/CLI-Anything.git
synced 2026-09-21 04:45:54 +08:00
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:
co-authored by
Claude Opus 4.6
parent
71230bca77
commit
167b8a8b51
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user