fix: update visualizer to support @AI_Visualizer mentions
- Change MENTION_TOKEN to MENTION_REGEX supporting both @AI_visual and @AI_Visualizer - Makes it case-insensitive and consistent with other agents (AI_Moderator, AI_Designer) - Update agent name from AI_Visual to AI_Visualizer - Update HTML markers from AUTO:VISUAL to AUTO:VISUALIZER - Update tests to match new naming - All tests passing
This commit is contained in:
parent
e6292fbad4
commit
304400cc85
|
|
@ -1,20 +1,22 @@
|
||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
"""
|
"""
|
||||||
AI_Visual agent.
|
AI_Visualizer agent.
|
||||||
|
|
||||||
Generates placeholder PlantUML diagrams on demand when @AI_visual is
|
Generates placeholder PlantUML diagrams on demand when @AI_Visualizer (or @AI_visual)
|
||||||
mentioned in a discussion. Provides scaffolding for future AI-powered
|
is mentioned in a discussion. Provides scaffolding for future AI-powered
|
||||||
diagram generation.
|
diagram generation.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
import argparse
|
import argparse
|
||||||
|
import re
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
MENTION_TOKEN = "@AI_visual"
|
# Support multiple mention patterns (case-insensitive)
|
||||||
BLOCK_START = "<!-- AUTO:VISUAL START -->"
|
MENTION_REGEX = re.compile(r"@ai[-_]visual(?:izer)?\s*:?\s*(.+)", re.IGNORECASE)
|
||||||
BLOCK_END = "<!-- AUTO:VISUAL END -->"
|
BLOCK_START = "<!-- AUTO:VISUALIZER START -->"
|
||||||
|
BLOCK_END = "<!-- AUTO:VISUALIZER END -->"
|
||||||
|
|
||||||
|
|
||||||
def find_next_diagram(diagram_dir: Path) -> Path:
|
def find_next_diagram(diagram_dir: Path) -> Path:
|
||||||
|
|
@ -29,7 +31,7 @@ def write_placeholder_plantuml(path: Path, prompt: str) -> None:
|
||||||
[
|
[
|
||||||
"@startuml",
|
"@startuml",
|
||||||
"' Auto-generated scaffold",
|
"' Auto-generated scaffold",
|
||||||
"' Requested via @AI_visual",
|
"' Requested via @AI_Visualizer",
|
||||||
f"note as N1",
|
f"note as N1",
|
||||||
prompt.strip() or "Diagram requested with no additional context.",
|
prompt.strip() or "Diagram requested with no additional context.",
|
||||||
"end note",
|
"end note",
|
||||||
|
|
@ -43,7 +45,7 @@ def write_placeholder_plantuml(path: Path, prompt: str) -> None:
|
||||||
def append_comment(discussion_path: Path, diagram_rel: Path) -> None:
|
def append_comment(discussion_path: Path, diagram_rel: Path) -> None:
|
||||||
comment = (
|
comment = (
|
||||||
f"{BLOCK_START}\n"
|
f"{BLOCK_START}\n"
|
||||||
"Name: AI_Visual\n"
|
"Name: AI_Visualizer\n"
|
||||||
f"Generated diagram: `{diagram_rel.as_posix()}`\n"
|
f"Generated diagram: `{diagram_rel.as_posix()}`\n"
|
||||||
"\n"
|
"\n"
|
||||||
"Let me know if you need an updated view.\n"
|
"Let me know if you need an updated view.\n"
|
||||||
|
|
@ -56,7 +58,7 @@ def append_comment(discussion_path: Path, diagram_rel: Path) -> None:
|
||||||
|
|
||||||
|
|
||||||
def main() -> int:
|
def main() -> int:
|
||||||
parser = argparse.ArgumentParser(description="AI Visual agent")
|
parser = argparse.ArgumentParser(description="AI Visualizer agent")
|
||||||
parser.add_argument("--repo-root", required=True, help="Repository root path")
|
parser.add_argument("--repo-root", required=True, help="Repository root path")
|
||||||
parser.add_argument("--path", required=True, help="Relative path to discussion file")
|
parser.add_argument("--path", required=True, help="Relative path to discussion file")
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
|
|
@ -69,16 +71,17 @@ def main() -> int:
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
text = discussion_path.read_text(encoding="utf-8")
|
text = discussion_path.read_text(encoding="utf-8")
|
||||||
if MENTION_TOKEN not in text:
|
match = MENTION_REGEX.search(text)
|
||||||
|
if not match:
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
# Simple check to avoid re-processing if our comment is already there
|
# Simple check to avoid re-processing if our comment is already there
|
||||||
if f"Name: AI_Visual" in text and BLOCK_START in text:
|
if f"Name: AI_Visualizer" in text and BLOCK_START in text:
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
diagram_dir = discussion_path.parent.parent / "diagrams"
|
diagram_dir = discussion_path.parent.parent / "diagrams"
|
||||||
diagram_path = find_next_diagram(diagram_dir)
|
diagram_path = find_next_diagram(diagram_dir)
|
||||||
prompt = text.split(MENTION_TOKEN, 1)[1]
|
prompt = match.group(1) # Extract text after the mention
|
||||||
write_placeholder_plantuml(diagram_path, prompt)
|
write_placeholder_plantuml(diagram_path, prompt)
|
||||||
append_comment(discussion_path, diagram_path.relative_to(repo_root))
|
append_comment(discussion_path, diagram_path.relative_to(repo_root))
|
||||||
return 0
|
return 0
|
||||||
|
|
|
||||||
|
|
@ -953,10 +953,10 @@ def test_visualizer_generates_diagram(temp_repo):
|
||||||
|
|
||||||
# Check that a comment was posted
|
# Check that a comment was posted
|
||||||
updated = discussion.read_text(encoding="utf-8")
|
updated = discussion.read_text(encoding="utf-8")
|
||||||
assert "Name: AI_Visual" in updated
|
assert "Name: AI_Visualizer" in updated
|
||||||
assert generated[0].relative_to(repo).as_posix() in updated
|
assert generated[0].relative_to(repo).as_posix() in updated
|
||||||
start = updated.index("<!-- AUTO:VISUAL START -->")
|
start = updated.index("<!-- AUTO:VISUALIZER START -->")
|
||||||
end = updated.index("<!-- AUTO:VISUAL END -->", start)
|
end = updated.index("<!-- AUTO:VISUALIZER END -->", start)
|
||||||
agent_block = updated[start:end]
|
agent_block = updated[start:end]
|
||||||
assert "VOTE:" not in agent_block
|
assert "VOTE:" not in agent_block
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue