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,76 @@
1
+ import { z } from 'zod';
2
+ import { Project } from './project.js';
3
+ import type { VisualCritique } from './critique.js';
4
+ export declare const briefSchema: z.ZodObject<{
5
+ id: z.ZodString;
6
+ category: z.ZodEnum<{
7
+ illustration: "illustration";
8
+ poster: "poster";
9
+ "raster-refinement": "raster-refinement";
10
+ }>;
11
+ prompt: z.ZodString;
12
+ max_edits: z.ZodDefault<z.ZodNumber>;
13
+ allowed_bounds: z.ZodOptional<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber, z.ZodNumber], null>>;
14
+ }, z.core.$strict>;
15
+ export type BenchmarkBrief = z.infer<typeof briefSchema>;
16
+ interface Checkpoint {
17
+ label: string;
18
+ scene_hash: string;
19
+ png_hash: string;
20
+ png: string;
21
+ verification_status: string;
22
+ score: number;
23
+ critique: VisualCritique;
24
+ history_length: number;
25
+ timestamp: string;
26
+ tokens: {
27
+ input: number;
28
+ output: number;
29
+ } | null;
30
+ }
31
+ export declare class BenchmarkSession {
32
+ readonly project: Project;
33
+ readonly brief: BenchmarkBrief;
34
+ readonly agent: string;
35
+ constructor(project: Project, brief: BenchmarkBrief, agent: string);
36
+ get directory(): string;
37
+ private get file();
38
+ checkpoints(): Promise<Checkpoint[]>;
39
+ checkpoint(label: string, tokens?: Checkpoint['tokens']): Promise<Checkpoint>;
40
+ finish(): Promise<{
41
+ status: string;
42
+ brief: {
43
+ id: string;
44
+ category: "illustration" | "poster" | "raster-refinement";
45
+ prompt: string;
46
+ max_edits: number;
47
+ allowed_bounds?: [number, number, number, number] | undefined;
48
+ };
49
+ agent: string;
50
+ review_method: string;
51
+ edits: number;
52
+ commands: number;
53
+ tokens: number | null;
54
+ token_note: string;
55
+ critique_before: number;
56
+ critique_after: number;
57
+ locality: import("./verify.js").LocalityEvidence;
58
+ cold_identical: boolean;
59
+ export_identical: boolean;
60
+ checkpoints: {
61
+ label: string;
62
+ scene_hash: string;
63
+ png_hash: string;
64
+ png: string;
65
+ verification_status: string;
66
+ score: number;
67
+ history_length: number;
68
+ timestamp: string;
69
+ tokens: {
70
+ input: number;
71
+ output: number;
72
+ } | null;
73
+ }[];
74
+ }>;
75
+ }
76
+ export {};
@@ -0,0 +1,118 @@
1
+ import { z } from 'zod';
2
+ import { readFile } from 'node:fs/promises';
3
+ import { join } from 'node:path';
4
+ import { boundsSchema } from './schema.js';
5
+ import { writeArtifact, writeRender } from './artifacts.js';
6
+ import { Project } from './project.js';
7
+ import { measureLocality } from './verify.js';
8
+ export const briefSchema = z.strictObject({
9
+ id: z.string().regex(/^[a-z][a-z0-9-]*$/),
10
+ category: z.enum(['poster', 'illustration', 'raster-refinement']),
11
+ prompt: z.string().min(30),
12
+ max_edits: z.number().int().min(1).max(30).default(6),
13
+ allowed_bounds: boundsSchema.optional(),
14
+ });
15
+ export class BenchmarkSession {
16
+ project;
17
+ brief;
18
+ agent;
19
+ constructor(project, brief, agent) {
20
+ this.project = project;
21
+ this.brief = brief;
22
+ this.agent = agent;
23
+ }
24
+ get directory() {
25
+ return join(this.project.root, 'benchmarks', this.brief.id);
26
+ }
27
+ get file() {
28
+ return join(this.directory, 'session.json');
29
+ }
30
+ async checkpoints() {
31
+ try {
32
+ const saved = JSON.parse(await readFile(this.file, 'utf8'));
33
+ if (JSON.stringify(saved.brief) !== JSON.stringify(this.brief))
34
+ throw new Error('Benchmark brief changed');
35
+ return saved.checkpoints;
36
+ }
37
+ catch (e) {
38
+ if (e.code === 'ENOENT')
39
+ return [];
40
+ throw e;
41
+ }
42
+ }
43
+ async checkpoint(label, tokens = null) {
44
+ const points = await this.checkpoints();
45
+ if (points.some((p) => p.label === label) || !/^[a-z0-9-]+$/.test(label))
46
+ throw new Error('Checkpoint labels must be unique path-safe words');
47
+ const render = await this.project.render(), verification = await this.project.verify(), critique = await this.project.critique();
48
+ if (!critique)
49
+ throw new Error('Inspect the PNG and record a visual critique before checkpointing');
50
+ const png = join(this.directory, `${label}.png`);
51
+ await writeRender(png, render);
52
+ points.push({
53
+ label,
54
+ scene_hash: render.evidence.scene.hash,
55
+ png_hash: render.evidence.render.png_hash,
56
+ png,
57
+ verification_status: verification.status,
58
+ score: verification.score,
59
+ critique,
60
+ history_length: (await this.project.history()).length,
61
+ timestamp: new Date().toISOString(),
62
+ tokens,
63
+ });
64
+ await writeArtifact(this.file, JSON.stringify({ brief: this.brief, agent: this.agent, method: 'interactive-agent', checkpoints: points }, null, 2) + '\n');
65
+ return points.at(-1);
66
+ }
67
+ async finish() {
68
+ const points = await this.checkpoints();
69
+ if (points.length < 2)
70
+ throw new Error('Need an inspected before and after checkpoint');
71
+ const first = points[0], last = points.at(-1), history = await this.project.history(), final = await this.project.render();
72
+ if (last.scene_hash !== final.evidence.scene.hash ||
73
+ last.png_hash !== final.evidence.render.png_hash)
74
+ throw new Error('Final checkpoint is stale');
75
+ const baseline = first.history_length
76
+ ? history[first.history_length - 1].after
77
+ : this.project.source.scene;
78
+ const before = await this.project.renderer.render(baseline, this.project.root);
79
+ if (before.evidence.render.png_hash !== first.png_hash)
80
+ throw new Error('Baseline no longer reproduces');
81
+ const locality = measureLocality(before, final, this.brief.allowed_bounds ? [this.brief.allowed_bounds] : [[0, 0, final.width, final.height]]);
82
+ const cold = await this.project.renderer.render(await this.project.scene(), this.project.root, {
83
+ cache: false,
84
+ });
85
+ const exportedFile = join(this.directory, 'export', 'scene.json');
86
+ await this.project.exportScene(exportedFile);
87
+ const exported = await Project.open(exportedFile), reproduction = await exported.render();
88
+ const edits = history.slice(first.history_length).filter((e) => e.kind === 'apply');
89
+ const success = last.verification_status === 'pass' &&
90
+ !last.critique.issues.some((i) => i.severity === 'medium' || i.severity === 'high') &&
91
+ last.critique.score > first.critique.score &&
92
+ locality.outside_changed_pixels === 0 &&
93
+ edits.length <= this.brief.max_edits &&
94
+ cold.png.equals(final.png) &&
95
+ reproduction.png.equals(final.png);
96
+ const result = {
97
+ status: success ? 'pass' : 'fail',
98
+ brief: this.brief,
99
+ agent: this.agent,
100
+ review_method: 'same-agent visual critique; not independent human evaluation',
101
+ edits: edits.length,
102
+ commands: edits.reduce((sum, e) => sum + e.commands.length, 0),
103
+ tokens: points.every((p) => p.tokens !== null)
104
+ ? points.reduce((sum, p) => sum + p.tokens.input + p.tokens.output, 0)
105
+ : null,
106
+ token_note: 'null means the host did not expose token usage',
107
+ critique_before: first.critique.score,
108
+ critique_after: last.critique.score,
109
+ locality,
110
+ cold_identical: cold.png.equals(final.png),
111
+ export_identical: reproduction.png.equals(final.png),
112
+ checkpoints: points.map(({ critique, ...p }) => p),
113
+ };
114
+ await writeArtifact(join(this.directory, 'result.json'), JSON.stringify(result, null, 2) + '\n');
115
+ return result;
116
+ }
117
+ }
118
+ //# sourceMappingURL=benchmark.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"benchmark.js","sourceRoot":"","sources":["../src/benchmark.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/cli.js ADDED
@@ -0,0 +1,300 @@
1
+ #!/usr/bin/env node
2
+ import { buildPipeline } from './pipeline.js';
3
+ import { production } from './production-workflow.js';
4
+ import { importSvg } from './svg.js';
5
+ import { runProgram, replayRecipe } from './program.js';
6
+ import { readRasterRegion, writeRasterRegion } from './raster-edit.js';
7
+ import { studioReference } from './studio-reference.js';
8
+ import { artDirectionGuide } from './art-direction.js';
9
+ import { createProject } from './project-config.js';
10
+ import { exportArtwork, preflight, softProof } from './export.js';
11
+ import { exportPresetSchema } from './document.js';
12
+ import { parseArgs } from 'node:util';
13
+ import { readFile } from 'node:fs/promises';
14
+ import { resolve, join, extname } from 'node:path';
15
+ import { z } from 'zod';
16
+ import { BenchmarkSession, briefSchema } from './benchmark.js';
17
+ import { Project } from './project.js';
18
+ import { boundsSchema, sceneSchema } from './schema.js';
19
+ import { commandSchema } from './commands.js';
20
+ import { writeArtifact, writeRender } from './artifacts.js';
21
+ import { verificationHeatmap } from './verify.js';
22
+ const help = `Rtistree — deterministic graphics for agents
23
+
24
+ graphics pipeline <project> <pipeline.json>
25
+ graphics production <project> <request.json>
26
+ graphics studio-help
27
+ graphics art-guide (read before creating artwork; includes trial lessons and a plan template)
28
+ graphics program <project> <program.json> (execute trusted local JavaScript and bake a raster asset)
29
+ graphics program-replay <project> <asset-id>
30
+ graphics raster-read <project> <request.json>
31
+ graphics raster-write <project> <request.json>
32
+ graphics import-svg <input.svg> -o <scene.json>
33
+ graphics project new <directory> [--size A3] [--orientation landscape] [--ppi 300] [--bleed 3mm] [--output-dir output]
34
+ graphics proof <project-or-scene> --preset print [-o proof.png]
35
+ graphics preflight <project-or-scene> [--preset print]
36
+ graphics export <project-or-scene> --format png|jpeg|tiff|pdf|svg|project [--preset print] [-o file]
37
+ graphics render <scene.yaml> [-o render.png] [--quality draft|preview|final]
38
+ graphics render-region <scene.yaml> <x> <y> <width> <height> [-o region.png]
39
+ graphics inspect <scene.yaml> [--layer <id>]
40
+ graphics inspect-region <scene.yaml> <x> <y> <width> <height>
41
+ graphics apply <scene.yaml> <patch.json>
42
+ graphics undo <scene.yaml>
43
+ graphics redo <scene.yaml>
44
+ graphics history <scene.yaml>
45
+ graphics rebase <scene.yaml>
46
+ graphics compact <scene.yaml>
47
+ graphics critique <scene.yaml> <critique.json>
48
+ graphics benchmark <scene.yaml> <brief.json> <checkpoint-label|finish>
49
+ graphics verify <scene.yaml> [-o report.json] [--heatmap heatmap.png]
50
+ graphics export <scene.yaml> -o <new-project/scene.json>
51
+ graphics schema [--kind scene|command]
52
+ graphics serve <scene.yaml> (MCP over stdio)
53
+
54
+ Before creating artwork, read graphics art-guide. Technical verification does not rate artistic quality.
55
+ All structured output is JSON. Verification failure exits 2; invalid input exits 1.
56
+ Raster scopes, masks and palette tiles default to canvas coordinates; space: layer attaches them to objects. See docs/scene-format.md.
57
+ `;
58
+ async function main() {
59
+ const { values, positionals } = parseArgs({
60
+ allowPositionals: true,
61
+ options: {
62
+ output: { type: 'string', short: 'o' },
63
+ size: { type: 'string' },
64
+ orientation: { type: 'string' },
65
+ ppi: { type: 'string' },
66
+ bleed: { type: 'string' },
67
+ 'output-dir': { type: 'string' },
68
+ preset: { type: 'string' },
69
+ format: { type: 'string' },
70
+ profile: { type: 'string' },
71
+ 'colour-space': { type: 'string' },
72
+ 'crop-marks': { type: 'boolean' },
73
+ quality: { type: 'string' },
74
+ layer: { type: 'string' },
75
+ heatmap: { type: 'string' },
76
+ kind: { type: 'string' },
77
+ help: { type: 'boolean', short: 'h' },
78
+ },
79
+ });
80
+ const [command, file, ...args] = positionals;
81
+ if (values.help || !command) {
82
+ process.stdout.write(help);
83
+ return;
84
+ }
85
+ const print = (value) => process.stdout.write(JSON.stringify(value, null, 2) + '\n');
86
+ if (command === 'art-guide') {
87
+ print(artDirectionGuide);
88
+ return;
89
+ }
90
+ if (command === 'studio-help') {
91
+ print(studioReference);
92
+ return;
93
+ }
94
+ if (command === 'schema') {
95
+ if (values.kind && !['scene', 'command'].includes(values.kind))
96
+ throw new Error('Unknown schema kind');
97
+ print(z.toJSONSchema(values.kind === 'command' ? commandSchema : sceneSchema, { reused: 'ref' }));
98
+ return;
99
+ }
100
+ if (command === 'import-svg') {
101
+ if (!file || !values.output)
102
+ throw new Error('import-svg requires an SVG file and --output scene.json');
103
+ const scene = importSvg(await readFile(file, 'utf8'));
104
+ await writeArtifact(resolve(values.output), JSON.stringify(scene, null, 2) + '\n');
105
+ print({ scene: resolve(values.output) });
106
+ return;
107
+ }
108
+ if (command === 'project') {
109
+ if (file !== 'new' || args.length !== 1)
110
+ throw new Error('Expected project new <directory>');
111
+ print(await createProject(args[0], {
112
+ size: values.size,
113
+ orientation: values.orientation,
114
+ ppi: values.ppi ? Number(values.ppi) : undefined,
115
+ bleed: values.bleed,
116
+ outputDir: values['output-dir'],
117
+ }));
118
+ return;
119
+ }
120
+ if (!file)
121
+ throw new Error('A scene file or project directory is required');
122
+ const project = await Project.open(file);
123
+ if (values.preset && !project.config?.presets[values.preset])
124
+ throw new Error('Unknown project preset');
125
+ const inferredFormat = {
126
+ '.jpg': 'jpeg',
127
+ '.jpeg': 'jpeg',
128
+ '.tif': 'tiff',
129
+ '.tiff': 'tiff',
130
+ '.pdf': 'pdf',
131
+ '.png': 'png',
132
+ '.svg': 'svg',
133
+ }[extname(values.output ?? '').toLowerCase()];
134
+ const preset = exportPresetSchema.parse({
135
+ ...project.config?.presets[values.preset ?? ''],
136
+ ...(inferredFormat ? { format: inferredFormat } : {}),
137
+ ...(values.format && values.format !== 'project' ? { format: values.format } : {}),
138
+ ...(values.ppi ? { ppi: Number(values.ppi) } : {}),
139
+ ...(values.profile ? { profile: values.profile, colour_space: 'cmyk' } : {}),
140
+ ...(values['colour-space'] ? { colour_space: values['colour-space'] } : {}),
141
+ ...(values['crop-marks'] ? { crop_marks: true } : {}),
142
+ });
143
+ const region = () => {
144
+ if (args.length !== 4)
145
+ throw new Error('Expected x y width height');
146
+ return boundsSchema.parse(args.map(Number));
147
+ };
148
+ switch (command) {
149
+ case 'pipeline':
150
+ case 'production':
151
+ case 'program':
152
+ case 'raster-read':
153
+ case 'raster-write': {
154
+ if (args.length !== 1)
155
+ throw new Error('Expected a request JSON file');
156
+ const request = JSON.parse(await readFile(args[0], 'utf8'));
157
+ if (command === 'pipeline')
158
+ print(await buildPipeline(project, request));
159
+ else if (command === 'production')
160
+ print(await production(project, request));
161
+ else if (command === 'program')
162
+ print(await runProgram(project, request));
163
+ else if (command === 'raster-write')
164
+ print(await writeRasterRegion(project, request));
165
+ else {
166
+ const { render, ...result } = await readRasterRegion(project, request);
167
+ print(result);
168
+ }
169
+ break;
170
+ }
171
+ case 'program-replay': {
172
+ const asset = (await project.scene()).assets[args[0] ?? ''];
173
+ if (args.length !== 1 || !asset?.recipe)
174
+ throw new Error('Expected an asset with a program recipe');
175
+ const { png, ...result } = await replayRecipe(project.root, asset.recipe);
176
+ print(result);
177
+ if (!result.identical)
178
+ process.exitCode = 2;
179
+ break;
180
+ }
181
+ case 'render':
182
+ case 'render-region': {
183
+ if (command === 'render' &&
184
+ (values.preset ||
185
+ values.format ||
186
+ values.ppi ||
187
+ (inferredFormat && inferredFormat !== 'png'))) {
188
+ const screen = {
189
+ ...preset,
190
+ format: values.format ?? inferredFormat ?? (values.preset ? preset.format : 'png'),
191
+ };
192
+ print(await exportArtwork(project, resolve(values.output ?? join(project.outputDirectory, `render.${screen.format}`)), screen));
193
+ break;
194
+ }
195
+ const quality = values.quality ?? 'final';
196
+ if (!['draft', 'preview', 'final'].includes(quality))
197
+ throw new Error('Unknown render quality');
198
+ const result = await project.render({
199
+ quality: quality,
200
+ region: command === 'render-region' ? region() : undefined,
201
+ layer: values.layer,
202
+ });
203
+ print(await writeRender(resolve(values.output ??
204
+ join(project.outputDirectory, command === 'render' ? 'render.png' : 'region.png')), result));
205
+ break;
206
+ }
207
+ case 'inspect':
208
+ print(values.layer ? await project.inspectLayer(values.layer) : await project.inspect());
209
+ break;
210
+ case 'inspect-region': {
211
+ const { render, ...inspection } = await project.inspectRegion(region());
212
+ const artifact = await writeRender(resolve(values.output ?? join(project.outputDirectory, 'inspection.png')), render);
213
+ print({ ...inspection, artifact });
214
+ break;
215
+ }
216
+ case 'apply': {
217
+ if (args.length !== 1)
218
+ throw new Error('Expected a patch JSON file');
219
+ const entry = await project.apply(JSON.parse(await readFile(args[0], 'utf8')));
220
+ print({ sequence: entry.sequence, hash: entry.after_hash, locality: entry.locality });
221
+ break;
222
+ }
223
+ case 'undo':
224
+ case 'redo': {
225
+ const entry = await project[command]();
226
+ print({ sequence: entry.sequence, hash: entry.after_hash });
227
+ break;
228
+ }
229
+ case 'benchmark': {
230
+ if (args.length !== 2)
231
+ throw new Error('Expected brief JSON and checkpoint label or finish');
232
+ const brief = briefSchema.parse(JSON.parse(await readFile(args[0], 'utf8'))), session = new BenchmarkSession(project, brief, 'Interactive agent using CLI');
233
+ print(args[1] === 'finish' ? await session.finish() : await session.checkpoint(args[1]));
234
+ break;
235
+ }
236
+ case 'rebase': {
237
+ const entry = await project.rebase();
238
+ print({ sequence: entry.sequence, hash: entry.after_hash });
239
+ break;
240
+ }
241
+ case 'compact':
242
+ print(await project.compactHistory());
243
+ break;
244
+ case 'critique':
245
+ if (args.length !== 1)
246
+ throw new Error('Expected critique JSON');
247
+ print(await project.recordCritique(JSON.parse(await readFile(args[0], 'utf8'))));
248
+ break;
249
+ case 'history':
250
+ print((await project.history()).map(({ after, ...entry }) => entry));
251
+ break;
252
+ case 'verify': {
253
+ const report = await project.verify();
254
+ if (values.output || project.config)
255
+ await writeArtifact(resolve(values.output ?? join(project.outputDirectory, 'verification.json')), JSON.stringify(report, null, 2) + '\n');
256
+ if (values.heatmap)
257
+ await writeArtifact(resolve(values.heatmap), await verificationHeatmap(await project.scene(), report));
258
+ print(report);
259
+ if (report.status === 'fail')
260
+ process.exitCode = 2;
261
+ break;
262
+ }
263
+ case 'proof':
264
+ print(await softProof(project, resolve(values.output ?? join(project.outputDirectory, 'proof.png')), preset));
265
+ break;
266
+ case 'preflight': {
267
+ const report = await preflight(project, preset);
268
+ const path = resolve(values.output ?? join(project.outputDirectory, 'preflight.json'));
269
+ await writeArtifact(path, JSON.stringify(report, null, 2) + '\n');
270
+ print({ ...report, report: path });
271
+ if (report.status === 'fail')
272
+ process.exitCode = 2;
273
+ break;
274
+ }
275
+ case 'export':
276
+ if (values.format !== 'project' && (values.format || values.preset || inferredFormat)) {
277
+ print(await exportArtwork(project, resolve(values.output ?? join(project.outputDirectory, `artwork.${preset.format}`)), preset));
278
+ break;
279
+ }
280
+ if (!values.output)
281
+ throw new Error('export requires --output');
282
+ if (!['.json', '.yaml', '.yml'].includes(extname(values.output).toLowerCase()))
283
+ throw new Error('Scene bundle output must end in .json or .yaml; use --format for artwork');
284
+ await project.exportScene(resolve(values.output));
285
+ print({ scene: resolve(values.output) });
286
+ break;
287
+ case 'serve': {
288
+ const { serve } = await import('./mcp.js');
289
+ await serve(project);
290
+ break;
291
+ }
292
+ default:
293
+ throw new Error(`Unknown command: ${command}`);
294
+ }
295
+ }
296
+ main().catch((error) => {
297
+ process.stderr.write(JSON.stringify({ error: error instanceof Error ? error.message : String(error) }) + '\n');
298
+ process.exitCode = 1;
299
+ });
300
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}