@sprig-and-prose/sprig 0.5.1 → 0.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md ADDED
@@ -0,0 +1,27 @@
1
+ # @sprig-and-prose/sprig
2
+
3
+ ## 0.6.1
4
+
5
+ ### Patch Changes
6
+
7
+ - **sprig-scenes (minor):** Export `PRIMITIVE_KINDS`, `ARTIFACT_TYPES`, and `ARTIFACT_TYPES_SET` from manifest as single source of truth. Add compile-time validation for primitive constraints (min/max/of) and array minItems/maxItems in `validateSceneManifest`. JSDoc: include `dataset` in artifactType.
8
+
9
+ **sprig-edge (minor):** Attestation now enforces optional fields, primitive constraints (min, max, of), and nested actor-shaped fields when manifest is available. Legend printed once at end for multiple scenes. Export `ValidationKind` and `ValidateRecordOptions`.
10
+
11
+ **sprig (patch):** Friendlier scene compile error prefix: "Scene compile failed" instead of "Scene compilation error".
12
+
13
+ **create-scene-tutorial (patch):** Generated scene file uses kebab-case filename: `demo-scene.scene.prose` instead of `DemoScene.scene.prose`.
14
+
15
+ - Updated dependencies
16
+ - @sprig-and-prose/sprig-scenes@0.2.0
17
+
18
+ ## 0.6.0
19
+
20
+ ### Minor Changes
21
+
22
+ - 9557987: Add dataset expectations, sprig-edge initial commit, and scene tutorial scaffolder
23
+
24
+ ### Patch Changes
25
+
26
+ - Updated dependencies [9557987]
27
+ - @sprig-and-prose/sprig-scenes@0.1.1
package/dist/cli.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAyNA,wBAAsB,UAAU,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA2ElF"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AA6PA,wBAAsB,UAAU,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA2ElF"}
package/dist/cli.js CHANGED
@@ -4,6 +4,7 @@ import { existsSync, writeFileSync } from "node:fs";
4
4
  import { discoverUniverseRoot } from "./root.js";
5
5
  import { loadProseFiles } from "./prose.js";
6
6
  import { compileUniverse } from "./compiler.js";
7
+ import { compileScenes } from "./scene-compiler.js";
7
8
  import { startUIServer } from "./ui.js";
8
9
  const commands = ["compile", "validate", "ui", "init"];
