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
@@ -0,0 +1,85 @@
1
+ import { z } from 'zod';
2
+ import type { Project } from './project.js';
3
+ export declare const PROGRAM_VERSION = "rtistree-studio/1";
4
+ export declare const programSchema: z.ZodObject<{
5
+ source: z.ZodOptional<z.ZodString>;
6
+ code: z.ZodOptional<z.ZodString>;
7
+ asset_id: z.ZodString;
8
+ target: z.ZodOptional<z.ZodString>;
9
+ width: z.ZodNumber;
10
+ height: z.ZodNumber;
11
+ seed: z.ZodDefault<z.ZodNumber>;
12
+ parameters: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodJSONSchema>>;
13
+ inputs: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodString>>;
14
+ timeout_ms: z.ZodDefault<z.ZodNumber>;
15
+ expected_hash: z.ZodOptional<z.ZodString>;
16
+ reason: z.ZodString;
17
+ }, z.core.$strict>;
18
+ export type RasterProgram = z.infer<typeof programSchema>;
19
+ export interface ProgramRecipe {
20
+ version: typeof PROGRAM_VERSION;
21
+ source: string;
22
+ source_hash: string;
23
+ parameters: Record<string, unknown>;
24
+ width: number;
25
+ height: number;
26
+ seed: number;
27
+ timeout_ms: number;
28
+ inputs: Record<string, {
29
+ source: string;
30
+ hash: string;
31
+ }>;
32
+ output_hash: string;
33
+ runtime: {
34
+ node: string;
35
+ skia: string;
36
+ techniques?: string;
37
+ };
38
+ }
39
+ export declare function executeRasterProgram(source: string, options: Pick<RasterProgram, 'width' | 'height' | 'seed' | 'parameters' | 'timeout_ms'>, inputs?: Record<string, Buffer>): Promise<Buffer>;
40
+ /** Explicit execution only. Rendering/importing a scene never evaluates its recipes. */
41
+ export declare function runProgram(project: Project, raw: unknown): Promise<{
42
+ asset_id: string;
43
+ asset: {
44
+ source: string;
45
+ hash: string;
46
+ recipe: {
47
+ source: string;
48
+ hash: string;
49
+ };
50
+ };
51
+ recipe_hash: string;
52
+ output_hash: string;
53
+ sequence: number;
54
+ scene_hash: string;
55
+ }>;
56
+ /** Bake immutable artifacts without changing a scene, for atomic multi-node builds. */
57
+ export declare function bakeProgram(root: string, spec: RasterProgram, assets: import('./schema.js').Scene['assets']): Promise<{
58
+ asset: {
59
+ source: string;
60
+ hash: string;
61
+ recipe: {
62
+ source: string;
63
+ hash: string;
64
+ };
65
+ };
66
+ recipe_hash: string;
67
+ output_hash: string;
68
+ }>;
69
+ export declare function replayRecipe(root: string, reference: {
70
+ source: string;
71
+ hash: string;
72
+ }): Promise<{
73
+ identical: boolean;
74
+ expected_hash: string;
75
+ output_hash: string;
76
+ png: Buffer<ArrayBufferLike>;
77
+ }>;
78
+ /** Copy a frozen recipe and its local input snapshots without executing code. */
79
+ export declare function copyRecipe(root: string, reference: {
80
+ source: string;
81
+ hash: string;
82
+ }, destination: string): Promise<{
83
+ source: string;
84
+ hash: string;
85
+ }>;
@@ -0,0 +1,246 @@
1
+ import { TECHNIQUE_VERSION } from './techniques.js';
2
+ import { Worker } from 'node:worker_threads';
3
+ import { readFile } from 'node:fs/promises';
4
+ import { dirname, join } from 'node:path';
5
+ import { z } from 'zod';
6
+ import sharp from 'sharp';
7
+ import { canonical, localAssetPath, sha256 } from './assets.js';
8
+ import { writeArtifact } from './artifacts.js';
9
+ import { sceneHash } from './assets.js';
10
+ import { flattenLayers } from './schema.js';
11
+ export const PROGRAM_VERSION = 'rtistree-studio/1';
12
+ const name = z.string().regex(/^[a-zA-Z][a-zA-Z0-9_-]{0,79}$/);
13
+ export const programSchema = z
14
+ .strictObject({
15
+ source: z.string().min(1).optional(),
16
+ code: z
17
+ .string()
18
+ .min(1)
19
+ .max(256 * 1024)
20
+ .optional(),
21
+ asset_id: name,
22
+ target: name.optional(),
23
+ width: z.number().int().min(1).max(8192),
24
+ height: z.number().int().min(1).max(8192),
25
+ seed: z.number().int().min(0).max(0xffffffff).default(0),
26
+ parameters: z.record(z.string(), z.json()).default({}),
27
+ inputs: z.record(name, name).default({}),
28
+ timeout_ms: z.number().int().min(50).max(30000).default(10000),
29
+ expected_hash: z.string().optional(),
30
+ reason: z.string().min(1).max(4000),
31
+ })
32
+ .superRefine((value, ctx) => {
33
+ if (Boolean(value.source) === Boolean(value.code))
34
+ ctx.addIssue({
35
+ code: 'custom',
36
+ message: 'Specify exactly one of source (project-local file) or code (inline JavaScript)',
37
+ });
38
+ });
39
+ export async function executeRasterProgram(source, options, inputs = {}) {
40
+ options = programSchema.parse({
41
+ width: options.width,
42
+ height: options.height,
43
+ seed: options.seed,
44
+ parameters: options.parameters,
45
+ timeout_ms: options.timeout_ms,
46
+ source: 'inline',
47
+ asset_id: 'output',
48
+ reason: 'Execute',
49
+ });
50
+ if (Buffer.byteLength(source) > 256 * 1024 ||
51
+ Buffer.byteLength(canonical(options.parameters)) > 64 * 1024)
52
+ throw new Error('Program source/parameters exceed 256 KiB / 64 KiB');
53
+ if (options.width * options.height > 16 * 1024 * 1024)
54
+ throw new Error('Program output exceeds 16 megapixels');
55
+ let pixels = options.width * options.height;
56
+ if (Object.keys(inputs).length > 16)
57
+ throw new Error('A program accepts at most 16 input images');
58
+ for (const input of Object.values(inputs)) {
59
+ const m = await sharp(input, { limitInputPixels: 32 * 1024 * 1024 }).metadata();
60
+ pixels += m.width * m.height;
61
+ }
62
+ if (pixels > 32 * 1024 * 1024)
63
+ throw new Error('Program inputs/output exceed 32 megapixels');
64
+ const ts = import.meta.url.endsWith('.ts'), url = new URL(ts ? './program-worker.ts' : './program-worker.js', import.meta.url).href;
65
+ const bootstrap = ts
66
+ ? `import('tsx/esm/api').then(({tsImport}) => tsImport(${JSON.stringify(url)}, ${JSON.stringify(import.meta.url)}))`
67
+ : `import(${JSON.stringify(url)})`;
68
+ const png = await new Promise((resolve, reject) => {
69
+ const worker = new Worker(bootstrap, {
70
+ eval: true,
71
+ workerData: { ...options, source, inputs },
72
+ resourceLimits: { maxOldGenerationSizeMb: 256 },
73
+ });
74
+ const timer = setTimeout(() => {
75
+ void worker.terminate();
76
+ reject(new Error('Raster program exceeded its wall-clock limit'));
77
+ }, options.timeout_ms + 2000);
78
+ const finish = () => {
79
+ clearTimeout(timer);
80
+ void worker.terminate();
81
+ };
82
+ worker.once('message', (message) => {
83
+ finish();
84
+ if (message.error)
85
+ reject(new Error(message.error));
86
+ else
87
+ resolve(Buffer.from(message.png));
88
+ });
89
+ worker.once('error', (error) => {
90
+ finish();
91
+ reject(error);
92
+ });
93
+ worker.once('exit', (code) => {
94
+ clearTimeout(timer);
95
+ reject(new Error(`Raster worker exited before producing an image (${code})`));
96
+ });
97
+ });
98
+ const metadata = await sharp(png, { limitInputPixels: 16 * 1024 * 1024 }).metadata();
99
+ if (metadata.format !== 'png' ||
100
+ metadata.width !== options.width ||
101
+ metadata.height !== options.height)
102
+ throw new Error('Program output must encode a PNG with the declared dimensions');
103
+ return png;
104
+ }
105
+ /** Explicit execution only. Rendering/importing a scene never evaluates its recipes. */
106
+ export async function runProgram(project, raw) {
107
+ const spec = programSchema.parse(raw), scene = await project.scene(), before = sceneHash(scene);
108
+ if (spec.expected_hash && before !== spec.expected_hash)
109
+ throw new Error('Stale scene hash');
110
+ const { asset, recipe_hash: hash, output_hash, } = await bakeProgram(project.root, spec, scene.assets);
111
+ const commands = [{ type: 'registerAsset', id: spec.asset_id, asset }];
112
+ if (spec.target) {
113
+ const target = flattenLayers(scene.layers).find((l) => l.id === spec.target);
114
+ commands.push(target
115
+ ? { type: 'setSource', target: spec.target, source: spec.asset_id }
116
+ : {
117
+ type: 'addLayer',
118
+ layer: {
119
+ id: spec.target,
120
+ type: 'raster',
121
+ source: spec.asset_id,
122
+ bounds: [0, 0, spec.width, spec.height],
123
+ },
124
+ });
125
+ }
126
+ const entry = await project.apply({ commands, reason: spec.reason, expected_hash: before });
127
+ return {
128
+ asset_id: spec.asset_id,
129
+ asset,
130
+ recipe_hash: hash,
131
+ output_hash,
132
+ sequence: entry.sequence,
133
+ scene_hash: entry.after_hash,
134
+ };
135
+ }
136
+ /** Bake immutable artifacts without changing a scene, for atomic multi-node builds. */
137
+ export async function bakeProgram(root, spec, assets) {
138
+ const source = spec.code ?? (await readFile(await localAssetPath(root, spec.source), 'utf8'));
139
+ const inputs = Object.create(null);
140
+ let inputPixels = spec.width * spec.height;
141
+ if (inputPixels > 16 * 1024 * 1024)
142
+ throw new Error('Program output exceeds 16 megapixels');
143
+ if (Buffer.byteLength(source) > 256 * 1024 ||
144
+ Buffer.byteLength(canonical(spec.parameters)) > 64 * 1024)
145
+ throw new Error('Program source/parameters exceed 256 KiB / 64 KiB');
146
+ if (Object.keys(spec.inputs).length > 16)
147
+ throw new Error('A program accepts at most 16 input images');
148
+ for (const [key, id] of Object.entries(spec.inputs)) {
149
+ const asset = assets[id];
150
+ if (!asset)
151
+ throw new Error(`Unknown program input asset ${id}`);
152
+ const bytes = await readFile(await localAssetPath(root, asset.source));
153
+ if (bytes.length > 64 * 1024 * 1024)
154
+ throw new Error('Program input exceeds 64 MiB');
155
+ if (asset.hash && sha256(bytes) !== asset.hash)
156
+ throw new Error('Program input hash mismatch');
157
+ const metadata = await sharp(bytes, { limitInputPixels: 32 * 1024 * 1024 }).metadata();
158
+ inputPixels += metadata.width * metadata.height;
159
+ if (inputPixels > 32 * 1024 * 1024)
160
+ throw new Error('Program inputs/output exceed 32 megapixels');
161
+ inputs[key] = await sharp(bytes, { limitInputPixels: 32 * 1024 * 1024 })
162
+ .toColourspace('srgb')
163
+ .png()
164
+ .toBuffer();
165
+ }
166
+ const png = await executeRasterProgram(source, spec, inputs);
167
+ const recipe = {
168
+ version: PROGRAM_VERSION,
169
+ source,
170
+ source_hash: sha256(source),
171
+ parameters: spec.parameters,
172
+ width: spec.width,
173
+ height: spec.height,
174
+ seed: spec.seed,
175
+ timeout_ms: spec.timeout_ms,
176
+ inputs: Object.fromEntries(Object.entries(inputs).map(([key, bytes]) => [
177
+ key,
178
+ { source: `inputs/${sha256(bytes).slice(7)}.png`, hash: sha256(bytes) },
179
+ ])),
180
+ output_hash: sha256(png),
181
+ runtime: { node: process.version, skia: '1.0.8', techniques: TECHNIQUE_VERSION },
182
+ };
183
+ const manifest = canonical(recipe), hash = sha256(manifest), directory = join('recipes', hash.slice(7));
184
+ for (const [key, bytes] of Object.entries(inputs))
185
+ await writeArtifact(join(root, directory, recipe.inputs[key].source), bytes);
186
+ await writeArtifact(join(root, directory, 'recipe.json'), manifest);
187
+ const sourcePath = join(directory, 'output.png');
188
+ await writeArtifact(join(root, sourcePath), png);
189
+ const asset = {
190
+ source: sourcePath,
191
+ hash: sha256(png),
192
+ recipe: { source: join(directory, 'recipe.json'), hash },
193
+ };
194
+ return { asset, recipe_hash: hash, output_hash: recipe.output_hash };
195
+ }
196
+ export async function replayRecipe(root, reference) {
197
+ const file = await localAssetPath(root, reference.source), raw = await readFile(file, 'utf8');
198
+ if (sha256(raw) !== reference.hash)
199
+ throw new Error('Recipe hash mismatch');
200
+ const recipe = JSON.parse(raw);
201
+ if (recipe.version !== PROGRAM_VERSION || sha256(recipe.source) !== recipe.source_hash)
202
+ throw new Error('Unsupported or changed program recipe');
203
+ if (recipe.runtime.techniques && recipe.runtime.techniques !== TECHNIQUE_VERSION)
204
+ throw new Error('Recipe requires a different technique version');
205
+ const spec = programSchema.parse({
206
+ width: recipe.width,
207
+ height: recipe.height,
208
+ seed: recipe.seed,
209
+ parameters: recipe.parameters,
210
+ timeout_ms: recipe.timeout_ms,
211
+ source: 'recipe',
212
+ asset_id: 'replay',
213
+ reason: 'Replay',
214
+ });
215
+ const inputs = Object.create(null);
216
+ for (const [name, input] of Object.entries(recipe.inputs)) {
217
+ const bytes = await readFile(await localAssetPath(dirname(file), input.source));
218
+ if (sha256(bytes) !== input.hash)
219
+ throw new Error('Recipe input hash mismatch');
220
+ inputs[name] = bytes;
221
+ }
222
+ const png = await executeRasterProgram(recipe.source, spec, inputs);
223
+ return {
224
+ identical: sha256(png) === recipe.output_hash,
225
+ expected_hash: recipe.output_hash,
226
+ output_hash: sha256(png),
227
+ png,
228
+ };
229
+ }
230
+ /** Copy a frozen recipe and its local input snapshots without executing code. */
231
+ export async function copyRecipe(root, reference, destination) {
232
+ const path = await localAssetPath(root, reference.source), bytes = await readFile(path);
233
+ if (sha256(bytes) !== reference.hash)
234
+ throw new Error('Recipe hash mismatch');
235
+ const recipe = JSON.parse(bytes.toString());
236
+ const directory = join('recipes', reference.hash.slice(7));
237
+ for (const input of Object.values(recipe.inputs)) {
238
+ const contents = await readFile(await localAssetPath(dirname(path), input.source));
239
+ if (sha256(contents) !== input.hash)
240
+ throw new Error('Recipe input hash mismatch');
241
+ await writeArtifact(join(destination, directory, input.source), contents);
242
+ }
243
+ await writeArtifact(join(destination, directory, 'recipe.json'), bytes);
244
+ return { source: join(directory, 'recipe.json'), hash: reference.hash };
245
+ }
246
+ //# sourceMappingURL=program.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"program.js","sourceRoot":"","sources":["../src/program.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,91 @@
1
+ import { z } from 'zod';
2
+ export declare const projectConfigSchema: z.ZodObject<{
3
+ version: z.ZodLiteral<1>;
4
+ scene: z.ZodDefault<z.ZodString>;
5
+ output_dir: z.ZodDefault<z.ZodString>;
6
+ presets: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodObject<{
7
+ format: z.ZodDefault<z.ZodEnum<{
8
+ jpeg: "jpeg";
9
+ pdf: "pdf";
10
+ png: "png";
11
+ svg: "svg";
12
+ tiff: "tiff";
13
+ }>>;
14
+ colour_space: z.ZodDefault<z.ZodEnum<{
15
+ cmyk: "cmyk";
16
+ srgb: "srgb";
17
+ }>>;
18
+ profile: z.ZodOptional<z.ZodString>;
19
+ profile_hash: z.ZodOptional<z.ZodString>;
20
+ intent: z.ZodDefault<z.ZodLiteral<"perceptual">>;
21
+ quality: z.ZodDefault<z.ZodNumber>;
22
+ chroma_subsampling: z.ZodDefault<z.ZodEnum<{
23
+ "4:2:0": "4:2:0";
24
+ "4:4:4": "4:4:4";
25
+ }>>;
26
+ background: z.ZodDefault<z.ZodString>;
27
+ crop_marks: z.ZodDefault<z.ZodBoolean>;
28
+ minimum_ppi: z.ZodDefault<z.ZodNumber>;
29
+ max_ink: z.ZodDefault<z.ZodNumber>;
30
+ black: z.ZodDefault<z.ZodEnum<{
31
+ "k-only": "k-only";
32
+ profile: "profile";
33
+ }>>;
34
+ mode: z.ZodDefault<z.ZodEnum<{
35
+ hybrid: "hybrid";
36
+ raster: "raster";
37
+ }>>;
38
+ ppi: z.ZodOptional<z.ZodNumber>;
39
+ }, z.core.$strict>>>;
40
+ }, z.core.$strict>;
41
+ export type ProjectConfig = z.infer<typeof projectConfigSchema>;
42
+ export declare function projectPath(root: string, value: string): string;
43
+ export declare function resolveProject(input: string): Promise<{
44
+ file: string;
45
+ config?: undefined;
46
+ configFile?: undefined;
47
+ } | {
48
+ file: string;
49
+ config: {
50
+ version: 1;
51
+ scene: string;
52
+ output_dir: string;
53
+ presets: Record<string, {
54
+ format: "jpeg" | "pdf" | "png" | "svg" | "tiff";
55
+ colour_space: "cmyk" | "srgb";
56
+ profile?: string | undefined;
57
+ profile_hash?: string | undefined;
58
+ intent: "perceptual";
59
+ quality: number;
60
+ chroma_subsampling: "4:2:0" | "4:4:4";
61
+ background: string;
62
+ crop_marks: boolean;
63
+ minimum_ppi: number;
64
+ max_ink: number;
65
+ black: "k-only" | "profile";
66
+ mode: "hybrid" | "raster";
67
+ ppi?: number | undefined;
68
+ }>;
69
+ };
70
+ configFile: string;
71
+ }>;
72
+ export declare function createProject(directory: string, options?: {
73
+ size?: string;
74
+ orientation?: string;
75
+ ppi?: number;
76
+ bleed?: string;
77
+ outputDir?: string;
78
+ }): Promise<{
79
+ project: string;
80
+ manifest: string;
81
+ scene: string;
82
+ output: string;
83
+ document: {
84
+ width: number;
85
+ height: number;
86
+ unit: "in" | "mm" | "pt";
87
+ ppi: number;
88
+ bleed: number;
89
+ safe_margin: number;
90
+ };
91
+ }>;
@@ -0,0 +1,187 @@
1
+ import { z } from 'zod';
2
+ import { mkdir, readFile, realpath, stat, writeFile } from 'node:fs/promises';
3
+ import { dirname, isAbsolute, relative, resolve, sep } from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
5
+ import { parse, stringify } from 'yaml';
6
+ import { exportPresetSchema, documentSchema, documentGeometry, lengthMm, } from './document.js';
7
+ import { localAssetPath } from './assets.js';
8
+ export const projectConfigSchema = z.strictObject({
9
+ version: z.literal(1),
10
+ scene: z.string().default('scene.yaml'),
11
+ output_dir: z.string().default('output'),
12
+ presets: z.record(z.string(), exportPresetSchema).default({}),
13
+ });
14
+ export function projectPath(root, value) {
15
+ const path = resolve(root, value), rel = relative(root, path);
16
+ if (isAbsolute(value) || rel === '..' || rel.startsWith(`..${sep}`))
17
+ throw new Error('Project paths must stay inside the project directory');
18
+ return path;
19
+ }
20
+ export async function resolveProject(input) {
21
+ let path = await realpath(resolve(input));
22
+ if ((await stat(path)).isDirectory())
23
+ path = resolve(path, 'rtistree.yaml');
24
+ if (!path.endsWith('/rtistree.yaml')) {
25
+ try {
26
+ const manifest = resolve(dirname(path), 'rtistree.yaml'), config = projectConfigSchema.parse(parse(await readFile(manifest, 'utf8')));
27
+ if ((await localAssetPath(dirname(path), config.scene)) === path)
28
+ return resolveProject(manifest);
29
+ }
30
+ catch (e) {
31
+ if (e.code !== 'ENOENT')
32
+ throw e;
33
+ }
34
+ return { file: path };
35
+ }
36
+ const config = projectConfigSchema.parse(parse(await readFile(path, 'utf8'))), root = dirname(path);
37
+ let output = projectPath(root, config.output_dir);
38
+ while (true) {
39
+ try {
40
+ const actual = await realpath(output);
41
+ projectPath(root, relative(root, actual));
42
+ break;
43
+ }
44
+ catch (e) {
45
+ if (e.code !== 'ENOENT')
46
+ throw e;
47
+ const parent = dirname(output);
48
+ if (parent === output)
49
+ throw e;
50
+ output = parent;
51
+ }
52
+ }
53
+ const file = await localAssetPath(root, config.scene);
54
+ if (dirname(file) !== root)
55
+ throw new Error('The scene entry point must be in the project root');
56
+ return { file, config, configFile: path };
57
+ }
58
+ export async function createProject(directory, options = {}) {
59
+ const sizes = {
60
+ A3: [297, 420],
61
+ A4: [210, 297],
62
+ A5: [148, 210],
63
+ Letter: [215.9, 279.4],
64
+ };
65
+ let size = sizes[options.size ?? 'A4'];
66
+ if (!size) {
67
+ const pair = (options.size ?? '').split('x');
68
+ if (pair.length !== 2)
69
+ throw new Error('Use A3, A4, A5, Letter, or WIDTHxHEIGHT in mm');
70
+ size = pair.map(lengthMm);
71
+ }
72
+ if (options.orientation && !['portrait', 'landscape'].includes(options.orientation))
73
+ throw new Error('Unknown orientation');
74
+ if (options.orientation === 'portrait')
75
+ size = [Math.min(...size), Math.max(...size)];
76
+ if (options.orientation === 'landscape')
77
+ size = [Math.max(...size), Math.min(...size)];
78
+ const document = documentSchema.parse({
79
+ width: size[0],
80
+ height: size[1],
81
+ ppi: options.ppi ?? 300,
82
+ bleed: lengthMm(options.bleed ?? '3mm'),
83
+ safe_margin: 5,
84
+ });
85
+ documentGeometry(document);
86
+ const root = resolve(directory), output = options.outputDir ?? 'output';
87
+ const outputRelative = relative(root, projectPath(root, output));
88
+ if (!outputRelative ||
89
+ [
90
+ 'assets',
91
+ 'layers',
92
+ 'fonts',
93
+ 'profiles',
94
+ 'history',
95
+ 'schemas',
96
+ 'programs',
97
+ 'recipes',
98
+ 'raster',
99
+ 'studio',
100
+ ].includes(outputRelative.split(sep)[0]))
101
+ throw new Error('Choose a dedicated output directory');
102
+ // Exclusive mkdir fails before any write if the destination already exists.
103
+ await mkdir(dirname(root), { recursive: true });
104
+ await mkdir(root);
105
+ for (const dir of [
106
+ 'assets',
107
+ 'fonts',
108
+ 'profiles',
109
+ 'layers',
110
+ 'history',
111
+ 'schemas',
112
+ 'programs',
113
+ 'recipes',
114
+ 'studio',
115
+ output,
116
+ ])
117
+ await mkdir(projectPath(root, dir), { recursive: true });
118
+ const config = projectConfigSchema.parse({
119
+ version: 1,
120
+ scene: 'scene.yaml',
121
+ output_dir: output,
122
+ presets: {
123
+ screen: { format: 'png', ppi: 96 },
124
+ print: { format: 'pdf', colour_space: 'cmyk', minimum_ppi: 150 },
125
+ },
126
+ });
127
+ const canvas = {
128
+ width: Math.round(document.width * 4),
129
+ height: Math.round(document.height * 4),
130
+ background: '#f3efe6',
131
+ };
132
+ const files = {
133
+ 'rtistree.yaml': '# yaml-language-server: $schema=./schemas/project.schema.json\n' + stringify(config),
134
+ 'scene.yaml': '# yaml-language-server: $schema=./schemas/authoring.schema.json\n' +
135
+ stringify({
136
+ version: 1,
137
+ canvas,
138
+ document,
139
+ include: ['layers/background.yaml', 'layers/content.yaml'],
140
+ }),
141
+ 'layers/background.yaml': stringify({
142
+ layers: [
143
+ { id: 'background', type: 'procedural', generator: { type: 'solid', colour: '#f3efe6' } },
144
+ ],
145
+ }),
146
+ 'layers/content.yaml': stringify({
147
+ layers: [
148
+ {
149
+ id: 'title',
150
+ type: 'text',
151
+ bounds: [
152
+ canvas.width * 0.1,
153
+ canvas.height * 0.15,
154
+ canvas.width * 0.8,
155
+ canvas.height * 0.5,
156
+ ],
157
+ content: 'A new canvas.',
158
+ style: { font: 'display', size: Math.min(64, canvas.width / 10), colour: '#243d38' },
159
+ },
160
+ ],
161
+ }),
162
+ '.gitignore': `${output}/\nhistory/*.lock\n`,
163
+ 'README.md': '# Your Rtistree project\n\nEdit scene.yaml and layers/. Assets, fonts and ICC profiles stay local. Read graphics studio-help for the foundation-first art-direction protocol. Author 2D painting code in programs/; use graphics pipeline . pipeline.json and graphics production . request.json for staged art. Cache and candidate records live in studio/.\n\nRun graphics render . --preset screen, graphics export . --format pdf --preset screen, or graphics preflight . --preset print.\n\nBefore CMYK print export, copy your printer/paper ICC profile to profiles/ and set presets.print.profile plus profile_hash in rtistree.yaml. Print preflight rejects a missing profile. Existing scene-file commands remain available.\n',
164
+ };
165
+ for (const name of [
166
+ 'project',
167
+ 'authoring',
168
+ 'fragment',
169
+ 'program',
170
+ 'pipeline',
171
+ 'construction',
172
+ 'production',
173
+ 'raster-read',
174
+ 'raster-write',
175
+ ])
176
+ files[`schemas/${name}.schema.json`] = await readFile(resolve(dirname(fileURLToPath(import.meta.url)), '..', 'schemas', `${name}.schema.json`), 'utf8');
177
+ for (const [name, content] of Object.entries(files))
178
+ await writeFile(resolve(root, name), content, { flag: 'wx' });
179
+ return {
180
+ project: root,
181
+ manifest: resolve(root, 'rtistree.yaml'),
182
+ scene: resolve(root, 'scene.yaml'),
183
+ output: resolve(root, output),
184
+ document,
185
+ };
186
+ }
187
+ //# sourceMappingURL=project-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-config.js","sourceRoot":"","sources":["../src/project-config.ts"],"names":[],"mappings":"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"}