with one click
Schema and rules for creating triggers
npx skills add https://github.com/nikolaj-lat/World-Puppeteer --skill triggersCopy and paste this command into Claude Code to install the skill
Schema and rules for creating triggers
npx skills add https://github.com/nikolaj-lat/World-Puppeteer --skill triggersCopy and paste this command into Claude Code to install the skill
| name | triggers |
| description | Schema and rules for creating triggers |
| context | fork |
| agent | triggers |
Edit tabs/triggers.json.
| Field | Requirement |
|---|---|
name | Must match object key exactly |
conditions | Array of TriggerCondition objects (see format below) |
effects | Array of TriggerEffect objects (see format below) |
| Field | When to Include |
|---|---|
recurring | Set to true only when trigger should fire every turn conditions are met |
script | Only when declarative conditions/effects can't express the logic (branching, derived math, cross-trigger coordination). See trigger-scripts-reference.md |
Omit these fields (auto-set or unused):
embeddingId (auto-generated for semantic conditions)All conditions in a trigger must pass for effects to fire.
| Type | Description | Required Fields |
|---|---|---|
story | Query matches recent story narrative | query |
action | Query matches player's current action | query |
Format: { type: 'story' | 'action', query: 'natural language description' }
String conditions (party-realm, party-region, party-location, party-area, story-text, action-text):
{ type: '...', operator: 'equals' | 'notEquals' | 'contains' | 'notContains' | 'regex', value: 'string' }
Number conditions (player-level, game-tick, player-resource):
{ type: '...', operator: 'equals' | 'notEquals' | 'greaterThan' | 'lessThan' | 'greaterThanOrEqual' | 'lessThanOrEqual', value: number }
// For player-resource, also include: resource: 'resourceName'
Boolean conditions (known-entity):
{ type: 'known-entity', operator: 'equals' | 'notEquals', value: boolean, entity: 'entityName' }
Array conditions (player-traits, quests-completed):
{ type: '...', operator: 'contains' | 'notContains', value: 'string' }
Read conditions (read-string, read-number, read-boolean, read-array):
{ type: '...', key: 'triggerWritableKey', operator: '...', value: '...' }
{ type: 'story', instruction: 'Text injected into story generation' }
{ type: 'quest-progress', questId: 'questKey' } // Marks objective complete
{ type: 'quest-init', operator: 'set', value: 'Quest Name' } // Makes quest available
{ type: 'party-realm' | 'party-region' | 'party-location' | 'party-area', operator: 'set', value: 'name' }
{ type: 'player-resource', resource: 'resourceName', operator: 'set' | 'add' | 'subtract' | 'multiply' | 'divide', value: number }
{ type: 'known-entity', entity: 'entityName', operator: 'set' | 'toggle', value?: boolean }
{ type: 'player-traits', operator: 'set' | 'add' | 'remove', value: 'traitName' | ['trait1', 'trait2'] }
{ type: 'write-string' | 'write-number' | 'write-boolean' | 'write-array', key: 'keyName', operator: '...', value: '...' }
Triggers evaluate in exactly one phase based on conditions:
Has action or action-text condition? | Phase |
|---|---|
| Yes | Planning (before story) |
| No | State (after story) |
story effects on tick 0 do NOT affect initial story. Use storyStart text or tick 1+ triggersrecurring: true, triggers fire only once everinterface Trigger {
name: string
conditions: TriggerCondition[]
effects: TriggerEffect[]
recurring?: boolean
}
For detailed documentation, see triggers-reference.md.
Schema and rules for creating abilities
Schema and rules for editing AI instructions
Check character counts and limits for Voyage World config files. Use when checking how much space is used, before adding large content, or when approaching size limits.
Schema and rules for creating locations
Schema and rules for creating NPCs
Schema and rules for creating regions