rtistree 0.5.0

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 (181) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/LICENSE +21 -0
  3. package/README.md +99 -0
  4. package/THIRD_PARTY_NOTICES.md +25 -0
  5. package/dist/art-direction.d.ts +77 -0
  6. package/dist/art-direction.js +186 -0
  7. package/dist/art-direction.js.map +1 -0
  8. package/dist/artifacts.d.ts +24 -0
  9. package/dist/artifacts.js +49 -0
  10. package/dist/artifacts.js.map +1 -0
  11. package/dist/assets.d.ts +16 -0
  12. package/dist/assets.js +96 -0
  13. package/dist/assets.js.map +1 -0
  14. package/dist/benchmark.d.ts +76 -0
  15. package/dist/benchmark.js +118 -0
  16. package/dist/benchmark.js.map +1 -0
  17. package/dist/cli.d.ts +2 -0
  18. package/dist/cli.js +300 -0
  19. package/dist/cli.js.map +1 -0
  20. package/dist/commands.d.ts +5315 -0
  21. package/dist/commands.js +591 -0
  22. package/dist/commands.js.map +1 -0
  23. package/dist/components.d.ts +20 -0
  24. package/dist/components.js +98 -0
  25. package/dist/components.js.map +1 -0
  26. package/dist/construction.d.ts +53 -0
  27. package/dist/construction.js +80 -0
  28. package/dist/construction.js.map +1 -0
  29. package/dist/critique.d.ts +44 -0
  30. package/dist/critique.js +45 -0
  31. package/dist/critique.js.map +1 -0
  32. package/dist/detail.d.ts +5 -0
  33. package/dist/detail.js +52 -0
  34. package/dist/detail.js.map +1 -0
  35. package/dist/document.d.ts +64 -0
  36. package/dist/document.js +56 -0
  37. package/dist/document.js.map +1 -0
  38. package/dist/export.d.ts +405 -0
  39. package/dist/export.js +344 -0
  40. package/dist/export.js.map +1 -0
  41. package/dist/font-inspection.d.ts +8 -0
  42. package/dist/font-inspection.js +34 -0
  43. package/dist/font-inspection.js.map +1 -0
  44. package/dist/graphics.d.ts +9 -0
  45. package/dist/graphics.js +72 -0
  46. package/dist/graphics.js.map +1 -0
  47. package/dist/history-storage.d.ts +10 -0
  48. package/dist/history-storage.js +59 -0
  49. package/dist/history-storage.js.map +1 -0
  50. package/dist/index.d.ts +27 -0
  51. package/dist/index.js +28 -0
  52. package/dist/index.js.map +1 -0
  53. package/dist/layout.d.ts +18 -0
  54. package/dist/layout.js +155 -0
  55. package/dist/layout.js.map +1 -0
  56. package/dist/loader.d.ts +9 -0
  57. package/dist/loader.js +108 -0
  58. package/dist/loader.js.map +1 -0
  59. package/dist/mcp.d.ts +4 -0
  60. package/dist/mcp.js +223 -0
  61. package/dist/mcp.js.map +1 -0
  62. package/dist/merge.d.ts +6 -0
  63. package/dist/merge.js +49 -0
  64. package/dist/merge.js.map +1 -0
  65. package/dist/native.d.ts +3 -0
  66. package/dist/native.js +6 -0
  67. package/dist/native.js.map +1 -0
  68. package/dist/paint.d.ts +9 -0
  69. package/dist/paint.js +331 -0
  70. package/dist/paint.js.map +1 -0
  71. package/dist/path-edit.d.ts +20 -0
  72. package/dist/path-edit.js +30 -0
  73. package/dist/path-edit.js.map +1 -0
  74. package/dist/pdf-output.d.ts +21 -0
  75. package/dist/pdf-output.js +297 -0
  76. package/dist/pdf-output.js.map +1 -0
  77. package/dist/pipeline.d.ts +39 -0
  78. package/dist/pipeline.js +227 -0
  79. package/dist/pipeline.js.map +1 -0
  80. package/dist/print-scene.d.ts +490 -0
  81. package/dist/print-scene.js +55 -0
  82. package/dist/print-scene.js.map +1 -0
  83. package/dist/production-workflow.d.ts +251 -0
  84. package/dist/production-workflow.js +335 -0
  85. package/dist/production-workflow.js.map +1 -0
  86. package/dist/program-worker.d.ts +1 -0
  87. package/dist/program-worker.js +31 -0
  88. package/dist/program-worker.js.map +1 -0
  89. package/dist/program.d.ts +85 -0
  90. package/dist/program.js +246 -0
  91. package/dist/program.js.map +1 -0
  92. package/dist/project-config.d.ts +91 -0
  93. package/dist/project-config.js +187 -0
  94. package/dist/project-config.js.map +1 -0
  95. package/dist/project.d.ts +897 -0
  96. package/dist/project.js +347 -0
  97. package/dist/project.js.map +1 -0
  98. package/dist/raster-edit.d.ts +61 -0
  99. package/dist/raster-edit.js +91 -0
  100. package/dist/raster-edit.js.map +1 -0
  101. package/dist/raster-studio.d.ts +84 -0
  102. package/dist/raster-studio.js +236 -0
  103. package/dist/raster-studio.js.map +1 -0
  104. package/dist/render.d.ts +79 -0
  105. package/dist/render.js +437 -0
  106. package/dist/render.js.map +1 -0
  107. package/dist/rich-text.d.ts +10 -0
  108. package/dist/rich-text.js +56 -0
  109. package/dist/rich-text.js.map +1 -0
  110. package/dist/schema.d.ts +1912 -0
  111. package/dist/schema.js +571 -0
  112. package/dist/schema.js.map +1 -0
  113. package/dist/spatial.d.ts +10 -0
  114. package/dist/spatial.js +29 -0
  115. package/dist/spatial.js.map +1 -0
  116. package/dist/studio-reference.d.ts +153 -0
  117. package/dist/studio-reference.js +39 -0
  118. package/dist/studio-reference.js.map +1 -0
  119. package/dist/svg.d.ts +5 -0
  120. package/dist/svg.js +315 -0
  121. package/dist/svg.js.map +1 -0
  122. package/dist/techniques.d.ts +74 -0
  123. package/dist/techniques.js +164 -0
  124. package/dist/techniques.js.map +1 -0
  125. package/dist/verify.d.ts +36 -0
  126. package/dist/verify.js +277 -0
  127. package/dist/verify.js.map +1 -0
  128. package/dist/viewport.d.ts +3 -0
  129. package/dist/viewport.js +71 -0
  130. package/dist/viewport.js.map +1 -0
  131. package/dist/workflow.d.ts +53 -0
  132. package/dist/workflow.js +66 -0
  133. package/dist/workflow.js.map +1 -0
  134. package/docs/agent-art-workflow.md +201 -0
  135. package/docs/agent-setup.md +83 -0
  136. package/docs/atelier.md +117 -0
  137. package/docs/cli-reference.md +61 -0
  138. package/docs/decisions/001-runtime-and-renderer.md +35 -0
  139. package/docs/decisions/002-composable-scenes-and-history.md +28 -0
  140. package/docs/decisions/003-editing-refinement-and-agent-validation.md +45 -0
  141. package/docs/decisions/004-print-production-and-projects.md +19 -0
  142. package/docs/decisions/005-programmable-digital-art.md +15 -0
  143. package/docs/decisions/006-staged-2d-art-production.md +13 -0
  144. package/docs/decisions/007-foundation-first-art-direction.md +13 -0
  145. package/docs/decisions/008-agent-onboarding-and-trial-lessons.md +48 -0
  146. package/docs/engine-overview.md +174 -0
  147. package/docs/evolution.md +179 -0
  148. package/docs/getting-started.md +107 -0
  149. package/docs/next-milestone.md +61 -0
  150. package/docs/previews/a3-production.json +36 -0
  151. package/docs/previews/benchmark.json +42 -0
  152. package/docs/previews/landscape.png +0 -0
  153. package/docs/previews/performance.json +24 -0
  154. package/docs/previews/poster.png +0 -0
  155. package/docs/production.md +107 -0
  156. package/docs/releasing.md +60 -0
  157. package/docs/scene-format.md +126 -0
  158. package/docs/studio.md +108 -0
  159. package/examples/hello/README.md +14 -0
  160. package/examples/hello/refine.json +10 -0
  161. package/examples/hello/render.mjs +9 -0
  162. package/examples/hello/scene.json +19 -0
  163. package/licenses/DM-Serif-Display-OFL.txt +93 -0
  164. package/licenses/Inter-OFL.txt +93 -0
  165. package/package.json +84 -0
  166. package/schemas/authoring.schema.json +2177 -0
  167. package/schemas/brief.schema.json +57 -0
  168. package/schemas/command.schema.json +3154 -0
  169. package/schemas/construction.schema.json +159 -0
  170. package/schemas/critique.schema.json +101 -0
  171. package/schemas/document.schema.json +41 -0
  172. package/schemas/export.schema.json +89 -0
  173. package/schemas/fragment.schema.json +1861 -0
  174. package/schemas/patch.schema.json +3177 -0
  175. package/schemas/pipeline.schema.json +205 -0
  176. package/schemas/production.schema.json +452 -0
  177. package/schemas/program.schema.json +152 -0
  178. package/schemas/project.schema.json +115 -0
  179. package/schemas/raster-read.schema.json +42 -0
  180. package/schemas/raster-write.schema.json +75 -0
  181. package/schemas/scene.schema.json +2014 -0
