showroom:create-lab
This skill should be used when the user asks to "create a lab module", "write a workshop module", "build a Showroom lab", "convert docs to a lab", "write a hands-on exercise", "create an AsciiDoc module", or "turn this documentation into a lab exercise".
Best use case
showroom:create-lab is best used when you need a repeatable AI agent workflow instead of a one-off prompt.
This skill should be used when the user asks to "create a lab module", "write a workshop module", "build a Showroom lab", "convert docs to a lab", "write a hands-on exercise", "create an AsciiDoc module", or "turn this documentation into a lab exercise".
Teams using showroom:create-lab should expect a more consistent output, faster repeated execution, less prompt rewriting.
When to use this skill
- You want a reusable workflow that can be run more than once with consistent structure.
When not to use this skill
- You only need a quick one-off answer and do not need a reusable workflow.
- You cannot install or maintain the underlying files, dependencies, or repository context.
Installation
Claude Code / Cursor / Codex
Manual Installation
- Download SKILL.md from GitHub
- Place it in
.claude/skills/showroom-create-lab/SKILL.mdinside your project - Restart your AI agent — it will auto-discover the skill
How showroom:create-lab Compares
| Feature / Agent | showroom:create-lab | Standard Approach |
|---|---|---|
| Platform Support | Not specified | Limited / Varies |
| Context Awareness | High | Baseline |
| Installation Complexity | Unknown | N/A |
Frequently Asked Questions
What does this skill do?
This skill should be used when the user asks to "create a lab module", "write a workshop module", "build a Showroom lab", "convert docs to a lab", "write a hands-on exercise", "create an AsciiDoc module", or "turn this documentation into a lab exercise".
Where can I find the source code?
You can find the source code on GitHub using the link provided at the top of the page.
SKILL.md Source
---
context: main
model: claude-sonnet-4-6
---
# Lab Module Generator
Orchestrates agents to create Red Hat Showroom workshop or demo content. Two modes: interactive (human) and headless (Publishing House via ph_payload).
## Architecture
This skill is an orchestrator. Generation and review are delegated to agents:
- `showroom:file-generator` (Sonnet) — generates one AsciiDoc file, runs in parallel for new labs
- `showroom:module-reviewer` (Sonnet) — quality check on generated files
The orchestrator handles: argument parsing, repo detection, planning, agent spawning, nav merge, delivery.
See @showroom/docs/SKILL-COMMON-RULES.md for AsciiDoc rules, version pinning, image conventions, and navigation format.
---
## ph_payload — Headless Mode (Publishing House)
If `ph_payload` is present in the invocation, skip ALL interactive questions and run headless. Return structured JSON.
```yaml
ph_payload:
target_dir: content/modules/ROOT/pages/
mode: new | continue
previous_module: 03-module-01-pipelines.adoc # continue mode only
spec:
lab_name: OpenShift Pipelines Workshop
audience: intermediate
learning_objectives: [Deploy a pipeline, Configure triggers, Monitor builds]
business_scenario: ACME Corp needs to modernize their CI/CD pipeline
duration: 90min
module_outline: |
Module 1: Pipeline setup (~30 min)
Module 2: Triggers (~30 min)
Module 3: Monitoring (~30 min)
env:
ocp_version: "4.18"
attributes: {user: user1, password: openshift}
```
Headless return (JSON only, no prose):
```json
{
"files_created": ["index.adoc", "01-overview.adoc", "02-details.adoc", "03-module-01-pipelines.adoc"],
"nav_updated": true,
"quality": {"critical": 0, "high": 0, "warnings": 2},
"warnings": ["Module has only 1 exercise, recommend adding more"]
}
```
---
## Interactive Mode
### Phase 0 — Parse Arguments
```bash
/create-lab # interactive, asks all questions
/create-lab <directory> # specify target directory
/create-lab <directory> --new # new lab, skip mode question
/create-lab <directory> --continue <module> # continue from module
```
Validate directory exists. If empty: tell user to clone nookbag template first:
```
git clone https://github.com/rhpds/showroom_template_nookbag <repo-name>
```
Never suggest `showroom-nookbag` (hyphens) — always `showroom_template_nookbag` (underscores).
---
### Phase 1 — Detect Mode (new lab vs continue)
If not set by arguments:
```
Are you:
1. Starting a NEW lab (creates index + overview + details + first module)
2. Adding a module to an EXISTING lab
```
Detect content type from existing files (no question):
- `=== Verify` sections or numbered exercises → Workshop
- Know/Show structure, presenter notes → Demo
- Unknown → Workshop
---
### Phase 2 — Planning Form (ALL questions at once, no sequential blocking)
**For NEW lab — ask as one grouped form:**
```
Let's plan your workshop. Answer all at once or skip any you're unsure about:
Lab name:
Target audience (e.g. Developers, SREs, Platform Engineers):
Experience level (Beginner / Intermediate / Advanced):
Main learning goal (what can learners DO when finished?):
Learning outcomes (list 3-4 skills they'll gain):
Business scenario (company name + challenge, e.g. "ACME Corp needs to modernize CI/CD"):
Duration (e.g. 30min, 1hr, 2hr):
Module breakdown (how many modules, what each covers):
OpenShift version (or leave blank for {ocp_version} placeholder):
Cluster type (multinode / SNO):
Access type (admin / multi-user htpasswd / keycloak):
UserInfo variables (paste from demo.redhat.com → My services → Details → Advanced settings):
Leave blank to use placeholder attributes {user}, {password}, {openshift_console_url}
Reference materials (paste URLs, file paths, or text — leave blank to use templates):
Writing style (optional — skip for standard Red Hat style):
Describe: "conversational, short sentences, active voice, no jargon"
OR paste 1-3 paragraphs of your own writing as an example
OR give a file path: ~/my-showroom/content/modules/ROOT/pages/03-my-module.adoc
Saved profile? Point to: ~/.claude/context/my-writing-style.md
```
User fills what they know, skips the rest. Orchestrator confirms the plan in one summary block:
```
📋 Plan confirmed:
Lab: [name] | [audience] | [duration]
Modules: [breakdown]
Environment: OCP [version] | [access type]
References: [N URLs / no references]
Generating files... (running in parallel)
```
**For CONTINUE mode — minimal questions:**
```
Which module are you adding? (title + brief description)
Reference materials for this module? (URLs, files, or blank)
Include troubleshooting section? [Y/n]
```
---
### Phase 2.5 — Showroom Setup (NEW lab only)
Ask Q0–Q3 from `@showroom/skills/create-lab/references/showroom-scaffold.md`:
- Q0: OCP or VM?
- Q1: Which tabs/consoles?
- Q2: Which Red Hat theme?
- Q3: Planning E2E tests with FTL skill? (optional — creates buttons.js + runtime-automation/ if yes)
Create/update `site.yml` and `ui-config.yml` in repo root.
---
### Phase 3 — Spawn File Generator Agents (parallel)
Build `FULL_SPEC` JSON from the planning form answers.
**NEW lab — spawn all files simultaneously:**
```
Task tool:
subagent_type: showroom:file-generator
prompt: |
TARGET_FILE: <repo_path>/content/modules/ROOT/pages/index.adoc
FILE_TYPE: index
FULL_SPEC: <FULL_SPEC JSON>
LAB_TYPE: <ocp|rhel|vm|ai>
CONTENT_TYPE: <workshop|demo>
REPO_PATH: <absolute repo path>
Task tool:
subagent_type: showroom:file-generator
prompt: |
TARGET_FILE: <repo_path>/content/modules/ROOT/pages/01-overview.adoc
FILE_TYPE: overview
FULL_SPEC: <FULL_SPEC JSON>
...
Task tool:
subagent_type: showroom:file-generator
prompt: |
TARGET_FILE: <repo_path>/content/modules/ROOT/pages/02-details.adoc
FILE_TYPE: details
FULL_SPEC: <FULL_SPEC JSON>
...
Task tool:
subagent_type: showroom:file-generator
prompt: |
TARGET_FILE: <repo_path>/content/modules/ROOT/pages/03-module-01-<slug>.adoc
FILE_TYPE: module
FULL_SPEC: <FULL_SPEC JSON>
...
```
All four run concurrently. Wait for all to return JSON.
**CONTINUE mode — single agent, sequential:**
```
Task tool:
subagent_type: showroom:file-generator
prompt: |
TARGET_FILE: <repo_path>/content/modules/ROOT/pages/<next-module>.adoc
FILE_TYPE: module
FULL_SPEC: <FULL_SPEC JSON>
PREVIOUS_MODULE: <path to previous .adoc>
REPO_PATH: <absolute repo path>
```
---
### Phase 4 — Quality Check
Spawn `showroom:module-reviewer` on each generated file:
```
Task tool:
subagent_type: showroom:module-reviewer
prompt: |
MODULE_FILE: <path to generated .adoc>
CONTENT_TYPE: <workshop|demo>
LAB_TYPE: <ocp|rhel|vm|ai>
SHARED_CONTEXT: {"module_order": [...], "defined_attributes": {...}, "first_use_map": {}, "lab_type": "ocp", "content_type": "workshop"}
REPO_PATH: <absolute repo path>
is_first_module: <true if overview>
is_conclusion: false
```
Collect findings. If Critical or High issues found, fix inline before delivering.
---
### Phase 5 — Update Navigation
Merge `nav_entry` values from each file-generator JSON output.
Read existing `content/modules/ROOT/nav.adoc`. Insert new entries in correct order. Write back.
Confirm: `✅ nav.adoc updated with [N] new entries.`
---
### Phase 6 — Deliver
**Human mode:**
```
✅ Files created:
index.adoc (247 words)
01-overview.adoc (312 words)
02-details.adoc (198 words)
03-module-01-pipeline-setup.adoc (1,340 words, 2 exercises)
✅ nav.adoc updated
Quality: 0 Critical, 0 High, 2 Warnings
- W1: Module has only 1 exercise — consider adding a second
- W2: [source,bash] found — run /verify-content E.3a fix when ready
Next: Add more modules with /create-lab --continue, or verify the full lab with /verify-content
```
**Headless mode:** return JSON from Phase 2's ph_payload schema.
---
### Phase 7 — Conclusion Module
When all modules are complete and user asks for the conclusion:
```
Task tool:
subagent_type: showroom:file-generator
prompt: |
FILE_TYPE: conclusion
FULL_SPEC: <FULL_SPEC JSON with all module summaries>
...
```
See `@showroom/skills/create-lab/references/conclusion-template.md` for conclusion structure.
---
## Related Skills
- `/showroom:verify-content` — full quality review after content is created
- `/showroom:create-demo` — presenter-led demo content
- `/ftl:rhdp-lab-validator` — write E2E solve/validate automationRelated Skills
showroom:verify-content
This skill should be used when the user asks to "verify my workshop content", "review my lab module", "check my Showroom content", "validate my AsciiDoc module", "quality check my demo", "review my workshop for Red Hat standards", or "run a content review on my lab".
showroom:create-demo
This skill should be used when the user asks to "create a demo module", "write a Know/Show demo", "build a presenter demo", "create a Showroom demo", "write a facilitator guide", "build a demo script", or "create a presenter-led demo for RHDP".
showroom:blog-generate
This skill should be used when the user asks to "turn this lab into a blog post", "write a blog post from this module", "generate a blog from my Showroom content", "convert my workshop to a blog", "write a Red Hat Developer blog post", or "create a blog post from my demo".
health:deployment-validator
Infrastructure Health Checker — use this when you need to validate that a workload or service DEPLOYED SUCCESSFULLY (pods running, routes accessible, dependencies ready). This is NOT for student E2E lab testing. For student exercise validation (solve/validate buttons), use /ftl:rhdp-lab-validator instead. Triggers on: 'create a validation role', 'build health checks', 'add deployment validation', 'create post-deployment checks', 'validate my deployment', 'check if my workload is healthy'.
agnosticv:validator
This skill should be used when the user asks to "validate my catalog", "check my AgnosticV config", "review common.yaml", "validate my RHDP catalog", "check for errors in my catalog", "lint my AgnosticV files", or "verify my catalog before submitting".
agnosticv:catalog-builder
This skill should be used when the user asks to "create a catalog", "build a common.yaml", "add a new RHDP lab", "set up a new catalog item", "create an AgnosticV catalog", "build a dev.yaml", "add a catalog entry", or "create a new lab catalog for RHDP".
sandbox-cli:sandbox-setup
This skill should be used when the user asks to "install sandbox-cli", "setup sandbox", "configure sandbox-cli", "get sandbox-cli working", "download sandbox-cli", or "I don't have sandbox-cli installed".
sandbox-cli:cluster-rotate
This skill should be used when the user asks to "rotate a cluster", "replace a cluster", "swap clusters", "offboard old and onboard new cluster", "cluster rotation", "replace an old cluster with a new one", or "refresh cluster".
sandbox-cli:cluster-onboard
This skill should be used when the user asks to "onboard a cluster", "add a cluster to sandbox", "register a cluster", "onboard OCP cluster", "sandbox onboard", or "add a new shared cluster".
sandbox-cli:cluster-offboard
This skill should be used when the user asks to "offboard a cluster", "remove a cluster from sandbox", "decommission a cluster", "sandbox offboard", "take a cluster offline", or "remove a shared cluster".
sandbox-cli:cluster-list
This skill should be used when the user asks to "list clusters", "show all clusters", "list sandbox clusters", "show registered clusters", "what clusters are available", or "cluster list".
sandbox-cli:cluster-details
This skill should be used when the user asks to "show cluster details", "get cluster info", "describe cluster", "cluster details", "inspect cluster", or "show cluster configuration".