一键导入
fork
Save the current shader + knob state as a new numbered iteration. Usage: `/fork` (auto-detects shader) or `/fork <shader-path>`
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Save the current shader + knob state as a new numbered iteration. Usage: `/fork` (auto-detects shader) or `/fork <shader-path>`
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
VJ a shader live at a party — auto-mutates the shader every minute to match the track. Reads audio features + Spotify track name from the jam page, edits the .frag via /__save-shader (HMR hot-swaps). Invoked as `/vibej` or its alias `/vj`. Usage: `/vibej [N-iterations] [shader-path-or-name]` (default 180, most-recent .frag). `/vibej stop` ends early. `/vibej tick` runs one iteration (what the cron fires).
Legacy alias for /vibej. Same skill, same behavior — VJ a shader live at a party, auto-mutating it every minute to match the track. Usage: `/vj [N-iterations] [shader-path-or-name]`. `/vj stop`, `/vj tick`. Identical to `/vibej`.
Reset the MIDI controller mapping for the Paper Cranes jam/edit page. Clears `localStorage['cranes-midi-profiles']` and reloads the tab so the next CC twist auto-assigns afresh. Usage: `/remap` (clears all profiles) or `/remap <device-name>` (clears one).
Launch a jam session — open the jam page with shader + controller + Spotify/SoundCloud, share tab audio, and get ready to tweak. Usage: `/jam [shader-path] [music-url]`
Launch a live creative session — open Chrome with the shader editor + audio source, connect Claude-in-Chrome, and get ready to jam. Use `/live-session` to start, optionally pass a shader path or SoundCloud/Spotify URL.
Record a music video from the current shader. Captures canvas video via MediaRecorder, restarts the Spotify/music track, and auto-stops when done. Usage: `/record [duration-seconds]`
| name | fork |
| description | Save the current shader + knob state as a new numbered iteration. Usage: `/fork` (auto-detects shader) or `/fork <shader-path>` |
| allowed-tools | Bash Read Write Edit Grep Glob Agent mcp__claude-in-chrome__tabs_context_mcp mcp__claude-in-chrome__javascript_tool |
Capture the current shader code + knob values from the browser and create a new numbered .frag file with the knob values baked into comments and a companion .md doc.
Arguments (optional shader path):
!echo "$ARGUMENTS"
Browser tabs:
!echo "Use tabs_context_mcp + javascript_tool to read current state"
If $ARGUMENTS specifies a path, use it. Otherwise:
window.location.search for ?shader=.frag in the worktreeOn the jam/editor tab, run:
JSON.stringify({
shader: new URLSearchParams(window.location.search).get('shader'),
controller: new URLSearchParams(window.location.search).get('controller'),
knobs: Object.fromEntries(
Object.entries(window.cranes.manualFeatures || {})
.filter(([k]) => /^knob_\d+$/.test(k))
.filter(([_, v]) => v !== undefined && v !== null)
.sort(([a],[b]) => parseInt(a.split('_')[1]) - parseInt(b.split('_')[1]))
)
})
Look at existing numbered files in the shader directory:
shaders/<path>/the-coat-2.frag
shaders/<path>/the-coat-3.frag
→ next: the-coat-4.frag
If no numbered files exist, use 2.frag as the first fork.
Copy the current .frag to the new filename. Update any internal comments that reference the old name.
Create <new-name>.md with:
Update the browser to use the new shader without reloading:
// Fetch new shader and swap
const r = await fetch('/shaders/<path>/<new>.frag?t=' + Date.now())
window.cranes.shader = await r.text()
// Update URL
const url = new URL(window.location)
url.searchParams.set('shader', '<new-shader-path>')
history.replaceState({}, '', url)
Tell the user:
Forked
old-name→new-namewith knob values baked in. [list key knob settings]