9
10
  function printHelp() {
@@ -17,6 +18,7 @@ function printHelp() {
17
18
  console.log("");
18
19
  console.log("Options:");
19
20
  console.log(" -p, --port <number> Port to listen on (default: 6336)");
21
+ console.log(" --out <dir> Output directory for manifests (default: .sprig/)");
20
22
  console.log(" --legacy Use the legacy parser/graph pipeline");
21
23
  console.log("");
22
24
  console.log("Root discovery:");
@@ -46,6 +48,7 @@ function parseArgs() {
46
48
  let path = process.cwd();
47
49
  let port;
48
50
  let legacy = false;
51
+ let out;
49
52
  for (let i = 1; i < args.length; i++) {
50
53
  const arg = args[i];
51
54
  if (arg === "--port" || arg === "-p") {
@@ -62,6 +65,15 @@ function parseArgs() {
62
65
  port = parsedPort;
63
66
  i++; // Skip the port value
64
67
  }
68
+ else if (arg === "--out") {
69
+ const outValue = args[i + 1];
70
+ if (!outValue) {
71
+ console.error("Error: --out requires a value");
72
+ process.exit(1);
73
+ }
74
+ out = resolve(outValue);
75
+ i++; // Skip the out value
76
+ }
65
77
  else if (arg === "--legacy") {
66
78
  legacy = true;
67
79
  }
@@ -75,27 +87,46 @@ function parseArgs() {
75
87
  process.exit(1);
76
88
  }
77
89
  }
78
- return { command, path, port, legacy };
90
+ return { command, path, port, legacy, out };
79
91
  }
80
- async function handleCompile(path, legacy = false) {
92
+ async function handleCompile(path, outDir, legacy = false) {
81
93
  const root = discoverUniverseRoot(path);
82
94
  if (!root) {
83
- console.error("Couldn't find universe.prose");
95
+ console.error("Could not find universe.prose when walking upward from", path);
84
96
  console.error("");
85
97
  console.error("Make sure you're inside a universe repository.");
86
98
  process.exit(1);
87
99
  }
100
+ // Resolve output directory: --out flag takes precedence over default
101
+ const outputDir = outDir || join(root, ".sprig");
102
+ // Compile universe
88
103
  const files = await loadProseFiles(root);
89
- const result = await compileUniverse(root, files, true, { legacy });
90
- if (!result.success) {
91
- const errors = result.diagnostics.filter((d) => d.severity === "error");
104
+ const universeResult = await compileUniverse(root, files, true, { legacy, outputDir });
105
+ if (!universeResult.success) {
106
+ const errors = universeResult.diagnostics.filter((d) => d.severity === "error");
92
107
  if (errors.length > 0) {
93
108
  printDiagnostics(errors, "Error");
94
109
  }
95
110
  process.exit(1);
96
111
  }
97
- const warnings = result.diagnostics.filter((d) => d.severity === "warning");
112
+ // Compile scenes
113
+ const sceneResult = await compileScenes(root, outputDir);
114
+ // Combine diagnostics
115
+ const allDiagnostics = [...universeResult.diagnostics, ...sceneResult.diagnostics];
116
+ const errors = allDiagnostics.filter((d) => d.severity === "error");
117
+ const warnings = allDiagnostics.filter((d) => d.severity === "warning");
118
+ if (!sceneResult.success) {
119
+ if (errors.length > 0) {
120
+ printDiagnostics(errors, "Error");
121
+ }
122
+ process.exit(1);
123
+ }
124
+ // Print summary
125
+ const sceneCount = sceneResult.scenes.length;
126
+ const scenesText = sceneCount === 1 ? "scene" : "scenes";
127
+ console.log(`✓ Compiled 1 universe + ${sceneCount} ${scenesText}`);
98
128
  if (warnings.length > 0) {
129
+ console.log("");
99
130
  printDiagnostics(warnings, "Warning");
100
131
  }
101
132
  }
@@ -253,7 +284,7 @@ async function handleUI(path, port, legacy = false) {
253
284
  await startUIServer(root, port, legacy);
254
285
  }
255
286
  async function main() {
256
- const { command, path, port, universeName, legacy } = parseArgs();
287
+ const { command, path, port, universeName, legacy, out } = parseArgs();
257
288
  if (!command) {
258
289
  printHelp();
259
290
  process.exit(0);
@@ -261,7 +292,7 @@ async function main() {
261
292
  try {
262
293
  switch (command) {
263
294
  case "compile":
264
- await handleCompile(path, legacy);
295
+ await handleCompile(path, out, legacy);
265
296
  break;
266
297
  case "validate":
267
298
  await handleValidate(path, legacy);
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -3,6 +3,10 @@ export interface CompileResult {
3
3
  manifest?: Record<string, unknown> & {
4
4
  repositories?: Record<string, unknown>;
5
5
  generatedAt: string;
6
+ meta?: {
7
+ generatedAt: string;
8
+ manifestId: string;
9
+ };
6
10
  };
7
11
  diagnostics: Array<{
8
12
  severity: string;
@@ -15,9 +19,11 @@ export interface CompileResult {
15
19
  * @param universeRoot - Universe root directory
16
20
  * @param files - Array of prose file paths
17
21
  * @param writeManifest - If true, write manifest to disk
22
+ * @param options - Compilation options (legacy, outputDir)
18
23
  * @returns Compile result with success status, manifest, and diagnostics
19
24
  */
20
25
  export declare function compileUniverse(universeRoot: string, files: string[], writeManifest?: boolean, options?: {
21
26
  legacy?: boolean;
27
+ outputDir?: string;
22
28
  }): Promise<CompileResult>;
23
29
  //# sourceMappingURL=compiler.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"compiler.d.ts","sourceRoot":"","sources":["../src/compiler.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;QAAE,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IACrG,WAAW,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CAC7E;AA2CD;;;;;;GAMG;AACH,wBAAsB,eAAe,CACnC,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,EAAE,EACf,aAAa,UAAO,EACpB,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAC7B,OAAO,CAAC,aAAa,CAAC,CA8ExB"}
1
+ {"version":3,"file":"compiler.d.ts","sourceRoot":"","sources":["../src/compiler.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;QAAE,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE;YAAE,WAAW,EAAE,MAAM,CAAC;YAAC,UAAU,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAC;IACzJ,WAAW,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CAC7E;AA0DD;;;;;;;GAOG;AACH,wBAAsB,eAAe,CACnC,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,EAAE,EACf,aAAa,UAAO,EACpB,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GACjD,OAAO,CAAC,aAAa,CAAC,CAsFxB"}
package/dist/compiler.js CHANGED
@@ -1,7 +1,23 @@
1
1
  import { readFileSync, writeFileSync, mkdirSync, renameSync } from "node:fs";
2
2
  import { join, dirname } from "node:path";
3
+ import { execSync } from "node:child_process";
3
4
  // @ts-expect-error - sprig-universe doesn't have TypeScript types
4
5
  import { parseFiles, parseFilesLegacy } from "@sprig-and-prose/sprig-universe";
6
+ /**
7
+ * Generate manifestId: git:<sha> if available, else time:<iso>
8
+ */
9
+ function generateManifestId() {
10
+ try {
11
+ const sha = execSync("git rev-parse HEAD", { encoding: "utf-8", stdio: ["ignore", "pipe", "ignore"] }).trim();
12
+ if (sha) {
13
+ return `git:${sha}`;
14
+ }
15
+ }
16
+ catch {
17
+ // Git not available or not in a git repo
18
+ }
19
+ return `time:${new Date().toISOString()}`;
20
+ }
5
21
  /**
6
22
  * Validates that exactly one universe declaration exists in the parsed graph
7
23
  */
@@ -40,10 +56,12 @@ function validateUniverseCount(graph) {
40
56
  * @param universeRoot - Universe root directory
41
57
  * @param files - Array of prose file paths
42
58
  * @param writeManifest - If true, write manifest to disk
59
+ * @param options - Compilation options (legacy, outputDir)
43
60
  * @returns Compile result with success status, manifest, and diagnostics
44
61
  */
45
62
  export async function compileUniverse(universeRoot, files, writeManifest = true, options) {
46
- const manifestPath = join(universeRoot, ".sprig", "manifest.json");
63
+ const outputDir = options?.outputDir || join(universeRoot, ".sprig");
64
+ const manifestPath = join(outputDir, "manifest.json");
47
65
  const useLegacy = options?.legacy ?? false;
48
66
  // Read and parse files
49
67
  const fileContents = files.map((file) => ({
@@ -66,10 +84,16 @@ export async function compileUniverse(universeRoot, files, writeManifest = true,
66
84
  };
67
85
  }
68
86
  // Add repositories and metadata to manifest
87
+ const generatedAt = new Date().toISOString();
88
+ const manifestId = generateManifestId();
69
89
  const manifest = {
70
90
  ...graph,
71
91
  repositories: graph.repositories || {},
72
- generatedAt: new Date().toISOString(),
92
+ generatedAt,
93
+ meta: {
94
+ generatedAt,
95
+ manifestId,
96
+ },
73
97
  };
74
98
  // Check for parsing errors
75
99
  const hasErrors = graph.diagnostics.some((d) => d.severity === "error");
@@ -1 +1 @@
1
- {"version":3,"file":"compiler.js","sourceRoot":"","sources":["../src/compiler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,kEAAkE;AAClE,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAQ/E;;GAEG;AACH,SAAS,qBAAqB,CAAC,KAA8B;IAK3D,MAAM,SAAS,GAAG,KAAK,CAAC,SAAgD,CAAC;IACzE,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;IAEnD,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,KAAK,EAAE,+EAA+E;SACvF,CAAC;IACJ,CAAC;IAED,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,KAAK,CAAC,KAAmE,CAAC;QACxF,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC;aACvC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YACZ,MAAM,QAAQ,GAAG,SAAS,EAAE,CAAC,IAAI,CAAkC,CAAC;YACpE,MAAM,QAAQ,GAAG,QAAQ,EAAE,IAAI,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YACvE,OAAO,QAAQ,EAAE,MAAM,EAAE,IAAI,IAAI,SAAS,CAAC;QAC7C,CAAC,CAAC;aACD,MAAM,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,CAAC,eAAe;aACzE,IAAI,EAAE;aACN,IAAI,CAAC,IAAI,CAAC,CAAC;QACd,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,KAAK,EAAE,sCAAsC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,QAAQ,iDAAiD;SAC3I,CAAC;IACJ,CAAC;IAED,OAAO;QACL,KAAK,EAAE,IAAI;QACX,YAAY,EAAE,aAAa,CAAC,CAAC,CAAC;KAC/B,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,YAAoB,EACpB,KAAe,EACf,aAAa,GAAG,IAAI,EACpB,OAA8B;IAE9B,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,EAAE,QAAQ,EAAE,eAAe,CAAC,CAAC;IACnE,MAAM,SAAS,GAAG,OAAO,EAAE,MAAM,IAAI,KAAK,CAAC;IAE3C,uBAAuB;IACvB,MAAM,YAAY,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACxC,IAAI;QACJ,IAAI,EAAE,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC;KAClC,CAAC,CAAC,CAAC;IAEJ,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;QAEpF,gCAAgC;QAChC,MAAM,UAAU,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC;QAChD,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;YACtB,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,WAAW,EAAE;oBACX;wBACE,QAAQ,EAAE,OAAO;wBACjB,OAAO,EAAE,UAAU,CAAC,KAAK,IAAI,0BAA0B;qBACxD;iBACF;aACF,CAAC;QACJ,CAAC;QAED,4CAA4C;QAC5C,MAAM,QAAQ,GAAG;YACf,GAAG,KAAK;YACR,YAAY,EAAE,KAAK,CAAC,YAAY,IAAI,EAAE;YACtC,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACtC,CAAC;QAEF,2BAA2B;QAC3B,MAAM,SAAS,GAAG,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAuB,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC;QAC9F,IAAI,SAAS,EAAE,CAAC;YACd,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,QAAQ;gBACR,WAAW,EAAE,KAAK,CAAC,WAAW;aAC/B,CAAC;QACJ,CAAC;QAED,8BAA8B;QAC9B,IAAI,aAAa,EAAE,CAAC;YAClB,iCAAiC;YACjC,MAAM,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;YAC1C,IAAI,CAAC;gBACH,SAAS,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC9C,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,wCAAwC;YAC1C,CAAC;YAED,wCAAwC;YACxC,MAAM,QAAQ,GAAG,GAAG,YAAY,MAAM,CAAC;YACvC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YAC/C,aAAa,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;YACvC,UAAU,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QACrC,CAAC;QAED,OAAO;YACL,OAAO,EAAE,IAAI;YACb,QAAQ;YACR,WAAW,EAAE,KAAK,CAAC,WAAW;SAC/B,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,OAAO;YACL,OAAO,EAAE,KAAK;YACd,WAAW,EAAE;gBACX;oBACE,QAAQ,EAAE,OAAO;oBACjB,OAAO,EAAE,sBAAsB,OAAO,EAAE;iBACzC;aACF;SACF,CAAC;IACJ,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"compiler.js","sourceRoot":"","sources":["../src/compiler.ts"],"names":[],"mappings":"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"}
package/dist/prose.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Loads all .prose files under root with default excludes
2
+ * Loads all .prose files under root (excluding .scene.prose files) with default excludes
3
3
  * @param root - Universe root directory
4
4
  * @returns Array of prose file paths, sorted deterministically
5
5
  */
@@ -1 +1 @@
1
- {"version":3,"file":"prose.d.ts","sourceRoot":"","sources":["../src/prose.ts"],"names":[],"mappings":"AAKA;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CASpE"}
1
+ {"version":3,"file":"prose.d.ts","sourceRoot":"","sources":["../src/prose.ts"],"names":[],"mappings":"AAKA;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAYpE"}
package/dist/prose.js CHANGED
@@ -2,7 +2,7 @@ import { join } from "node:path";
2
2
  import fastGlob from "fast-glob";
3
3
  const DEFAULT_EXCLUDES = [".sprig/**", "dist/**", "node_modules/**", ".git/**"];
4
4
  /**
5
- * Loads all .prose files under root with default excludes
5
+ * Loads all .prose files under root (excluding .scene.prose files) with default excludes
6
6
  * @param root - Universe root directory
7
7
  * @returns Array of prose file paths, sorted deterministically
8
8
  */
@@ -10,7 +10,10 @@ export async function loadProseFiles(root) {
10
10
  const pattern = join(root, "**/*.prose");
11
11
  const allFiles = await fastGlob(pattern, {
12
12
  absolute: true,
13
- ignore: DEFAULT_EXCLUDES.map((exclude) => join(root, exclude)),
13
+ ignore: [
14
+ ...DEFAULT_EXCLUDES.map((exclude) => join(root, exclude)),
15
+ join(root, "**/*.scene.prose"), // Exclude scene files
16
+ ],
14
17
  });
15
18
  // Sort for deterministic ordering
16
19
  return allFiles.sort();
package/dist/prose.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"prose.js","sourceRoot":"","sources":["../src/prose.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,QAAQ,MAAM,WAAW,CAAC;AAEjC,MAAM,gBAAgB,GAAG,CAAC,WAAW,EAAE,SAAS,EAAE,iBAAiB,EAAE,SAAS,CAAC,CAAC;AAEhF;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAY;IAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IACzC,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE;QACvC,QAAQ,EAAE,IAAI;QACd,MAAM,EAAE,gBAAgB,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;KAC/D,CAAC,CAAC;IAEH,kCAAkC;IAClC,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;AACzB,CAAC"}
1
+ {"version":3,"file":"prose.js","sourceRoot":"","sources":["../src/prose.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,QAAQ,MAAM,WAAW,CAAC;AAEjC,MAAM,gBAAgB,GAAG,CAAC,WAAW,EAAE,SAAS,EAAE,iBAAiB,EAAE,SAAS,CAAC,CAAC;AAEhF;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAY;IAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IACzC,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE;QACvC,QAAQ,EAAE,IAAI;QACd,MAAM,EAAE;YACN,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YACzD,IAAI,CAAC,IAAI,EAAE,kBAAkB,CAAC,EAAE,sBAAsB;SACvD;KACF,CAAC,CAAC;IAEH,kCAAkC;IAClC,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;AACzB,CAAC"}
@@ -0,0 +1,18 @@
1
+ export interface SceneCompileResult {
2
+ success: boolean;
3
+ scenes: string[];
4
+ diagnostics: Array<{
5
+ severity: string;
6
+ message: string;
7
+ source?: unknown;
8
+ scene?: string;
9
+ }>;
10
+ }
11
+ /**
12
+ * Compile all scene files in the universe
13
+ * @param universeRoot - Universe root directory
14
+ * @param outputDir - Output directory for scene manifests
15
+ * @returns Compile result with success status and list of compiled scenes
16
+ */
17
+ export declare function compileScenes(universeRoot: string, outputDir: string): Promise<SceneCompileResult>;
18
+ //# sourceMappingURL=scene-compiler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scene-compiler.d.ts","sourceRoot":"","sources":["../src/scene-compiler.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,WAAW,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC7F;AAiBD;;;;;GAKG;AACH,wBAAsB,aAAa,CACjC,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,kBAAkB,CAAC,CA4F7B"}
@@ -0,0 +1,115 @@
1
+ import { readFileSync, writeFileSync, mkdirSync, renameSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { execSync } from "node:child_process";
4
+ import fg from "fast-glob";
5
+ // Import directly from compile_scene to avoid scene-engine dependency
6
+ // @ts-expect-error - sprig-scenes doesn't have full TypeScript types
7
+ import { compileSceneFromText } from "@sprig-and-prose/sprig-scenes/compiler/compile_scene";
8
+ /**
9
+ * Generate manifestId: git:<sha> if available, else time:<iso>
10
+ */
11
+ function generateManifestId() {
12
+ try {
13
+ const sha = execSync("git rev-parse HEAD", { encoding: "utf-8", stdio: ["ignore", "pipe", "ignore"] }).trim();
14
+ if (sha) {
15
+ return `git:${sha}`;
16
+ }
17
+ }
18
+ catch {
19
+ // Git not available or not in a git repo
20
+ }
21
+ return `time:${new Date().toISOString()}`;
22
+ }
23
+ /**
24
+ * Compile all scene files in the universe
25
+ * @param universeRoot - Universe root directory
26
+ * @param outputDir - Output directory for scene manifests
27
+ * @returns Compile result with success status and list of compiled scenes
28
+ */
29
+ export async function compileScenes(universeRoot, outputDir) {
30
+ const diagnostics = [];
31
+ const compiledScenes = [];
32
+ try {
33
+ // Find all .scene.prose files
34
+ const sceneFiles = await fg("**/*.scene.prose", {
35
+ cwd: universeRoot,
36
+ absolute: true,
37
+ ignore: ["node_modules/**", ".git/**"],
38
+ });
39
+ if (sceneFiles.length === 0) {
40
+ // No scenes to compile is not an error
41
+ return {
42
+ success: true,
43
+ scenes: [],
44
+ diagnostics: [],
45
+ };
46
+ }
47
+ // Ensure output directory exists
48
+ try {
49
+ mkdirSync(outputDir, { recursive: true });
50
+ }
51
+ catch (error) {
52
+ // Directory might already exist, ignore
53
+ }
54
+ const generatedAt = new Date().toISOString();
55
+ const manifestId = generateManifestId();
56
+ // Compile each scene
57
+ for (const sceneFile of sceneFiles) {
58
+ try {
59
+ const sourceText = readFileSync(sceneFile, "utf-8");
60
+ const manifest = compileSceneFromText(sourceText);
61
+ if (!manifest || !manifest.sceneName) {
62
+ diagnostics.push({
63
+ severity: "error",
64
+ message: `Failed to compile scene: no sceneName found`,
65
+ source: sceneFile,
66
+ });
67
+ continue;
68
+ }
69
+ // Inject metadata
70
+ const manifestWithMeta = {
71
+ ...manifest,
72
+ meta: {
73
+ generatedAt,
74
+ manifestId,
75
+ },
76
+ };
77
+ // Write to output directory
78
+ const outputPath = join(outputDir, `${manifest.sceneName}.scene.json`);
79
+ const tempPath = `${outputPath}.tmp`;
80
+ const json = JSON.stringify(manifestWithMeta, null, 2);
81
+ writeFileSync(tempPath, json, "utf-8");
82
+ renameSync(tempPath, outputPath);
83
+ compiledScenes.push(manifest.sceneName);
84
+ }
85
+ catch (error) {
86
+ const message = error instanceof Error ? error.message : String(error);
87
+ diagnostics.push({
88
+ severity: "error",
89
+ message: `Scene compile failed: ${message}`,
90
+ source: sceneFile,
91
+ });
92
+ }
93
+ }
94
+ const hasErrors = diagnostics.some((d) => d.severity === "error");
95
+ return {
96
+ success: !hasErrors,
97
+ scenes: compiledScenes,
98
+ diagnostics,
99
+ };
100
+ }
101
+ catch (error) {
102
+ const message = error instanceof Error ? error.message : String(error);
103
+ return {
104
+ success: false,
105
+ scenes: [],
106
+ diagnostics: [
107
+ {
108
+ severity: "error",
109
+ message: `Scene discovery error: ${message}`,
110
+ },
111
+ ],
112
+ };
113
+ }
114
+ }
115
+ //# sourceMappingURL=scene-compiler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scene-compiler.js","sourceRoot":"","sources":["../src/scene-compiler.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sprig-and-prose/sprig",
3
- "version": "0.5.1",
3
+ "version": "0.6.1",
4
4
  "type": "module",
5
5
  "description": "Sprig CLI tool for compiling and serving universes",
6
6
  "main": "dist/cli.js",
@@ -21,8 +21,9 @@
21
21
  "author": "",
22
22
  "license": "ISC",
23
23
  "dependencies": {
24
- "@sprig-and-prose/sprig-universe": "^0.5.1",
25
24
  "@sprig-and-prose/sprig-ui-csr": "^0.3.6",
25
+ "@sprig-and-prose/sprig-universe": "^0.5.1",
26
+ "@sprig-and-prose/sprig-scenes": "*",
26
27
  "chokidar": "^3.6.0",
27
28
  "fast-glob": "^3.3.2"
28
29
  },
package/src/cli.ts CHANGED
@@ -5,6 +5,7 @@ import { existsSync, writeFileSync } from "node:fs";
5
5
  import { discoverUniverseRoot } from "./root.js";
6
6
  import { loadProseFiles } from "./prose.js";
7
7
  import { compileUniverse } from "./compiler.js";
8
+ import { compileScenes } from "./scene-compiler.js";
8
9
  import { startUIServer } from "./ui.js";
9
10
 
10
11
  const commands = ["compile", "validate", "ui", "init"] as const;
@@ -21,6 +22,7 @@ function printHelp() {
21
22
  console.log("");
22
23
  console.log("Options:");
23
24
  console.log(" -p, --port <number> Port to listen on (default: 6336)");
25
+ console.log(" --out <dir> Output directory for manifests (default: .sprig/)");
24
26
  console.log(" --legacy Use the legacy parser/graph pipeline");
25
27
  console.log("");
26
28
  console.log("Root discovery:");
@@ -34,6 +36,7 @@ function parseArgs(): {
34
36
  port?: number;
35
37
  universeName?: string;
36
38
  legacy?: boolean;
39
+ out?: string;
37
40
  } {
38
41
  const args = process.argv.slice(2);
39
42
 
@@ -61,6 +64,7 @@ function parseArgs(): {
61
64
  let path = process.cwd();
62
65
  let port: number | undefined;
63
66
  let legacy = false;
67
+ let out: string | undefined;
64
68
 
65
69
  for (let i = 1; i < args.length; i++) {
66
70
  const arg = args[i];
@@ -77,6 +81,14 @@ function parseArgs(): {
77
81
  }
78
82
  port = parsedPort;
79
83
  i++; // Skip the port value
84
+ } else if (arg === "--out") {
85
+ const outValue = args[i + 1];
86
+ if (!outValue) {
87
+ console.error("Error: --out requires a value");
88
+ process.exit(1);
89
+ }
90
+ out = resolve(outValue);
91
+ i++; // Skip the out value
80
92
  } else if (arg === "--legacy") {
81
93
  legacy = true;
82
94
  } else if (!arg.startsWith("-")) {
@@ -89,31 +101,55 @@ function parseArgs(): {
89
101
  }
90
102
  }
91
103
 
92
- return { command, path, port, legacy };
104
+ return { command, path, port, legacy, out };
93
105
  }
94
106
 
95
- async function handleCompile(path: string, legacy = false): Promise<void> {
107
+ async function handleCompile(path: string, outDir: string | undefined, legacy = false): Promise<void> {
96
108
  const root = discoverUniverseRoot(path);
97
109
  if (!root) {
98
- console.error("Couldn't find universe.prose");
110
+ console.error("Could not find universe.prose when walking upward from", path);
99
111
  console.error("");
100
112
  console.error("Make sure you're inside a universe repository.");
101
113
  process.exit(1);
102
114
  }
103
115
 
116
+ // Resolve output directory: --out flag takes precedence over default
117
+ const outputDir = outDir || join(root, ".sprig");
118
+
119
+ // Compile universe
104
120
  const files = await loadProseFiles(root);
105
- const result = await compileUniverse(root, files, true, { legacy });
121
+ const universeResult = await compileUniverse(root, files, true, { legacy, outputDir });
106
122
 
107
- if (!result.success) {
108
- const errors = result.diagnostics.filter((d) => d.severity === "error");
123
+ if (!universeResult.success) {
124
+ const errors = universeResult.diagnostics.filter((d) => d.severity === "error");
109
125
  if (errors.length > 0) {
110
126
  printDiagnostics(errors, "Error");
111
127
  }
112
128
  process.exit(1);
113
129
  }
114
130
 
115
- const warnings = result.diagnostics.filter((d) => d.severity === "warning");
131
+ // Compile scenes
132
+ const sceneResult = await compileScenes(root, outputDir);
133
+
134
+ // Combine diagnostics
135
+ const allDiagnostics = [...universeResult.diagnostics, ...sceneResult.diagnostics];
136
+ const errors = allDiagnostics.filter((d) => d.severity === "error");
137
+ const warnings = allDiagnostics.filter((d) => d.severity === "warning");
138
+
139
+ if (!sceneResult.success) {
140
+ if (errors.length > 0) {
141
+ printDiagnostics(errors, "Error");
142
+ }
143
+ process.exit(1);
144
+ }
145
+
146
+ // Print summary
147
+ const sceneCount = sceneResult.scenes.length;
148
+ const scenesText = sceneCount === 1 ? "scene" : "scenes";
149
+ console.log(`✓ Compiled 1 universe + ${sceneCount} ${scenesText}`);
150
+
116
151
  if (warnings.length > 0) {
152
+ console.log("");
117
153
  printDiagnostics(warnings, "Warning");
118
154
  }
119
155
  }
@@ -305,7 +341,7 @@ async function handleUI(path: string, port?: number, legacy = false): Promise<vo
305
341
  }
306
342
 
307
343
  async function main() {
308
- const { command, path, port, universeName, legacy } = parseArgs();
344
+ const { command, path, port, universeName, legacy, out } = parseArgs();
309
345
 
310
346
  if (!command) {
311
347
  printHelp();
@@ -315,7 +351,7 @@ async function main() {
315
351
  try {
316
352
  switch (command) {
317
353
  case "compile":
318
- await handleCompile(path, legacy);
354
+ await handleCompile(path, out, legacy);
319
355
  break;
320
356
  case "validate":
321
357
  await handleValidate(path, legacy);
package/src/compiler.ts CHANGED
@@ -1,14 +1,30 @@
1
1
  import { readFileSync, writeFileSync, mkdirSync, renameSync } from "node:fs";
2
2
  import { join, dirname } from "node:path";
3
+ import { execSync } from "node:child_process";
3
4
  // @ts-expect-error - sprig-universe doesn't have TypeScript types
4
5
  import { parseFiles, parseFilesLegacy } from "@sprig-and-prose/sprig-universe";
5
6
 
6
7
  export interface CompileResult {
7
8
  success: boolean;
8
- manifest?: Record<string, unknown> & { repositories?: Record<string, unknown>; generatedAt: string };
9
+ manifest?: Record<string, unknown> & { repositories?: Record<string, unknown>; generatedAt: string; meta?: { generatedAt: string; manifestId: string } };
9
10
  diagnostics: Array<{ severity: string; message: string; source?: unknown }>;
10
11
  }
11
12
 
13
+ /**
14
+ * Generate manifestId: git:<sha> if available, else time:<iso>
15
+ */
16
+ function generateManifestId(): string {
17
+ try {
18
+ const sha = execSync("git rev-parse HEAD", { encoding: "utf-8", stdio: ["ignore", "pipe", "ignore"] }).trim();
19
+ if (sha) {
20
+ return `git:${sha}`;
21
+ }
22
+ } catch {
23
+ // Git not available or not in a git repo
24
+ }
25
+ return `time:${new Date().toISOString()}`;
26
+ }
27
+
12
28
  /**
13
29
  * Validates that exactly one universe declaration exists in the parsed graph
14
30
  */
@@ -55,15 +71,17 @@ function validateUniverseCount(graph: Record<string, unknown>): {
55
71
  * @param universeRoot - Universe root directory
56
72
  * @param files - Array of prose file paths
57
73
  * @param writeManifest - If true, write manifest to disk
74
+ * @param options - Compilation options (legacy, outputDir)
58
75
  * @returns Compile result with success status, manifest, and diagnostics
59
76
  */
60
77
  export async function compileUniverse(
61
78
  universeRoot: string,
62
79
  files: string[],
63
80
  writeManifest = true,
64
- options?: { legacy?: boolean },
81
+ options?: { legacy?: boolean; outputDir?: string },
65
82
  ): Promise<CompileResult> {
66
- const manifestPath = join(universeRoot, ".sprig", "manifest.json");
83
+ const outputDir = options?.outputDir || join(universeRoot, ".sprig");
84
+ const manifestPath = join(outputDir, "manifest.json");
67
85
  const useLegacy = options?.legacy ?? false;
68
86
 
69
87
  // Read and parse files
@@ -90,10 +108,17 @@ export async function compileUniverse(
90
108
  }
91
109
 
92
110
  // Add repositories and metadata to manifest
111
+ const generatedAt = new Date().toISOString();
112
+ const manifestId = generateManifestId();
113
+
93
114
  const manifest = {
94
115
  ...graph,
95
116
  repositories: graph.repositories || {},
96
- generatedAt: new Date().toISOString(),
117
+ generatedAt,
118
+ meta: {
119
+ generatedAt,
120
+ manifestId,
121
+ },
97
122
  };
98
123
 
99
124
  // Check for parsing errors
package/src/prose.ts CHANGED
@@ -4,7 +4,7 @@ import fastGlob from "fast-glob";
4
4
  const DEFAULT_EXCLUDES = [".sprig/**", "dist/**", "node_modules/**", ".git/**"];
5
5
 
6
6
  /**
7
- * Loads all .prose files under root with default excludes
7
+ * Loads all .prose files under root (excluding .scene.prose files) with default excludes
8
8
  * @param root - Universe root directory
9
9
  * @returns Array of prose file paths, sorted deterministically
10
10
  */
@@ -12,7 +12,10 @@ export async function loadProseFiles(root: string): Promise<string[]> {
12
12
  const pattern = join(root, "**/*.prose");
13
13
  const allFiles = await fastGlob(pattern, {
14
14
  absolute: true,
15
- ignore: DEFAULT_EXCLUDES.map((exclude) => join(root, exclude)),
15
+ ignore: [
16
+ ...DEFAULT_EXCLUDES.map((exclude) => join(root, exclude)),
17
+ join(root, "**/*.scene.prose"), // Exclude scene files
18
+ ],
16
19
  });
17
20
 
18
21
  // Sort for deterministic ordering
@@ -0,0 +1,131 @@
1
+ import { readFileSync, writeFileSync, mkdirSync, renameSync } from "node:fs";
2
+ import { join, dirname } from "node:path";
3
+ import { execSync } from "node:child_process";
4
+ import fg from "fast-glob";
5
+ // Import directly from compile_scene to avoid scene-engine dependency
6
+ // @ts-expect-error - sprig-scenes doesn't have full TypeScript types
7
+ import { compileSceneFromText } from "@sprig-and-prose/sprig-scenes/compiler/compile_scene";
8
+
9
+ export interface SceneCompileResult {
10
+ success: boolean;
11
+ scenes: string[];
12
+ diagnostics: Array<{ severity: string; message: string; source?: unknown; scene?: string }>;
13
+ }
14
+
15
+ /**
16
+ * Generate manifestId: git:<sha> if available, else time:<iso>
17
+ */
18
+ function generateManifestId(): string {
19
+ try {
20
+ const sha = execSync("git rev-parse HEAD", { encoding: "utf-8", stdio: ["ignore", "pipe", "ignore"] }).trim();
21
+ if (sha) {
22
+ return `git:${sha}`;
23
+ }
24
+ } catch {
25
+ // Git not available or not in a git repo
26
+ }
27
+ return `time:${new Date().toISOString()}`;
28
+ }
29
+
30
+ /**
31
+ * Compile all scene files in the universe
32
+ * @param universeRoot - Universe root directory
33
+ * @param outputDir - Output directory for scene manifests
34
+ * @returns Compile result with success status and list of compiled scenes
35
+ */
36
+ export async function compileScenes(
37
+ universeRoot: string,
38
+ outputDir: string,
39
+ ): Promise<SceneCompileResult> {
40
+ const diagnostics: Array<{ severity: string; message: string; source?: unknown; scene?: string }> = [];
41
+ const compiledScenes: string[] = [];
42
+
43
+ try {
44
+ // Find all .scene.prose files
45
+ const sceneFiles = await fg("**/*.scene.prose", {
46
+ cwd: universeRoot,
47
+ absolute: true,
48
+ ignore: ["node_modules/**", ".git/**"],
49
+ });
50
+
51
+ if (sceneFiles.length === 0) {
52
+ // No scenes to compile is not an error
53
+ return {
54
+ success: true,
55
+ scenes: [],
56
+ diagnostics: [],
57
+ };
58
+ }
59
+
60
+ // Ensure output directory exists
61
+ try {
62
+ mkdirSync(outputDir, { recursive: true });
63
+ } catch (error) {
64
+ // Directory might already exist, ignore
65
+ }
66
+
67
+ const generatedAt = new Date().toISOString();
68
+ const manifestId = generateManifestId();
69
+
70
+ // Compile each scene
71
+ for (const sceneFile of sceneFiles) {
72
+ try {
73
+ const sourceText = readFileSync(sceneFile, "utf-8");
74
+ const manifest = compileSceneFromText(sourceText);
75
+
76
+ if (!manifest || !manifest.sceneName) {
77
+ diagnostics.push({
78
+ severity: "error",
79
+ message: `Failed to compile scene: no sceneName found`,
80
+ source: sceneFile,
81
+ });
82
+ continue;
83
+ }
84
+
85
+ // Inject metadata
86
+ const manifestWithMeta = {
87
+ ...manifest,
88
+ meta: {
89
+ generatedAt,
90
+ manifestId,
91
+ },
92
+ };
93
+
94
+ // Write to output directory
95
+ const outputPath = join(outputDir, `${manifest.sceneName}.scene.json`);
96
+ const tempPath = `${outputPath}.tmp`;
97
+ const json = JSON.stringify(manifestWithMeta, null, 2);
98
+ writeFileSync(tempPath, json, "utf-8");
99
+ renameSync(tempPath, outputPath);
100
+
101
+ compiledScenes.push(manifest.sceneName);
102
+ } catch (error) {
103
+ const message = error instanceof Error ? error.message : String(error);
104
+ diagnostics.push({
105
+ severity: "error",
106
+ message: `Scene compile failed: ${message}`,
107
+ source: sceneFile,
108
+ });
109
+ }
110
+ }
111
+
112
+ const hasErrors = diagnostics.some((d) => d.severity === "error");
113
+ return {
114
+ success: !hasErrors,
115
+ scenes: compiledScenes,
116
+ diagnostics,
117
+ };
118
+ } catch (error) {
119
+ const message = error instanceof Error ? error.message : String(error);
120
+ return {
121
+ success: false,
122
+ scenes: [],
123
+ diagnostics: [
124
+ {
125
+ severity: "error",
126
+ message: `Scene discovery error: ${message}`,
127
+ },
128
+ ],
129
+ };
130
+ }
131
+ }