@skenora/tooling 0.1.2

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.
Files changed (44) hide show
  1. package/README.md +32 -0
  2. package/bin/skenora-mcp-http.mjs +131 -0
  3. package/bin/skenora-mcp.mjs +50 -0
  4. package/bin/skenora.mjs +388 -0
  5. package/dist/doctor.d.ts +3 -0
  6. package/dist/doctor.d.ts.map +1 -0
  7. package/dist/doctor.js +109 -0
  8. package/dist/doctor.js.map +1 -0
  9. package/dist/examples.d.ts +26 -0
  10. package/dist/examples.d.ts.map +1 -0
  11. package/dist/examples.js +207 -0
  12. package/dist/examples.js.map +1 -0
  13. package/dist/index.d.ts +8 -0
  14. package/dist/index.d.ts.map +1 -0
  15. package/dist/index.js +7 -0
  16. package/dist/index.js.map +1 -0
  17. package/dist/mcp-http.d.ts +16 -0
  18. package/dist/mcp-http.d.ts.map +1 -0
  19. package/dist/mcp-http.js +279 -0
  20. package/dist/mcp-http.js.map +1 -0
  21. package/dist/mcp.d.ts +79 -0
  22. package/dist/mcp.d.ts.map +1 -0
  23. package/dist/mcp.js +817 -0
  24. package/dist/mcp.js.map +1 -0
  25. package/dist/resources.d.ts +24 -0
  26. package/dist/resources.d.ts.map +1 -0
  27. package/dist/resources.js +141 -0
  28. package/dist/resources.js.map +1 -0
  29. package/dist/wgsl.d.ts +42 -0
  30. package/dist/wgsl.d.ts.map +1 -0
  31. package/dist/wgsl.js +133 -0
  32. package/dist/wgsl.js.map +1 -0
  33. package/package.json +53 -0
  34. package/resources/docs/diagnostics.md +16 -0
  35. package/resources/docs/overview.md +26 -0
  36. package/resources/docs/runtime-probe.md +17 -0
  37. package/resources/examples/gallery.json +1818 -0
  38. package/resources/examples/invalid-scene.json +9 -0
  39. package/resources/examples/valid-scene.json +69 -0
  40. package/resources/llms-full.txt +52 -0
  41. package/resources/llms.txt +19 -0
  42. package/resources/manifest.json +97 -0
  43. package/resources/schemas/example-manifest.schema.json +454 -0
  44. package/resources/schemas/scene-check-report.schema.json +36 -0
