Programmatic bridge between Claude Code and the Memeroot canvas. Validate, bundle, and package region files into a single canvas-ready HTML — opened in any browser, the canvas boots with content already loaded.
Three commands: validate, bundle, package. Pure Node.js, no external dependencies, no runtime services. Designed to be invoked by Claude Code (via the bash tool) when the memeroot-bridge skill is active.
Without this CLI, the workflow from "produce content" to "have content in canvas" requires three manual steps from the user: open canvas, drop files, ingest each one. With this CLI, Claude Code closes the loop programmatically: the user receives one HTML file, opens it, the canvas boots with all content already in the Tree.
$ memeroot validate control.xml tod.xml toe.xml ✓ control.xml <control id="REV-001"> · 1842b ✓ tod.xml <test-of-design id="TOD-REV-001-2026Q1"> · 2410b ✓ toe.xml <test-of-operating-effectiveness id="TOE-REV-001-2026Q1"> · 3104b 3 ok · 0 failed · 0 warnings
Checks: well-formed XML · root element with id matching [A-Za-z][A-Za-z0-9_-]{1,127} · root is a known Memeroot region kind · no fake <signature> elements · no absolute file paths · no unfilled [NEEDS INPUT:…] placeholders. Exit code 0 = pass, 1 = at least one failure.
<workspace> XML.$ memeroot bundle control.xml tod.xml toe.xml -o packet.xml --title "REV-001 audit" ✓ wrote packet.xml (8412b · 3 regions · id WS-2026-05-23-mphr...)
Each input is validated first; bundle aborts on any failure. The workspace wrapper carries metadata (generation timestamp, source filenames, region count). Inputs that are already workspace bundles can be nested.
$ memeroot package control.xml tod.xml toe.xml -o audit-packet.html --title "REV-001 Q1 audit" ✓ wrote audit-packet.html (149312b · canvas + 3 region file(s) + bootstrap) open in a browser; canvas boots with content pre-loaded
Wraps the bundled workspace with the canvas HTML template, plus a small bootstrap script that auto-injects content into the canvas's ingest endpoint on page load. The recipient opens audit-packet.html, sees the canvas boot, sees a confirmation banner ("✓ packet loaded · N bytes"), and finds the regions already in the Tree tab ready for signing.
$ unzip memeroot-cli.zip $ cd memeroot-cli/ $ npm install -g . # Or use directly: node bin/memeroot ... $ memeroot help memeroot — Memeroot canvas ↔ Claude Code bridge CLI Commands: memeroot validate <file>... — check files for well-formedness, ids, conventions memeroot bundle <file>... -o out.xml — combine region files into one workspace.xml memeroot package <file>... -o out.html — produce single-file canvas with regions pre-loaded
Requires Node.js 18+. No runtime dependencies; the CLI is pure Node.js using only built-in modules. The canvas template bundled with the package is the same single-file MR-CANVAS-v0.8.html the Memeroot ecosystem uses.
The CLI is designed to be invoked by Claude Code itself, via the bash tool, when the memeroot-bridge skill is active. Typical session:
User: "Document the REV-001 control for SOX Q1; output as Memeroot packet." Claude Code: # Produces three structured region files $ cat > control.xml << 'XML' <control id="REV-001">...</control> XML $ cat > tod.xml << 'XML' <test-of-design id="TOD-REV-001-2026Q1">...</test-of-design> XML $ cat > toe.xml << 'XML' <test-of-operating-effectiveness id="TOE-REV-001-2026Q1">... XML # Self-validates before packaging $ memeroot validate *.xml ✓ 3 ok · 0 failed · 0 warnings # Packages as single HTML deliverable $ memeroot package *.xml -o audit-packet.html --title "REV-001 Q1 audit" ✓ wrote audit-packet.html → User receives audit-packet.html → Opens it in browser → Canvas boots, three regions in the Tree, banner: "✓ packet loaded" → User signs in Sign tab as the appropriate identity → Bundles for distribution to external auditor
The natural-language → multi-signed audit packet pipeline is now fully automated end-to-end with these four pieces working together: Claude Code, regulated-document-author skill, memeroot-bridge skill, memeroot-cli.