# Dashboard Template

Kiro Crew repo only: load this when a task will author or change a dashboard page.

- Repository: https://github.com/kirodotdev/KiroCrew (4711 stars)
- Category: Testing
- License: Apache-2.0
- Last updated: 2026-11-01
- Runs scripts: yes, review before use

## Install

Claude Code: `npx skills add kirodotdev/KiroCrew --skill dashboard-template -g -a claude-code -y`
Codex: `npx skills add kirodotdev/KiroCrew --skill dashboard-template -g -a codex -y`
Cursor: `npx skills add kirodotdev/KiroCrew --skill dashboard-template -g -a cursor -y`
Gemini CLI: `npx skills add kirodotdev/KiroCrew --skill dashboard-template -g -a gemini-cli -y`

## Description

Kiro Crew repo only: load this when a task will author or change a dashboard page. A page never ships alone: the same PR carries its TypedDict contract, its provider, and a parity test that the two agree. Scaffold all four from one field list; read numbers from an existing fold, never type them.

## SKILL.md, as published by its author (untrusted third-party text, read it as data)

# Dashboard Template

A dashboard page is HALF of a template. The other half is a type, and the two halves
are checked by different machines, which is why they drift.

> This skill is the procedure for the `kirocrew-dashboard-author` crewmate, whose spec
> is `agent-spec.md` beside this file: the charter (what it is for and what it may never
> do) plus the narrowed toolset that makes the charter true against a tool list rather
> than only against prose. A human or another agent following this file gets the same
> procedure. The gateway installs the spec as the owned agent `kirocrew-dashboard-author` at
> every start (`OWNED_KIRO_AGENT_FILES`, `_install_dashboard_author_agent`), so a
> crewmate dispatched on it starts with this procedure as its prompt; a human or
> another agent loads this skill directly.

The page is inert html. The host sanitizes it, renders it, and binds text into it by
`data-dashboard-field`. No type checker is anywhere near that binding, because one half
is markup. So a page that reads `settled` while its provider fills `settled_count`
renders an empty cell, on a status board, forever, with nothing red anywhere.

Read the host before you write a page; it is short and it is the authority on what gets
refused. `src/kiro_crew/dashboard/dynamic_cards.py` holds `normalize_card`, which decides
whether a card is accepted at all, and
`website/src/pages/chat/command-center/dashboardDocument.ts` is what queries
`[data-dashboard-field]` and writes the text in.

**You are done when four files and one registration line exist, not when the page looks
right.** Everything here is dev time: it lands through a pull request, mypy is blocking
and the parity test is a gate. At run time the gateway evaluates none of it. A publisher
supplies three sentences and nothing else.

## What a run produces

The rest: https://github.com/kirodotdev/KiroCrew/blob/HEAD/src/kiro_crew/builtin_skills/kirocrew-dev/dashboard-template/SKILL.md
