@nodetool-ai/agents 0.8.4-a24.3 → 0.8.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.nodetool-build-stamp +1 -1
- package/dist/_skills/LICENSE-iart-motion-design-skills +21 -0
- package/dist/_skills/README.md +211 -0
- package/dist/_skills/api-agents/SKILL.md +58 -0
- package/dist/_skills/api-apps/SKILL.md +54 -0
- package/dist/_skills/api-assets/SKILL.md +66 -0
- package/dist/_skills/api-collections/SKILL.md +33 -0
- package/dist/_skills/api-games/SKILL.md +81 -0
- package/dist/_skills/api-media/SKILL.md +131 -0
- package/dist/_skills/api-memory/SKILL.md +72 -0
- package/dist/_skills/api-models/SKILL.md +78 -0
- package/dist/_skills/api-scripts/SKILL.md +79 -0
- package/dist/_skills/api-settings/SKILL.md +49 -0
- package/dist/_skills/api-sketches/SKILL.md +61 -0
- package/dist/_skills/api-storyboards/SKILL.md +94 -0
- package/dist/_skills/api-timelines/SKILL.md +151 -0
- package/dist/_skills/api-web/SKILL.md +57 -0
- package/dist/_skills/api-workflows/SKILL.md +123 -0
- package/dist/_skills/beat-sync-editing/SKILL.md +208 -0
- package/dist/_skills/caption-titles/SKILL.md +94 -0
- package/dist/_skills/color-motion/SKILL.md +185 -0
- package/dist/_skills/commercial-beat-sheet/SKILL.md +338 -0
- package/dist/_skills/elevenlabs-audio-prompting/SKILL.md +163 -0
- package/dist/_skills/explainer-storyboard/SKILL.md +63 -0
- package/dist/_skills/flux-2-klein-prompting/SKILL.md +107 -0
- package/dist/_skills/frame-composition/SKILL.md +291 -0
- package/dist/_skills/game-direction/SKILL.md +99 -0
- package/dist/_skills/gpt-image-2-prompting/SKILL.md +161 -0
- package/dist/_skills/hailuo-prompting/SKILL.md +107 -0
- package/dist/_skills/kling-video-prompting/SKILL.md +188 -0
- package/dist/_skills/launch-commercial/SKILL.md +267 -0
- package/dist/_skills/launch-kit/SKILL.md +120 -0
- package/dist/_skills/logo-reveal/SKILL.md +225 -0
- package/dist/_skills/manimgx/SKILL.md +123 -0
- package/dist/_skills/minimax-h3-prompting/SKILL.md +134 -0
- package/dist/_skills/motion-ad/SKILL.md +281 -0
- package/dist/_skills/motion-background/SKILL.md +145 -0
- package/dist/_skills/motion-curves/SKILL.md +302 -0
- package/dist/_skills/motion-direction/SKILL.md +259 -0
- package/dist/_skills/motion-graphics/SKILL.md +217 -0
- package/dist/_skills/motion-principles/SKILL.md +255 -0
- package/dist/_skills/music-video-treatment/SKILL.md +40 -0
- package/dist/_skills/nano-banana-pro-prompting/SKILL.md +133 -0
- package/dist/_skills/native-game/SKILL.md +310 -0
- package/dist/_skills/native-game-reference/SKILL.md +879 -0
- package/dist/_skills/nodetool-3d-scene/SKILL.md +110 -0
- package/dist/_skills/nodetool-api-reference/SKILL.md +338 -0
- package/dist/_skills/nodetool-app-builder/SKILL.md +291 -0
- package/dist/_skills/nodetool-browser-agent/SKILL.md +119 -0
- package/dist/_skills/nodetool-chat-cli/SKILL.md +184 -0
- package/dist/_skills/nodetool-custom-node-developer/SKILL.md +294 -0
- package/dist/_skills/nodetool-deployment/SKILL.md +195 -0
- package/dist/_skills/nodetool-js-scripting/SKILL.md +223 -0
- package/dist/_skills/nodetool-model-provider-config/SKILL.md +348 -0
- package/dist/_skills/nodetool-rag-indexing/SKILL.md +153 -0
- package/dist/_skills/nodetool-sketch/SKILL.md +138 -0
- package/dist/_skills/nodetool-skill-author/SKILL.md +125 -0
- package/dist/_skills/nodetool-troubleshooter/SKILL.md +370 -0
- package/dist/_skills/nodetool-video-post/SKILL.md +149 -0
- package/dist/_skills/nodetool-workflow-builder/SKILL.md +295 -0
- package/dist/_skills/product-commercial/SKILL.md +132 -0
- package/dist/_skills/qwen-image-prompting/SKILL.md +122 -0
- package/dist/_skills/script-video/SKILL.md +106 -0
- package/dist/_skills/seedance-2-prompting/SKILL.md +194 -0
- package/dist/_skills/seedream-prompting/SKILL.md +117 -0
- package/dist/_skills/short-film/SKILL.md +123 -0
- package/dist/_skills/stable-audio-prompting/SKILL.md +130 -0
- package/dist/_skills/storyboard-core/SKILL.md +716 -0
- package/dist/_skills/timeline-edit-ops/SKILL.md +736 -0
- package/dist/_skills/trailer-template/SKILL.md +291 -0
- package/dist/_skills/ugc-video/SKILL.md +186 -0
- package/dist/_skills/veo-3-prompting/SKILL.md +140 -0
- package/dist/_skills/video-audio-continuity/SKILL.md +90 -0
- package/dist/_skills/video-clone/SKILL.md +96 -0
- package/dist/_skills/video-workflow/SKILL.md +119 -0
- package/dist/_skills/wan-2-6-prompting/SKILL.md +107 -0
- package/dist/app-build/bridge.d.ts.map +1 -1
- package/dist/app-build/bridge.js +44 -17
- package/dist/app-build/bridge.js.map +1 -1
- package/dist/capabilities/apps.d.ts.map +1 -1
- package/dist/capabilities/apps.js +55 -13
- package/dist/capabilities/apps.js.map +1 -1
- package/dist/capabilities/apps.specs.d.ts.map +1 -1
- package/dist/capabilities/apps.specs.js +5 -3
- package/dist/capabilities/apps.specs.js.map +1 -1
- package/dist/capabilities/game-asset-browser.d.ts.map +1 -1
- package/dist/capabilities/game-asset-browser.js +6 -1
- package/dist/capabilities/game-asset-browser.js.map +1 -1
- package/dist/capabilities/game.d.ts +1 -1
- package/dist/capabilities/game.d.ts.map +1 -1
- package/dist/capabilities/game.js +71 -56
- package/dist/capabilities/game.js.map +1 -1
- package/dist/capabilities/game.specs.js +1 -1
- package/dist/capabilities/game.specs.js.map +1 -1
- package/dist/capabilities/game3d.d.ts.map +1 -1
- package/dist/capabilities/game3d.js +14 -19
- package/dist/capabilities/game3d.js.map +1 -1
- package/dist/capabilities/gameAssertions.d.ts +52 -0
- package/dist/capabilities/gameAssertions.d.ts.map +1 -0
- package/dist/capabilities/gameAssertions.js +32 -0
- package/dist/capabilities/gameAssertions.js.map +1 -0
- package/dist/capabilities/models.d.ts.map +1 -1
- package/dist/capabilities/models.js +9 -0
- package/dist/capabilities/models.js.map +1 -1
- package/dist/capabilities/storyboards.d.ts.map +1 -1
- package/dist/capabilities/storyboards.js +36 -11
- package/dist/capabilities/storyboards.js.map +1 -1
- package/dist/capabilities/storyboards.specs.d.ts.map +1 -1
- package/dist/capabilities/storyboards.specs.js +11 -1
- package/dist/capabilities/storyboards.specs.js.map +1 -1
- package/dist/capabilities/workflows.d.ts.map +1 -1
- package/dist/capabilities/workflows.js +1 -0
- package/dist/capabilities/workflows.js.map +1 -1
- package/dist/capabilities/workflows.specs.d.ts.map +1 -1
- package/dist/capabilities/workflows.specs.js +4 -3
- package/dist/capabilities/workflows.specs.js.map +1 -1
- package/dist/evals/surfaces/game.d.ts.map +1 -1
- package/dist/evals/surfaces/game.js +29 -1
- package/dist/evals/surfaces/game.js.map +1 -1
- package/dist/game-authoring.d.ts +120 -0
- package/dist/game-authoring.d.ts.map +1 -1
- package/dist/game-build-integrity.d.ts +12 -0
- package/dist/game-build-integrity.d.ts.map +1 -0
- package/dist/game-build-integrity.js +78 -0
- package/dist/game-build-integrity.js.map +1 -0
- package/dist/game-examples.d.ts +44 -3
- package/dist/game-examples.d.ts.map +1 -1
- package/dist/game-examples.js +60 -10
- package/dist/game-examples.js.map +1 -1
- package/dist/system-skills.d.ts +1 -1
- package/dist/system-skills.js +1 -1
- package/dist/tools/builtin-tools.d.ts.map +1 -1
- package/dist/tools/builtin-tools.js +2 -0
- package/dist/tools/builtin-tools.js.map +1 -1
- package/package.json +19 -19
|
@@ -1 +1 @@
|
|
|
1
|
-
2026-10-
|
|
1
|
+
2026-10-17T11:16:45.392Z
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 iart.ai
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
# System skills
|
|
2
|
+
|
|
3
|
+
The instruction documents NodeTool ships. A user skill is a row somebody wrote
|
|
4
|
+
and can rewrite; a system skill is a `SKILL.md` in the build — same shape in the
|
|
5
|
+
prompt, immutable, and present on every install with no seeding migration to
|
|
6
|
+
drift. Loader and discovery rules live in
|
|
7
|
+
`packages/agents/src/system-skills.ts`.
|
|
8
|
+
|
|
9
|
+
One directory per skill, holding a `SKILL.md` whose frontmatter `name` matches
|
|
10
|
+
the directory. Nothing imports these files, so this is not a workspace:
|
|
11
|
+
`stageSystemSkills` in `scripts/bundle-backend.mjs` copies every directory here
|
|
12
|
+
into `_skills/` beside the bundled `server.mjs`, and
|
|
13
|
+
`scripts/verify-backend-bundle.mjs` fails a build that misses one. A new
|
|
14
|
+
directory ships with no other change.
|
|
15
|
+
|
|
16
|
+
`SKILL.md` is the whole skill. Only that file is staged and only that file is
|
|
17
|
+
read, so material that would have been a `references/` file goes in a `##`
|
|
18
|
+
section of the body, which `load_skill` returns in one piece.
|
|
19
|
+
|
|
20
|
+
A skill the repository's own coding agent also wants is symlinked, not copied:
|
|
21
|
+
`.claude/skills/<name>` points here. `npm run check:agents-docs` fails on a
|
|
22
|
+
second copy, a broken link, a frontmatter name that disagrees with its
|
|
23
|
+
directory, and a file beside `SKILL.md` — the last two are mistakes the loader
|
|
24
|
+
would otherwise absorb in silence, leaving the skill out of the catalog with no
|
|
25
|
+
error anywhere.
|
|
26
|
+
|
|
27
|
+
## What the prompt carries
|
|
28
|
+
|
|
29
|
+
Every turn carries a catalog of the user's own skills and of the shipped
|
|
30
|
+
skills whose frontmatter says `featured: true`. The others are named by count
|
|
31
|
+
and found with `list_skills({query})`, which matches a query word by word. The
|
|
32
|
+
catalog is rendered by `formatSkillCatalogForPrompt` in
|
|
33
|
+
`packages/agents/src/skill-prompt.ts`. Feature the entry point of each
|
|
34
|
+
surface. Of the motion skills, only `motion-graphics`, `caption-titles` and
|
|
35
|
+
`video-audio-continuity` are featured: `motion-graphics` loads the craft skills
|
|
36
|
+
it needs, so their catalog lines would buy no routing. The model guides are
|
|
37
|
+
reached through `find_model`, and the brief shapes, `api-*` references and
|
|
38
|
+
`native-game-reference` through the skills and prompt lines that point at them.
|
|
39
|
+
|
|
40
|
+
## The object-model references
|
|
41
|
+
|
|
42
|
+
One `api-*` skill for each area of the `nodetool` object model that code
|
|
43
|
+
actions call. The prompt lists each namespace as a line of signatures and
|
|
44
|
+
names its skill; the skill holds every option, return shape and example.
|
|
45
|
+
`NAMESPACE_DOCS` in `packages/agents/src/codeact/nodetool-api.ts` maps a
|
|
46
|
+
namespace to its skill.
|
|
47
|
+
|
|
48
|
+
| Skill | Namespaces |
|
|
49
|
+
| :--- | :--- |
|
|
50
|
+
| `api-workflows` | `workflows`, `jobs`, `nodes` |
|
|
51
|
+
| `api-models` | `models` |
|
|
52
|
+
| `api-media` | `media`, `generations` |
|
|
53
|
+
| `api-assets` | `assets`, `documents` |
|
|
54
|
+
| `api-web` | `web`, `email` |
|
|
55
|
+
| `api-memory` | `memory`, `shared`, `threads` |
|
|
56
|
+
| `api-agents` | `agents` |
|
|
57
|
+
| `api-settings` | `settings`, `secrets` |
|
|
58
|
+
| `api-collections` | `collections` |
|
|
59
|
+
| `api-apps` | `apps` |
|
|
60
|
+
| `api-timelines` | `timelines` |
|
|
61
|
+
| `api-sketches` | `sketches` |
|
|
62
|
+
| `api-scripts` | `scripts` |
|
|
63
|
+
| `api-storyboards` | `storyboards` |
|
|
64
|
+
| `api-games` | `games` |
|
|
65
|
+
| `nodetool-troubleshooter` | `runs` |
|
|
66
|
+
|
|
67
|
+
## The surfaces
|
|
68
|
+
|
|
69
|
+
One skill per NodeTool document kind, for the agent inside the product and the
|
|
70
|
+
one working on this repository alike.
|
|
71
|
+
|
|
72
|
+
| Skill | Surface |
|
|
73
|
+
| :--- | :--- |
|
|
74
|
+
| `nodetool-workflow-builder` | Workflow graphs, and the routing table for when a graph is the wrong document |
|
|
75
|
+
| `nodetool-app-builder` | Mini apps: operations, widgets, bindings, variables, resources |
|
|
76
|
+
| `nodetool-sketch` | Sketches (image documents): layers, blend modes, placed images, briefs, versions |
|
|
77
|
+
| `nodetool-3d-scene` | glTF models: objects, transforms, lights, materials, headless Blender renders |
|
|
78
|
+
| `manimgx` | ManimGX scenes: math and 3D animations in Python, inspected and rendered by the `nodetool.manimgx` nodes |
|
|
79
|
+
| `nodetool-js-scripting` | The QuickJS sandbox: Code node bodies, JS script documents, packs, calling nodes from code |
|
|
80
|
+
| `nodetool-video-post` | Repairs on delivered footage, and the candidate review protocol they return |
|
|
81
|
+
| `nodetool-rag-indexing` | Ingestion, vector collections, retrieval, the RAG loop |
|
|
82
|
+
| `nodetool-browser-agent` | Browser automation agents: navigation, extraction, forms |
|
|
83
|
+
| `nodetool-custom-node-developer` | New TypeScript node types and node packages |
|
|
84
|
+
| `nodetool-model-provider-config` | Providers, credentials, local models, model selection |
|
|
85
|
+
| `nodetool-api-reference` | REST, tRPC, MsgPack WebSocket, MCP, the OpenAI-compatible chat API |
|
|
86
|
+
| `nodetool-chat-cli` | Chat CLI sessions, provider selection, Global Chat |
|
|
87
|
+
| `nodetool-deployment` | Servers and workers: Docker, SSH, Runpod, cloud |
|
|
88
|
+
| `nodetool-troubleshooter` | A failing run, routed to the surface it belongs to, and stuck generations |
|
|
89
|
+
| `nodetool-skill-author` | Writing a user skill row or a shipped one |
|
|
90
|
+
| `storyboard-core` | Storyboards, entity casting, rendering, timeline assembly — the contract the job and board skills quote |
|
|
91
|
+
| `native-game` | Built-in games, generated asset installation, and playtests |
|
|
92
|
+
| `native-game-reference` | The game document in detail: schema versions, scripts, visuals, physics, audio, input, HUD |
|
|
93
|
+
| `game-direction` | Game feel, teaching beats, layered art, and completion evidence |
|
|
94
|
+
|
|
95
|
+
The job skills that sit on `storyboard-core`, each one a brief shape rather
|
|
96
|
+
than a tool contract: `ugc-video`, `product-commercial`, `script-video`,
|
|
97
|
+
`short-film`, `video-clone`, `launch-kit`, `video-workflow`, `motion-ad`.
|
|
98
|
+
`motion-ad` is the one that renders nothing by default: its board holds the
|
|
99
|
+
real product images as stills and its motion is built on the timeline. Each
|
|
100
|
+
job skill pairs with a board skill for structure: `ugc-video` and
|
|
101
|
+
`product-commercial` with `commercial-beat-sheet`, `script-video` with
|
|
102
|
+
`explainer-storyboard`, `short-film` with `trailer-template`.
|
|
103
|
+
|
|
104
|
+
## The craft and the model lines
|
|
105
|
+
|
|
106
|
+
| Skill | Answers |
|
|
107
|
+
| :--- | :--- |
|
|
108
|
+
| `motion-graphics` | The build loop, choosing between the code pack and edit ops, and the review pass |
|
|
109
|
+
| `timeline-edit-ops` | The `edit_timeline` op contract: roles, presets, transitions, groups, masks, mattes, effects, validate and preview |
|
|
110
|
+
| `motion-curves` | Custom animations — curves by hand, or a JS body baked in the sandbox |
|
|
111
|
+
| `motion-principles` | Durations, easing, stagger, weight, anticipation — the numbers before the call |
|
|
112
|
+
| `motion-direction` | The motion language a whole piece obeys, and the audit against it |
|
|
113
|
+
| `frame-composition` | Grids, focal placement, safe areas, depth and parallax, camera moves |
|
|
114
|
+
| `beat-sync-editing` | The beat grid, cut types, pacing arc, speed ramps |
|
|
115
|
+
| `color-motion` | Palettes, gradient fills, the grade chain, which colour channels move |
|
|
116
|
+
| `logo-reveal` | Stings: draw-on, wipe, build, wordmark, sound-logo sync |
|
|
117
|
+
| `motion-background` | Ambient beds that loop and stay behind |
|
|
118
|
+
| `caption-titles` | What on-screen text says and when it appears |
|
|
119
|
+
| `video-audio-continuity` | Sound across a multi-scene cut — one clip carrying every scene, or a track of your own |
|
|
120
|
+
| `explainer-storyboard`, `commercial-beat-sheet`, `launch-commercial`, `music-video-treatment` | Board shapes for four brief types |
|
|
121
|
+
| `trailer-template` | Trailers and teasers: eight audio-first beats on a runtime-scaled grid, event/reception pairs, the drop at ~65%, one unbroken music bed |
|
|
122
|
+
| `nano-banana-pro-prompting` | Nano Banana Pro: the art-director brief, and lock/change/amount/constraints for edits |
|
|
123
|
+
| `gpt-image-2-prompting` | GPT Image 2: five slots, change-versus-preserve edits, labelled multi-image compositing |
|
|
124
|
+
| `flux-2-klein-prompting` | FLUX.2 [klein]: the subject-first hierarchy, guidance and step choices, the seed-locked loop |
|
|
125
|
+
| `seedance-2-prompting` | Seedance 2: subject and motion first, quoted dialogue, the sound brief, cuts in one take |
|
|
126
|
+
| `veo-3-prompting` | Veo 3: the five-element structure, cinematography vocabulary, duration and audio economics |
|
|
127
|
+
| `minimax-h3-prompting` | MiniMax H3: which endpoint, a job per reference, timed shot lists, native audio direction |
|
|
128
|
+
| `wan-2-6-prompting` | Wan 2.6: text-to-video and image-to-video, and the prompt shape each one wants |
|
|
129
|
+
| `kling-video-prompting` | Kling 2.5-turbo and later: the shot list, tagged elements, the labelled dialogue format |
|
|
130
|
+
| `hailuo-prompting` | MiniMax Hailuo: beats in order, the Director bracket commands, no negative prompt |
|
|
131
|
+
| `seedream-prompting` | Seedream 4 and 5: the six-layer brief, quoted copy, pinning what an edit must not change |
|
|
132
|
+
| `qwen-image-prompting` | Qwen-Image: typography — exact copy, relative layout, non-Latin scripts, expansion off |
|
|
133
|
+
| `elevenlabs-audio-prompting` | ElevenLabs: audio tags and stability, the dialogue list, sound-effect briefs, composition plans |
|
|
134
|
+
| `stable-audio-prompting` | Stable Audio: genre/instruments/mood/BPM, the TrackType tags, which dials the distilled checkpoints ignore |
|
|
135
|
+
|
|
136
|
+
The `*-prompting` skills are the model-line guides. None is featured, so the
|
|
137
|
+
catalog does not list them. `find_model` attaches `prompting_skill` to a
|
|
138
|
+
matching route so the guide surfaces at the step before the prompt is written,
|
|
139
|
+
and each description names the model ids across every provider that serves the
|
|
140
|
+
line, so `list_skills` finds the guide by model id. The table behind
|
|
141
|
+
`prompting_skill` is `MODEL_PROMPTING_SKILLS` in
|
|
142
|
+
`packages/agents/src/model-prompting-skills.ts`, and
|
|
143
|
+
`packages/agents/tests/model-prompting-skills.test.ts` checks it against the
|
|
144
|
+
skills on disk, the model ids the shipped provider manifests actually name, and
|
|
145
|
+
the capability registry. A new line means a directory here plus a row there.
|
|
146
|
+
|
|
147
|
+
`motion-graphics` carries the mechanics and the other motion skills carry the
|
|
148
|
+
craft. A skill quotes calls rather than teaching them, and a renamed tool leaves
|
|
149
|
+
it teaching a spelling no model can use, so
|
|
150
|
+
`packages/agents/tests/shipped-skill-names.test.ts` reads every snake_case call
|
|
151
|
+
out of every skill in this directory and checks it against the registry. A new
|
|
152
|
+
directory is covered with no entry to add.
|
|
153
|
+
|
|
154
|
+
It checks at two strengths. The motion skills its `SKILL_NAMES` lists are
|
|
155
|
+
matched exactly against the capability specs and `edit_timeline`'s op list, and
|
|
156
|
+
`motion-graphics` together with `timeline-edit-ops` has to name every shipped
|
|
157
|
+
preset and stagger unit. Every other skill is matched against the vocabulary
|
|
158
|
+
the registry declares in structured form: tool names, schema keys and enums,
|
|
159
|
+
the op lists that `edit_sketch`, `edit_model3d` and `edit_storyboard` write
|
|
160
|
+
into their `ops` fields, and the WebSocket commands. Free prose in a spec does
|
|
161
|
+
not count, so a stale name that a spec merely mentions still fails. A call that is neither is exempted by name in
|
|
162
|
+
`NOT_A_BACKEND_CALL`, with the reason it is not a rename waiting to happen.
|
|
163
|
+
|
|
164
|
+
## How the set routes
|
|
165
|
+
|
|
166
|
+
One job crosses the whole set in a fixed order, and each skill hands off at
|
|
167
|
+
the same seams:
|
|
168
|
+
|
|
169
|
+
1. **Brief → board.** A board skill (`commercial-beat-sheet`,
|
|
170
|
+
`launch-commercial`, `explainer-storyboard`, `music-video-treatment`,
|
|
171
|
+
`trailer-template`) resolves entities, writes the beats and stores them
|
|
172
|
+
with `create_storyboard` / `edit_storyboard`. A job skill on
|
|
173
|
+
`storyboard-core` decides what the picture looks like over the same board,
|
|
174
|
+
and the two compose: structure from one, look from the other. The storyboard and entity call
|
|
175
|
+
shapes — return fields, all fifteen `edit_storyboard` ops, every key
|
|
176
|
+
`set_board` accepts, which fields and entities each shot's prompt receives —
|
|
177
|
+
live once, in `storyboard-core` § Tool contract. The job skills and the five
|
|
178
|
+
board skills point there, and `commercial-beat-sheet` § Tool contract is only
|
|
179
|
+
a pointer.
|
|
180
|
+
2. **Board → model.** Before the shot text is written, `find_model` picks the
|
|
181
|
+
image and video lines, `set_board {image_model, video_model}` makes them the
|
|
182
|
+
render defaults, and the `prompting_skill` on each result names the
|
|
183
|
+
`*-prompting` guide that decides how `action` and `motion` are worded.
|
|
184
|
+
3. **Sound, before the first render.** `video-audio-continuity` decides whether
|
|
185
|
+
a multi-scene piece is one native-audio generation or separate clips under
|
|
186
|
+
a track of your own; the audio guides (`elevenlabs-audio-prompting`,
|
|
187
|
+
`stable-audio-prompting`) write that track.
|
|
188
|
+
4. **Render → cut.** `assemble_storyboard_timeline` turns the board into the
|
|
189
|
+
document `motion-graphics` edits; `beat-sync-editing` sits the cuts on the
|
|
190
|
+
bed, `caption-titles` adds every word on screen (never a render prompt),
|
|
191
|
+
`logo-reveal` the mark, `color-motion` the grade, `motion-direction` the one
|
|
192
|
+
motion language, and the rest of the craft skills the numbers.
|
|
193
|
+
|
|
194
|
+
Every skill states where the rest of the set picks up along that path. A craft
|
|
195
|
+
skill opens by pointing back at `motion-graphics` for the op contract and
|
|
196
|
+
sideways at the neighbours that decide its numbers; a board skill points
|
|
197
|
+
forward at the motion skills at the step where a board becomes a cut, so an
|
|
198
|
+
agent asked to animate a finished board loads the craft file instead of
|
|
199
|
+
improvising against the op list.
|
|
200
|
+
|
|
201
|
+
## Credit
|
|
202
|
+
|
|
203
|
+
The craft skills beside `motion-graphics` are adapted from
|
|
204
|
+
[iart-ai/motion-design-skills](https://github.com/iart-ai/motion-design-skills)
|
|
205
|
+
(MIT, commit `3c129f7`), rewritten against NodeTool's timeline: its animation
|
|
206
|
+
roles and preset catalog, its easing grammar, the animatable channels and how
|
|
207
|
+
they fold, and the validate-and-preview loop that closes each one. Upstream's
|
|
208
|
+
After Effects and Remotion skills have no counterpart — `motion-graphics` holds
|
|
209
|
+
the tool contract and `motion-curves` the sandbox bake, which is what those two
|
|
210
|
+
answer for this engine. The licence is kept at
|
|
211
|
+
`LICENSE-iart-motion-design-skills`.
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: api-agents
|
|
3
|
+
description: "Call nodetool.agents from a code action: hand a self-contained task to a sub-agent, fan several out in parallel, or start background sub-agents and collect their results later. Load before the first call into nodetool.agents."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# nodetool.agents
|
|
7
|
+
|
|
8
|
+
A sub-agent is a fresh agent loop with the same tools as you and **none of
|
|
9
|
+
this conversation**. It answers with its final message as text.
|
|
10
|
+
|
|
11
|
+
| Call | Does | Answers |
|
|
12
|
+
| :--- | :--- | :--- |
|
|
13
|
+
| `run(prompt, {description})` | Runs a sub-agent and blocks until it finishes. | The final message of the sub-agent, as text. Throws when the sub-agent fails. |
|
|
14
|
+
| `start(prompt, {description})` | Starts a sub-agent and returns at once. | `{subtask_id, status: "running"}` |
|
|
15
|
+
| `wait({ids, timeoutMs})` | Blocks until the named sub-agents finish. Omit `ids` to wait for every one this turn started. `timeoutMs` defaults to 300000. A code action stops after 600 s, so keep it under that. | Rows `{subtask_id, status, result \| error}`. `status` is `completed`, `failed`, `aborted`, or `running` after a timeout. |
|
|
16
|
+
|
|
17
|
+
`description` is the 3–7 word label the user sees. Without it the first six
|
|
18
|
+
words of the prompt are used.
|
|
19
|
+
|
|
20
|
+
## Write the prompt for a stranger
|
|
21
|
+
|
|
22
|
+
- Put everything the child needs in the prompt: the goal, the inputs (ids,
|
|
23
|
+
uris, the text), the constraints, and what to return.
|
|
24
|
+
- Ask for the answer shape you want: "reply as JSON with fields title, url,
|
|
25
|
+
summary". Parse the text you get back.
|
|
26
|
+
- Pass ids and `asset://` uris, not descriptions of them. The child can read
|
|
27
|
+
them with its own tools.
|
|
28
|
+
|
|
29
|
+
## When to delegate
|
|
30
|
+
|
|
31
|
+
Delegate work that gains from a fresh, focused context: research one question
|
|
32
|
+
end to end, draft a self-contained section, review a result against a brief.
|
|
33
|
+
Do not delegate a single tool call. A sub-agent costs real time and money.
|
|
34
|
+
|
|
35
|
+
## Patterns
|
|
36
|
+
|
|
37
|
+
Parallel, blocking — one settled entry per prompt, so a failed child becomes
|
|
38
|
+
an entry instead of a throw:
|
|
39
|
+
|
|
40
|
+
```js
|
|
41
|
+
const answers = await nodetool.batch(prompts, (p) => nodetool.agents.run(p),
|
|
42
|
+
{ concurrency: 4 });
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
Background — start, do other work, then collect in the same action:
|
|
46
|
+
|
|
47
|
+
```js
|
|
48
|
+
const a = await nodetool.agents.start(researchPrompt, { description: "Research competitors" });
|
|
49
|
+
const draft = await draftOutline(); // your own work meanwhile
|
|
50
|
+
const [row] = await nodetool.agents.wait({ ids: [a.subtask_id] });
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
Results of a sub-agent you never wait for are lost to the turn. Always wait
|
|
54
|
+
for what you need before the action ends.
|
|
55
|
+
|
|
56
|
+
Sub-agents can start sub-agents of their own, up to a depth limit. Results
|
|
57
|
+
they publish with `nodetool.shared.publish` are readable by the parent in the
|
|
58
|
+
same run (see `api-memory`).
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: api-apps
|
|
3
|
+
description: "Call nodetool.apps from a code action: list, read, create and edit mini apps through the App Builder steps, and debug an app's wiring or run it. Load before the first call into nodetool.apps."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# nodetool.apps
|
|
7
|
+
|
|
8
|
+
A mini app is a UI of widgets bound to workflow operations and variables, so
|
|
9
|
+
someone can run a task without the graph. How to design one, and every App
|
|
10
|
+
Builder tool, is `nodetool-app-builder`. This is the call reference.
|
|
11
|
+
|
|
12
|
+
| Call | Does | Answers |
|
|
13
|
+
| :--- | :--- | :--- |
|
|
14
|
+
| `list({limit})` | Lists apps, newest first, with their operations. | App rows |
|
|
15
|
+
| `get(id)` | Reads the app document: operations, variables and the widget tree. | The document |
|
|
16
|
+
| `create(name, {description, project_id, from_workflow_id, document})` | Creates an app. `from_workflow_id` binds its first operation to a workflow. `document` starts from a whole app document. | `{application_id, …}` |
|
|
17
|
+
| `edit(id, steps, {name, description, workflow_ids, base_updated_at})` | Applies App Builder steps in order to the saved document, then saves once. | The result of each step and the app state |
|
|
18
|
+
| `debug(id, {params, interact, run, timeout_ms, poll})` | Checks every binding and simulates the app. | A pass/fail verdict with issues, and the final state of each widget |
|
|
19
|
+
|
|
20
|
+
## edit
|
|
21
|
+
|
|
22
|
+
Each step is `{tool, input}`. `tool` is an App Builder tool name, such as
|
|
23
|
+
`ui_app_add_operation` or `ui_app_add_component`. The `ui_app_` prefix may be
|
|
24
|
+
left out.
|
|
25
|
+
|
|
26
|
+
- `edit(id, [])` answers the catalog of every tool with its schema, and the
|
|
27
|
+
current state of the app. Call it first.
|
|
28
|
+
- `workflow_ids` loads the bindable surface of workflows the app does not use
|
|
29
|
+
yet, so a widget can bind to one.
|
|
30
|
+
- `base_updated_at` refuses the save when the app changed after you read it.
|
|
31
|
+
|
|
32
|
+
## debug
|
|
33
|
+
|
|
34
|
+
- `{run: false}` checks the wiring only. It is free and takes milliseconds.
|
|
35
|
+
Run it after every wiring change.
|
|
36
|
+
- A bare `debug(id)` is a full run: `run` defaults to true. A full run
|
|
37
|
+
executes the real workflows and spends real money. Run it to confirm that
|
|
38
|
+
the app works, not to explore.
|
|
39
|
+
- `interact` scripts the user actions in order: `{set: {key, value}}`,
|
|
40
|
+
`{click: <widget>}`, `{change: {…}}`, `{run: <operationId>}`,
|
|
41
|
+
`{cancel: <operationId>}`, `{seedResource: {id, items}}`. A widget is named
|
|
42
|
+
by its component id, by a type only one widget has, or by a unique label.
|
|
43
|
+
Without `interact`, the natural run trigger of the app is clicked.
|
|
44
|
+
- `poll: true` returns a session id at once for a long run.
|
|
45
|
+
|
|
46
|
+
```js
|
|
47
|
+
const { application_id } = await nodetool.apps.create("Caption maker",
|
|
48
|
+
{ from_workflow_id: wfId });
|
|
49
|
+
const catalog = await nodetool.apps.edit(application_id, []);
|
|
50
|
+
await nodetool.apps.edit(application_id, [
|
|
51
|
+
{ tool: "ui_app_add_component", input: { /* from the catalog schema */ } }
|
|
52
|
+
]);
|
|
53
|
+
const check = await nodetool.apps.debug(application_id, { run: false });
|
|
54
|
+
```
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: api-assets
|
|
3
|
+
description: "Call nodetool.assets or nodetool.documents from a code action: find, read and save files in the user's asset library, keep a file another tool downloaded, and convert documents or extract text and tables from a PDF. Load before the first call into these namespaces."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# nodetool.assets and nodetool.documents
|
|
7
|
+
|
|
8
|
+
An asset is a stored file in the user's library: an image, a video, audio, a
|
|
9
|
+
document, JSON. Its locator is `asset://<id>` (an extension is allowed:
|
|
10
|
+
`asset://<id>.png`). Reuse an asset id instead of making the same file again.
|
|
11
|
+
The workspace is a different store: it holds the files of this run, by
|
|
12
|
+
workspace-relative path.
|
|
13
|
+
|
|
14
|
+
## nodetool.assets
|
|
15
|
+
|
|
16
|
+
| Call | Does | Answers |
|
|
17
|
+
| :--- | :--- | :--- |
|
|
18
|
+
| `list({source, query, content_type, limit})` | Lists assets. `source` is `"user"` (default) or `"package"`. `content_type` is `image`, `video`, `audio`, `text` or `folder`. | Asset rows |
|
|
19
|
+
| `search(query, {content_type, limit})` | Finds assets by a name substring across every media type. `content_type` is a MIME prefix (`"image/"`). An empty query lists the newest. `limit` defaults to 25. | Handles with `asset://` uris |
|
|
20
|
+
| `images({query, limit})` | Lists image assets as handles: id, name, size, dimensions. No pixels are loaded. | Handles. Pass an id to `view_image` to see one. |
|
|
21
|
+
| `get(assetId)` | Reads one asset row. No bytes. | The row |
|
|
22
|
+
| `read(nameOrUri)` | Reads the content. Takes an `asset://` URI, an id, a `/api/storage/` key or a stored file name. | `{content}` for text, `{content_base64}` for binary |
|
|
23
|
+
| `save(name, {content \| content_base64 \| source, content_type})` | Saves a file to the library. | `{asset_id, asset_uri, url}` |
|
|
24
|
+
|
|
25
|
+
### save
|
|
26
|
+
|
|
27
|
+
Pass exactly one of these:
|
|
28
|
+
|
|
29
|
+
- `content` — text, markdown or JSON.
|
|
30
|
+
- `content_base64` — binary bytes you made yourself.
|
|
31
|
+
- `source` — bytes that already exist: the `asset_url` or `/api/storage/` key
|
|
32
|
+
that another tool returned (`nodetool.web.download`, `run_apify_actor`, a
|
|
33
|
+
generation), an `asset://` URI to copy, or an http(s) URL. The host copies
|
|
34
|
+
them, so the bytes never pass through the guest.
|
|
35
|
+
|
|
36
|
+
Never `read()` a stored file to base64 to save it again. Pass it as `source`.
|
|
37
|
+
Without `content_type`, the extension of `name` decides it: name an SVG
|
|
38
|
+
`logo.svg` and it is stored as `image/svg+xml`. Show a saved image, video or
|
|
39
|
+
audio file in the reply as ``.
|
|
40
|
+
|
|
41
|
+
### Editing a stored image
|
|
42
|
+
|
|
43
|
+
Pass the asset to `image.*` (a guest global), then save the handle:
|
|
44
|
+
|
|
45
|
+
```js
|
|
46
|
+
const handle = await image.resize("asset://<id>.png", { width: 1024 });
|
|
47
|
+
const saved = await nodetool.media.toImage(handle);
|
|
48
|
+
return saved.asset_uri;
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## nodetool.documents
|
|
52
|
+
|
|
53
|
+
File-to-file conversion with Pandoc and PDF tools. Every path is
|
|
54
|
+
workspace-relative. Stage an asset into the workspace first with
|
|
55
|
+
`nodetool.web.download("asset://<id>", "in.pdf")`.
|
|
56
|
+
|
|
57
|
+
| Call | Does |
|
|
58
|
+
| :--- | :--- |
|
|
59
|
+
| `convert(inputFile, outputFile, {from_format, to_format, extra_args})` | Pandoc conversion. `from_format` defaults to `markdown`, `to_format` to `pdf`. It reads markdown, docx, rst, html and more. |
|
|
60
|
+
| `extractText(pdfPath, {start_page, end_page})` | Plain text from a PDF, as `{text}`. Pages are 0-based, and `end_page: -1` is the last page. |
|
|
61
|
+
| `extractTables(pdfPath, outputJsonFile, {start_page, end_page})` | Tables from a PDF into a JSON file |
|
|
62
|
+
| `markdownToPdf(inputFile, outputFile)` | Markdown to PDF |
|
|
63
|
+
| `pdfToMarkdown(inputFile, outputFile, {start_page, end_page})` | PDF to Markdown |
|
|
64
|
+
|
|
65
|
+
The output of a conversion is a workspace file. Save it to the library with
|
|
66
|
+
`nodetool.assets.save(name, {source: …})` when the user should keep it.
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: api-collections
|
|
3
|
+
description: "Call nodetool.collections from a code action: list the user's knowledge collections and run a semantic search in one of them. Indexing is not available from code; build it with nodetool-rag-indexing. Load before the first call into nodetool.collections."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# nodetool.collections
|
|
7
|
+
|
|
8
|
+
The vector store behind retrieval. A collection holds document chunks with
|
|
9
|
+
embeddings for semantic search. It is not an asset folder. How to chunk, index
|
|
10
|
+
and build a RAG workflow is `nodetool-rag-indexing`.
|
|
11
|
+
|
|
12
|
+
| Call | Does |
|
|
13
|
+
| :--- | :--- |
|
|
14
|
+
| `list()` | Lists the collections the user has. |
|
|
15
|
+
| `query(collection, query, {n_results})` | Semantic search in one named collection. `n_results` defaults to 5. |
|
|
16
|
+
|
|
17
|
+
`index`, `indexBatch`, `search` and `hybridSearch` also exist on
|
|
18
|
+
`nodetool.collections`, but their tools are on no tool belt this product
|
|
19
|
+
ships, so each one throws "not in this toolbelt". Do not plan on them. To add
|
|
20
|
+
documents to a collection, build an indexing workflow as `nodetool-rag-indexing`
|
|
21
|
+
describes and run it with `nodetool.workflows.run`.
|
|
22
|
+
|
|
23
|
+
## Rules
|
|
24
|
+
|
|
25
|
+
- Call `list()` first when you do not know the collection name.
|
|
26
|
+
- An empty result from a collection the user just made usually means nothing
|
|
27
|
+
was indexed yet. Say so instead of retrying the query.
|
|
28
|
+
|
|
29
|
+
```js
|
|
30
|
+
const { collections } = await nodetool.collections.list();
|
|
31
|
+
const hits = await nodetool.collections.query("manuals", "reset the device",
|
|
32
|
+
{ n_results: 8 });
|
|
33
|
+
```
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: api-games
|
|
3
|
+
description: "Call nodetool.games from a code action: create or install a built-in game, read and edit its draft, write a whole generated level, generate and install art and audio into asset slots, playtest and autoplay routes, capture frames, publish a revision and build a web player. Load before the first call into nodetool.games."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# nodetool.games
|
|
7
|
+
|
|
8
|
+
A built-in game runs in NodeTool's native 2D or 3D engine. It has a mutable **draft**
|
|
9
|
+
and immutable **revisions**. Play is deterministic, so a playtest with the same
|
|
10
|
+
seed and inputs gives the same result. How to build one is `native-game`, and
|
|
11
|
+
feel, pacing and art direction are `game-direction`. This is the call
|
|
12
|
+
reference.
|
|
13
|
+
|
|
14
|
+
Every `id` is the full game id or its exact 12-character prefix.
|
|
15
|
+
|
|
16
|
+
| Call | Does |
|
|
17
|
+
| :--- | :--- |
|
|
18
|
+
| `create(name, {project_id, dimension, template})` | Creates a game in a project. `dimension` is `2d` (default, a playable top-down room) or `3d` (an exploration blockout). `template` is `topdown` or `exploration`. Answers the full id and the revision. |
|
|
19
|
+
| `get(id, {source, revision, view, entity_id})` | Reads the draft (default) or a revision. `view` is `outline` (default), `entity` or `full`. |
|
|
20
|
+
| `edit(id, ops, {base_updated_at})` | Applies ordered edits to the draft atomically. Issues come back with the op index and path. It does not publish. |
|
|
21
|
+
| `setDocument(id, document, {base_updated_at})` | Writes a whole document as one `set_document` edit, validated atomically. |
|
|
22
|
+
| `previewAuthoring(id, {program, base_updated_at, expected_document})` | Rebakes retained construction without writing. Returns a candidate, entity/dependency changes, conflicts and restart policy. Omit `program` to rebuild the saved construction. |
|
|
23
|
+
| `applyAuthoring(id, candidate)` | Recomputes and applies the preview against its exact draft. Rejects stale or changed candidates and unresolved conflicts. |
|
|
24
|
+
| `generateAsset(id, slot, kind, prompt, opts)` | Makes or imports an asset and binds it to the draft. |
|
|
25
|
+
| `installAsset(id, slot, binding, {base_revision, base_updated_at, candidate_workspace_id})` | Installs one staged asset. The staged bytes must match `binding.digest`. |
|
|
26
|
+
| `playtest(id, {source, revision, seed, inputs, assertions, capture_ticks})` | Runs up to 18,000 ticks with run-length inputs and assertions, and captures up to 8 frames. |
|
|
27
|
+
| `autoplay(id, {win, target_prefix, seed, player_id, max_ticks, source, revision})` | Searches for a route to a win or to an entity prefix. Answers replayable inputs, the win tick and level statistics. An exhausted budget is inconclusive. |
|
|
28
|
+
| `capture(id, {ticks, inputs, seed, camera, overlays, scale, sheet, source, revision})` | Renders up to 8 frames for a visual review. |
|
|
29
|
+
| `publish(id, {base_revision, message})` | Saves the draft as an immutable revision, only when the user asks. `base_revision` is required, and a stale one is a conflict. |
|
|
30
|
+
| `build(id, {revision})` | Builds a standalone web player of a revision under `game-builds/<game-id>/<revision>` in the project workspace. |
|
|
31
|
+
| `listExamples({query, limit})`, `getExample(slug, {view, entity_id})` | Lists and reads the shipped benchmark games, such as `kindle`. |
|
|
32
|
+
| `installExample(slug, {project_id, name})` | Copies an example with its media into a project as a new game you own. |
|
|
33
|
+
|
|
34
|
+
## generateAsset
|
|
35
|
+
|
|
36
|
+
`kind` is `image`, `audio` (speech), `music`, `sfx`, `font`, `model` or
|
|
37
|
+
`collider`. Each generation is billed, so confirm the slot list with the user
|
|
38
|
+
before you generate assets for many slots.
|
|
39
|
+
|
|
40
|
+
- Images can be prepared as aligned sprite sheets, edge tilesets or grade LUTs
|
|
41
|
+
through `preparation`.
|
|
42
|
+
- `sfx` needs a registered sound-effect `node_type` and its `params`.
|
|
43
|
+
- `font` imports a TTF or OTF `input_file`.
|
|
44
|
+
- `model` needs a provider `node_type` with `params`, or an owned glTF or GLB
|
|
45
|
+
`input_file`. `dependency_files` maps a glTF buffer or image URI to an owned
|
|
46
|
+
asset or workspace path. `collider` takes `preparation.shape`. 3D results
|
|
47
|
+
are candidates that `installAsset` must install.
|
|
48
|
+
- `install: false` stages a 2D candidate and answers its binding without
|
|
49
|
+
binding it.
|
|
50
|
+
- `reference_slot` keeps a new image in the style of an existing slot.
|
|
51
|
+
- `provider` and `model` pick the model. `background: true` starts it and
|
|
52
|
+
answers a `generation_id`; call again with `generation_id` and the same
|
|
53
|
+
preparation to finish.
|
|
54
|
+
|
|
55
|
+
## Build a level in code
|
|
56
|
+
|
|
57
|
+
Author the whole document with `@nodetool-ai/sandbox-game` and save it with
|
|
58
|
+
`saveGame({name, document}, {games: nodetool.games, project_id})`. Read
|
|
59
|
+
`nodetool.packs.docs("@nodetool-ai/sandbox-game")` first.
|
|
60
|
+
|
|
61
|
+
For retained construction, use `constructGame({inputs, seed}, (inputs, builder)
|
|
62
|
+
=> { return document; })` and save the returned bundle with `saveGame`. Put
|
|
63
|
+
accepted preparation results and pinned asset bindings in `inputs`. The callback
|
|
64
|
+
cannot depend on outer variables. Rebuilds run without external capabilities.
|
|
65
|
+
Ordinary `setDocument` cannot attach or replace retained source or its baseline.
|
|
66
|
+
|
|
67
|
+
Manual property edits become overrides. Removing a generated entity suppresses
|
|
68
|
+
its key on later rebuilds. `edit` supports `reset_override` with `entity_id`,
|
|
69
|
+
optional `scene_id` and optional field `path`, and `detach_entity` with the same
|
|
70
|
+
entity target. Resetting a suppressed target restores it from the baseline.
|
|
71
|
+
Active retained-game sessions adopt the rebuilt definition and assets on restart.
|
|
72
|
+
|
|
73
|
+
## The loop
|
|
74
|
+
|
|
75
|
+
1. Read an example: `getExample("kindle")`, then `view: "entity"` for the
|
|
76
|
+
script and feel parameters of one entity.
|
|
77
|
+
2. Build or edit the draft.
|
|
78
|
+
3. Prove it can be finished: `autoplay(id, {win: true})`, then replay the
|
|
79
|
+
route with `playtest(id, {inputs, assertions})` and a win assertion.
|
|
80
|
+
4. Look at it: `capture(id, {ticks, sheet: true})`.
|
|
81
|
+
5. Publish and build only when the user asks.
|