Back to Skills

generate-puzzle

pjt222
Updated Yesterday
2 views
17
2
17
View on GitHub
Metawordaitestingdesign

About

This skill generates jigsaw puzzle SVGs and ggplot2 visualizations via the jigsawR package, supporting multiple puzzle types like rectangular, hexagonal, and voronoi. It validates parameters against a config file and is useful for creating puzzle files, testing configurations, or producing demos. Developers can use it for programmatic puzzle generation and visualization in R.

Quick Install

Claude Code

Recommended
Primary
npx skills add pjt222/agent-almanac -a claude-code
Plugin CommandAlternative
/plugin add https://github.com/pjt222/agent-almanac
Git CloneAlternative
git clone https://github.com/pjt222/agent-almanac.git ~/.claude/skills/generate-puzzle

Copy and paste this command in Claude Code to install this skill

Documentation

Generate Puzzle

Make jigsaw puzzles with jigsawR package unified API.

When Use

  • Make puzzle SVG files for specific type + config
  • Test puzzle generation with different parameters
  • Make sample output for docs or demos
  • Make ggplot2 puzzle visualizations with geom_puzzle_*()

Inputs

  • Required: Puzzle type ("rectangular", "hexagonal", "concentric", "voronoi", "random", "snic")
  • Required: Grid dimensions (type-dependent: c(cols, rows) or c(rings))
  • Optional: Size in mm (default varies by type)
  • Optional: Seed for reproducibility (default: 42)
  • Optional: Offset (0 = interlocked, >0 = separated pieces)
  • Optional: Layout ("grid" or "repel" for rectangular)
  • Optional: Fusion groups (PILES notation string)

Steps

Step 1: Read Config Constraints

R_EXE="/mnt/c/Program Files/R/R-4.5.0/bin/Rscript.exe"
"$R_EXE" -e "cat(yaml::yaml.load_file('inst/config.yml')[['{TYPE}']]$grid$max)"

Or read inst/config.yml direct to check valid ranges for chosen type.

Got: Min/max values for grid, size, tabsize, other parameters known for chosen puzzle type.

If fail: config.yml missing or type key absent? Check in jigsawR project root + package built at least once.

Step 2: Pick Type + Parameters

Map user request to valid generate_puzzle() args:

TypegridsizeExtra params
rectangularc(cols, rows)c(width, height) mmoffset, layout, tabsize
hexagonalc(rings)c(diameter) mmdo_warp, do_trunc, tabsize
concentricc(rings)c(diameter) mmcenter_shape, tabsize
voronoic(cols, rows)c(width, height) mmn_interior, tabsize
randomc(cols, rows)c(width, height) mmn_interior, tabsize
snicc(cols, rows)c(width, height) mmn_interior, compactness, tabsize

Got: User request mapped to valid generate_puzzle() args with correct type, grid dimensions, size in config.yml ranges.

If fail: Unsure of parameter format? See table. Rectangular + voronoi use c(cols, rows); hexagonal + concentric use c(rings).

Step 3: Make R Script

Write script file (preferred over -e for complex commands):

library(jigsawR)

result <- generate_puzzle(
  type = "rectangular",
  seed = 42,
  grid = c(3, 4),
  size = c(400, 300),
  offset = 0,
  layout = "grid"
)

cat("Pieces:", length(result$pieces), "\n")
cat("SVG length:", nchar(result$svg_content), "\n")
cat("Files:", paste(result$files, collapse = ", "), "\n")

Save to temporary script file.

Got: R script file at temporary location, contains library(jigsawR), generate_puzzle() call with all parameters, diagnostic output lines.

If fail: Script syntax errors? Verify string args quoted + numeric vectors use c(). Skip complex shell escaping — always use script files.

Step 4: Execute via WSL R

R_EXE="/mnt/c/Program Files/R/R-4.5.0/bin/Rscript.exe"
"$R_EXE" /path/to/script.R

Got: Script done no errors. SVG file(s) written to output/.

If fail: Check renv restored (renv::restore()). Verify package loaded (devtools::load_all()). NO --vanilla flag (renv needs .Rprofile).

Step 5: Verify Output

  • SVG file exists in output/ directory
  • SVG content starts with <?xml or <svg
  • Piece count matches expected: cols * rows (rectangular), ring formula (hex/concentric)
  • ggplot2 approach: plot object renders no error

Got: SVG file exists in output/, starts with <?xml or <svg, piece count matches grid (cols * rows rectangular, ring formula hex/concentric).

If fail: SVG file missing? Check output/ directory exists. Piece count wrong? Verify grid matches puzzle type formula. ggplot2 output → check plot renders by wrap in tryCatch().

Step 6: Save Output

Generated files saved to output/ default. result object contains:

  • $svg_content — raw SVG string
  • $pieces — list of piece data
  • $canvas_size — dimensions
  • $files — paths to written files

Got: result object has $svg_content, $pieces, $canvas_size, $files fields. Files listed in $files exist on disk.

If fail: $files empty? Puzzle may have generated in-memory only. Save explicit with writeLines(result$svg_content, "output/puzzle.svg").

Checks

  • Script executes no errors
  • SVG file well-formed XML
  • Piece count matches grid
  • Same seed → identical output (reproducibility)
  • Parameters in config.yml constraints

Pitfalls

  • --vanilla flag: Breaks renv activation. Never use.
  • Complex -e commands: Use script files; shell escaping → Exit code 5.
  • Grid vs size confusion: Grid = piece count, size = physical dimensions in mm.
  • Offset semantics: 0 = assembled puzzle, positive = exploded/separated pieces.
  • SNIC without package: snic type needs snic package installed.

See Also

  • add-puzzle-type — scaffold new puzzle type end-to-end
  • validate-piles-notation — validate fusion group strings before generate_puzzle()
  • run-puzzle-tests — run test suite after generation changes
  • write-testthat-tests — add tests for new generation scenarios

GitHub Repository

pjt222/agent-almanac
Path: i18n/caveman/skills/generate-puzzle
0
agentsagentskillsai-assisted-developmentclaude-codeskillsteams

Related Skills

content-collections

Meta

This skill provides a production-tested setup for Content Collections, a TypeScript-first tool that transforms Markdown/MDX files into type-safe data collections with Zod validation. Use it when building blogs, documentation sites, or content-heavy Vite + React applications to ensure type safety and automatic content validation. It covers everything from Vite plugin configuration and MDX compilation to deployment optimization and schema validation.

View skill

polymarket

Meta

This skill enables developers to build applications with the Polymarket prediction markets platform, including API integration for trading and market data. It also provides real-time data streaming via WebSocket to monitor live trades and market activity. Use it for implementing trading strategies or creating tools that process live market updates.

View skill

creating-opencode-plugins

Meta

This skill helps developers create OpenCode plugins that hook into 25+ event types like commands, files, and LSP operations. It provides the plugin structure, event API specifications, and implementation patterns for JavaScript/TypeScript modules. Use it when you need to intercept, monitor, or extend the OpenCode AI assistant's lifecycle with custom event-driven logic.

View skill

sglang

Meta

SGLang is a high-performance LLM serving framework that specializes in fast, structured generation for JSON, regex, and agentic workflows using its RadixAttention prefix caching. It delivers significantly faster inference, especially for tasks with repeated prefixes, making it ideal for complex, structured outputs and multi-turn conversations. Choose SGLang over alternatives like vLLM when you need constrained decoding or are building applications with extensive prefix sharing.

View skill