feat(admin): yellow banner for legacy CLI verbs in workspace-prompt override

This commit is contained in:
ZdenekSrotyr 2026-05-04 17:46:50 +02:00
parent 8091620d33
commit a92c624dba
3 changed files with 64 additions and 0 deletions

View file

@ -974,6 +974,7 @@ async def admin_workspace_prompt_page(
):
from src.repositories.claude_md_template import ClaudeMdTemplateRepository
from src.claude_md import compute_default_claude_md
from app.api.claude_md import _scan_legacy_strings
row = ClaudeMdTemplateRepository(conn).get()
server_url = str(request.base_url).rstrip("/")
@ -986,6 +987,7 @@ async def admin_workspace_prompt_page(
updated_at=row["updated_at"],
updated_by=row["updated_by"],
is_override=row["content"] is not None,
legacy_strings_detected=_scan_legacy_strings(row["content"] or ""),
)
return templates.TemplateResponse(request, "admin_workspace_prompt.html", ctx)

View file

@ -271,6 +271,20 @@
</div>
</details>
{% if legacy_strings_detected %}
<div id="legacy-banner"
role="alert"
style="background:#fff3cd; border:1px solid #ffc107; padding:0.75rem 1rem; border-radius:8px; margin-bottom:14px; color:#664d03;">
<strong>This override references CLI verbs / paths that were renamed:</strong>
<ul style="margin:0.5rem 0 0 1.5rem; padding:0;">
{% for hit in legacy_strings_detected %}
<li><code>{{ hit }}</code></li>
{% endfor %}
</ul>
<p style="margin:0.5rem 0 0 0;">Re-author and Save to clear this warning. See <code>CHANGELOG.md</code> for the rename list.</p>
</div>
{% endif %}
<div class="welcome-editor-row">
<div class="welcome-pane">
<h4 class="welcome-pane-label">Editor</h4>

View file

@ -121,3 +121,51 @@ def test_admin_get_template_returns_empty_when_clean(web_session):
resp = web_session.get("/api/admin/workspace-prompt-template")
assert resp.status_code == 200, resp.text
assert resp.json()["legacy_strings_detected"] == []
# ---------------------------------------------------------------------------
# HTML banner tests — admin /admin/workspace-prompt page renders a yellow
# warning banner above the editor when the saved override contains stale
# CLI verbs / paths.
# ---------------------------------------------------------------------------
def test_admin_workspace_prompt_page_renders_banner_when_legacy_present(web_session):
"""When the saved override contains legacy strings, the admin UI renders
a yellow warning banner above the editor listing the hits."""
web_session.put(
"/api/admin/workspace-prompt-template",
json={"content": "Run `da sync` and check data/parquet/."},
)
resp = web_session.get("/admin/workspace-prompt")
assert resp.status_code == 200
text = resp.text
# Banner is rendered (id, class, or distinctive styling)
assert "legacy-banner" in text or "renamed" in text.lower() or "warning" in text.lower()
# Specific hits appear in the banner content
assert "da sync" in text
assert "data/parquet" in text
def test_admin_workspace_prompt_page_no_banner_when_clean(web_session):
"""When the override has no legacy strings, the banner block is absent
(or rendered as empty/hidden)."""
web_session.put(
"/api/admin/workspace-prompt-template",
json={"content": "Use `agnes pull` and `server/parquet/`."},
)
resp = web_session.get("/admin/workspace-prompt")
assert resp.status_code == 200
text = resp.text
# The banner div should not appear (or its content should not list hits)
# Pin to the legacy-banner id; the {% if %} guard means absent when clean
assert "legacy-banner" not in text
def test_admin_workspace_prompt_page_no_banner_when_no_override(web_session):
"""No saved override at all → banner absent."""
# Reset to default by deleting any existing override
web_session.delete("/api/admin/workspace-prompt-template")
resp = web_session.get("/admin/workspace-prompt")
assert resp.status_code == 200
assert "legacy-banner" not in resp.text