AgentStack
Browse Sign in
Browse Why AgentStack Sell Docs
Sign in
SKILL verified MIT Self-run

Instantiate Asset Pack

skill-summerengine-summer-engine-agent-instantiate-asset-pack · by SummerEngine

Use when the user wants to import or spawn an entire asset pack (the multi-slice ArtAsset produced by `create-asset-sheet`) into the current scene — not a single slice, the whole pack. Reads the pack's per-slice metadata (zOrder, isComposite, parentSliceIndex, widget, bbox), groups composites, sorts children by paint order, and emits the Sprite2D / Node2D / NinePatchRect ops to lay it out correct…

No reviews yet
0 installs
6 views
0.0% view→install

Install

$ agentstack add skill-summerengine-summer-engine-agent-instantiate-asset-pack

✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.

Security review

✓ Passed

No issues found. Passed automated security review. · v0.1.0 How review works →

  • Prompt-injection patterns
  • Secret / credential exfiltration
  • Dangerous shell & filesystem operations
  • Untrusted network calls
  • Known-malicious package signatures

What it can access

  • Network access No
  • Filesystem access No
  • Shell / process execution No
  • Environment & secrets No
  • Dynamic code execution No

From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.

View the full security report →

Verified badge

Passed review? Show it. Paste this badge into your README, it links to the public security report.

