From showroom
Generates Red Hat Showroom workshop modules in AsciiDoc from reference materials like URLs, files, or docs, with business storytelling and hands-on exercises.
npx claudepluginhub rhpds/rhdp-skills-marketplace --plugin showroomThis skill uses the workspace's default tool permissions.
---
Generates Red Hat Showroom demo modules in Know/Show structure for presenter-led demonstrations from objectives, materials, and customer scenarios.
Generates runtime-automation playbooks (solve/validation/setup.yml) for existing RHDP labs. Adds Zero Touch Solve/Validate buttons to showroom without altering setup. Supports OCP tenant/dedicated, RHEL VM+bastion, AAP.
Creates step-by-step tutorials and educational content from code, transforming complex concepts into progressive, hands-on learning experiences. Use for onboarding, blogs, courses, or teaching documentation.
Share bugs, ideas, or general feedback.
Guide you through creating a single Red Hat Showroom workshop module from reference materials (URLs, files, docs, or text) with business storytelling and proper AsciiDoc formatting.
Have these ready before running this skill:
Required:
content/modules/ROOT/pages/)Helpful to have:
Access needed:
See @showroom/docs/SKILL-COMMON-RULES.md for:
This skill supports optional command-line arguments for faster workflows.
Usage Examples:
/create-lab # Interactive mode (asks all questions)
/create-lab <directory> # Specify target directory
/create-lab <directory> --new # Create new lab in directory
/create-lab <directory> --continue <module> # Continue from specific module
Parameters:
<directory> - Target directory for module files
/create-lab content/modules/ROOT/pages/content/modules/ROOT/pages/--new - Flag to create new lab (generates index + overview + details + module-01)--continue <module-path> - Continue from specified previous module
/create-lab content/modules/ROOT/pages/ --continue content/modules/ROOT/pages/03-module-01-intro.adocHow Arguments Work:
/create-lab with no argumentsCRITICAL RULES
If this is the FIRST module of a NEW lab, you MUST generate files in this EXACT order:
NEVER skip index/overview/details for first module!
File naming convention:
If continuing existing lab:
Example of WRONG approach:
❌ Asking all at once:
1. Module file name?
2. UserInfo variables?
3. Learning objective?
4. Number of exercises?
Example of CORRECT approach:
✅ Ask sequentially:
Step 2: Complete overall lab story planning
[WAIT for completion]
Step 3.1: Module file name?
[WAIT for answer]
Step 3.2: Reference materials?
[WAIT for answer]
etc.
Check if user invoked skill with arguments.
Pattern 1: /create-lab <directory> --new
Parsing arguments: "<directory> --new"
✓ Target directory: <directory>
✓ Mode: Create new lab
✓ Will generate: index.adoc → 01-overview → 02-details → 03-module-01
Validating directory...
[Check if directory exists, create if needed]
Skipping: Step 1 (mode already known: NEW lab)
Proceeding to: Step 2 (Plan Overall Lab Story)
Pattern 2: /create-lab <directory> --continue <module-path>
Parsing arguments: "<directory> --continue <module-path>"
✓ Target directory: <directory>
✓ Mode: Continue existing lab
✓ Previous module: <module-path>
Validating directory...
[Check if directory exists]
Reading previous module: <module-path>
[Extract story, company, progression]
Skipping: Step 1 (mode already known: CONTINUE)
Skipping: Step 2 (story detected from previous module)
Proceeding to: Step 3 (Module-Specific Details)
Pattern 3: /create-lab <directory>
Parsing arguments: "<directory>"
✓ Target directory: <directory>
Validating directory...
[Check if directory exists]
Skipping: Target directory question
Proceeding to: Step 1 (still need to ask: new vs continue)
Pattern 4: /create-lab (no arguments)
No arguments provided.
Using interactive mode.
Target directory: Will use default (content/modules/ROOT/pages/)
Proceeding to: Step 1 (Determine Context)
Argument Validation:
--continue but module path invalid, fall back to asking for story recapSKIP THIS STEP IF:
--new flag in arguments (already know: NEW lab)--continue <module> in arguments (already know: EXISTING lab)CRITICAL: DO NOT read any files or make assumptions before asking this question!
First, ask the user:
Welcome! Let's create your workshop together.
Are you starting a brand new lab or adding to an existing one?
1. 🆕 NEW lab (I'll create the whole thing: index → overview → details → first module)
2. ➕ EXISTING lab (I'll add the next module and continue your story)
3. 🤔 Something else (tell me what you need)
What's your situation? [1/2/3]
ONLY AFTER user answers, proceed based on their response.
SKIP THIS STEP IF: User provided <directory> as argument
Ask the user:
What is the path to your cloned Showroom repository?
You can provide:
- A local path: /Users/yourname/work/showroom-content/my-lab-showroom
- A GitHub URL: https://github.com/rhpds/my-lab-showroom
(I'll clone it to /tmp/ automatically)
Repo path or URL:
If the user provides a GitHub URL (starts with https://github.com/ or git@github.com:):
.git suffix if present)git clone <url> /tmp/<repo-name>/tmp/<repo-name>Use content/modules/ROOT/pages/ within that path as the target for lab files.
If option 1 (NEW lab):
If option 2 (EXISTING lab):
If continuing existing lab:
Fallback behavior:
Awesome! Let's design your workshop together. I'll ask you some questions to build the perfect learning experience.
IMPORTANT: Ask these as conversational, open-ended questions. Do NOT provide multiple choice options.
Question 1 - What Should We Call This?:
What's the name of your workshop?
Example: "Building AI/ML Workloads on OpenShift AI"
I'll use this to set up your lab title and generate a clean URL-friendly slug.
Your lab name:
[After user provides title, I'll suggest a slug like "building-ai-ml-workloads-openshift-ai"]
Question 2 - The Learning Goal:
What's the main goal of this lab?
What should learners be able to do when they finish?
Example: "Learn to build and deploy AI/ML workloads on OpenShift AI"
Your lab goal:
Question 3 - Who's Learning?:
Who is this lab designed for?
Examples: Developers, Architects, SREs, Data Scientists, Platform Engineers
Your target audience:
What's their experience level?
- Beginner (new to the technology)
- Intermediate (some hands-on experience)
- Advanced (production experience)
Their level:
Question 4 - The Learning Journey:
By the end of this lab, what should learners understand and be able to do?
List the key skills they'll gain:
Your learning outcomes:
Question 5 - Make It Real:
What company or business scenario should we use to make this relatable?
Examples: "ACME Corp", "RetailCo", "FinTech Solutions"
Or create your own!
Company name:
What business challenge are they facing that drives this learning?
Their challenge:
Question 6 - How Long?:
How much time should learners budget for the complete lab?
Typical options: 30min, 1hr, 2hr
Your target duration:
Question 7 - Technical Environment:
Let's nail down the technical details:
OpenShift version? (e.g., "4.18", "4.20", or I can use {ocp_version} placeholder)
Product versions? (e.g., "OpenShift Pipelines 1.12, OpenShift AI 2.8")
Cluster type? (SNO or multinode)
Access level? (admin only, or multi-user with keycloak/htpasswd)
Your environment details:
Note: If you're not sure, I'll use placeholders that work across versions.
Then I'll recommend:
You can:
For NEW labs only. Skip if adding a module to an existing lab.
Two files to create or fix:
site.yml (repo root) — correct title and ui-bundle theme URL. If default-site.yml exists → rename to site.yml + update .github/workflows/gh-pages.yml reference.ui-config.yml (repo root) — split view enabled (view_switcher.enabled: true, default_mode: split) and correct tabs for OCP or VMAsk all three questions in order — do NOT skip any:
ui-config.yml)ui-bundle URL in site.yml — this is what the user reported missing)→ Full questions, file templates, AgnosticV workload vars: @showroom/skills/create-lab/references/showroom-scaffold.md
Now for this specific module:
Module file name and numbering:
0X-module-YY-<slug>.adoc (e.g., 03-module-01-pipelines-intro.adoc)= Module X: <Title> (e.g., = Module 1: Pipeline Fundamentals)content/modules/ROOT/pages/Reference materials (optional but recommended):
UserInfo variables (optional, for accurate showroom content):
Q: Do you have access to a deployed environment on demo.redhat.com or integration.demo.redhat.com?
If YES (RECOMMENDED - easiest and most accurate):
Please share the UserInfo variables from your deployed service:
1. Login to https://demo.redhat.com (or integration.demo.redhat.com)
2. Go to "My services" → Your service
3. Click "Details" tab
4. Expand "Advanced settings" section
5. Copy and paste the output here
This provides exact variable NAMES like:
- openshift_cluster_console_url
- openshift_cluster_admin_username
- gitea_console_url
- [custom workload variables]
CRITICAL: I will use these to know WHICH variables exist, NOT to replace them with actual values!
Variables will stay as placeholders: {openshift_cluster_console_url}
Showroom replaces these at runtime with actual deployment values.
If NO:
Q: Would you like to use placeholder attributes for now?
If YES:
I'll use placeholders: {openshift_console_url}, {user}, {password}
You can update these later when you get Advanced settings.
If NO (RHDP internal team only):
I can extract variables from AgnosticV repository if you have it cloned locally.
This requires AgV path and catalog name.
Note: Less reliable than Advanced settings.
Main learning objective:
Business scenario:
Technology/product focus:
Number of exercises:
Diagrams, screenshots, or code blocks (optional):
content/modules/ROOT/assets/images/Troubleshooting section (optional):
Q: Would you like to include a troubleshooting section in this module?
A troubleshooting section helps learners solve common issues they may encounter.
Options:
1. Yes, include troubleshooting (Recommended for production workshops)
2. No, skip it for now (I'll add it later if needed)
Your choice? [1/2]
When to recommend "Yes":
When "No" is acceptable:
UserInfo variables are collected in Step 4, item 3. If skipped there, use placeholder attributes ({openshift_console_url}, {user}, {password}) and proceed.
If you provided visual assets or code:
For images (diagrams, screenshots):
See @showroom/docs/SKILL-COMMON-RULES.md for image path conventions and clickable image syntax.
For code blocks:
role="execute" — this renders the copy/execute button in the Showroom UI. Without it the button does not appear.
[source,role="execute"]
----
oc create deployment my-app --image=myimage:latest
----
----
NAME READY STATUS RESTARTS AGE
my-app-xxxxx-xxxxx 1/1 Running 0 2m
----
role="execute": [source,yaml], [source,json], etc.Based on your references, I'll:
Reference Enforcement:
See @showroom/docs/SKILL-COMMON-RULES.md for reference enforcement patterns.
Reference Tracking (for conclusion generation):
IMPORTANT: External Link Format:
^ caret to open in new tablink:https://example.com[Link Text^]^ ensures users don't lose their place in the workshop^link:https://docs.redhat.com/...[Red Hat Documentation^]xref:03-module-02-next.adoc[Next Module] (no caret)CRITICAL: Read templates BEFORE generating any content.
Template source — check the Showroom repo first:
The user's Showroom repo may contain a templates/ directory with up-to-date patterns. Always prefer these over the marketplace's built-in templates.
# Check if user's Showroom repo has templates
ls {showroom_repo_path}/examples/workshop/templates/ # if exists use examples/ 2>/dev/null
If examples/workshop/templates/ exists in the Showroom repo — read from there:
{showroom_repo_path}/examples/workshop/templates/index.adoc — Learner-facing index (output as index.adoc){showroom_repo_path}/examples/workshop/templates/03-module-01.adoc — Module template{showroom_repo_path}/examples/workshop/example/01-overview.adoc — Overview example{showroom_repo_path}/examples/workshop/example/02-details.adoc — Details example{showroom_repo_path}/examples/workshop/example/03-module-01.adoc — Module example⚠️ Old nookbag repos: If the repo's examples contain [source,bash] without role="execute", treat them as [source,role="execute"] when generating new content. Many repos were cloned from nookbag before this standard was introduced — the reference is still valid for structure and storytelling, but always generate command blocks with [source,role="execute"] regardless of what the reference shows. Offer to bulk-fix existing modules: "I see your existing modules use [source,bash]. Want me to update them all to [source,role="execute"]?"
If examples/workshop/templates/ does NOT exist — use bundled plugin templates:
@showroom/templates/workshop/templates/00-index-learner.adoc — Learner-facing index@showroom/templates/workshop/templates/03-module-01.adoc — Module template@showroom/templates/workshop/example/01-overview.adoc — Filled overview example@showroom/templates/workshop/example/02-details.adoc — Filled details example@showroom/templates/workshop/example/03-module-01.adoc — Filled module example@showroom/templates/workshop/templates/README-TEMPLATE-GUIDE.adoc — Storytelling patternsKey rules from the templates:
index.adoc is learner-facing — NOT a facilitator guide (use index.adoc template, output as index.adoc)The user's examples/ directory reflects the latest nookbag patterns and may be more current than the marketplace copies. Always use the repo's own templates when available.
See @showroom/docs/SKILL-COMMON-RULES.md for verification prompt file lists and how to use them.
IMPORTANT: Use the bundled workshop templates read in Step 8 as quality references.
Apply patterns from the bundled templates to new content:
CRITICAL: If this is the FIRST module of a NEW lab, generate files in this order:
Purpose: Learner-facing landing page - NOT a facilitator guide
Content:
= {{ Workshop Title }}
Welcome to the {{ workshop name }} workshop!
== What you'll learn
In this workshop, you will:
* {{ Learning objective 1 }}
* {{ Learning objective 2 }}
* {{ Learning objective 3 }}
* {{ Learning objective 4 }}
== Who this is for
This workshop is designed for {{ target audience }} who want to {{ main goal }}.
== Prerequisites
Before starting this workshop, you should have:
* {{ Prerequisite 1 }}
* {{ Prerequisite 2 }}
* Access to {{ environment/tools }}
== Workshop environment
{{ Brief description of the lab environment }}
* OpenShift cluster: {openshift_console_url}
* Login credentials will be provided
== Let's get started!
Click on the next section to begin the workshop.
What NOT to do:
What TO do:
Purpose: Business scenario and learning objectives
Content: See workshop/example/01-overview.adoc for pattern
Purpose: Technical requirements and setup
Content: See workshop/example/02-details.adoc for pattern
I'll create a complete module with:
CRITICAL: Image Syntax Enforcement:
Always include link=self,window=blank on every image — makes images clickable to open full-size in new tab.
CRITICAL: AsciiDoc rules (em dashes, originality, external links, bullets vs numbers):
See @showroom/skills/create-lab/references/asciidoc-rules.md for all rules with correct/incorrect examples.
Required Structure:
Note: References are NOT included in individual modules. All references will be consolidated in the mandatory conclusion module.
Mandatory: Verification Checkpoints: Each major step must include:
=== Verify
Run the following to confirm success:
[source,role="execute"]
----
oc get pods
----
Expected output:
----
NAME READY STATUS RESTARTS AGE
my-app-xxxxx-xxxxx 1/1 Running 0 2m
----
✓ Pod status is "Running"
✓ READY shows 1/1
Optional: Troubleshooting Section (If Requested): If the user requested troubleshooting in Step 3, include this section:
== Troubleshooting
**Issue**: Pod stuck in "ImagePullBackOff"
**Solution**:
. Check image name: `oc describe pod <pod-name>`
. Verify registry credentials
. Common fix: `oc set image-lookup <deployment>`
**Issue**: Permission denied errors
**Solution**:
. Verify you're in correct project: `oc project`
. Check RBAC: `oc whoami` and `oc auth can-i create pods`
**Issue**: Command not found
**Solution**:
. Verify OpenShift CLI installed: `oc version`
. Expected version: {ocp_version}
Guidelines for troubleshooting section:
Mandatory: Learning Outcomes Checkpoint:
See @showroom/docs/SKILL-COMMON-RULES.md for Learning Outcomes Checkpoint requirements.
Optional but Recommended: Cleanup: If module changes shared state:
== Cleanup (Optional)
To reset your environment:
[source,role="execute"]
----
oc delete project my-project
----
Quality:
The generated module is already in context — check it directly. No agents needed.
Read @showroom/docs/SKILL-COMMON-RULES.md for the full quality gate criteria, then verify the just-generated file against this list:
Must fix before delivering (fix silently, note in Step 12 summary):
| Check | Rule |
|---|---|
| Headings | Sentence case — not Title Case |
| Em dashes | Zero — — rewrite or use -- |
| Prohibited terms | No "robust", "powerful", "leverage", "synergy" |
| Student command blocks | All commands students run use [source,role="execute"] — never bare [source,bash] |
| Expected output blocks | Use plain ---- with no source declaration — no language specifier, no role="execute" |
| Config/code blocks | Non-executable content (YAML, JSON, config) uses [source,yaml] / [source,json] without role="execute" |
| Exercise steps | Numbered lists (.) — not bullets (*) |
| Verify sections | Every exercise has === Verify with expected output |
| Learning objectives | Present with ≥3 bullet points |
| Hardcoded values | No cluster URLs, usernames, passwords — use {user}, {password}, {openshift_console_url} |
| Pronouns | No "he/she" — use "they/them" |
| Product names | No bare "OCP", "AAP" without first-use expansion |
If anything fails, fix it now. Do not ask the user — just fix and note what was corrected in the Step 12 delivery summary.
See @showroom/docs/SKILL-COMMON-RULES.md for navigation update rules and conflict handling.
CRITICAL: Manage Output Tokens to Prevent Overflow
Token Management Rules:
Output Format for FIRST module:
✅ Workshop Generation Complete
**Files Created**:
- content/modules/ROOT/pages/index.adoc (32 lines) - Learner landing page
- content/modules/ROOT/pages/01-overview.adoc (85 lines) - Business scenario
- content/modules/ROOT/pages/02-details.adoc (67 lines) - Technical details
- content/modules/ROOT/pages/03-module-01-intro.adoc (234 lines) - First hands-on module
- content/modules/ROOT/nav.adoc (updated)
Output Format for CONTINUATION modules:
✅ Module Generation Complete
**Files Created**:
- content/modules/ROOT/pages/04-module-02-advanced.adoc (198 lines)
- content/modules/ROOT/nav.adoc (updated)
**Module Structure**:
- Learning objectives: 4 items
- Exercises: 3
- Verification checkpoints: 3
- Troubleshooting scenarios: 5 (if included)
- Learning outcomes: 4 items
**Assets**:
- Images needed: 2 placeholders (see module for TODO comments)
- Dynamic attributes used: {openshift_console_url}, {user}, {password}
**Next Steps**:
1. Review module: content/modules/ROOT/pages/04-module-02-advanced.adoc
2. Capture screenshots for placeholder images
3. Test commands in your environment
4. Run: verify-content to check quality
5. Create next module: create-lab (continuing existing lab)
6. Enable GitHub Pages (if not done yet): repo Settings → Pages → Source: GitHub Actions
**Note**: All files have been written. Use your editor to review them.
What NOT to do:
What TO do:
After the final module, ask if this is the last module. If YES: read all previous modules to extract learning outcomes and references, then generate a conclusion module (0X-conclusion.adoc) consolidating all references from all modules organized by category.
→ Full conclusion template and reference curation workflow: @showroom/skills/create-lab/references/conclusion-template.md
/showroom:verify-content -- Run quality checks on generated content before publishing/showroom:blog-generate -- Convert workshop modules into blog posts