Imported from grafana/interactive-tutorials (
AGENTS.md). Install upstream withnpx skills add grafana/interactive-tutorials. Copyright stays with the author.
- Security issues should be reported via Grafana's security issue reporting page and not directly in this repository.
Interactive Guides Repository
This repository contains interactive Grafana guides in JSON format. Each guide lives in its own directory with a content.json file defining the guide structure and a manifest.json file whose targeting.match controls where the guide is recommended. (index.json is frozen and no longer edited per guide -- a CI check fails any PR that changes it.)
Full reference documentation lives in docs/. AI-oriented references live in .cursor/.
Critical Rules
- Use
navmenu-openfor any step targeting navigation menu elements - Use stable selectors -- prefer
data-testid, button text, and semantic attributes over CSS classes - No markdown titles in guides -- the guide
titleis rendered by the app frame; a leading## Titleduplicates it - No multistep singletons -- a
multistepwith one step must be a plaininteractiveblock - Include
exists-reftargetfor selector-targeting steps -- the repo convention is to listexists-reftargetin therequirementsarray for any block or step with areftarget. - Use sections, not markdown headers -- group steps with
sectionblocks, not##headings - Include page requirements -- page-specific actions need
on-page:/path - Verify state changes -- use
verifyafter save/create operations - Keep prose brief -- guides render in a sidebar; be direct and action-oriented
- Action-focused content -- "Save your configuration" not "The save button can be clicked"
- Connect requirements and objectives -- if section 1 creates a resource, section 2 should require it
- Tooltips -- under 250 characters, one sentence, don't name the highlighted element
doIt: falsefor secrets -- never automate filling passwords, tokens, or API keys- Section bookends -- each
sectionneeds a 1-sentence "what you'll do" intro markdown block immediately before the section and a 1-sentence "what you learned" summary markdown block immediately after it. Do not put those bookends inside thesection-- Pathfinder often numbers in-section markdown as a step. You may omit the intro when a pre-section markdown line already covers the goal (for example "To ..., complete the following steps:"). - Bold only GUI names -- "Click Save & test" not "Click the Save & test button"
skippable: truefor conditional steps -- use for permission-gated steps and optional/conditional fields- No focus-before-formfill --
highlighton an input withdoIt: trueis a no-op; useformfillinstead, or setdoIt: false schemaVersionis optional -- if included, use"schemaVersion": "1.1.0"; the schema defaults to"1.1.0"when omittedpopoutrequirestargetvalue--popoutactions MUST settargetvalueto exactly"sidebar"or"floating"; the schema rejects any other value, andpopoutis not allowed insideguidedblocks- Use
openGuide, not?doc=-- to chain a follow-up guide after anavigatestep, setopenGuide: "bundled:<guide-id>"on the interactive block; the legacy?doc=query param is back-compat only - Use supported lazy discovery -- for targets absent until scrolling, use a standalone
interactiveblock withlazyRender: true,exists-reftarget, and a verifiedscrollContainer(often#pageContentwith the Grafana sidebar open). Its individual Show me / Do it handles discovery. Currentguidedsteps and Do section do not run that discovery; see guided-interactions.md.
Task Routing
Reference Documentation (docs/)
| Document | Purpose |
|---|---|
| learning-path-authoring.md | Docs-team entry point for interactive learning paths |
| json-guide-reference.md | Block types, properties, and guide structure |
| interactive-actions.md | Action type behavior and button controls |
| requirements-reference.md | All requirement types |
| selectors-and-testids.md | Stable selector patterns |
| guided-interactions.md | Detailed guided block documentation |
| manifest-reference.md | Manifest field reference and derivation rules |
| website-yaml-reference.md | Learning Hub metadata in website.yaml |
Historical Context
| Path | What |
|---|---|
docs/history/ |
Completed project records (package migration, recommendation deduplication). Not needed for day-to-day work — consult only when investigating past design decisions or PR provenance. Do not use material from this directory as a basis for building new features. |
Shared Content (shared/)
| Path | Purpose |
|---|---|
| shared/snippets/ | Pre-tested JSON blocks for common Grafana UI patterns (nav, save dashboard, datasource picker, tab navigation, drilldown nav, etc.) — copy and adapt rather than writing from scratch |
| shared/templates/tutorial-datasources.json | Reusable tutorial data source template |
Commands
| Command | Purpose |
|---|---|
| /new | Create a new guide from scratch |
| /lint | Validate guide JSON structure |
| /check | Check guide quality against best practices |
| /attack | Find issues by simulating confused users |
| /create-learning-path | Create a new interactive learning path from scratch |
| /build-interactive-lj | Convert an existing website learning path to an interactive package |
| /preflight-learning-path | Author pre-PR self-review for a learning path (mirrors review checks + shared claim-check, then optional fixes) |
| /review-learning-path-pr | Full learning path PR review (audit, consistency, Playwright, Pathfinder, GitHub submit) |
Committing and pushing
Branch protection on this repository enforces verified commit signatures as a push rule. An unsigned commit is not rejected when you make it — it is rejected by the remote at push time, with GH013: Repository rule violations found naming each offending SHA. Fixing it after the fact means rewriting the commit, which changes its SHA and can leave local tooling holding a diverged ref.
So: leave commit.gpgsign enabled and never disable it for a commit here (no -c commit.gpgsign=false, no --no-gpg-sign). Check before pushing with git log --pretty='%h %G? %s' main..HEAD — every commit must show G.
Maintaining this file
Keep this file for knowledge useful to almost every future agent session in this project. Do not repeat what the codebase already shows; point to the authoritative file or command instead. Prefer rewriting or pruning existing entries over appending new ones. When updating this file, preserve this bar for all agents and keep entries concise.