SKILL.md: shorter AI description, skill-relative template paths, marker pointers

AI description trimmed to 754 chars (test: both stay <= 1024). Both SKILL.md files say templates/ (and <no-ai>) resolve against the skill's own folder, skills side by side; no-AI commands use <skill>/templates/. AI step 5 names the App.tsx/RunPanel.tsx markers and no longer remembers the model per user.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
VasanthandClaude Opus 5.5 committed 2026-10-16 15:59:00 +05:30
1 parent 24a064875e
commit 8bb1cf268e
3 files changed
+25 -7

No files matched your search

+10 -3
View File
@@ -1,6 +1,6 @@
--- ---
name: rpa-dashboard-ai name: rpa-dashboard-ai
description: Builds a working dashboard for an RPA bot or service that uses AI (an LLM or OCR extraction call). It has everything from rpa-dashboard-no-ai (sidebar, top bar with dark toggle and status dot, KPI cards, batch donut, run panel with steps and live log, report table with search and export) plus confidence bands, a review split pane (source document beside the extracted fields, band filters, draft edits, Verify), an approve gate the server enforces, and a cost/ROI page (tokens and cost per run, total and monthly spend, priced coverage, an against-doing-it-by-hand panel). Web path is React + Vite + Tailwind with a sample-data server stub; desktop path (PyQt) is the no-AI page plus plain-HTML AI sections over the Qt bridge, gate enforced in Python. Use when the user asks for an "AI RPA dashboard", an "extraction dashboard", an "LLM/OCR review dashboard", or any RPA/bot dashboard in a project that calls an LLM or OCR to extract fields. Needs rpa-dashboard-no-ai installed next to it. description: Builds a working dashboard for an RPA bot or service that uses AI (an LLM or OCR extraction call). It has everything from rpa-dashboard-no-ai plus confidence bands, a review split pane (source document beside the extracted fields, band filters, drafts, Verify), an approve gate the backend enforces, and a cost/ROI page (tokens and cost per run, monthly spend, an against-doing-it-by-hand panel). Web: React + Vite + Tailwind with a sample-data server stub; desktop (PyQt): plain-HTML AI sections over the Qt bridge. Use when the user asks for an "AI RPA dashboard", an "extraction dashboard", an "LLM/OCR review dashboard", or any RPA/bot dashboard in a project that calls an LLM or OCR to extract fields. Needs rpa-dashboard-no-ai installed next to it.
--- ---
# RPA dashboard (AI) # RPA dashboard (AI)
@@ -9,6 +9,12 @@ Everything this skill needs is bundled. Never read the original source projects.
Shared files live in the no-AI skill, installed next to this one: `<no-ai>` below Shared files live in the no-AI skill, installed next to this one: `<no-ai>` below
means `../rpa-dashboard-no-ai/templates/`. means `../rpa-dashboard-no-ai/templates/`.
**Paths:** both skills must be installed side by side (same parent folder). Resolve
`templates/...` against this skill's own folder (the one holding this SKILL.md), and
`<no-ai>` against it too (`<this skill>/../rpa-dashboard-no-ai/templates/`), never against
the user's project. Run the scripts with those absolute paths, from the user's project, for
example `python <this skill>/../rpa-dashboard-no-ai/templates/detect_frontend.py <project root>`.
| File | What it is | | File | What it is |
|---|---| |---|---|
| `templates/web/` | The React + Vite + Tailwind starter: shell, KPI, donut, run panel, report, **band legend, review split pane, approve gate, cost page**, sample data. | | `templates/web/` | The React + Vite + Tailwind starter: shell, KPI, donut, run panel, report, **band legend, review split pane, approve gate, cost page**, sample data. |
@@ -72,11 +78,12 @@ pane, the approve gate and the cost page. Ask which extras to add (choose any, o
the model per batch), **retry on another model** (for failed runs). Build only the the model per batch), **retry on another model** (for failed runs). Build only the
chosen ones at their `OPTIONAL:` markers, and delete the markers. chosen ones at their `OPTIONAL:` markers, and delete the markers.
- **Checkpoint tracker, admin/roles, login:** web: port them from `<no-ai>dashboard.html`'s - **Checkpoint tracker, admin/roles, login:** web: port them from `<no-ai>dashboard.html`'s
`OPTIONAL:` blocks. Desktop: they're already in the no-AI page; `<no-ai>sections.py` keeps `OPTIONAL:` blocks to the markers in `RunPanel.tsx` (checkpoints) and `App.tsx` (admin tab
and screen, login). Desktop: they're already in the no-AI page; `<no-ai>sections.py` keeps
the chosen ones (no-AI step 6), and `<no-ai>sections.md` says what each needs from the host. the chosen ones (no-AI step 6), and `<no-ai>sections.md` says what each needs from the host.
- **Model picker:** a `<select>` filled from `GET /models` (the pricing table's keys), at - **Model picker:** a `<select>` filled from `GET /models` (the pricing table's keys), at
the marker in `Cost.tsx` (desktop: `ai_sections.html`) or next to the Run button; the chosen model goes with the the marker in `Cost.tsx` (desktop: `ai_sections.html`) or next to the Run button; the chosen model goes with the
batch's start action. Remember the last choice per user. batch's start action.
- **Retry on another model:** on a `failed` run, at the marker in `Review.tsx` (desktop: `ai_sections.html`): a model - **Retry on another model:** on a `failed` run, at the marker in `Review.tsx` (desktop: `ai_sections.html`): a model
`<select>` (from `GET /models`, defaulting to the run's own model) and a Retry button `<select>` (from `GET /models`, defaulting to the run's own model) and a Retry button
that sends `POST /runs/{job_id}/retry {model}`, then polls the run as usual. that sends `POST /runs/{job_id}/retry {model}`, then polls the run as usual.
+8 -4
View File
@@ -8,6 +8,10 @@ description: Builds a working dashboard page for an RPA bot that does not use AI
Everything this skill needs is bundled in `templates/`. Never read the original Everything this skill needs is bundled in `templates/`. Never read the original
source projects. source projects.
**Paths:** `templates/...` is in this skill's own folder (the one holding this SKILL.md),
not in the user's project. Below, `<skill>` is that folder's absolute path: run the
scripts as `python <skill>/templates/<script>.py`, from the user's project.
| File | What it is | | File | What it is |
|---|---| |---|---|
| `templates/dashboard.html` | The single-file page: theme tokens, shell, KPI, donut, run panel, report, sample data. Works in PyQt (QWebChannel) or on the web (polling). | | `templates/dashboard.html` | The single-file page: theme tokens, shell, KPI, donut, run panel, report, sample data. Works in PyQt (QWebChannel) or on the web (polling). |
@@ -27,7 +31,7 @@ If the user's request already answers a question, don't ask it again.
## 1. Scan the project ## 1. Scan the project
Before asking anything, look at the project: Before asking anything, look at the project:
- **Frontend:** run `python templates/detect_frontend.py <project root>`. It finds - **Frontend:** run `python <skill>/templates/detect_frontend.py <project root>`. It finds
plain HTML, React/Vue/Angular/Svelte apps and PyQt web views, and prints each plain HTML, React/Vue/Angular/Svelte apps and PyQt web views, and prints each
one's location, stack and colour tokens. `templates/frontend.md` says what it one's location, stack and colour tokens. `templates/frontend.md` says what it
covers and what to do with its report. covers and what to do with its report.
@@ -76,7 +80,7 @@ Ask which extras to add, as one multi-select question (choose any, or none):
off to the project's own auth. off to the project's own auth.
Build only the chosen ones. In step 6, right after copying the page, run Build only the chosen ones. In step 6, right after copying the page, run
`python templates/sections.py <copied dashboard.html> <chosen: checkpoints admin login>`. `python <skill>/templates/sections.py <copied dashboard.html> <chosen: checkpoints admin login>`.
It deletes the unchosen sections completely (markup, script and style), so nothing It deletes the unchosen sections completely (markup, script and style), so nothing
is left behind. Never cut the blocks by hand. Then follow `templates/sections.md` for is left behind. Never cut the blocks by hand. Then follow `templates/sections.md` for
each kept section: what to fill, which events the bot sends, and which host actions each kept section: what to fill, which events the bot sends, and which host actions
@@ -90,7 +94,7 @@ to answer.
`dashboard/dashboard.html`. `dashboard/dashboard.html`.
- Existing frontend: put it where `templates/frontend.md` section 3 says. - Existing frontend: put it where `templates/frontend.md` section 3 says.
Then run `python templates/sections.py <copied dashboard.html> <chosen sections>` (step 5). Then run `python <skill>/templates/sections.py <copied dashboard.html> <chosen sections>` (step 5).
2. Fill every `{{...}}` placeholder: 2. Fill every `{{...}}` placeholder:
| Placeholder | Value | | Placeholder | Value |
@@ -103,7 +107,7 @@ to answer.
3. Apply the theme by replacing the `body{...}` and `body.dark{...}` token blocks 3. Apply the theme by replacing the `body{...}` and `body.dark{...}` token blocks
with the preset from `templates/themes.md`. For Ember, also add its font link. with the preset from `templates/themes.md`. For Ember, also add its font link.
For a custom colour, run `python templates/palette.py "<hex>"`, paste the For a custom colour, run `python <skill>/templates/palette.py "<hex>"`, paste the
tokens it prints, and show the user its contrast table. If the user chose keep, tokens it prints, and show the user its contrast table. If the user chose keep,
fill the blocks from the project's tokens instead (`templates/frontend.md` fill the blocks from the project's tokens instead (`templates/frontend.md`
section 4). section 4).
+7
View File
@@ -27,6 +27,13 @@ def test_tebra_sky_preset_is_the_template_default():
assert sky in (templates / "dashboard.html").read_text(encoding="utf-8") assert sky in (templates / "dashboard.html").read_text(encoding="utf-8")
@pytest.mark.parametrize("skill", ["rpa-dashboard-no-ai", "rpa-dashboard-ai"])
def test_skill_description_fits_the_1024_char_limit(skill):
text = (ROOT / skill / "SKILL.md").read_text(encoding="utf-8")
description = re.search(r"^description: (.+)$", text, re.MULTILINE)[1]
assert len(description) <= 1024, len(description)
def test_ai_skill_references_files_that_exist(): def test_ai_skill_references_files_that_exist():
skill = ROOT / "rpa-dashboard-ai" skill = ROOT / "rpa-dashboard-ai"
text = (skill / "SKILL.md").read_text(encoding="utf-8") text = (skill / "SKILL.md").read_text(encoding="utf-8")