@@ -0,0 +1,9 @@
1
+ {
2
+ "schema": "skenora.scene",
3
+ "version": 1,
4
+ "id": "",
5
+ "name": "Invalid example",
6
+ "assets": [],
7
+ "entities": {},
8
+ "rootEntityIds": ["missing-entity"]
9
+ }
@@ -0,0 +1,69 @@
1
+ {
2
+ "schema": "skenora.scene",
3
+ "version": 1,
4
+ "id": "tooling-example",
5
+ "name": "Tooling example",
6
+ "assets": {},
7
+ "entities": {},
8
+ "rootEntityIds": [],
9
+ "materials": {},
10
+ "materialBindings": {},
11
+ "textureAnimations": {},
12
+ "camera": {
13
+ "mode": "orbit",
14
+ "position": { "x": 0, "y": 2, "z": -6 },
15
+ "target": { "x": 0, "y": 0, "z": 0 },
16
+ "minZ": 0.01,
17
+ "maxZ": 10000,
18
+ "fov": 0.8,
19
+ "speed": 1
20
+ },
21
+ "cameraPaths": {},
22
+ "environment": {
23
+ "enabled": true,
24
+ "intensity": 1,
25
+ "rotationY": 0,
26
+ "background": { "mode": "color", "color": "#202124", "blur": 0 }
27
+ },
28
+ "ground": {
29
+ "enabled": false,
30
+ "mode": "solid",
31
+ "size": 20,
32
+ "fitToScene": false,
33
+ "padding": 1.5,
34
+ "color": "#808080",
35
+ "opacity": 1,
36
+ "shadowOpacity": 0.55
37
+ },
38
+ "fog": {
39
+ "enabled": false,
40
+ "mode": "linear",
41
+ "color": "#ffffff",
42
+ "density": 0.01,
43
+ "start": 10,
44
+ "end": 100
45
+ },
46
+ "weather": {
47
+ "enabled": false,
48
+ "type": "rain",
49
+ "intensity": 0.5,
50
+ "wind": { "x": 0, "y": 0, "z": 0 },
51
+ "particleSize": 0.1
52
+ },
53
+ "lights": [],
54
+ "postProcess": {
55
+ "enabled": false,
56
+ "samples": 1,
57
+ "bloom": false,
58
+ "glow": false,
59
+ "sharpen": false,
60
+ "grain": false,
61
+ "chromaticAberration": false,
62
+ "depthOfField": false,
63
+ "vignetteEnabled": false,
64
+ "ssao": { "enabled": false }
65
+ },
66
+ "flows": {},
67
+ "variables": {},
68
+ "extensions": {}
69
+ }
@@ -0,0 +1,52 @@
1
+ # Skenora agent reference
2
+
3
+ ## Ownership
4
+
5
+ `SceneDocumentData` is persistent authored truth. EditorSession owns commands,
6
+ revision, undo, and selection. RuntimeSession owns Babylon Engine, Scene,
7
+ materials, GPU resources, render loop, and disposal. ResourceResolver is the
8
+ only path from logical asset references to bytes. ScenePlan compiles declarative
9
+ Blueprints and Patches without executing arbitrary code.
10
+
11
+ ## Safe workflow
12
+
13
+ 1. Discover schemas/capabilities from installed Skenora resources.
14
+ 2. Produce a native SceneDocument, SceneBlueprint, or ScenePatch version 1.
15
+ 3. Run pure `checkSceneInput()` and repair diagnostic codes.
16
+ 4. Supply explicit resource bindings for Blueprint compilation.
17
+ 5. Let the host commit through Editor/ScenePlan APIs.
18
+ 6. Let Runtime project the accepted document.
19
+ 7. Use `getBackendSnapshot()` for device facts and `probe()` for real health.
20
+
21
+ Never serialize Babylon objects or infer authored state from GPU resources.
22
+ Never put URLs, credentials, callbacks, JavaScript, GLSL, or WGSL in scene data.
23
+ MaterialProgram and ProceduralGeometryProgram are bounded declarative ceilings.
24
+
25
+ ## Diagnostics
26
+
27
+ Every shared diagnostic is JSON-safe and includes version, code, severity,
28
+ stage, and message. Optional path and entity/asset/material/animation/binding/
29
+ capability identities locate the issue. `repair` is public guidance. Error
30
+ messages are explanatory but not stable identifiers.
31
+
32
+ ## Runtime evidence
33
+
34
+ Backend snapshots report observed WebGL/WebGPU facts and host policy separately.
35
+ They do not prove rendering. `healthy` is permitted only when an active browser
36
+ Runtime rendered and successfully read pixels. Plain Node doctor runs are
37
+ `unverified`, not healthy.
38
+
39
+ ## Tooling and MCP
40
+
41
+ The `skenora` CLI provides check, doctor, docs, examples, resource verification,
42
+ and a read-only stdio or loopback-HTTP MCP server. The default MCP exposes
43
+ resource discovery/read/search, schema lookup, pure scene check, and doctor
44
+ report generation. It exposes no filesystem writes, Editor commands, arbitrary
45
+ URL fetch, credentials, or Runtime objects.
46
+
47
+ A protected host may inject ScenePlan tools for an active Editor. Every such
48
+ call includes an opaque `editorHandle`; writes also require the revision token
49
+ returned by inspect and an idempotency key. Inspect returns a revision-bound
50
+ paginated safe outline. The host owns authentication, content-bound approval,
51
+ handle resolution, resource policy, audit, and persistence. Apply uses strict
52
+ projection and returns document and projection outcomes separately.
@@ -0,0 +1,19 @@
1
+ # Skenora
2
+
3
+ Skenora is a local-first 3D scene foundation. Authored truth is a serializable
4
+ SceneDocument; Babylon.js objects are disposable runtime projections.
5
+
6
+ Use SceneBlueprint and ScenePatch for declarative input. Run `skenora check`
7
+ before execution. Diagnostics are versioned JSON objects; branch on code.
8
+
9
+ Use only bounded MaterialProgram and ProceduralGeometryProgram contracts. Never
10
+ emit raw shaders, arbitrary URLs, JavaScript, credentials, or runtime handles.
11
+
12
+ Static validity is not GPU health. A healthy Runtime report requires a real
13
+ browser render and pixel readback from `renderer.probe()`.
14
+
15
+ Offline resources: `skenora docs list`, `skenora examples list`, or the
16
+ read-only `skenora mcp` stdio/HTTP server. Protected host composition may add
17
+ handle-scoped ScenePlan inspect, resource search, validation, strict apply, and
18
+ operation-wait tools. Inspect pages model-safe scene IDs and relationships;
19
+ never invent an editor handle, revision token, or write approval.
@@ -0,0 +1,97 @@
1
+ {
2
+ "schema": "skenora.tooling-manifest",
3
+ "version": 1,
4
+ "packageVersion": "0.1.2",
5
+ "resources": [
6
+ {
7
+ "id": "docs.overview",
8
+ "version": "1",
9
+ "kind": "documentation",
10
+ "title": "Skenora offline tooling",
11
+ "path": "docs/overview.md",
12
+ "mediaType": "text/markdown",
13
+ "sha256": "6a9e659a453670e79697da0a0074efcc7ef00c4faaf2a5f94277a156fcd002ab"
14
+ },
15
+ {
16
+ "id": "docs.diagnostics",
17
+ "version": "1",
18
+ "kind": "documentation",
19
+ "title": "Diagnostics and repair",
20
+ "path": "docs/diagnostics.md",
21
+ "mediaType": "text/markdown",
22
+ "sha256": "93afbe844fb38dd6e5204eaefa476f3ab04f230ef2439c74f9802f82852d4a92"
23
+ },
24
+ {
25
+ "id": "docs.runtime-probe",
26
+ "version": "1",
27
+ "kind": "documentation",
28
+ "title": "Runtime backend snapshot and probe",
29
+ "path": "docs/runtime-probe.md",
30
+ "mediaType": "text/markdown",
31
+ "sha256": "ca6e52e7dc19bca849107dcfa98cb7f08ad70e4824607e2c2005479e2b144c0d"
32
+ },
33
+ {
34
+ "id": "examples.valid-scene",
35
+ "version": "1",
36
+ "kind": "example",
37
+ "title": "Valid minimal native scene",
38
+ "path": "examples/valid-scene.json",
39
+ "mediaType": "application/json",
40
+ "sha256": "df44ea351e95badcbd388547f6a6d8152332f5a6b0d27c577f16242c7a5c58a0"
41
+ },
42
+ {
43
+ "id": "examples.invalid-scene",
44
+ "version": "1",
45
+ "kind": "example",
46
+ "title": "Invalid scene with repairable diagnostics",
47
+ "path": "examples/invalid-scene.json",
48
+ "mediaType": "application/json",
49
+ "sha256": "7f53cbd52b9aba890c84fecc4e52ed5e8a42ad86edc28eb1ec65c0e1c572e5af"
50
+ },
51
+ {
52
+ "id": "examples.gallery",
53
+ "version": "1",
54
+ "kind": "example",
55
+ "title": "Skenora immutable example gallery",
56
+ "path": "examples/gallery.json",
57
+ "mediaType": "application/json",
58
+ "sha256": "4a7ea71fa8097cf4ab569fde4aac544608362125ad352a04d8961ed30cae7a9d"
59
+ },
60
+ {
61
+ "id": "schemas.scene-check-report",
62
+ "version": "1",
63
+ "kind": "schema",
64
+ "title": "Scene check report JSON Schema",
65
+ "path": "schemas/scene-check-report.schema.json",
66
+ "mediaType": "application/schema+json",
67
+ "sha256": "16138ec754757e162fee6bf03438e07f00fd7e1bb9c1a2fcf85c13b149718218"
68
+ },
69
+ {
70
+ "id": "schemas.example-manifest",
71
+ "version": "1",
72
+ "kind": "schema",
73
+ "title": "Skenora example manifest JSON Schema",
74
+ "path": "schemas/example-manifest.schema.json",
75
+ "mediaType": "application/schema+json",
76
+ "sha256": "644a98a2a97aeffa69d58fa5745195919569b2511bdce476042d578e7b02e85e"
77
+ },
78
+ {
79
+ "id": "llms.summary",
80
+ "version": "1",
81
+ "kind": "llms",
82
+ "title": "Skenora concise agent reference",
83
+ "path": "llms.txt",
84
+ "mediaType": "text/plain",
85
+ "sha256": "2411b26761b665453dc00995d8f101edffe9d73313551076fbd71176bc2afe84"
86
+ },
87
+ {
88
+ "id": "llms.full",
89
+ "version": "1",
90
+ "kind": "llms",
91
+ "title": "Skenora complete agent reference",
92
+ "path": "llms-full.txt",
93
+ "mediaType": "text/plain",
94
+ "sha256": "e43b62d9bd877128146810c4d438dfe32949637e77eac590fe021a5272fa123c"
95
+ }
96
+ ]
97
+ }
@@ -0,0 +1,454 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "urn:skenora:example-manifest:1",
4
+ "type": "object",
5
+ "additionalProperties": false,
6
+ "required": [
7
+ "schema",
8
+ "schemaVersion",
9
+ "id",
10
+ "title",
11
+ "description",
12
+ "tags",
13
+ "mode",
14
+ "tier",
15
+ "requiredCapabilities",
16
+ "optionalCapabilities",
17
+ "assets",
18
+ "controls",
19
+ "evidence",
20
+ "files",
21
+ "license",
22
+ "aggregateSha256"
23
+ ],
24
+ "properties": {
25
+ "schema": {
26
+ "const": "skenora.example-manifest"
27
+ },
28
+ "schemaVersion": {
29
+ "const": 1
30
+ },
31
+ "id": {
32
+ "type": "string",
33
+ "pattern": "^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$"
34
+ },
35
+ "title": {
36
+ "type": "string",
37
+ "minLength": 1
38
+ },
39
+ "description": {
40
+ "type": "string",
41
+ "minLength": 1
42
+ },
43
+ "tags": {
44
+ "type": "array",
45
+ "uniqueItems": true,
46
+ "items": {
47
+ "type": "string",
48
+ "pattern": "^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$"
49
+ }
50
+ },
51
+ "mode": {
52
+ "enum": [
53
+ "blueprint",
54
+ "recipe",
55
+ "renderer-lab"
56
+ ]
57
+ },
58
+ "tier": {
59
+ "enum": [
60
+ "foundation",
61
+ "bounded-effects",
62
+ "materials",
63
+ "render-graph",
64
+ "compute",
65
+ "advanced-simulation"
66
+ ]
67
+ },
68
+ "requiredCapabilities": {
69
+ "type": "array",
70
+ "items": {
71
+ "type": "object",
72
+ "additionalProperties": false,
73
+ "required": [
74
+ "id",
75
+ "version",
76
+ "reason"
77
+ ],
78
+ "properties": {
79
+ "id": {
80
+ "type": "string",
81
+ "pattern": "^[a-z][a-z0-9.-]+$"
82
+ },
83
+ "version": {
84
+ "type": "string",
85
+ "minLength": 1
86
+ },
87
+ "reason": {
88
+ "type": "string",
89
+ "minLength": 1
90
+ }
91
+ }
92
+ }
93
+ },
94
+ "optionalCapabilities": {
95
+ "type": "array",
96
+ "items": {
97
+ "type": "object",
98
+ "additionalProperties": false,
99
+ "required": [
100
+ "id",
101
+ "version",
102
+ "reason"
103
+ ],
104
+ "properties": {
105
+ "id": {
106
+ "type": "string",
107
+ "pattern": "^[a-z][a-z0-9.-]+$"
108
+ },
109
+ "version": {
110
+ "type": "string",
111
+ "minLength": 1
112
+ },
113
+ "reason": {
114
+ "type": "string",
115
+ "minLength": 1
116
+ }
117
+ }
118
+ }
119
+ },
120
+ "assets": {
121
+ "type": "array",
122
+ "items": {
123
+ "$ref": "#/$defs/asset"
124
+ }
125
+ },
126
+ "controls": {
127
+ "$ref": "#/$defs/fieldRule"
128
+ },
129
+ "evidence": {
130
+ "type": "array",
131
+ "items": {
132
+ "$ref": "#/$defs/evidence"
133
+ }
134
+ },
135
+ "fallback": {
136
+ "$ref": "#/$defs/fallback"
137
+ },
138
+ "files": {
139
+ "type": "array",
140
+ "minItems": 1,
141
+ "items": {
142
+ "$ref": "#/$defs/file"
143
+ }
144
+ },
145
+ "license": {
146
+ "$ref": "#/$defs/license"
147
+ },
148
+ "aggregateSha256": {
149
+ "type": "string",
150
+ "pattern": "^[a-f0-9]{64}$"
151
+ }
152
+ },
153
+ "$defs": {
154
+ "asset": {
155
+ "type": "object",
156
+ "additionalProperties": false,
157
+ "required": [
158
+ "id",
159
+ "kind",
160
+ "required",
161
+ "provenance",
162
+ "description"
163
+ ],
164
+ "properties": {
165
+ "id": {
166
+ "type": "string",
167
+ "pattern": "^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$"
168
+ },
169
+ "kind": {
170
+ "enum": [
171
+ "texture",
172
+ "model",
173
+ "environment",
174
+ "data"
175
+ ]
176
+ },
177
+ "required": {
178
+ "type": "boolean"
179
+ },
180
+ "provenance": {
181
+ "enum": [
182
+ "generated",
183
+ "repository",
184
+ "host-supplied"
185
+ ]
186
+ },
187
+ "description": {
188
+ "type": "string",
189
+ "minLength": 1
190
+ },
191
+ "mediaType": {
192
+ "type": "string",
193
+ "minLength": 1
194
+ },
195
+ "integrity": {
196
+ "type": "string",
197
+ "minLength": 1
198
+ }
199
+ }
200
+ },
201
+ "evidence": {
202
+ "type": "object",
203
+ "additionalProperties": false,
204
+ "required": [
205
+ "kind",
206
+ "required",
207
+ "status",
208
+ "note"
209
+ ],
210
+ "properties": {
211
+ "kind": {
212
+ "enum": [
213
+ "parse",
214
+ "compile",
215
+ "capability",
216
+ "preparation",
217
+ "runtime",
218
+ "pixels",
219
+ "visual",
220
+ "performance",
221
+ "package-consumption",
222
+ "cross-device"
223
+ ]
224
+ },
225
+ "required": {
226
+ "type": "boolean"
227
+ },
228
+ "status": {
229
+ "enum": [
230
+ "unverified",
231
+ "passed",
232
+ "failed",
233
+ "not-applicable"
234
+ ]
235
+ },
236
+ "note": {
237
+ "type": "string",
238
+ "minLength": 1
239
+ },
240
+ "report": {
241
+ "type": "string",
242
+ "minLength": 1
243
+ }
244
+ }
245
+ },
246
+ "fallback": {
247
+ "type": "object",
248
+ "additionalProperties": false,
249
+ "required": [
250
+ "strategy",
251
+ "description"
252
+ ],
253
+ "properties": {
254
+ "strategy": {
255
+ "enum": [
256
+ "degrade",
257
+ "substitute-example",
258
+ "unsupported"
259
+ ]
260
+ },
261
+ "description": {
262
+ "type": "string",
263
+ "minLength": 1
264
+ },
265
+ "exampleId": {
266
+ "type": "string",
267
+ "pattern": "^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$"
268
+ }
269
+ }
270
+ },
271
+ "file": {
272
+ "type": "object",
273
+ "additionalProperties": false,
274
+ "required": [
275
+ "path",
276
+ "role",
277
+ "mediaType",
278
+ "bytes",
279
+ "sha256"
280
+ ],
281
+ "properties": {
282
+ "path": {
283
+ "type": "string",
284
+ "minLength": 1,
285
+ "pattern": "^(?!/)(?!.*(?:^|/)\\.\\.(?:/|$))(?!.*//)(?!.*\\\\).+$"
286
+ },
287
+ "role": {
288
+ "enum": [
289
+ "readme",
290
+ "blueprint",
291
+ "source",
292
+ "fixture",
293
+ "evidence"
294
+ ]
295
+ },
296
+ "mediaType": {
297
+ "type": "string",
298
+ "minLength": 1
299
+ },
300
+ "bytes": {
301
+ "type": "integer",
302
+ "minimum": 0
303
+ },
304
+ "sha256": {
305
+ "type": "string",
306
+ "pattern": "^[a-f0-9]{64}$"
307
+ }
308
+ }
309
+ },
310
+ "license": {
311
+ "type": "object",
312
+ "additionalProperties": false,
313
+ "required": [
314
+ "spdx",
315
+ "attribution"
316
+ ],
317
+ "properties": {
318
+ "spdx": {
319
+ "type": "string",
320
+ "minLength": 1
321
+ },
322
+ "attribution": {
323
+ "type": "string",
324
+ "minLength": 1
325
+ },
326
+ "source": {
327
+ "type": "string",
328
+ "minLength": 1
329
+ }
330
+ }
331
+ },
332
+ "fieldRule": {
333
+ "type": "object",
334
+ "additionalProperties": false,
335
+ "required": [
336
+ "description"
337
+ ],
338
+ "anyOf": [
339
+ {
340
+ "required": [
341
+ "type"
342
+ ]
343
+ },
344
+ {
345
+ "required": [
346
+ "oneOf"
347
+ ]
348
+ }
349
+ ],
350
+ "properties": {
351
+ "type": {
352
+ "enum": [
353
+ "object",
354
+ "array",
355
+ "string",
356
+ "number",
357
+ "integer",
358
+ "boolean"
359
+ ]
360
+ },
361
+ "oneOf": {
362
+ "type": "array",
363
+ "minItems": 1,
364
+ "items": {
365
+ "$ref": "#/$defs/fieldRule"
366
+ }
367
+ },
368
+ "nullable": {
369
+ "type": "boolean"
370
+ },
371
+ "description": {
372
+ "type": "string",
373
+ "minLength": 1
374
+ },
375
+ "enum": {
376
+ "type": "array",
377
+ "items": {
378
+ "type": [
379
+ "string",
380
+ "number",
381
+ "boolean"
382
+ ]
383
+ }
384
+ },
385
+ "minimum": {
386
+ "type": "number"
387
+ },
388
+ "exclusiveMinimum": {
389
+ "type": "number"
390
+ },
391
+ "maximum": {
392
+ "type": "number"
393
+ },
394
+ "minLength": {
395
+ "type": "integer",
396
+ "minimum": 0
397
+ },
398
+ "minItems": {
399
+ "type": "integer",
400
+ "minimum": 0
401
+ },
402
+ "maxItems": {
403
+ "type": "integer",
404
+ "minimum": 0
405
+ },
406
+ "properties": {
407
+ "type": "object",
408
+ "additionalProperties": {
409
+ "$ref": "#/$defs/fieldRule"
410
+ }
411
+ },
412
+ "required": {
413
+ "type": "array",
414
+ "uniqueItems": true,
415
+ "items": {
416
+ "type": "string",
417
+ "minLength": 1
418
+ }
419
+ },
420
+ "additionalProperties": {
421
+ "oneOf": [
422
+ {
423
+ "type": "boolean"
424
+ },
425
+ {
426
+ "$ref": "#/$defs/fieldRule"
427
+ }
428
+ ]
429
+ },
430
+ "items": {
431
+ "$ref": "#/$defs/fieldRule"
432
+ },
433
+ "default": {},
434
+ "unit": {
435
+ "type": "string",
436
+ "minLength": 1
437
+ },
438
+ "update": {
439
+ "enum": [
440
+ "parameter",
441
+ "rebuild"
442
+ ]
443
+ },
444
+ "reference": {
445
+ "enum": [
446
+ "asset",
447
+ "entity",
448
+ "material"
449
+ ]
450
+ }
451
+ }
452
+ }
453
+ }
454
+ }