MCP HubMCP Hub
Volver a habilidades

add-puzzle-type

pjt222
Actualizado Yesterday
3 vistas
17
2
17
Ver en GitHub
Metatestingdesign

Acerca de

Esta Skill de Claude estructura un nuevo tipo de rompecabezas en todos los más de 10 puntos de integración del paquete jigsawR. Automatiza la creación del módulo principal, el cableado de la tubería, las capas de ggplot, las actualizaciones de configuración, las extensiones de la aplicación Shiny y un conjunto de pruebas. Úsela al agregar un tipo de rompecabezas completamente nuevo para garantizar que no se omita ningún paso de integración.

Instalación rápida

Claude Code

Recomendado
Principal
npx skills add pjt222/agent-almanac -a claude-code
Comando PluginAlternativo
/plugin add https://github.com/pjt222/agent-almanac
Git CloneAlternativo
git clone https://github.com/pjt222/agent-almanac.git ~/.claude/skills/add-puzzle-type

Copia y pega este comando en Claude Code para instalar esta habilidad

Documentación

Add Puzzle Type

Scaffold new puzzle type across pipeline integration points jigsawR.

Use When

  • Add new puzzle type to pkg
  • Follow 10-point pipeline checklist (CLAUDE.md)
  • Nothing missed wiring new type end-to-end

In

  • Required: New type name (lowercase, e.g. "triangular")
  • Required: Geometry desc (piece shape/arrangement)
  • Required: Needs external pkgs? (Suggests)
  • Optional: Params beyond standard (grid, size, seed, tabsize, offset)
  • Optional: Ref impl or algo source

Do

Step 1: Core Puzzle Module

Create R/<type>_puzzle.R:

#' Generate <type> puzzle pieces (internal)
#' @noRd
generate_<type>_pieces_internal <- function(params, seed) {
  # 1. Initialize RNG state
  # 2. Generate piece geometries
  # 3. Build edge paths (SVG path data)
  # 4. Compute adjacency
  # 5. Return list: pieces, edges, adjacency, metadata
}

Follow pattern R/voronoi_puzzle.R or R/snic_puzzle.R.

Fn returns list: $pieces, $edges, $adjacency, $metadata.

If err: Compare return structure against generate_voronoi_pieces_internal() → missing elements or wrong types.

Step 2: Wire jigsawR_clean.R

Edit R/jigsawR_clean.R:

  1. Add "<type>" to valid_types
  2. Type-specific param extraction
  3. Valid. logic type-specific constraints
  4. Filename prefix mapping (e.g., "<type>" -> "<type>_")
# In valid_types
valid_types <- c("rectangular", "hexagonal", "concentric", "voronoi", "snic", "<type>")

generate_puzzle(type = "<type>") accepted, no "unknown type" err.

If err: Verify type string in valid_types exact, param extraction covers required type-specific args.

Step 3: Wire unified_piece_generation.R

Edit R/unified_piece_generation.R:

  1. Dispatch case generate_pieces_internal()
  2. Fusion handling if PILES notation
# In the switch/dispatch
"<type>" = generate_<type>_pieces_internal(params, seed)

Pieces generated on dispatch.

If err: Confirm dispatch string exact, generate_<type>_pieces_internal defined + exported.

Step 4: Wire piece_positioning.R

Edit R/piece_positioning.R:

Add positioning dispatch. Most use shared, some need custom.

apply_piece_positioning() handles new type no err, pieces at correct coords.

If err: Check if needs custom or reuse shared path. Add dispatch if default no apply.

Step 5: Wire unified_renderer.R

Edit R/unified_renderer.R:

  1. Render case render_puzzle_svg()
  2. Edge path fn: get_<type>_edge_paths()
  3. Piece name fn: get_<type>_piece_name()

SVG out generated new type, correct outlines + edge paths.

If err: Verify get_<type>_edge_paths() returns valid SVG path, get_<type>_piece_name() unique IDs.

Step 6: Wire adjacency_api.R

Edit R/adjacency_api.R:

Neighbor dispatch → get_neighbors() + get_adjacency() work.

get_neighbors(result, piece_id) returns correct neighbors.

If err: Check dispatch returns correct structure. Test small grid, manually verify against geometry.

Step 7: ggpuzzle Geom Layer

Edit R/geom_puzzle.R:

geom_puzzle_<type>() using make_puzzle_layer():

#' @export
geom_puzzle_<type> <- function(mapping = NULL, data = NULL, ...) {
  make_puzzle_layer(type = "<type>", mapping = mapping, data = data, ...)
}

ggplot() + geom_puzzle_<type>(aes(...)) renders no err.

If err: Verify make_puzzle_layer() correct type, geom exported via @export.

Step 8: Stat Dispatch

Edit R/stat_puzzle.R:

  1. Type-specific default params
  2. Dispatch case compute_panel()

Stat layer computes geometry, produces expected polygons.

If err: compute_panel() dispatch returns df w/ x, y, group, piece_id, defaults sensible.

Step 9: DESCRIPTION

Edit DESCRIPTION:

  1. New type in Description text
  2. New pkgs → Suggests:
  3. Collate: include new R file (alphabetical)

