executing-plans
executing-plans
Use when executing an implementation plan in the current session as the implementer yourself — your human partner chose inline execution, or no subagent tool is available
add-puzzle-typejigsawRの10以上のパイプライン統合ポイントにまたがる新しいパズルタイプを スキャフォールドする。コアパズルモジュールを作成し、統合パイプライン (生成、配置、レンダリング、隣接)に接続し、ggpuzzleのgeom/statレイヤーを 追加し、DESCRIPTIONとconfig.ymlを更新し、Shinyアプリを拡張し、包括的な テストスイートを作成する。パッケージに完全に新しいパズルタイプを追加する場合や、 10ポイント統合チェックリストに従ってエンドツーエンドで漏れがないようにする場合に使用する。
Independent GitHub snapshot · Automated classification · Original documentation governs
jigsawRのすべてのパイプライン統合ポイントにまたがる新しいパズルタイプをスキャフォールドする。
"triangular")内部生成関数を持つ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
}
構造についてはR/voronoi_puzzle.RまたはR/snic_puzzle.Rのパターンに従う。
期待結果: 関数が$pieces、$edges、$adjacency、$metadataを含むリストを返す。
失敗時: generate_voronoi_pieces_internal()の返却構造と比較して、不足しているリスト要素や不正な型を特定する。
R/jigsawR_clean.Rを編集する:
valid_typesベクトルに"<type>"を追加"<type>" -> "<type>_")# In valid_types
valid_types <- c("rectangular", "hexagonal", "concentric", "voronoi", "snic", "<type>")
期待結果: generate_puzzle(type = "<type>")が「unknown type」エラーなく受け入れられる。
失敗時: タイプ文字列が正確なスペルでvalid_typesに追加されているか、パラメータ抽出が必要なタイプ固有引数をすべてカバーしているか確認する。
R/unified_piece_generation.Rを編集する:
generate_pieces_internal()にディスパッチケースを追加# In the switch/dispatch
"<type>" = generate_<type>_pieces_internal(params, seed)
期待結果: タイプがディスパッチされるとピースが生成される。
失敗時: ディスパッチケース文字列がタイプ名と正確に一致し、generate_<type>_pieces_internalがパズルモジュールから定義・エクスポートされているか確認する。
R/piece_positioning.Rを編集する:
新しいタイプの配置ディスパッチを追加する。ほとんどのタイプは共有配置ロジックを使用するが、カスタム処理が必要なものもある。
期待結果: apply_piece_positioning()が新しいタイプをエラーなく処理し、ピースが正しい座標に配置される。
失敗時: 新しいタイプにカスタム配置ロジックが必要か、共有配置パスを再利用できるか確認する。デフォルトパスが適用されない場合はディスパッチケースを追加する。
R/unified_renderer.Rを編集する:
render_puzzle_svg()にレンダリングケースを追加get_<type>_edge_paths()get_<type>_piece_name()期待結果: 正しいピース輪郭とエッジパスを持つ新しいタイプのSVG出力が生成される。
失敗時: get_<type>_edge_paths()が有効なSVGパスデータを返し、get_<type>_piece_name()が各ピースに一意の識別子を生成しているか確認する。
R/adjacency_api.Rを編集する:
get_neighbors()とget_adjacency()が新しいタイプで動作するようにネイバーディスパッチを追加する。
期待結果: get_neighbors(result, piece_id)がパズル内の任意のピースに対して正しいネイバーを返す。
失敗時: 隣接ディスパッチが正しいデータ構造を返しているか確認する。小さなグリッドでテストし、ジオメトリに対してネイバー関係を手動で検証する。
R/geom_puzzle.Rを編集する:
make_puzzle_layer()ファクトリーを使用してgeom_puzzle_<type>()を作成する:
#' @export
geom_puzzle_<type> <- function(mapping = NULL, data = NULL, ...) {
make_puzzle_layer(type = "<type>", mapping = mapping, data = data, ...)
}
期待結果: ggplot() + geom_puzzle_<type>(aes(...))がエラーなくレンダリングされる。
失敗時: make_puzzle_layer()が正しいタイプ文字列を受け取り、geom関数が@export経由でNAMESPACEにエクスポートされているか確認する。
R/stat_puzzle.Rを編集する:
compute_panel()にディスパッチケースを追加期待結果: statレイヤーがパズルジオメトリを正しく計算し、期待される数のポリゴンを生成する。
失敗時: compute_panel()ディスパッチケースが必要なカラム(x、y、group、piece_id)を含むデータフレームを返し、デフォルトパラメータが新しいタイプに適切か確認する。
DESCRIPTIONを編集する:
Suggests:に追加(外部依存がある場合)Collate:を更新して新しいRファイルを含める(アルファベット順)期待結果: devtools::document()が成功する。リストされていないファイルに関するNOTEがない。
失敗時: 新しいRファイルがCollate:フィールドにアルファベット順でリストされており、新しいSuggestsパッケージがバージョン制約とともに正しくスペルされているか確認する。
inst/config.ymlを編集する:
新しいタイプのデフォルトと制約を追加する:
<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
期待結果: 設定が有効なYAMLである。デフォルト値がgenerate_puzzle()で使用されたとき動作するパズルを生成する。
失敗時: yaml::yaml.load_file("inst/config.yml")でYAMLを検証する。デフォルトのgridとsize値が適切なパズルを生成するか確認する(小さすぎず大きすぎず)。
inst/shiny-app/app.Rを編集する:
期待結果: Shinyアプリのドロップダウンに新しいタイプが表示され、選択するとパズルが生成される。
失敗時: UIセレクターのchoices引数にタイプが追加されており、タイプ固有パラメータの条件付きパネルがconditionalPanel(condition = "input.type == '<type>'")を使用し、サーバーサイドハンドラーが正しいパラメータを渡しているか確認する。
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", { ... })
タイプが外部パッケージを必要とする場合、テストをskip_if_not_installed()でラップする。
期待結果: すべてのテストがパスする。外部依存が欠落していない限りスキップはない。
失敗時: 各統合ポイントを個別にチェックする。最も一般的な問題はディスパッチケースの欠落である — grep -rn "switch\|valid_types" R/を実行してすべてのディスパッチ場所を見つける。
generate_puzzle(type = "<type>")が有効な出力を生成するdevtools::test()が新しいテストでパスするdevtools::check()が0エラー、0警告を返すdevtools::document()が成功する(NAMESPACEが更新される)paste(a, b, sep = "-")で隣接キーを作成する際、負のピースラベルが"1--1"のようなキーを生成する。代わりに"|"セパレータを使用し、"\\|"で分割するcat()を使用: 常にcliパッケージのロギングラッパー(log_info、log_warnなど)を使用するyaml::yaml.load_file("inst/config.yml")でテストするgenerate-puzzle — スキャフォールド後に新しいタイプをテストするrun-puzzle-tests — 統合を検証するための完全なテストスイートを実行するvalidate-piles-notation — 新しいタイプでフュージョンをテストするwrite-testthat-tests — テスト記述の一般的なパターンwrite-roxygen-docs — 新しいgeom関数のドキュメントを作成する