container
npx skills add https://github.com/simhacker/moollm --skill container
Agent 安装分布
Skill 文档
Container
Intermediate scopes that provide inheritance without being navigable rooms.
Containers are directories that define shared properties for their children, without themselves being places you can “go to.”
The OpenLaszlo Inspiration
In OpenLaszlo (Don Hopkins’ earlier work!), <node> was a fundamental building block:
<!-- OpenLaszlo: <node> provides inheritance without visual layout -->
<node name="mazeDefaults">
<attribute name="isDark" value="true"/>
<attribute name="hasDanger" value="true"/>
</node>
<view extends="mazeDefaults">
<!-- Inherits isDark, hasDanger -->
</view>
MOOLLM’s CONTAINER.yml does the same for adventure directories:
# maze/CONTAINER.yml
container:
name: "The Twisty Maze"
inherits:
is_dark: true
is_dangerous: true
grue_rules:
can_appear: true
All rooms inside maze/ automatically inherit these properties!
Container vs Room vs Meta
| Type | File | Navigable? | Inherits to children? |
|---|---|---|---|
| Room | ROOM.yml |
â Yes | â No |
| Container | CONTAINER.yml |
â No | â Yes |
| Meta | .meta.yml |
â No | â No (just metadata) |
Use Container when:
- You want to define shared properties
- Children should inherit automatically
- The directory itself is not a place
Use Room when:
- The directory is a navigable location
- It has exits and can be entered
Use .meta.yml when:
- Just declaring “this is a system directory”
- No inheritance needed
Inheritance Rules
Cascade Down
Properties in inherits: flow to ALL descendants:
maze/
âââ CONTAINER.yml # inherits: { is_dark: true }
âââ room-a/
â âââ ROOM.yml # Inherits is_dark: true
âââ room-b/
â âââ ROOM.yml # Inherits is_dark: true
âââ deep/
âââ CONTAINER.yml # Can add MORE inherits
âââ room-c/
âââ ROOM.yml # Inherits from BOTH containers!
Override by Redefining
Children can override inherited values:
# maze/room-f/ROOM.yml
room:
name: "The Treasure Chamber"
is_dark: false # Override! This room has magical light
Merge, Don’t Replace
For objects and arrays, inheritance MERGES:
# maze/CONTAINER.yml
container:
inherits:
rules:
- "Grues patrol in darkness"
# maze/room-g/ROOM.yml
room:
rules:
- "This room has a pit trap" # ADDS to inherited rules
Result: room-g has BOTH rules.
Defaults vs Inherits
| Field | Purpose |
|---|---|
inherits |
Properties that children GET automatically |
defaults |
Values to use IF a child doesn’t define them |
container:
# Every child room IS dark (forced)
inherits:
is_dark: true
# If a room doesn't define atmosphere, use this
defaults:
room:
atmosphere: "damp and musty"
Use Cases
Maze with Grue Rules
# maze/CONTAINER.yml
container:
name: "The Twisty Maze"
description: "Passages all alike... or are they?"
inherits:
is_dark: true
is_dangerous: true
grue_rules:
can_appear: true
safe_with_light: true
rules:
- "No teleportation"
- "Breadcrumbs disappear after 3 turns"
- "Echoes alert nearby rooms"
ambient:
sound: "dripping water"
smell: "wet stone"
temperature: cold
Animal Character Category
# characters/animals/CONTAINER.yml
container:
name: "Animal Characters"
description: "Non-human beings with souls"
inherits:
type: animal
has_instincts: true
defaults:
character:
can_speak_human: false
pet_able: true
diet: omnivore
Kitchen Appliances
# kitchen/appliances/CONTAINER.yml
container:
name: "Kitchen Appliances"
inherits:
type: appliance
requires_power: true
defaults:
object:
breakable: true
fixable_with: "wrench"
Resolution Order
When looking up a property:
- Self â Check the object/room itself
- Parent Container â Check
CONTAINER.ymlin parent dir - Grandparent Container â Keep going up
- Adventure Defaults â
ADVENTURE.ymldefaults - Prototype â The skill template
maze/deep/room-c/ROOM.yml
â inherits from
maze/deep/CONTAINER.yml
â inherits from
maze/CONTAINER.yml
â inherits from
ADVENTURE.yml (if it has defaults)
â inherits from
skills/room/ROOM.yml.tmpl
Linter Behavior
The linter recognizes CONTAINER.yml:
ð Phase 1: Discovery
Found: 36 rooms, 54 objects, 6 characters
Found: 2 containers # NEW!
Containers suppress the “missing type declaration” warning:
# Before: maze/ triggers warning
â ï¸ Directory has room children but no ROOM.yml
# After: maze/CONTAINER.yml exists
â
maze/ is a container (not a room)
Related Patterns
- Prototype Inheritance (Self/JavaScript) â Objects inherit from prototypes
- Lexical Scope (Lisp/JavaScript) â Inner scopes access outer variables
- Cascading (CSS) â Styles flow from parent to child
- XML Namespaces â Context flows through the tree
Credits
- OpenLaszlo â The
<node>element as non-visual scope - Self â Prototype inheritance without classes
- CSS â The cascade as inheritance mechanism
- Don Hopkins â For remembering OpenLaszlo! ð