package/docs/studio.md ADDED
@@ -0,0 +1,108 @@
1
+ # Programmable digital art in v0.4
2
+
3
+ The studio is the escape hatch below scene abstractions. An agent can build an image using paths and gradients, paint pressure-sensitive strokes, calculate pixel colours, sample textures, or write a custom image-processing algorithm. No image-generation model is used by these tools.
4
+
5
+ Scene layers still describe composition. Programs produce ordinary pinned PNG assets and can replace the source of a raster/image layer. Their exact source, seed, parameters, input snapshots and output hash are saved as a recipe. Rendering, inspecting and opening a scene never runs a program. Re-execution is explicit, and existing edits remain undoable.
6
+
7
+ ## First painting
8
+
9
+ ```sh
10
+ graphics project new study --size 100x100
11
+ graphics studio-help
12
+ ```
13
+
14
+ Save this as `study/programs/rubber.js`:
15
+
16
+ ```js
17
+ const height = (x, y) => 18 * Math.sin(x / 80);
18
+ return art.raster((x, y) => {
19
+ const grain = (art.fbm(x / 20, y / 20) - 0.5) * 5;
20
+ return art.light(art.normal(height, x, y), [40 + grain, 47 + grain, 51 + grain, 255], {
21
+ light: [-0.6, -0.4, 1],
22
+ specular: 0.06,
23
+ shininess: 20,
24
+ });
25
+ });
26
+ ```
27
+
28
+ Save a request as `study/paint.json`:
29
+
30
+ ```json
31
+ {
32
+ "source": "programs/rubber.js",
33
+ "asset_id": "rubberPaint",
34
+ "target": "rubber",
35
+ "width": 400,
36
+ "height": 400,
37
+ "seed": 2020,
38
+ "parameters": {},
39
+ "reason": "Paint a curved rubber material using height-field lighting"
40
+ }
41
+ ```
42
+
43
+ ```sh
44
+ graphics program study study/paint.json
45
+ graphics render study -o study/output/rubber.png
46
+ graphics program-replay study rubberPaint
47
+ ```
48
+
49
+ Supply exactly one of `source` (a project-local JavaScript file) or `code` (an inline function body). A program receives `art` and `parameters`, runs synchronously and returns one Canvas with the declared dimensions. It cannot import modules through the public API. A new `target` creates a raster layer; an existing target must accept an image source. Omit `target` to register an asset for subsequent mask, region or layer operations. The runner captures the starting scene hash and rejects a concurrent edit before committing.
50
+
51
+ ## Authoring vocabulary
52
+
53
+ `graphics studio-help` and the MCP `studioHelp` tool expose the complete signatures and a runnable example. TypeScript consumers can use `RasterStudio` from the SDK.
54
+
55
+ | API | Purpose |
56
+ | ----------------------------------------------- | ------------------------------------------------------------------------------- |
57
+ | `canvas`, `getContext('2d')` | Native paths, fills, transforms, compositing, gradients and text |
58
+ | `raster`, `pixels`, `put` | Arbitrary pixel functions and dense typed-array editing |
59
+ | `brush` | Round dabs with pressure, hardness, per-dab opacity, spacing and seeded scatter |
60
+ | `noise`, `fbm`, `random` | Coordinate-addressed textures and repeatable random sequences |
61
+ | `polar`, `repeat`, `mix`, `clamp`, `smoothstep` | General coordinate and field construction |
62
+ | `sample`, `warp`, `displace` | Bilinear sampling and arbitrary inverse coordinate mappings |
63
+ | `normal`, `light` | Height-field normals, Lambert diffuse and Blinn–Phong highlights |
64
+ | `blur` | Softening and intermediate layer preparation |
65
+ | `input` | A mutable Canvas copy of a named frozen input image |
66
+
67
+ Brush pressure affects radius and alpha. Opacity applies to each dab, so strokes accumulate paint. Spacing is measured as a fraction of the requested radius; scatter is also radius-relative. Brushes use the canvas context's current transform. Dabs below 0.01 pixel radius are omitted to avoid degenerate native gradients. These are round brushes, not a complete simulation of paint, bristles or wet media.
68
+
69
+ Pixel functions use integer pixel-centre coordinates and four finite 0–255 sRGB channels. Native surfaces store premultiplied alpha: fully transparent hidden RGB is not preserved, and semi-transparent samples can round on conversion. Sampling interpolates premultiplied colour to avoid dark fringes. Edge modes are transparent, clamp or repeat. Warp callbacks map **destination coordinates to source coordinates**. Displacement adds its field to the source sampling coordinates.
70
+
71
+ Height-field lighting is an artistic 2.5D calculation, with the viewer along positive Z. It does not provide ray-traced reflections, refraction, global illumination, occlusion or cast shadows. Those effects can be painted, approximated in code, or supplied as baked assets from an external traditional graphics tool.
72
+
73
+ ## Dense regional edits
74
+
75
+ `readRasterRegion` / `graphics raster-read PROJECT request.json` read a PNG crop of the composite or an isolated layer. The request contains integer canvas-space `bounds` and an optional `target`. The result includes the scene hash and an asset descriptor ready for `registerAsset`.
76
+
77
+ `writeRasterRegion` / `graphics raster-write PROJECT request.json` consumes:
78
+
79
+ ```json
80
+ {
81
+ "target": "rubber",
82
+ "region_id": "scuff",
83
+ "source": "output/scuff.png",
84
+ "bounds": [40, 60, 80, 80],
85
+ "space": "layer",
86
+ "composite": "over",
87
+ "expected_hash": "sha256:REPLACE_WITH_CURRENT_SCENE_HASH",
88
+ "reason": "Paint a local abrasion without changing the rest of the layer"
89
+ }
90
+ ```
91
+
92
+ The source must be a project-local PNG matching the region's exact dimensions. `replace` clears/replaces the region, including alpha; `over` composites it onto the previous pixels. The command creates or updates a named promoted region at scale 1 and stores an immutable copy of the PNG. `space: layer` captures reference dimensions, so the patch follows later transforms and resizing. `space: canvas` stays at canvas coordinates. Existing layer masks/effects still apply; locality validation rejects changes leaking outside the declared region. Undo/redo restores the prior image.
93
+
94
+ For a custom filter, register the descriptor returned by the read, pass that asset to `runProgram.inputs`, calculate the new pixels, and write the returned PNG into a region. Use the latest scene hash returned by each mutation. Canvas-space reads cannot automatically become local-space reads of a rotated object; use canvas-space patch coordinates for a direct read/edit/write round trip.
95
+
96
+ ## Reproducibility and execution limits
97
+
98
+ Recipes live under `recipes/<hash>/`. Each recipe stores the exact JavaScript source text, source hash, parameters, seed, studio version, Node/Skia versions, frozen input PNG hashes and output hash. Inputs are normalised to sRGB before execution. Portable project export copies the recipe and its input snapshots, without executing them. `program-replay` executes a selected recipe and compares the resulting PNG hash; equality is expected on the same pinned runtime/platform, not universally across machines.
99
+
100
+ Programs execute only when explicitly requested and must be trusted code. A worker and VM provide convenience isolation and cancellation, **not a security sandbox**: native objects expose host methods. The public API does not expose filesystem/network access, and its `Math.random` is seeded; Date/performance are absent. Do not treat these properties as hostile-code containment.
101
+
102
+ The runner checks a 16-megapixel output limit, 16 input images, an 8,192-pixel edge, 256 KiB source, 64 KiB parameters, and up to 30 seconds of execution. The parent watchdog allows two additional seconds for worker setup. Studio helper allocations are capped at 32 cumulative megapixels including inputs; V8's heap limit is 256 MiB. Native Canvas buffers and arbitrary allocations made through exposed native objects are outside the V8 accounting, so these limits are not an OS memory quota. Scene rendering retains its separate surface budget.
103
+
104
+ The studio has no live dependency graph. Changing program code, parameters or an input does not automatically rebake dependent assets. Explicit execution replaces a target source through the existing transaction/history mechanism. If execution or commit fails, the scene is unchanged; a late failed commit can leave unreferenced content-addressed artifacts.
105
+
106
+ ## Trial
107
+
108
+ The [manual wheel trial](../examples/manual-wheel-trial/README.md) used no model-generated or downloaded imagery. Its eight layers were painted with code, geometry, material fields, text and brushes. Source, recipes, initial/refined images, critiques and replay checks are retained. The result demonstrates a reproducible digital illustration; its visual evaluation explicitly leaves photographic realism unachieved.
@@ -0,0 +1,14 @@
1
+ # First image
2
+
3
+ From a directory with `rtistree` installed, copy these three files into your project.
4
+
5
+ ```sh
6
+ npx graphics render scene.json -o hello.png
7
+ npx graphics apply scene.json refine.json
8
+ npx graphics render scene.json -o brighter.png
9
+ npx graphics undo scene.json
10
+ npx graphics render scene.json -o restored.png
11
+ ```
12
+
13
+ `restored.png` should match `hello.png` byte for byte on the same runtime and platform.
14
+ `render.mjs` demonstrates the SDK; run it with `node render.mjs`.
@@ -0,0 +1,10 @@
1
+ {
2
+ "reason": "Brighten the disc while preserving the title and background",
3
+ "commands": [
4
+ {
5
+ "type": "applyRasterOperation",
6
+ "target": "disc",
7
+ "operation": { "type": "brightness", "bounds": [360, 60, 200, 200], "amount": 0.15 }
8
+ }
9
+ ]
10
+ }
@@ -0,0 +1,9 @@
1
+ import { Project, rtistreeAgentInstructions, artDirectionGuide } from 'rtistree';
2
+ import { writeFile } from 'node:fs/promises';
3
+
4
+ const project = await Project.open(new URL('./scene.json', import.meta.url).pathname);
5
+ const result = await project.render();
6
+ await writeFile(new URL('./sdk-output.png', import.meta.url), result.png);
7
+ console.log({ width: result.width, height: result.height, guide: artDirectionGuide.version });
8
+ // Include this string in your agent's instructions when integrating the SDK.
9
+ console.log(rtistreeAgentInstructions);
@@ -0,0 +1,19 @@
1
+ {
2
+ "version": 1,
3
+ "canvas": { "width": 640, "height": 400, "background": "#14251f" },
4
+ "layers": [
5
+ {
6
+ "id": "disc",
7
+ "type": "vector",
8
+ "bounds": [360, 60, 200, 200],
9
+ "shape": { "type": "ellipse", "fill": "#95b85c" }
10
+ },
11
+ {
12
+ "id": "title",
13
+ "type": "text",
14
+ "bounds": [48, 275, 544, 80],
15
+ "content": "Hello, Rtistree.",
16
+ "style": { "font": "inter", "size": 44, "weight": "bold", "colour": "#edf3e8" }
17
+ }
18
+ ]
19
+ }
@@ -0,0 +1,93 @@
1
+ Copyright 2014 - 2017 Adobe Systems Incorporated (http://www.adobe.com/), with Reserved Font Name 'Source'. Copyright 2019 Google LLC. DMSerifDisplay-Italic.ttf: Copyright 2014 - 2017 Adobe Systems Incorporated (http://www.adobe.com/), with Reserved Font Name 'Source'. Copyright 2019 Google LLC.
2
+
3
+ This Font Software is licensed under the SIL Open Font License, Version 1.1.
4
+ This license is copied below, and is also available with a FAQ at:
5
+ http://scripts.sil.org/OFL
6
+
7
+
8
+ -----------------------------------------------------------
9
+ SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
10
+ -----------------------------------------------------------
11
+
12
+ PREAMBLE
13
+ The goals of the Open Font License (OFL) are to stimulate worldwide
14
+ development of collaborative font projects, to support the font creation
15
+ efforts of academic and linguistic communities, and to provide a free and
16
+ open framework in which fonts may be shared and improved in partnership
17
+ with others.
18
+
19
+ The OFL allows the licensed fonts to be used, studied, modified and
20
+ redistributed freely as long as they are not sold by themselves. The
21
+ fonts, including any derivative works, can be bundled, embedded,
22
+ redistributed and/or sold with any software provided that any reserved
23
+ names are not used by derivative works. The fonts and derivatives,
24
+ however, cannot be released under any other type of license. The
25
+ requirement for fonts to remain under this license does not apply
26
+ to any document created using the fonts or their derivatives.
27
+
28
+ DEFINITIONS
29
+ "Font Software" refers to the set of files released by the Copyright
30
+ Holder(s) under this license and clearly marked as such. This may
31
+ include source files, build scripts and documentation.
32
+
33
+ "Reserved Font Name" refers to any names specified as such after the
34
+ copyright statement(s).
35
+
36
+ "Original Version" refers to the collection of Font Software components as
37
+ distributed by the Copyright Holder(s).
38
+
39
+ "Modified Version" refers to any derivative made by adding to, deleting,
40
+ or substituting -- in part or in whole -- any of the components of the
41
+ Original Version, by changing formats or by porting the Font Software to a
42
+ new environment.
43
+
44
+ "Author" refers to any designer, engineer, programmer, technical
45
+ writer or other person who contributed to the Font Software.
46
+
47
+ PERMISSION & CONDITIONS
48
+ Permission is hereby granted, free of charge, to any person obtaining
49
+ a copy of the Font Software, to use, study, copy, merge, embed, modify,
50
+ redistribute, and sell modified and unmodified copies of the Font
51
+ Software, subject to the following conditions:
52
+
53
+ 1) Neither the Font Software nor any of its individual components,
54
+ in Original or Modified Versions, may be sold by itself.
55
+
56
+ 2) Original or Modified Versions of the Font Software may be bundled,
57
+ redistributed and/or sold with any software, provided that each copy
58
+ contains the above copyright notice and this license. These can be
59
+ included either as stand-alone text files, human-readable headers or
60
+ in the appropriate machine-readable metadata fields within text or
61
+ binary files as long as those fields can be easily viewed by the user.
62
+
63
+ 3) No Modified Version of the Font Software may use the Reserved Font
64
+ Name(s) unless explicit written permission is granted by the corresponding
65
+ Copyright Holder. This restriction only applies to the primary font name as
66
+ presented to the users.
67
+
68
+ 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
69
+ Software shall not be used to promote, endorse or advertise any
70
+ Modified Version, except to acknowledge the contribution(s) of the
71
+ Copyright Holder(s) and the Author(s) or with their explicit written
72
+ permission.
73
+
74
+ 5) The Font Software, modified or unmodified, in part or in whole,
75
+ must be distributed entirely under this license, and must not be
76
+ distributed under any other license. The requirement for fonts to
77
+ remain under this license does not apply to any document created
78
+ using the Font Software.
79
+
80
+ TERMINATION
81
+ This license becomes null and void if any of the above conditions are
82
+ not met.
83
+
84
+ DISCLAIMER
85
+ THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
86
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
87
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
88
+ OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
89
+ COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
90
+ INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
91
+ DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
92
+ FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
93
+ OTHER DEALINGS IN THE FONT SOFTWARE.
@@ -0,0 +1,93 @@
1
+ Copyright 2016 The Inter Project Authors (https://github.com/rsms/inter) Inter-Italic[opsz,wght].ttf: Copyright 2016 The Inter Project Authors (https://github.com/rsms/inter)
2
+
3
+ This Font Software is licensed under the SIL Open Font License, Version 1.1.
4
+ This license is copied below, and is also available with a FAQ at:
5
+ http://scripts.sil.org/OFL
6
+
7
+
8
+ -----------------------------------------------------------
9
+ SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
10
+ -----------------------------------------------------------
11
+
12
+ PREAMBLE
13
+ The goals of the Open Font License (OFL) are to stimulate worldwide
14
+ development of collaborative font projects, to support the font creation
15
+ efforts of academic and linguistic communities, and to provide a free and
16
+ open framework in which fonts may be shared and improved in partnership
17
+ with others.
18
+
19
+ The OFL allows the licensed fonts to be used, studied, modified and
20
+ redistributed freely as long as they are not sold by themselves. The
21
+ fonts, including any derivative works, can be bundled, embedded,
22
+ redistributed and/or sold with any software provided that any reserved
23
+ names are not used by derivative works. The fonts and derivatives,
24
+ however, cannot be released under any other type of license. The
25
+ requirement for fonts to remain under this license does not apply
26
+ to any document created using the fonts or their derivatives.
27
+
28
+ DEFINITIONS
29
+ "Font Software" refers to the set of files released by the Copyright
30
+ Holder(s) under this license and clearly marked as such. This may
31
+ include source files, build scripts and documentation.
32
+
33
+ "Reserved Font Name" refers to any names specified as such after the
34
+ copyright statement(s).
35
+
36
+ "Original Version" refers to the collection of Font Software components as
37
+ distributed by the Copyright Holder(s).
38
+
39
+ "Modified Version" refers to any derivative made by adding to, deleting,
40
+ or substituting -- in part or in whole -- any of the components of the
41
+ Original Version, by changing formats or by porting the Font Software to a
42
+ new environment.
43
+
44
+ "Author" refers to any designer, engineer, programmer, technical
45
+ writer or other person who contributed to the Font Software.
46
+
47
+ PERMISSION & CONDITIONS
48
+ Permission is hereby granted, free of charge, to any person obtaining
49
+ a copy of the Font Software, to use, study, copy, merge, embed, modify,
50
+ redistribute, and sell modified and unmodified copies of the Font
51
+ Software, subject to the following conditions:
52
+
53
+ 1) Neither the Font Software nor any of its individual components,
54
+ in Original or Modified Versions, may be sold by itself.
55
+
56
+ 2) Original or Modified Versions of the Font Software may be bundled,
57
+ redistributed and/or sold with any software, provided that each copy
58
+ contains the above copyright notice and this license. These can be
59
+ included either as stand-alone text files, human-readable headers or
60
+ in the appropriate machine-readable metadata fields within text or
61
+ binary files as long as those fields can be easily viewed by the user.
62
+
63
+ 3) No Modified Version of the Font Software may use the Reserved Font
64
+ Name(s) unless explicit written permission is granted by the corresponding
65
+ Copyright Holder. This restriction only applies to the primary font name as
66
+ presented to the users.
67
+
68
+ 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
69
+ Software shall not be used to promote, endorse or advertise any
70
+ Modified Version, except to acknowledge the contribution(s) of the
71
+ Copyright Holder(s) and the Author(s) or with their explicit written
72
+ permission.
73
+
74
+ 5) The Font Software, modified or unmodified, in part or in whole,
75
+ must be distributed entirely under this license, and must not be
76
+ distributed under any other license. The requirement for fonts to
77
+ remain under this license does not apply to any document created
78
+ using the Font Software.
79
+
80
+ TERMINATION
81
+ This license becomes null and void if any of the above conditions are
82
+ not met.
83
+
84
+ DISCLAIMER
85
+ THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
86
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
87
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
88
+ OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
89
+ COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
90
+ INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
91
+ DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
92
+ FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
93
+ OTHER DEALINGS IN THE FONT SOFTWARE.
package/package.json ADDED
@@ -0,0 +1,84 @@
1
+ {
2
+ "name": "rtistree",
3
+ "version": "0.5.0",
4
+ "description": "Deterministic, agent-operable raster graphics engine",
5
+ "main": "./dist/index.js",
6
+ "scripts": {
7
+ "build": "tsc",
8
+ "typecheck": "tsc --noEmit",
9
+ "test": "node --import tsx --test tests/*.test.ts",
10
+ "check": "npm run build && npm test",
11
+ "graphics": "node --import tsx src/cli.ts",
12
+ "demo": "node --import tsx scripts/demo.ts",
13
+ "schema": "node --import tsx scripts/schema.ts",
14
+ "format": "prettier --write src tests scripts docs examples schemas README.md package.json tsconfig.json .github .prettierrc.json",
15
+ "format:check": "prettier --check src tests scripts docs examples schemas README.md package.json tsconfig.json .github .prettierrc.json",
16
+ "performance": "node --import tsx scripts/performance.ts",
17
+ "prepack": "npm run build",
18
+ "package:check": "node scripts/package-smoke.mjs"
19
+ },
20
+ "keywords": [
21
+ "graphics",
22
+ "mcp",
23
+ "agents",
24
+ "raster",
25
+ "procedural-art",
26
+ "canvas"
27
+ ],
28
+ "type": "module",
29
+ "dependencies": {
30
+ "@fontsource/dm-serif-display": "5.3.0",
31
+ "@fontsource/inter": "5.3.0",
32
+ "@modelcontextprotocol/sdk": "1.30.0",
33
+ "@napi-rs/canvas": "1.0.8",
34
+ "fast-xml-parser": "5.11.1",
35
+ "fontkit": "2.0.4",
36
+ "pdf-lib": "1.17.1",
37
+ "pdfkit": "0.20.2",
38
+ "sharp": "0.35.4",
39
+ "yaml": "2.9.0",
40
+ "zod": "4.5.4"
41
+ },
42
+ "devDependencies": {
43
+ "@types/fontkit": "2.0.9",
44
+ "@types/node": "26.5.0",
45
+ "@types/pdfkit": "0.17.6",
46
+ "prettier": "3.9.6",
47
+ "tsx": "4.23.13",
48
+ "typescript": "7.0.2"
49
+ },
50
+ "types": "./dist/index.d.ts",
51
+ "exports": {
52
+ ".": "./dist/index.js"
53
+ },
54
+ "bin": {
55
+ "graphics": "./dist/cli.js"
56
+ },
57
+ "engines": {
58
+ "node": ">=22"
59
+ },
60
+ "files": [
61
+ "dist",
62
+ "README.md",
63
+ "docs",
64
+ "schemas",
65
+ "LICENSE",
66
+ "CHANGELOG.md",
67
+ "THIRD_PARTY_NOTICES.md",
68
+ "licenses",
69
+ "examples/hello"
70
+ ],
71
+ "license": "MIT",
72
+ "author": "Colum Ferry",
73
+ "homepage": "https://rtistree.dev",
74
+ "repository": {
75
+ "type": "git",
76
+ "url": "git+https://github.com/Coly010/rtistree.git"
77
+ },
78
+ "bugs": {
79
+ "url": "https://github.com/Coly010/rtistree/issues"
80
+ },
81
+ "publishConfig": {
82
+ "access": "public"
83
+ }
84
+ }