AgentStack Verified badge Links to your public security report.
[![AgentStack Verified](https://agentstack.voostack.com/badges/verified.svg)](https://agentstack.voostack.com/security/report/skill-summerengine-summer-engine-agent-instantiate-asset-pack)

Reliability & compatibility

Security review passed
0 installs to date
no reviews yet
1mo ago

Declared compatibility

Claude CodeClaude Desktop

Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.

Preview Execution monitoring

We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.

How agent discovery & health will work →
Are you the author of Instantiate Asset Pack? Claim this listing to set pricing, connect Stripe payouts, and keep 70% of every sale.
Sign up to claim

About

instantiate-asset-pack — Instantiate Asset Pack into Scene

A pack ArtAsset (produced by summer:2d-assets/create-asset-sheet) is a bundle of cropped slice PNGs with per-slice metadata. This skill is the runtime side: given a pack, lay its slices into the current scene as a correctly-grouped, correctly-layered set of nodes.

For wiring individual widget slices (9-slice panels, progress bars, toggles), this skill delegates to summer:2d-assets/use-widget-asset. This skill handles the pack-level layout: grouping composites, paint order, spatial offset, naming.

When to use

  • "Import the dungeon UI pack."
  • "Spawn the settings panel from that asset sheet I just made."
  • "Bring the whole biome pack into this scene."
  • "Add the card frame composite from pack X."
  • User has a pack ArtAsset in their library and wants it placed in the scene, not just imported as files.

When NOT to use

  • User wants a single slice → import it directly as a Sprite2D (or summer:2d-assets/use-widget-asset if it's a UI widget).
  • User wants to generate a new pack → summer:2d-assets/create-asset-sheet.
  • User wants to apply a slice as a material/texture on a 3D mesh → not the pack flow; see asset_pipeline.json.

Pack JSON shape

Full schema: publicsummerengine/public/knowledge/asset_pack_schema.json.

The per-slice fields this skill cares about:

| Field | Used for | |---|---| | name | Node name | | url | Texture path (after summer_import_from_url) | | bbox | Spatial offset of composite children relative to parent | | zOrder | z_index on the Sprite2D; sort children by this ascending | | isComposite | Filter out parent slices (flat previews, not runtime assets) | | parentSliceIndex | Group children to their composite parent | | pairWith | Toggle ON/OFF pair link | | widget | Wrap in NinePatchRect / TextureProgressBar via use-widget-asset | | category | Decide wrapper type — ui → Control tree, else Node2D/Sprite2D |

Legacy fallback: slice.zOrder ?? slice.layerIndex ?? packFileIndex, slice.isComposite ?? slice.isReference ?? false. packFileIndex is the iteration counter when looping packFiles[], not a stored field.

Standalone child slice

A standalone slice has no parentSliceIndex and isn't a composite parent. Spawn as a single Sprite2D:

  1. Import the slice URL via summer_import_from_url to get a res:// path.
  2. summer_add_node — type Sprite2D, name slice.name.
  3. summer_set_proptexture = res://....
  4. If slice.zOrder is set, summer_set_propz_index = slice.zOrder.

If the slice has a widget field, hand off to summer:2d-assets/use-widget-asset after step 1.

Composite parent + children

A composite parent (isComposite: true) is the flat preview the wizard made of the assembled panel. Do not spawn it. Its children — slices whose parentSliceIndex points back at it — are the real runtime assets.

Recipe:

  1. Skip the parent. Filter out isComposite: true slices unless the user asked for the flat preview.
  2. Group children. Collect every slice whose parentSliceIndex matches this parent's index.
  3. Sort children by zOrder ascending. Lower zOrder renders behind. Use the legacy fallback chain.
  4. Spawn a Node2D parent named after the composite parent's name (e.g. settings_panel).
  5. For each child, in sorted order:
  • Import child.urlres:// path.
  • summer_add_node Sprite2D under the Node2D, name = child.name.
  • summer_set_proptexture = res://....
  • summer_set_propz_index = child.zOrder.
  • summer_set_propposition = Vector2(child.bbox.x - parent.bbox.x, child.bbox.y - parent.bbox.y).
  1. Apply widget post-processing to any child with a widget field — see next section.

Widget post-processing

When a child slice has widget.kind set, the bare Sprite2D is not the right node. Replace or wrap it per the widget mapping:

| widget.kind | Node | Mapping | |---|---|---| | panel, button | NinePatchRect | frameMargins[0..3]patch_margin_left/top/right/bottom | | progress_bar | TextureProgressBar | fillRectstretch_margin_*; orientationfill_mode | | slider | HSlider/VSlider + NinePatchRect track | track uses frameMargins; slider sits on top | | toggle | TextureRect | Swap texture between this slice and packFiles[pairWith].url |

Delegate the actual wiring (percentage-to-pixel conversion, node-specific props) to summer:2d-assets/use-widget-asset. This skill places the node; that skill configures the geometry.

Naming convention

  • slice.name is canonical. The wizard's classifier produces snake_case names (play_button, health_bar_fill, settings_panel). Use as the node name verbatim.
  • If the user said "name them with prefix X" (e.g. "prefix everything with hud_"), prepend: hud_play_button.
  • Composite parent's name becomes the Node2D wrapper name.
  • If a name collides with an existing node in the scene, suffix _1, _2, etc. Do not silently overwrite.

Examples

Example 1 — Standalone slice import

Pack has one non-composite slice, crate_wooden, no widget metadata. Place it at scene origin:

{
  "ops": [
    {
      "op": "AddNode",
      "parent": ".",
      "type": "Sprite2D",
      "name": "crate_wooden"
    },
    {
      "op": "SetProp",
      "path": "./crate_wooden",
      "key": "texture",
      "value": "res://assets/images/crate_wooden.png"
    },
    {
      "op": "SetProp",
      "path": "./crate_wooden",
      "key": "position",
      "value": "Vector2(0, 0)"
    },
    { "op": "SaveScene" }
  ]
}

Example 2 — Composite panel with three children

Pack has a composite parent settings_panel (filtered out) plus three children:

  • panel_bg — zOrder 0, bbox offset (0, 0), widget.kind = panel, frameMargins present
  • apply_button — zOrder 1, bbox offset (40, 120), widget.kind = button, frameMargins present
  • close_icon — zOrder 2, bbox offset (220, 8), no widget
{
  "ops": [
    {
      "op": "AddNode",
      "parent": ".",
      "type": "Node2D",
      "name": "settings_panel"
    },
    {
      "op": "AddNode",
      "parent": "./settings_panel",
      "type": "NinePatchRect",
      "name": "panel_bg"
    },
    {
      "op": "SetProp",
      "path": "./settings_panel/panel_bg",
      "key": "texture",
      "value": "res://assets/images/panel_bg.png"
    },
    {
      "op": "SetProp",
      "path": "./settings_panel/panel_bg",
      "key": "z_index",
      "value": 0
    },
    {
      "op": "SetProp",
      "path": "./settings_panel/panel_bg",
      "key": "position",
      "value": "Vector2(0, 0)"
    },
    {
      "op": "AddNode",
      "parent": "./settings_panel",
      "type": "NinePatchRect",
      "name": "apply_button"
    },
    {
      "op": "SetProp",
      "path": "./settings_panel/apply_button",
      "key": "texture",
      "value": "res://assets/images/apply_button.png"
    },
    {
      "op": "SetProp",
      "path": "./settings_panel/apply_button",
      "key": "z_index",
      "value": 1
    },
    {
      "op": "SetProp",
      "path": "./settings_panel/apply_button",
      "key": "position",
      "value": "Vector2(40, 120)"
    },
    {
      "op": "AddNode",
      "parent": "./settings_panel",
      "type": "Sprite2D",
      "name": "close_icon"
    },
    {
      "op": "SetProp",
      "path": "./settings_panel/close_icon",
      "key": "texture",
      "value": "res://assets/images/close_icon.png"
    },
    {
      "op": "SetProp",
      "path": "./settings_panel/close_icon",
      "key": "z_index",
      "value": 2
    },
    {
      "op": "SetProp",
      "path": "./settings_panel/close_icon",
      "key": "position",
      "value": "Vector2(220, 8)"
    },
    { "op": "SaveScene" }
  ]
}

After this, hand panel_bg and apply_button to summer:2d-assets/use-widget-asset to set patch_margin_* from their widget.frameMargins.

Note the ops format: position is the Godot string "Vector2(0, 0)", not a JSON object. z_index is a bare integer. This is the format Summer Engine expects — see the publicsummerengine CLAUDE.md.

Failure modes

  • Old pack with no zOrder. Fall back to slice.zOrder ?? slice.layerIndex ?? packFileIndex. packFileIndex is the iteration counter when looping packFiles[] (not a persisted field). If even layerIndex is missing (very old pack), iteration order is the only signal — accept it.
  • Old pack with no isComposite. Fall back to slice.isComposite ?? slice.isReference ?? false. If both are missing on every slice, treat the whole pack as standalone — no compositing, every slice spawns at origin as its own Sprite2D.
  • Composite parent with no children in the pack. The composite preview is the only thing the user has — render the parent as a regular Sprite2D (do not filter it out in this case).
  • Child references a parent that's missing. Treat the child as standalone. Spawn at Vector2(0, 0) with its own zOrder.
  • Widget with no frameMargins. The vision detector said kind: 'panel' but didn't emit margins. Render as TextureRect (or Sprite2D if outside a Control tree) and skip 9-slice. Do not invent margins.
  • Name collision in scene. Suffix _1, _2, etc. Never overwrite an existing node.
  • Slice URL fails to import. summer_import_from_url returns an error — skip that slice, log a warning, continue with the rest. Do not abort the whole pack.

Related skills

  • summer:2d-assets/create-asset-sheet — production side; how the pack was made.
  • summer:2d-assets/use-widget-asset — wiring an individual widget slice (NinePatchRect, TextureProgressBar geometry).
  • asset_pipeline.json — broader find-or-generate -> import -> apply flow.

Source & license

This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.

Install and usage instructions live in the source repository linked above.

Reviews

No reviews yet, be the first.

Versions

  • v0.1.0 Imported from the upstream source.