Summer Board Types logo

Summer Board Types

Organization
SummerEngine
summer-board-types

Define and reuse types on a Summer Board (Character, Level, Item) so ideas become typed cards: read the board's types first, reuse before you define.

Overview

PublisherSummerEngine
Repositorysummer
Skill namesummer-board-types
Stars
91
Forks
8
Bundled files
1
LicenseMIT
Links
  • Markdown instructions

    A SKILL.md file the model loads on demand, so it only costs tokens when a request actually matches.

  • Works with any LLM

    AI skills are plain Markdown, not provider-specific code, so this works with GPT, Claude, Gemini, Grok, or a local model.

  • 1 bundled files

    Scripts, templates, and references the model can read while it works. Files are read-only and never executed.

  • Open source

    Published by SummerEngine on GitHub. Read the source before you install it.

Installation

Install the Summer Board Types AI skill in TypingMind to use it with any LLM, or drop it into another agent that reads SKILL.md.

1

Install in TypingMind

TypingMind installs a skill straight from its GitHub folder — it reads SKILL.md, bundles the resource files, and stores the result locally.

  1. Open the app and go to Plugins → Skills.
  2. Choose "Install from GitHub".
  3. Paste the skill folder URL below and confirm.
    https://github.com/SummerEngine/summer/tree/main/library/skills/summer-board-types
  4. Enable the skill in any chat where you want it available.
Plugins → Skills → Add skill → From GitHub URL, then paste the folder URL and press Continue.
2

Install in another agent

Any agent that reads the Agent Skills format can use this skill — copy the folder into that agent's skills directory.

Claude Code — .claude/skills
git clone --depth 1 https://github.com/SummerEngine/summer.git /tmp/summer
mkdir -p .claude/skills
cp -r /tmp/summer/library/skills/summer-board-types .claude/skills/summer-board-types
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable Summer Board Types in any TypingMind chat and the model takes it from there. Its name and description sit in the system prompt, and the moment a request matches, the model loads the full instructions itself — you never invoke it by hand, and it costs no tokens until it is actually used.

The model loads Summer Board Types on its own as soon as a request matches it.

Works with any AI model

AI skills are plain Markdown instructions rather than provider-specific code, so Summer Board Types is not tied to the model it was written for. Install it once in TypingMind and use it with GPT-5, Claude, Gemini, Grok, DeepSeek, Mistral, Llama, or a local model you run yourself — all on your own API keys.

  • Loaded only when it is needed

    The system prompt carries just the name and description. The instructions are fetched on the first matching request, so an idle skill costs nothing.

  • Switch models mid-chat

    Because the skill is instructions rather than code, changing model does not break it — the next model reads the same SKILL.md.

Skill instructions

This is the SKILL.md content the model loads. Read it before installing — a skill is instructions your model will follow.

Types on the Summer Board

A type says what a kind of thing on the board is: a Character has a name, a role and hp; a Level has a theme and a boss. A card is one thing of a type, drawn in its type's colour. People list cards by type, turn them into tasks, and the game loads them as data. One board has at most 30 types, shared by every person and agent on it.

How many types and which fields: read summer-board-modeling first. This skill is how to define them without making a mess.

1. Read before you define

board.types {gameId, agent, action: "list"}   -> every type, its properties, how many cards

Always, even if you read the board a minute ago: another agent may have defined one since.

Then decide in this order, and stop at the first that fits:

  1. A type already holds it. Use it as it is.
  2. A type almost holds it. Extend it: add the field you need (section 3).
  3. It is a kind of an existing type. An enemy is a Character with role: "enemy". Add a value to the choice, not a new type.
  4. Nothing holds it, and summer-board-modeling says it earns a type. Define it.

Names that mean the same thing are the same type: Enemy, Monster, Foe, Mob, Creature, NPC are all Character with a role. Level, Map, Stage, Area, Zone are one type: use the word the board already uses.

2. Define a type

The type is a JSON Schema, a small flat subset:

board.types {gameId, agent, action: "define", schema: {
  "title": "Character",
  "description": "Anyone the player meets or plays.",
  "x-color": "amber", "x-icon": "user",
  "type": "object",
  "properties": {
    "name":    { "type": "string" },
    "role":    { "enum": ["hero", "npc", "enemy", "boss"] },
    "hp":      { "type": "integer", "minimum": 1 },
    "look":    { "type": "string", "description": "One line the art pipeline uses" },
    "faction": { "type": "string", "x-ref": "Faction" },
    "drops":   { "type": "array", "items": { "type": "string", "x-ref": "Item" } }
  },
  "required": ["name", "role"]
}}
  • Name: singular, one or two words, capitalised: Character, Level, Weapon, QuestStep. Not Characters, character_list, GameCharacter.
  • Property keys: lower snake case, plain words: hp, move_speed, unlock_level.
  • Property kinds: string, number, integer, boolean, enum (a choice), and arrays of those. Nothing nested: a nested thing is a type of its own, linked with x-ref. oneOf, $ref, pattern and default are refused with what to write instead; $schema and additionalProperties are fine and ignored.
  • x-ref: "Faction": the value is the id of a Faction card. Use it for every link between things, so the board draws the link and the game gets a real reference. The linked type must exist first: define Faction before a Character that points at it, or add the field to Character once Faction exists.
  • description: one line, on the type and on any property whose meaning or unit is not obvious ("metres per second").
  • How it shows (x-show, optional): a card lays its fields out by kind: the first plain text field becomes the line under the name, choices and true-or-false are pills, a number with minimum and maximum is a bar, other numbers are stat chips, links are chips of the linked card, other text is short lines. Set x-show only to change that: title, tag, health (needs a maximum), stat, link, picture (a board file's url, from board.upload; a list is a gallery), text, or hidden (table only). Give the field you want under the name x-show: "title", and a health-like number a maximum.
  • required: only what a card is useless without. Usually name and one or two more. name is always there; the board adds it if you leave it out.
  • x-color, x-icon: optional. Leave them out and the board picks. Never change another type's colour.

The answer lists every type again, with one line per field (fields). If the board refuses the name as too close to an existing type (Enemies next to Enemy, a typo), it names that type: use it (section 1), do not invent a third spelling.

3. Change a type

define with an existing name replaces it. Before you change a type someone else made, check the cards it affects:

  • Adding a property or a choice value is always fine. Do it.
  • Removing a property or a choice value, or tightening minimum/maximum: the answer says how many cards it affects. If any, ask in one board.post first (kind: "proposal") unless the person asked for it.
  • Renaming: board.types {action: "rename", name: "Map", to: "Level"} or {action: "rename", name: "Character", property: "health", to: "hp"}. Renames rewrite every card and link; never rename by defining a second type.

Cards are never rejected for drifting from their type. They show issues (a missing required field, a choice value the type dropped) on the card and in reads. Fix the issues on cards you made after you change a type.

4. Merging and deleting

Merging moves every card of one type into another; it changes people's work, so ask first. When you see two types that mean one thing:

board.post {gameId, agent, kind: "proposal", items: [one card of each],
  body: "Monster and Enemy look like one type. Merge Monster into Enemy? Monster's 'danger' would become a new field on Enemy."}

Only after a person says yes:

board.types {gameId, agent, action: "define", schema: <Enemy with danger added>}   -> so no value is left behind
board.types {gameId, agent, action: "merge", from: "Monster", into: "Enemy"}

The answer lists values the target type has no field for (unmapped); they stay on the cards as issues. Links to Monster now point at Enemy. Never copy cards from one type to another by hand.

board.types {action: "delete", name} removes a type with no cards that no other type links to. A type with cards is merged, not deleted.

5. Cards

board.canvas {gameId, agent, items: [                                          -> many at once, all or none
  {itemId: "frame-cast", kind: "frame", title: "Cast", x: 0, y: 0, w: 1100, h: 400},
  {itemId: "c-knight", kind: "card", type: "Character", props: {name: "Ember Knight", role: "boss"}, at: {in: "frame-cast"}},
  {itemId: "c-fox", kind: "card", type: "Character", props: {name: "Fox", role: "hero", rival: "c-knight"}, at: {in: "frame-cast"}}]}
board.canvas {gameId, agent, action: "update", itemId, props: {hp: 1200}}       -> merges; null removes a field
board.query  {gameId, agent, type: "Character", where: {role: "boss"}}          -> rows with issues and task
  • Make many cards with one items call (up to 100). Give each your own itemId: links can then name cards in the same call, even ones further down the list.
  • Place with at instead of x and y: {in: frame or card} takes the next free slot of a grid (the frame grows to fit), {right | below | left | above: item} goes beside an item and skips past whatever is there.
  • One card is one thing. Its name, fields and main picture are on the card. More pictures and free notes about it go on top of the card: whatever lies on a card belongs to it (moves, copies and deletes with it), and board.read lists them as the card's attached items. Make the card big enough to hold them.
  • Picture: upload with board.upload, then pass the url.
  • Links: set the x-ref field to the other card's id. Do not also draw an arrow; the board draws links from the values.
  • Lay cards of a type out together, in a frame named after the topic (summer-board 7b).

6. Cards are tasks

A card becomes a task like any item, titled "Character: Ember Knight":

board.task {gameId, agent, fromItem: <card id>, owner: <your address>}
board.status {gameId, agent, doing: "Rigging Ember Knight", taskId}

The card shows who owns it, its status and your doing line. Mark it done with a note saying where the result is. To find open work of a type: board.query {type: "Level", status: "open"}.

7. Before you say it is done

  • board.types {action: "list"}: no two types mean one thing, no type with fewer than 3 cards unless the person wants it.
  • board.query each type you touched: no issues left on your cards.

From a shell

No Summer MCP tools in this session? Run each one as a command; when summer --version is missing or below 4.0, use npx -y summer-engine@latest in place of summer. Fields are flags in kebab-case (--scene-path res://main.tscn) or one --input '<json>', and summer ops describe <op> prints the exact input. The summer-cli skill has the rest.

In this skillCommand
summer_searchsummer ops search "<what you want>"

Bundled files

The model reads these on demand while the skill is loaded. They are exposed as readable files and are never executed.

Frequently asked questions

What does the Summer Board Types AI skill do?

Define and reuse types on a Summer Board (Character, Level, Item) so ideas become typed cards: read the board's types first, reuse before you define.

Why use Summer Board Types on TypingMind?

Because you install it once and use it with any model. Summer Board Types is plain Markdown rather than provider-specific code, so the same skill runs on GPT-5, Claude, Gemini, Grok, or a local model — and you can switch model mid-chat without it breaking. TypingMind runs on your own API keys, so you pay providers directly instead of a per-seat subscription, and your skills and chats stay in your own storage.

How do I install Summer Board Types in TypingMind?

Open Plugins → Skills → Install from GitHub in TypingMind and paste https://github.com/SummerEngine/summer/tree/main/library/skills/summer-board-types. TypingMind reads its SKILL.md and bundles its files and installs it as a skill you can enable per chat.

Which AI models can use Summer Board Types?

Any model you connect in TypingMind. AI skills are plain Markdown instructions rather than provider-specific code, so GPT, Claude, Gemini, Grok, and local models can all load this skill when a request matches it.

How many AI models can I use with Summer Board Types?

As many as you like. As long as a model supports skills, you can use Summer Board Types with it — GPT, Claude, Gemini, Grok, DeepSeek, Mistral, Llama and more — all on TypingMind with your own API keys.

Is the Summer Board Types AI skill free?

Yes. It is published on GitHub by SummerEngine under the MIT license. You only pay your own AI provider for the tokens you use.

What are AI skills?

An AI skill is a reusable instruction bundle that teaches an AI model how to do one specific task. It follows the open Agent Skills format: a SKILL.md file with a name and description, plus any scripts, templates or reference files the model may need. The model reads the instructions only when your request matches the skill, so an installed skill costs nothing until it is used.

How are AI skills different from plugins or MCP servers?

A plugin or MCP server gives a model new tools to call — code that runs somewhere and returns a result. An AI skill gives the model knowledge and process instead: how to approach a task, which steps to follow, what good output looks like. Skills are plain Markdown, so they need no server, no API key and no runtime, and they work with any model.

View all

Set up your own AI workspace now

Get notified about new features and future giveaways by subscribing to our newsletter 👇