devtools::document() succeeds. No NOTE unlisted files.

If err: New R file in Collate: alphabetical, new Suggests pkgs spelled correct w/ ver constraints.

Step 10: config.yml

Edit inst/config.yml:

Defaults + constraints:

<type>:
  grid:
    default: [3, 3]
    min: [2, 2]
    max: [20, 20]
  size:
    default: [300, 300]
    min: [100, 100]
    max: [2000, 2000]
  tabsize:
    default: 20
    min: 5
    max: 50
  # Add type-specific params here

Config valid YAML. Defaults → working puzzle via generate_puzzle().

If err: Validate yaml::yaml.load_file("inst/config.yml"). Defaults sensible (not too small/large).

Step 11: Shiny App

Edit inst/shiny-app/app.R:

  1. Add type → UI selector
  2. Conditional UI panels type-specific params
  3. Server-side generation

Shiny shows new type, generates on select.

If err: Type in choices of selector, conditional panel conditionalPanel(condition = "input.type == '<type>'"), server passes correct params.

Step 12: Test Suite

Create tests/testthat/test-<type>-puzzles.R:

test_that("<type> puzzle generates correct piece count", { ... })
test_that("<type> puzzle respects seed reproducibility", { ... })
test_that("<type> adjacency returns valid neighbors", { ... })
test_that("<type> fusion merges pieces correctly", { ... })
test_that("<type> geom layer renders without error", { ... })
test_that("<type> SVG output is well-formed", { ... })
test_that("<type> config constraints are enforced", { ... })

External dep → skip_if_not_installed().

All pass. No skips unless dep missing.

If err: Check each point individually. Common: missing dispatch → grep -rn "switch\|valid_types" R/.

Check

  • generate_puzzle(type = "<type>") produces valid out
  • All 10 points wired
  • devtools::test() passes new tests
  • devtools::check() → 0 err, 0 warn
  • Shiny renders new type
  • Config constraints enforced (min/max valid.)
  • Adjacency + fusion work
  • ggpuzzle geom renders no err
  • devtools::document() succeeds (NAMESPACE updated)

Traps

  • Missing dispatch: One of 10+ files forgotten → silent fail or "unknown type"
  • strsplit neg nums: paste(a, b, sep = "-")"1--1". Use "|" + split "\\|".
  • cat() for out: Always cli logging wrappers (log_info, log_warn, etc.)
  • Collate order: alphabetical or dep-ordered
  • config.yml format: Valid YAML; test yaml::yaml.load_file("inst/config.yml")

  • generate-puzzle — test new type after scaffold
  • run-puzzle-tests — full suite verify integration
  • validate-piles-notation — test fusion w/ new type
  • write-testthat-tests — general test patterns
  • write-roxygen-docs — document new geom fn

Repositorio GitHub

pjt222/agent-almanac
Ruta: i18n/caveman-ultra/skills/add-puzzle-type
0
agentsagentskillsai-assisted-developmentclaude-codeskillsteams

Habilidades relacionadas

content-collections

Meta

Esta habilidad proporciona una configuración probada en producción para Content Collections, una herramienta centrada en TypeScript que transforma archivos Markdown/MDX en colecciones de datos con tipado seguro mediante validación Zod. Úsala al construir blogs, sitios de documentación o aplicaciones Vite + React con mucho contenido para garantizar seguridad de tipos y validación automática de contenido. Abarca todo, desde la configuración del plugin de Vite y compilación MDX hasta la optimización de despliegue y validación de esquemas.

Ver habilidad

polymarket

Meta

Esta habilidad permite a los desarrolladores crear aplicaciones con la plataforma de mercados de predicción Polymarket, incluyendo la integración de API para operaciones y datos de mercado. También proporciona transmisión de datos en tiempo real a través de WebSocket para monitorear operaciones en vivo y actividad del mercado. Úsela para implementar estrategias de trading o crear herramientas que procesen actualizaciones de mercado en tiempo real.

Ver habilidad

creating-opencode-plugins

Meta

Esta habilidad ayuda a los desarrolladores a crear complementos de OpenCode que se conectan a más de 25 tipos de eventos, como comandos, archivos y operaciones LSP. Proporciona la estructura del complemento, las especificaciones de la API de eventos y los patrones de implementación para módulos en JavaScript/TypeScript. Úsala cuando necesites interceptar, monitorear o extender el ciclo de vida del asistente de IA de OpenCode con lógica personalizada basada en eventos.

Ver habilidad

sglang

Meta

SGLang es un framework de alto rendimiento para el servicio de LLM que se especializa en generación rápida y estructurada para JSON, expresiones regulares y flujos de trabajo de agentes utilizando su caché de prefijos RadixAttention. Ofrece una inferencia significativamente más rápida, especialmente para tareas con prefijos repetidos, lo que lo hace ideal para salidas complejas y estructuradas, y conversaciones multiturno. Elige SGLang sobre alternativas como vLLM cuando necesites decodificación restringida o estés construyendo aplicaciones con uso extensivo de prefijos compartidos.

Ver habilidad