livecodes-sdk-methods

star 1.4k

Use SDK methods to interact with playgrounds: run, getCode, setConfig, getConfig, watch, runTests, format, getShareUrl, show, destroy. Load this skill when programmatically controlling embedded playgrounds, reacting to code changes, or retrieving compiled output.

live-codes By live-codes schedule Updated 6/4/2026

name: livecodes/sdk-methods description: > Use SDK methods to interact with playgrounds: run, getCode, setConfig, getConfig, watch, runTests, format, getShareUrl, show, destroy. Load this skill when programmatically controlling embedded playgrounds, reacting to code changes, or retrieving compiled output. type: core library: livecodes library_version: 0.13.0 requires: - sdk-embedding sources: - live-codes/livecodes:docs/docs/sdk/js-ts.mdx - live-codes/livecodes:src/sdk/index.ts

This skill builds on sdk-embedding. Read it first for foundational concepts.

LiveCodes — Use SDK Methods

The Playground object returned by createPlayground exposes methods to programmatically control the playground.

Setup

import { createPlayground } from 'livecodes';

const playground = await createPlayground('#container', {
  template: 'react',
});

// All SDK methods return Promises
await playground.run();
const code = await playground.getCode();
await playground.setConfig({
  /* new config */
});

Core Patterns

Run the playground

// Run the result page (after any needed compilation)
await playground.run();

Get current code and config

// Get code from all editors
const code = await playground.getCode();
console.log(code.markup.content); // Source markup
console.log(code.markup.language); // Language name
console.log(code.markup.compiled); // Compiled output (if applicable)
console.log(code.result); // Result page HTML

// Get configuration object
const config = await playground.getConfig();
console.log(config.title);
console.log(config.markup.language);

// Get content-only config (without user preferences)
const contentConfig = await playground.getConfig(true);

Update playground configuration

// Load new project in place (no full reload)
await playground.setConfig({
  markup: { language: 'markdown', content: '# New Content' },
});

// Get the resulting config
const newConfig = await playground.setConfig({
  script: { language: 'typescript', content: 'const x: number = 1;' },
});

Watch for changes

// Watch for code changes
const codeWatcher = playground.watch('code', ({ code, config }) => {
  console.log('Code changed:', code.script.content);
});

// Watch for code execution
const runWatcher = playground.watch('run', ({ code, config }) => {
  console.log('Playground ran. Result HTML:', code.result);
});

// Watch for console output
const consoleWatcher = playground.watch('console', ({ method, args }) => {
  console[method](...args);
});

// Watch for test results
const testsWatcher = playground.watch('tests', ({ results, error }) => {
  results.forEach((r) => console.log(r.status, r.testPath));
});

// Remove watchers when done
codeWatcher.remove();
runWatcher.remove();
consoleWatcher.remove();
testsWatcher.remove();

Run tests programmatically

const { results } = await playground.runTests();
results.forEach((result) => {
  console.log(result.status); // 'pass', 'fail', or 'skip'
  console.log(result.errors); // Array of error strings
  console.log(result.testPath); // ['describe', 'it']
});

Show specific panel

// Show editors
await playground.show('editor'); // Active editor
await playground.show('markup'); // Markup editor
await playground.show('style'); // Style editor
await playground.show('script'); // Script editor

// Show tools
await playground.show('console'); // Console panel
await playground.show('compiled'); // Compiled code viewer
await playground.show('tests'); // Tests panel

// Show result
await playground.show('result'); // Result page
await playground.show('toggle-result'); // Toggle result visibility

// With options
await playground.show('result', { full: true }); // Full screen
await playground.show('result', { zoom: 0.5 }); // 50% zoom
await playground.show('script', { line: 10, column: 5 }); // Scroll to line

Format code

// Format all editors
await playground.format();

// Format only active editor
await playground.format(false);

Get share URL

// Long URL with compressed config
const longUrl = await playground.getShareUrl();

// Short URL (requires share service)
const shortUrl = await playground.getShareUrl(true);

Execute custom commands

// Set broadcast token
await playground.exec('setBroadcastToken', 'my-token');

// Show version info
await playground.exec('showVersion');

Destroy playground

await playground.destroy();
// Playground removed from DOM, all event listeners cleaned up

Common Mistakes

HIGH Not awaiting async SDK methods

Wrong:

const playground = await createPlayground('#container', {});
const code = playground.getCode(); // Returns Promise, not code
console.log(code); // Promise { <pending> }

Correct:

const playground = await createPlayground('#container', {});
const code = await playground.getCode(); // Await the Promise
console.log(code.markup.content);

All SDK methods return Promises. Use await or .then() to get the result.

Source: docs/docs/sdk/js-ts.mdx — SDK methods section

MEDIUM watch callback receives wrong data structure

Wrong:

playground.watch('code', (data) => {
  console.log(data.content); // Undefined
});

Correct:

// 'code' event provides { code, config }
playground.watch('code', ({ code, config }) => {
  console.log(code.markup.content);
  console.log(code.style.content);
  console.log(code.script.content);
  console.log(code.result); // Result page HTML
});

// 'run' event provides { code, config }
playground.watch('run', ({ code, config }) => {
  console.log(code.result); // Result page HTML
});

// 'console' event provides { method, args }
playground.watch('console', ({ method, args }) => {
  console[method](...args);
});

// 'tests' event provides { results, error? }
playground.watch('tests', ({ results, error }) => {
  if (error) console.error(error);
  results.forEach((r) => console.log(r.status));
});

Source: docs/docs/sdk/js-ts.mdx — watch method section

LOW Using deprecated onChange instead of watch

Wrong:

// Deprecated method
const watcher = playground.onChange(({ code, config }) => {
  console.log('changed');
});

Correct:

// Use watch instead
const watcher = playground.watch('code', ({ code, config }) => {
  console.log('changed');
});
watcher.remove(); // When done watching

onChange is deprecated. Use watch('code', callback) instead.

Source: src/sdk/index.ts — onChange marked as deprecated

SDK Method Reference

Method Returns Description
load() Promise<void> Load playground (for click-to-load mode)
run() Promise<void> Run the result page
format(allEditors?) Promise<void> Format code
getShareUrl(shortUrl?) Promise<string> Get shareable URL
getConfig(contentOnly?) Promise<Config> Get configuration
setConfig(config) Promise<Config> Update configuration
getCode() Promise<Code> Get code from all editors
show(panel, options?) Promise<void> Show specific panel
runTests() Promise<{results}> Run tests
watch(event, fn) {remove()} Subscribe to events
exec(command, ...args) Promise<any> Execute custom command
destroy() Promise<void> Clean up and remove
Install via CLI
npx skills add https://github.com/live-codes/livecodes --skill livecodes-sdk-methods
Repository Details
star Stars 1,446
call_split Forks 246
navigation Branch main
article Path SKILL.md
More from Creator