Utility tools for MicroSim management including quality validation, screenshot capture, icon management, and index page generation. Routes to the appropriate utility based on the task needed.
This meta-skill provides utility functions for managing and maintaining MicroSims in intelligent textbook projects. It consolidates four utility skills into a single entry point with on-demand loading of specific utility guides.
Use this skill when users request:
Match the user's request to the appropriate utility guide:
| Trigger Keywords | Guide File | Purpose |
|---|---|---|
| standardize, quality, validate, score, check, audit | references/standardization.md |
Quality validation and scoring |
| screenshot, capture, preview, image, thumbnail | references/screen-capture.md |
Automated screenshot generation |
| icons, add icons, favicon, logo | references/add-icons.md |
Icon management for MicroSims |
| index page, microsim list, grid, directory, catalog, update the microsim listings, update the list of microsims, create a grid view, generate a listing | references/index-generator.md |
Generate index page with grid cards |
| TODO, todo json, extract specs, diagram specs, unimplemented, create microsim todo, todo files, extract diagrams, unimplemented microsims | scripts/create-microsim-todo-json-files.py |
Extract unimplemented diagram specs into TODO JSON files |
| scaffold microsims, scaffold from todo, scaffold sims, create microsim stubs, generate microsim scaffolding, stub out microsims, create scaffold files, generate scaffold from json, microsim stubs from todo | scripts/scaffold-microsims-from-todo.py |
Generate main.html, index.md, and metadata.json stub files for each TODO JSON spec that does not yet have an implementation |
| fix iframe heights, sync iframe heights, correct iframe heights, iframe height, canvas height, sync heights, update iframe heights | scripts/sync-iframe-heights.py |
Synchronize iframe heights from CANVAS_HEIGHT in JS files to sim and chapter index.md files |
| iframe auto height, iframe auto resize, iframe postMessage, runtime iframe resize, microsim auto resize, auto-size iframe, iframe self-resize | references/iframe-auto-height.md |
Runtime postMessage protocol so embedded MicroSims report their own height to the parent page |
Need to check MicroSim quality/standards?
→ YES: standardization.md
Need to capture screenshots for previews?
→ YES: screen-capture.md
Need to add or manage icons?
→ YES: add-icons.md
Need to generate/update the MicroSim index page?
→ YES: index-generator.md
Need to extract unimplemented diagram specs into TODO files?
→ YES: Run scripts/create-microsim-todo-json-files.py
Need to scaffold sim directories (main.html, index.md, metadata.json) from those TODO JSON files?
→ YES: Run scripts/scaffold-microsims-from-todo.py
Need to fix, sync, or correct iframe heights?
→ YES: Run scripts/sync-iframe-heights.py
Need iframes to auto-resize at runtime via postMessage?
→ YES: references/iframe-auto-height.md
For reference-based utilities, read the corresponding guide file from references/ and follow its workflow.
For Python script utilities, run the script directly:
TODO JSON extractor:
python /path/to/skills/microsim-utils/scripts/create-microsim-todo-json-files.py --project-dir /path/to/project
Report the summary output to the user (chapters scanned, total specs found, already implemented, TODO files written, output directory).
Scaffold from TODO JSON:
python /path/to/skills/microsim-utils/scripts/scaffold-microsims-from-todo.py --project-dir /path/to/project
Report the summary output to the user (TODO specs processed, scaffolded, skipped). Use --force only if the user explicitly asks to regenerate stubs; the script never overwrites an existing main.html regardless of --force.
Iframe height sync:
python /path/to/skills/microsim-utils/scripts/sync-iframe-heights.py --project-dir /path/to/project --verbose
Report the summary output to the user (sims synced, CANVAS_HEIGHT comments inserted, iframe heights updated).
Each guide contains:
Purpose: Validate MicroSim quality against standards
Checks:
Output: Quality score (0-100) with recommendations
Purpose: Capture high-quality screenshots for social media previews
Script: ~/.local/bin/bk-capture-screenshot <microsim-directory-path>
Features:
Output: PNG screenshot named {microsim-name}.png in MicroSim directory
Purpose: Add favicon and icons to MicroSim directories
Creates:
Purpose: Generate comprehensive MicroSim index page
Creates:
Purpose: Extract unimplemented MicroSim diagram specifications from chapter content and create TODO JSON files
Script: scripts/create-microsim-todo-json-files.py --project-dir /path/to/project
How it works:
docs/chapters/*/index.md files for #### Diagram: headers<details> blocksmain.html under docs/sims/docs/sims/TODO/Output: Individual JSON files in docs/sims/TODO/{sim-id}.json with fields:
sim_id, diagram_name, chapter_number, chapter_titlelibrary, bloom_level, bloom_verb, learning_objectivecompletion_status: "specified", extracted_date, specificationImportant: Always pass --project-dir pointing to the project root (the directory containing mkdocs.yml). If omitted, the script walks up from its own location to find mkdocs.yml, which may find the wrong project.
Purpose: Generate scaffold (stub) files for each MicroSim that has a TODO JSON spec but no implementation yet. This is the natural next step after create-microsim-todo-json-files.py.
Script: scripts/scaffold-microsims-from-todo.py --project-dir /path/to/project
How it works:
docs/sims/TODO/<sim-id>.jsondocs/sims/<sim-id>/main.html, creates the directory with three stub files:main.html — placeholder canvas with the spec embedded as a commentindex.md — frontmatter, learning objective, iframe embed, full specmetadata.json — mapped from the TODO JSONmain.html already exists (so real implementations are never clobbered)Flags:
--project-dir — Project root containing mkdocs.yml (required or auto-detected)--force — Overwrite existing index.md and metadata.json stubs. Never overwrites an existing main.html, even with --force, because that file may contain a real implementation.Output: Summary showing TODO specs processed, scaffolded, and skipped (already implemented).
Important: Always pass --project-dir pointing to the project root. The script auto-detects by walking up from cwd to find mkdocs.yml if omitted.
Purpose: Synchronize iframe heights across MicroSim index.md files and chapter files using the CANVAS_HEIGHT comment in each sim's JavaScript file as the single source of truth.
Script: scripts/sync-iframe-heights.py --project-dir /path/to/project
How it works:
// CANVAS_HEIGHT: <int> from the first 15 lines of each sim's .js filedrawHeight + controlHeight (+ graphHeight if present) and inserts the comment on line 2 of the JS fileCANVAS_HEIGHT + 2 (2px for iframe border) in:docs/sims/<sim-id>/index.mddocs/chapters/*/index.md) that embeds the simFlags:
--project-dir — Project root containing mkdocs.yml (required or auto-detected)--sim <sim-id> — Sync a single sim instead of all--dry-run — Preview changes without writing files--verbose — Show status for all sims, not just changesOutput: Summary showing sims synced, CANVAS_HEIGHT comments inserted, and iframe heights updated.
Important: Always pass --project-dir pointing to the project root. The script auto-detects by walking up from cwd to find mkdocs.yml if omitted.
Purpose: Runtime alternative to sync-iframe-heights.py. Documents the
two-part postMessage protocol that lets an embedded MicroSim report its
own measured content height to the parent page, which then resizes the
iframe automatically.
When to use: Sims with responsive or content-dependent heights that
are hard to predict at build time (e.g., diagram-overlay sims whose height
depends on the longest callout text). Coexists with sync-iframe-heights.py
without conflict.
What's in the guide:
'microsim-resize' message contract (type, height fields)docs/js/extra.jsevent.source === iframe.contentWindow (not by URL)digital-citizenship projectSetup is one-time per project: add the listener block once to
docs/js/extra.js, then any MicroSim that posts the microsim-resize
message participates automatically.
User: "Check if my bouncing-ball MicroSim meets standards"
Routing: Keywords "check", "standards" → references/standardization.md
Action: Read standardization.md and follow its workflow
User: "Create a preview image for the timeline MicroSim"
Routing: Keywords "preview", "image" → references/screen-capture.md
Action: Run ~/.local/bin/bk-capture-screenshot /path/to/docs/sims/timeline
User: "Update the MicroSim index page with all new sims"
Routing: Keywords "index", "update" → references/index-generator.md
Action: Read index-generator.md and follow its workflow
User: "Create MicroSim TODO JSON files"
Routing: Keywords "TODO", "create microsim todo" → scripts/create-microsim-todo-json-files.py
Action: Run python scripts/create-microsim-todo-json-files.py --project-dir /path/to/project and report results (chapters scanned, specs found, already implemented, TODO files written)
User: "scaffold the microsims" or "create the stub files for the TODO sims" or "generate scaffold files from the JSON specs"
Routing: Keywords "scaffold microsims", "stub out microsims", "scaffold from todo" → scripts/scaffold-microsims-from-todo.py
Action: Run python scripts/scaffold-microsims-from-todo.py --project-dir /path/to/project and report results (TODO specs processed, scaffolded, skipped). Typically follows immediately after create-microsim-todo-json-files.py.
User: "fix the iframe heights" or "sync the iframe heights" or "correct the iframe heights"
Routing: Keywords "fix iframe heights", "sync iframe heights", "correct iframe heights" → scripts/sync-iframe-heights.py
Action: Run python scripts/sync-iframe-heights.py --project-dir /path/to/project --verbose and report results (sims synced, comments inserted, iframe heights updated)
User: "make the iframes auto-size" or "set up iframe auto height" or "I want microsims to report their own height"
Routing: Keywords "iframe auto height", "auto-size iframe", "iframe postMessage" → references/iframe-auto-height.md
Action: Read iframe-auto-height.md and follow the two-part setup: paste the parent-side listener block at the top of docs/js/extra.js, then ensure the relevant MicroSims post { type: 'microsim-resize', height } after layout settles. Confirm both sides are in place and report which sims now participate.
standardization.md to validate quality~/.local/bin/bk-capture-screenshot <microsim-path> to create preview imageindex-generator.md to add to index pageUse standardization.md to audit all MicroSims in a project and generate a quality report.
These utilities work with the standard MicroSim directory structure:
docs/sims/<microsim-name>/
├── main.html # Main visualization
├── index.md # Documentation
├── *.js # JavaScript code
├── style.css # Styles (optional)
└── <name>.png # Preview screenshot (created by screen-capture)