@ontrails/trails 1.0.0-beta.15 → 1.0.0-beta.17

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 (201) hide show
  1. package/CHANGELOG.md +215 -2
  2. package/README.md +27 -0
  3. package/package.json +21 -8
  4. package/src/app.ts +15 -5
  5. package/src/cli.ts +303 -10
  6. package/src/completions.ts +240 -0
  7. package/src/load-app-mirror.ts +160 -0
  8. package/src/local-state-io.ts +153 -0
  9. package/src/project-writes.ts +320 -0
  10. package/src/run-collision.ts +125 -0
  11. package/src/run-completions-install.ts +179 -0
  12. package/src/run-example.ts +149 -0
  13. package/src/run-examples.ts +148 -0
  14. package/src/run-quiet.ts +75 -0
  15. package/src/run-trace.ts +273 -0
  16. package/src/run-warden.ts +39 -0
  17. package/src/run-watch.ts +432 -0
  18. package/src/scaffold-versions.generated.ts +12 -0
  19. package/src/trails/add-surface.ts +45 -23
  20. package/src/trails/add-trail.ts +27 -17
  21. package/src/trails/add-verify.ts +57 -17
  22. package/src/trails/completions-complete.ts +165 -0
  23. package/src/trails/completions.ts +47 -0
  24. package/src/trails/create-scaffold.ts +86 -33
  25. package/src/trails/create.ts +11 -3
  26. package/src/trails/dev-clean.ts +6 -1
  27. package/src/trails/dev-reset.ts +6 -1
  28. package/src/trails/dev-stats.ts +6 -1
  29. package/src/trails/dev-support.ts +29 -17
  30. package/src/trails/draft-promote.ts +289 -80
  31. package/src/trails/guide.ts +54 -34
  32. package/src/trails/load-app.ts +251 -56
  33. package/src/trails/root-dir.ts +21 -0
  34. package/src/trails/run-example.ts +482 -0
  35. package/src/trails/run-examples.ts +141 -0
  36. package/src/trails/run.ts +403 -0
  37. package/src/trails/survey.ts +534 -200
  38. package/src/trails/topo-activation.ts +385 -0
  39. package/src/trails/topo-compile.ts +55 -0
  40. package/src/trails/topo-history.ts +6 -1
  41. package/src/trails/topo-output-schemas.ts +219 -0
  42. package/src/trails/topo-pin.ts +19 -6
  43. package/src/trails/topo-read-support.ts +171 -228
  44. package/src/trails/topo-reports.ts +587 -25
  45. package/src/trails/topo-store-support.ts +43 -19
  46. package/src/trails/topo-support.ts +18 -28
  47. package/src/trails/topo-unpin.ts +6 -1
  48. package/src/trails/topo-verify.ts +18 -5
  49. package/src/trails/topo.ts +60 -23
  50. package/src/trails/warden-guide.ts +121 -0
  51. package/src/trails/warden.ts +137 -56
  52. package/src/versions.ts +3 -18
  53. package/.turbo/turbo-build.log +0 -1
  54. package/.turbo/turbo-lint.log +0 -3
  55. package/.turbo/turbo-typecheck.log +0 -1
  56. package/__tests__/examples.test.ts +0 -45
  57. package/dist/bin/trails.d.ts +0 -3
  58. package/dist/bin/trails.d.ts.map +0 -1
  59. package/dist/bin/trails.js +0 -4
  60. package/dist/bin/trails.js.map +0 -1
  61. package/dist/src/app.d.ts +0 -2
  62. package/dist/src/app.d.ts.map +0 -1
  63. package/dist/src/app.js +0 -22
  64. package/dist/src/app.js.map +0 -1
  65. package/dist/src/clack.d.ts +0 -9
  66. package/dist/src/clack.d.ts.map +0 -1
  67. package/dist/src/clack.js +0 -84
  68. package/dist/src/clack.js.map +0 -1
  69. package/dist/src/cli.d.ts +0 -2
  70. package/dist/src/cli.d.ts.map +0 -1
  71. package/dist/src/cli.js +0 -14
  72. package/dist/src/cli.js.map +0 -1
  73. package/dist/src/trails/add-surface.d.ts +0 -13
  74. package/dist/src/trails/add-surface.d.ts.map +0 -1
  75. package/dist/src/trails/add-surface.js +0 -110
  76. package/dist/src/trails/add-surface.js.map +0 -1
  77. package/dist/src/trails/add-trail.d.ts +0 -12
  78. package/dist/src/trails/add-trail.d.ts.map +0 -1
  79. package/dist/src/trails/add-trail.js +0 -104
  80. package/dist/src/trails/add-trail.js.map +0 -1
  81. package/dist/src/trails/add-trailhead.d.ts +0 -13
  82. package/dist/src/trails/add-trailhead.d.ts.map +0 -1
  83. package/dist/src/trails/add-trailhead.js +0 -88
  84. package/dist/src/trails/add-trailhead.js.map +0 -1
  85. package/dist/src/trails/add-verify.d.ts +0 -10
  86. package/dist/src/trails/add-verify.d.ts.map +0 -1
  87. package/dist/src/trails/add-verify.js +0 -68
  88. package/dist/src/trails/add-verify.js.map +0 -1
  89. package/dist/src/trails/create-scaffold.d.ts +0 -15
  90. package/dist/src/trails/create-scaffold.d.ts.map +0 -1
  91. package/dist/src/trails/create-scaffold.js +0 -295
  92. package/dist/src/trails/create-scaffold.js.map +0 -1
  93. package/dist/src/trails/create.d.ts +0 -18
  94. package/dist/src/trails/create.d.ts.map +0 -1
  95. package/dist/src/trails/create.js +0 -126
  96. package/dist/src/trails/create.js.map +0 -1
  97. package/dist/src/trails/dev-clean.d.ts +0 -9
  98. package/dist/src/trails/dev-clean.d.ts.map +0 -1
  99. package/dist/src/trails/dev-clean.js +0 -66
  100. package/dist/src/trails/dev-clean.js.map +0 -1
  101. package/dist/src/trails/dev-reset.d.ts +0 -6
  102. package/dist/src/trails/dev-reset.d.ts.map +0 -1
  103. package/dist/src/trails/dev-reset.js +0 -39
  104. package/dist/src/trails/dev-reset.js.map +0 -1
  105. package/dist/src/trails/dev-stats.d.ts +0 -7
  106. package/dist/src/trails/dev-stats.d.ts.map +0 -1
  107. package/dist/src/trails/dev-stats.js +0 -61
  108. package/dist/src/trails/dev-stats.js.map +0 -1
  109. package/dist/src/trails/dev-support.d.ts +0 -64
  110. package/dist/src/trails/dev-support.d.ts.map +0 -1
  111. package/dist/src/trails/dev-support.js +0 -181
  112. package/dist/src/trails/dev-support.js.map +0 -1
  113. package/dist/src/trails/draft-promote.d.ts +0 -18
  114. package/dist/src/trails/draft-promote.d.ts.map +0 -1
  115. package/dist/src/trails/draft-promote.js +0 -400
  116. package/dist/src/trails/draft-promote.js.map +0 -1
  117. package/dist/src/trails/guide.d.ts +0 -21
  118. package/dist/src/trails/guide.d.ts.map +0 -1
  119. package/dist/src/trails/guide.js +0 -61
  120. package/dist/src/trails/guide.js.map +0 -1
  121. package/dist/src/trails/load-app.d.ts +0 -12
  122. package/dist/src/trails/load-app.d.ts.map +0 -1
  123. package/dist/src/trails/load-app.js +0 -415
  124. package/dist/src/trails/load-app.js.map +0 -1
  125. package/dist/src/trails/project.d.ts +0 -8
  126. package/dist/src/trails/project.d.ts.map +0 -1
  127. package/dist/src/trails/project.js +0 -54
  128. package/dist/src/trails/project.js.map +0 -1
  129. package/dist/src/trails/survey.d.ts +0 -18
  130. package/dist/src/trails/survey.d.ts.map +0 -1
  131. package/dist/src/trails/survey.js +0 -234
  132. package/dist/src/trails/survey.js.map +0 -1
  133. package/dist/src/trails/topo-constants.d.ts +0 -3
  134. package/dist/src/trails/topo-constants.d.ts.map +0 -1
  135. package/dist/src/trails/topo-constants.js +0 -3
  136. package/dist/src/trails/topo-constants.js.map +0 -1
  137. package/dist/src/trails/topo-export.d.ts +0 -19
  138. package/dist/src/trails/topo-export.d.ts.map +0 -1
  139. package/dist/src/trails/topo-export.js +0 -31
  140. package/dist/src/trails/topo-export.js.map +0 -1
  141. package/dist/src/trails/topo-history.d.ts +0 -20
  142. package/dist/src/trails/topo-history.d.ts.map +0 -1
  143. package/dist/src/trails/topo-history.js +0 -32
  144. package/dist/src/trails/topo-history.js.map +0 -1
  145. package/dist/src/trails/topo-pin.d.ts +0 -17
  146. package/dist/src/trails/topo-pin.d.ts.map +0 -1
  147. package/dist/src/trails/topo-pin.js +0 -31
  148. package/dist/src/trails/topo-pin.js.map +0 -1
  149. package/dist/src/trails/topo-read-support.d.ts +0 -58
  150. package/dist/src/trails/topo-read-support.d.ts.map +0 -1
  151. package/dist/src/trails/topo-read-support.js +0 -167
  152. package/dist/src/trails/topo-read-support.js.map +0 -1
  153. package/dist/src/trails/topo-reports.d.ts +0 -54
  154. package/dist/src/trails/topo-reports.d.ts.map +0 -1
  155. package/dist/src/trails/topo-reports.js +0 -128
  156. package/dist/src/trails/topo-reports.js.map +0 -1
  157. package/dist/src/trails/topo-show.d.ts +0 -23
  158. package/dist/src/trails/topo-show.d.ts.map +0 -1
  159. package/dist/src/trails/topo-show.js +0 -49
  160. package/dist/src/trails/topo-show.js.map +0 -1
  161. package/dist/src/trails/topo-store-support.d.ts +0 -13
  162. package/dist/src/trails/topo-store-support.d.ts.map +0 -1
  163. package/dist/src/trails/topo-store-support.js +0 -55
  164. package/dist/src/trails/topo-store-support.js.map +0 -1
  165. package/dist/src/trails/topo-support.d.ts +0 -76
  166. package/dist/src/trails/topo-support.d.ts.map +0 -1
  167. package/dist/src/trails/topo-support.js +0 -132
  168. package/dist/src/trails/topo-support.js.map +0 -1
  169. package/dist/src/trails/topo-unpin.d.ts +0 -20
  170. package/dist/src/trails/topo-unpin.d.ts.map +0 -1
  171. package/dist/src/trails/topo-unpin.js +0 -44
  172. package/dist/src/trails/topo-unpin.js.map +0 -1
  173. package/dist/src/trails/topo-verify.d.ts +0 -5
  174. package/dist/src/trails/topo-verify.d.ts.map +0 -1
  175. package/dist/src/trails/topo-verify.js +0 -24
  176. package/dist/src/trails/topo-verify.js.map +0 -1
  177. package/dist/src/trails/topo.d.ts +0 -5
  178. package/dist/src/trails/topo.d.ts.map +0 -1
  179. package/dist/src/trails/topo.js +0 -63
  180. package/dist/src/trails/topo.js.map +0 -1
  181. package/dist/src/trails/warden.d.ts +0 -20
  182. package/dist/src/trails/warden.d.ts.map +0 -1
  183. package/dist/src/trails/warden.js +0 -98
  184. package/dist/src/trails/warden.js.map +0 -1
  185. package/dist/src/versions.d.ts +0 -12
  186. package/dist/src/versions.d.ts.map +0 -1
  187. package/dist/src/versions.js +0 -23
  188. package/dist/src/versions.js.map +0 -1
  189. package/dist/tsconfig.tsbuildinfo +0 -1
  190. package/src/__tests__/add-trail.test.ts +0 -97
  191. package/src/__tests__/create.test.ts +0 -415
  192. package/src/__tests__/draft-promote.test.ts +0 -144
  193. package/src/__tests__/guide.test.ts +0 -96
  194. package/src/__tests__/load-app.test.ts +0 -419
  195. package/src/__tests__/survey.test.ts +0 -377
  196. package/src/__tests__/topo-dev.test.ts +0 -426
  197. package/src/__tests__/warden.test.ts +0 -74
  198. package/src/trails/topo-export.ts +0 -35
  199. package/src/trails/topo-show.ts +0 -54
  200. package/tsconfig.json +0 -9
  201. package/tsconfig.tests.json +0 -10
@@ -1,12 +0,0 @@
1
- /**
2
- * `add.trail` trail -- Scaffold a new trail file with tests.
3
- */
4
- export declare const addTrail: import("@ontrails/core").Trail<{
5
- description: string;
6
- exampleName: string;
7
- id: string;
8
- intent: "read" | "write" | "destroy";
9
- }, {
10
- created: string[];
11
- }, never>;
12
- //# sourceMappingURL=add-trail.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"add-trail.d.ts","sourceRoot":"","sources":["../../../src/trails/add-trail.ts"],"names":[],"mappings":"AAAA;;GAEG;AA4EH,eAAO,MAAM,QAAQ;;;;;;;SAmDnB,CAAC"}
@@ -1,104 +0,0 @@
1
- /**
2
- * `add.trail` trail -- Scaffold a new trail file with tests.
3
- */
4
- import { mkdirSync } from 'node:fs';
5
- import { dirname, join, resolve } from 'node:path';
6
- import { Result, trail } from '@ontrails/core';
7
- import { z } from 'zod';
8
- // ---------------------------------------------------------------------------
9
- // Helpers
10
- // ---------------------------------------------------------------------------
11
- const literal = (value) => JSON.stringify(value);
12
- const deriveExampleMessage = (id) => `${id} completed`;
13
- const generateTrailFile = (id, description, exampleName, intent) => {
14
- const intentLine = intent === 'write' ? '' : `\n intent: '${intent}',`;
15
- const exampleMessage = deriveExampleMessage(id);
16
- return `import { Result, trail } from '@ontrails/core';
17
- import { z } from 'zod';
18
-
19
- export const ${id.replaceAll('.', '_')} = trail('${id}', {
20
- blaze: async () => {
21
- return Result.ok({ message: ${literal(exampleMessage)} });
22
- },
23
- description: ${literal(description)},
24
- examples: [
25
- {
26
- expected: { message: ${literal(exampleMessage)} },
27
- input: {},
28
- name: ${literal(exampleName)},
29
- },
30
- ],
31
- input: z.object({}),${intentLine}
32
- output: z.object({ message: z.string() }),
33
- });
34
- `;
35
- };
36
- const generateTestFile = (id, exampleName) => {
37
- const moduleName = id.replaceAll('.', '-');
38
- const trailName = id.replaceAll('.', '_');
39
- const exampleMessage = deriveExampleMessage(id);
40
- return `import { testTrail } from '@ontrails/testing';
41
- import { ${trailName} } from '../src/trails/${moduleName}.js';
42
-
43
- testTrail(${trailName}, [
44
- {
45
- description: ${literal(exampleName)},
46
- expectValue: { message: ${literal(exampleMessage)} },
47
- input: {},
48
- },
49
- ]);
50
- `;
51
- };
52
- // ---------------------------------------------------------------------------
53
- // Trail definition
54
- // ---------------------------------------------------------------------------
55
- /** Write a file, creating parent directories as needed. */
56
- const writeWithDirs = async (filePath, content) => {
57
- mkdirSync(dirname(filePath), { recursive: true });
58
- await Bun.write(filePath, content);
59
- };
60
- export const addTrail = trail('add.trail', {
61
- args: ['id'],
62
- blaze: async (input, ctx) => {
63
- const { id } = input;
64
- const moduleName = id.replaceAll('.', '-');
65
- const cwd = resolve(ctx.cwd ?? '.');
66
- const files = new Map([
67
- [
68
- `src/trails/${moduleName}.ts`,
69
- generateTrailFile(id, input.description, input.exampleName, input.intent),
70
- ],
71
- [
72
- `__tests__/${moduleName}.test.ts`,
73
- generateTestFile(id, input.exampleName),
74
- ],
75
- ]);
76
- for (const [relativePath, content] of files) {
77
- await writeWithDirs(join(cwd, relativePath), content);
78
- }
79
- return Result.ok({ created: [...files.keys()] });
80
- },
81
- description: 'Scaffold a new trail with tests and examples',
82
- input: z.object({
83
- description: z
84
- .string()
85
- .min(1, 'Trail description is required')
86
- .describe('Trail description'),
87
- exampleName: z
88
- .string()
89
- .min(1, 'Starter example name is required')
90
- .describe('Starter example name'),
91
- id: z
92
- .string()
93
- .min(1, 'Trail ID is required')
94
- .describe('Trail ID (e.g., entity.update)'),
95
- intent: z
96
- .enum(['read', 'write', 'destroy'])
97
- .default('write')
98
- .describe('Trail intent'),
99
- }),
100
- output: z.object({
101
- created: z.array(z.string()),
102
- }),
103
- });
104
- //# sourceMappingURL=add-trail.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"add-trail.js","sourceRoot":"","sources":["../../../src/trails/add-trail.ts"],"names":[],"mappings":"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"}
@@ -1,13 +0,0 @@
1
- /**
2
- * `add.trailhead` trail -- Add a trailhead to an existing project.
3
- *
4
- * Generates the CLI or MCP entry point and updates package.json dependencies.
5
- */
6
- export declare const addTrailhead: import("@ontrails/core").Trail<{
7
- trailhead: "cli" | "mcp";
8
- dir?: string | undefined;
9
- }, {
10
- created: string;
11
- dependency: string;
12
- }, never>;
13
- //# sourceMappingURL=add-trailhead.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"add-trailhead.d.ts","sourceRoot":"","sources":["../../../src/trails/add-trailhead.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAwFH,eAAO,MAAM,YAAY;;;;;;SA4BvB,CAAC"}
@@ -1,88 +0,0 @@
1
- /**
2
- * `add.trailhead` trail -- Add a trailhead to an existing project.
3
- *
4
- * Generates the CLI or MCP entry point and updates package.json dependencies.
5
- */
6
- import { existsSync, mkdirSync } from 'node:fs';
7
- import { basename, dirname, join, resolve } from 'node:path';
8
- import { Result, trail } from '@ontrails/core';
9
- import { z } from 'zod';
10
- import { findTopoPath } from './project.js';
11
- const generateCliEntry = (appImportPath) => `import { surface } from '@ontrails/cli/commander';
12
-
13
- import { app } from '${appImportPath}';
14
-
15
- await surface(app);
16
- `;
17
- const generateMcpEntry = (appImportPath) => `import { surface } from '@ontrails/mcp';
18
-
19
- import { app } from '${appImportPath}';
20
-
21
- await surface(app);
22
- `;
23
- /** Resolve the entry file for a trailhead. */
24
- const getEntryFile = (trailhead) => trailhead === 'cli' ? 'src/cli.ts' : 'src/mcp.ts';
25
- // ---------------------------------------------------------------------------
26
- // Trail definition
27
- // ---------------------------------------------------------------------------
28
- /** Patch deps and optionally bin in a parsed package.json. */
29
- const patchPkgDeps = (pkg, trailhead, cwd) => {
30
- const depName = trailhead === 'cli' ? '@ontrails/cli' : '@ontrails/mcp';
31
- const deps = (pkg['dependencies'] ?? {});
32
- deps[depName] = 'workspace:*';
33
- if (trailhead === 'cli') {
34
- deps['commander'] = '^14.0.0';
35
- pkg['bin'] = {
36
- [pkg['name'] ?? basename(cwd)]: './src/cli.ts',
37
- };
38
- }
39
- pkg['dependencies'] = Object.fromEntries(Object.entries(deps).toSorted(([a], [b]) => a.localeCompare(b)));
40
- return depName;
41
- };
42
- /** Update package.json with trailhead dependency and CLI bin if needed. */
43
- const updatePkgJsonForTrailhead = async (cwd, trailhead) => {
44
- const pkgPath = join(cwd, 'package.json');
45
- if (!existsSync(pkgPath)) {
46
- return trailhead === 'cli' ? '@ontrails/cli' : '@ontrails/mcp';
47
- }
48
- const pkg = (await Bun.file(pkgPath).json());
49
- const depName = patchPkgDeps(pkg, trailhead, cwd);
50
- await Bun.write(pkgPath, `${JSON.stringify(pkg, null, 2)}\n`);
51
- return depName;
52
- };
53
- /** Create the entry file for a trailhead and return the relative path. */
54
- const writeTrailheadEntry = async (cwd, trailhead) => {
55
- const entryFile = getEntryFile(trailhead);
56
- const fullEntryPath = join(cwd, entryFile);
57
- const appImport = (await findTopoPath(cwd)) ?? './app.js';
58
- const content = trailhead === 'cli'
59
- ? generateCliEntry(appImport)
60
- : generateMcpEntry(appImport);
61
- mkdirSync(dirname(fullEntryPath), { recursive: true });
62
- await Bun.write(fullEntryPath, content);
63
- return entryFile;
64
- };
65
- export const addTrailhead = trail('add.trailhead', {
66
- blaze: async (input) => {
67
- const cwd = resolve(input.dir ?? '.');
68
- const { trailhead } = input;
69
- const entryFile = getEntryFile(trailhead);
70
- if (existsSync(join(cwd, entryFile))) {
71
- return Result.err(new Error(`${trailhead.toUpperCase()} trailhead already exists. Nothing to do.`));
72
- }
73
- return Result.ok({
74
- created: await writeTrailheadEntry(cwd, trailhead),
75
- dependency: await updatePkgJsonForTrailhead(cwd, trailhead),
76
- });
77
- },
78
- description: 'Add a trailhead to an existing project',
79
- input: z.object({
80
- dir: z.string().optional().describe('Project directory'),
81
- trailhead: z.enum(['cli', 'mcp']).describe('Trailhead to add'),
82
- }),
83
- output: z.object({
84
- created: z.string(),
85
- dependency: z.string(),
86
- }),
87
- });
88
- //# sourceMappingURL=add-trailhead.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"add-trailhead.js","sourceRoot":"","sources":["../../../src/trails/add-trailhead.ts"],"names":[],"mappings":"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"}
@@ -1,10 +0,0 @@
1
- /**
2
- * `add.verify` trail -- Add testing + warden setup to a project.
3
- */
4
- export declare const addVerify: import("@ontrails/core").Trail<{
5
- name: string;
6
- dir?: string | undefined;
7
- }, {
8
- created: string[];
9
- }, never>;
10
- //# sourceMappingURL=add-verify.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"add-verify.d.ts","sourceRoot":"","sources":["../../../src/trails/add-verify.ts"],"names":[],"mappings":"AAAA;;GAEG;AA2DH,eAAO,MAAM,SAAS;;;;;SA8BpB,CAAC"}
@@ -1,68 +0,0 @@
1
- /**
2
- * `add.verify` trail -- Add testing + warden setup to a project.
3
- */
4
- import { existsSync, mkdirSync } from 'node:fs';
5
- import { dirname, join, resolve } from 'node:path';
6
- import { Result, trail } from '@ontrails/core';
7
- import { z } from 'zod';
8
- import { ontrailsPackageRange, scaffoldDependencyVersions, } from '../versions.js';
9
- // ---------------------------------------------------------------------------
10
- // Content generators
11
- // ---------------------------------------------------------------------------
12
- const generateTestFile = () => `import { testAllEstablished } from '@ontrails/testing';
13
- import { app } from '../src/app.js';
14
-
15
- testAllEstablished(app);
16
- `;
17
- const generateLefthookYml = () => `pre-push:
18
- commands:
19
- warden:
20
- run: bunx trails warden
21
- `;
22
- /** Add testing and warden devDependencies to package.json when present. */
23
- const patchVerifyDeps = (pkg) => {
24
- const devDeps = (pkg['devDependencies'] ?? {});
25
- devDeps['@ontrails/testing'] = ontrailsPackageRange;
26
- devDeps['@ontrails/warden'] = ontrailsPackageRange;
27
- devDeps['lefthook'] = scaffoldDependencyVersions.lefthook;
28
- pkg['devDependencies'] = Object.fromEntries(Object.entries(devDeps).toSorted(([a], [b]) => a.localeCompare(b)));
29
- };
30
- /** Update package.json in the target project with verify dependencies. */
31
- const updatePackageJsonForVerify = async (projectDir) => {
32
- const pkgPath = join(projectDir, 'package.json');
33
- if (!existsSync(pkgPath)) {
34
- return;
35
- }
36
- const pkg = (await Bun.file(pkgPath).json());
37
- patchVerifyDeps(pkg);
38
- await Bun.write(pkgPath, `${JSON.stringify(pkg, null, 2)}\n`);
39
- };
40
- // ---------------------------------------------------------------------------
41
- // Trail definition
42
- // ---------------------------------------------------------------------------
43
- export const addVerify = trail('add.verify', {
44
- blaze: async (input) => {
45
- const projectDir = resolve(input.dir ?? '.', input.name);
46
- const files = [];
47
- const writeFile = async (relativePath, content) => {
48
- const fullPath = join(projectDir, relativePath);
49
- mkdirSync(dirname(fullPath), { recursive: true });
50
- await Bun.write(fullPath, content);
51
- files.push(relativePath);
52
- };
53
- await writeFile('__tests__/examples.test.ts', generateTestFile());
54
- await writeFile('lefthook.yml', generateLefthookYml());
55
- await updatePackageJsonForVerify(projectDir);
56
- return Result.ok({ created: files });
57
- },
58
- description: 'Add testing and warden verification',
59
- input: z.object({
60
- dir: z.string().optional().describe('Parent directory'),
61
- name: z.string().describe('Project name'),
62
- }),
63
- meta: { internal: true },
64
- output: z.object({
65
- created: z.array(z.string()),
66
- }),
67
- });
68
- //# sourceMappingURL=add-verify.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"add-verify.js","sourceRoot":"","sources":["../../../src/trails/add-verify.ts"],"names":[],"mappings":"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"}
@@ -1,15 +0,0 @@
1
- /**
2
- * `create.scaffold` trail -- Creates base project structure.
3
- *
4
- * Generates package.json, tsconfig, app.ts, starter trails, and .trails/ directory.
5
- */
6
- export declare const createScaffold: import("@ontrails/core").Trail<{
7
- name: string;
8
- starter: "empty" | "entity" | "hello";
9
- dir?: string | undefined;
10
- }, {
11
- created: string[];
12
- dir: string;
13
- name: string;
14
- }, never>;
15
- //# sourceMappingURL=create-scaffold.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"create-scaffold.d.ts","sourceRoot":"","sources":["../../../src/trails/create-scaffold.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA2UH,eAAO,MAAM,cAAc;;;;;;;;SA6BzB,CAAC"}
@@ -1,295 +0,0 @@
1
- /**
2
- * `create.scaffold` trail -- Creates base project structure.
3
- *
4
- * Generates package.json, tsconfig, app.ts, starter trails, and .trails/ directory.
5
- */
6
- import { mkdirSync } from 'node:fs';
7
- import { dirname, join, resolve } from 'node:path';
8
- import { Result, trail } from '@ontrails/core';
9
- import { z } from 'zod';
10
- import { ontrailsPackageRange, scaffoldDependencyVersions, } from '../versions.js';
11
- // ---------------------------------------------------------------------------
12
- // Content generators
13
- // ---------------------------------------------------------------------------
14
- const generatePackageJson = (name) => {
15
- const deps = {
16
- '@ontrails/core': ontrailsPackageRange,
17
- zod: scaffoldDependencyVersions.zod,
18
- };
19
- const pkg = {
20
- dependencies: Object.fromEntries(Object.entries(deps).toSorted(([a], [b]) => a.localeCompare(b))),
21
- devDependencies: Object.fromEntries(Object.entries({
22
- '@types/bun': scaffoldDependencyVersions.bunTypes,
23
- oxlint: scaffoldDependencyVersions.oxlint,
24
- typescript: scaffoldDependencyVersions.typescript,
25
- ultracite: scaffoldDependencyVersions.ultracite,
26
- }).toSorted(([a], [b]) => a.localeCompare(b))),
27
- name,
28
- scripts: {
29
- build: 'tsc -b',
30
- lint: 'oxlint ./src',
31
- test: 'bun test',
32
- typecheck: 'tsc --noEmit',
33
- },
34
- type: 'module',
35
- version: '0.1.0',
36
- };
37
- return JSON.stringify(pkg, null, 2);
38
- };
39
- const TSCONFIG_CONTENT = JSON.stringify({
40
- compilerOptions: {
41
- declaration: true,
42
- module: 'ESNext',
43
- moduleResolution: 'bundler',
44
- noUncheckedIndexedAccess: true,
45
- outDir: 'dist',
46
- rootDir: 'src',
47
- skipLibCheck: true,
48
- strict: true,
49
- target: 'ESNext',
50
- verbatimModuleSyntax: true,
51
- },
52
- include: ['src'],
53
- }, null, 2);
54
- const GITIGNORE_CONTENT = `node_modules/
55
- dist/
56
- *.tsbuildinfo
57
- .trails/_surface.json
58
- `;
59
- const OXLINTRC_CONTENT = JSON.stringify({
60
- extends: ['ultracite'],
61
- }, null, 2);
62
- const OXFMTRC_CONTENT = `{
63
- // ultracite defaults
64
- }
65
- `;
66
- const generateHelloTrail = () => `import { Result, trail } from '@ontrails/core';
67
- import { z } from 'zod';
68
-
69
- export const hello = trail('hello', {
70
- description: 'Say hello',
71
- examples: [
72
- {
73
- expected: { message: 'Hello, world!' },
74
- input: {},
75
- name: 'Default greeting',
76
- },
77
- {
78
- expected: { message: 'Hello, Trails!' },
79
- input: { name: 'Trails' },
80
- name: 'Named greeting',
81
- },
82
- ],
83
- blaze: (input) => {
84
- const name = input.name ?? 'world';
85
- return Result.ok({ message: \`Hello, \${name}!\` });
86
- },
87
- input: z.object({
88
- name: z.string().optional(),
89
- }),
90
- output: z.object({
91
- message: z.string(),
92
- }),
93
- intent: 'read',
94
- });
95
- `;
96
- const generateEntityTrails = () => `import { Result, trail } from '@ontrails/core';
97
- import { z } from 'zod';
98
-
99
- const entitySchema = z.object({
100
- id: z.string(),
101
- name: z.string(),
102
- });
103
-
104
- export const show = trail('entity.show', {
105
- description: 'Show an entity by ID',
106
- examples: [
107
- {
108
- expected: { id: '1', name: 'Example' },
109
- input: { id: '1' },
110
- name: 'Show entity',
111
- },
112
- ],
113
- blaze: (input) => {
114
- return Result.ok({ id: input.id, name: 'Example' });
115
- },
116
- input: z.object({ id: z.string() }),
117
- output: entitySchema,
118
- intent: 'read',
119
- });
120
-
121
- export const add = trail('entity.add', {
122
- description: 'Add a new entity',
123
- examples: [
124
- {
125
- expected: { id: '1', name: 'New' },
126
- input: { name: 'New' },
127
- name: 'Add entity',
128
- },
129
- ],
130
- blaze: (input) => {
131
- return Result.ok({ id: '1', name: input.name });
132
- },
133
- input: z.object({ name: z.string() }),
134
- output: entitySchema,
135
- });
136
- `;
137
- const generateSearchTrail = () => `import { Result, trail } from '@ontrails/core';
138
- import { z } from 'zod';
139
-
140
- export const search = trail('search', {
141
- description: 'Search entities by query',
142
- examples: [
143
- {
144
- expected: { results: [] },
145
- input: { query: 'test' },
146
- name: 'Search entities',
147
- },
148
- ],
149
- blaze: () => {
150
- return Result.ok({ results: [] });
151
- },
152
- input: z.object({ query: z.string() }),
153
- output: z.object({
154
- results: z.array(z.object({ id: z.string(), name: z.string() })),
155
- }),
156
- intent: 'read',
157
- });
158
- `;
159
- const generateOnboardTrail = () => `import { Result, trail } from '@ontrails/core';
160
- import { z } from 'zod';
161
-
162
- export const onboard = trail('entity.onboard', {
163
- description: 'Onboard a new entity end-to-end',
164
- crosses: ['entity.add'],
165
- blaze: async (input, ctx) => {
166
- const result = await ctx.cross('entity.add', { name: input.name });
167
- if (result.isErr()) {
168
- return result;
169
- }
170
- return Result.ok({ onboarded: true });
171
- },
172
- input: z.object({ name: z.string() }),
173
- output: z.object({ onboarded: z.boolean() }),
174
- });
175
- `;
176
- const generateEntitySignals = () => `import { signal } from '@ontrails/core';
177
- import { z } from 'zod';
178
-
179
- export const entityUpdated = signal('entity.updated', {
180
- description: 'Fired when an entity is updated',
181
- payload: z.object({
182
- entityId: z.string(),
183
- updatedAt: z.string(),
184
- }),
185
- });
186
- `;
187
- const generateStore = () => `/** In-memory store for entities. */
188
-
189
- interface Entity {
190
- readonly id: string;
191
- readonly name: string;
192
- }
193
-
194
- const store = new Map<string, Entity>();
195
-
196
- export const getEntity = (id: string): Entity | undefined => store.get(id);
197
- export const addEntity = (entity: Entity): void => {
198
- store.set(entity.id, entity);
199
- };
200
- export const deleteEntity = (id: string): boolean => store.delete(id);
201
- export const listEntities = (): Entity[] => Array.from(store.values());
202
- `;
203
- const starterImports = {
204
- empty: { imports: [], modules: [] },
205
- entity: {
206
- imports: [
207
- "import * as entity from './trails/entity.js';",
208
- "import * as search from './trails/search.js';",
209
- "import * as onboard from './trails/onboard.js';",
210
- "import * as entitySignals from './signals/entity-signals.js';",
211
- ],
212
- modules: ['entity', 'search', 'onboard', 'entitySignals'],
213
- },
214
- hello: {
215
- imports: ["import * as hello from './trails/hello.js';"],
216
- modules: ['hello'],
217
- },
218
- };
219
- const generateAppTs = (name, starter) => {
220
- const { imports, modules } = starterImports[starter];
221
- const topoArgs = modules.length > 0 ? `'${name}', ${modules.join(', ')}` : `'${name}'`;
222
- return [
223
- "import { topo } from '@ontrails/core';",
224
- ...imports,
225
- '',
226
- `export const app = topo(${topoArgs});`,
227
- '',
228
- ].join('\n');
229
- };
230
- // ---------------------------------------------------------------------------
231
- // File collection and writing
232
- // ---------------------------------------------------------------------------
233
- const starterFileGenerators = {
234
- empty: () => [['src/trails/.gitkeep', '']],
235
- entity: () => [
236
- ['src/trails/entity.ts', generateEntityTrails()],
237
- ['src/trails/search.ts', generateSearchTrail()],
238
- ['src/trails/onboard.ts', generateOnboardTrail()],
239
- ['src/signals/entity-signals.ts', generateEntitySignals()],
240
- ['src/store.ts', generateStore()],
241
- ],
242
- hello: () => [['src/trails/hello.ts', generateHelloTrail()]],
243
- };
244
- const collectScaffoldFiles = (name, starter) => new Map([
245
- ['package.json', generatePackageJson(name)],
246
- ['tsconfig.json', TSCONFIG_CONTENT],
247
- ['.gitignore', GITIGNORE_CONTENT],
248
- ['.oxlintrc.json', OXLINTRC_CONTENT],
249
- ['.oxfmtrc.jsonc', OXFMTRC_CONTENT],
250
- ['src/app.ts', generateAppTs(name, starter)],
251
- ...starterFileGenerators[starter](),
252
- ]);
253
- const writeScaffoldFiles = async (projectDir, fileMap) => {
254
- const files = [];
255
- for (const [relativePath, content] of fileMap) {
256
- const fullPath = join(projectDir, relativePath);
257
- mkdirSync(dirname(fullPath), { recursive: true });
258
- await Bun.write(fullPath, content);
259
- files.push(relativePath);
260
- }
261
- return files;
262
- };
263
- // ---------------------------------------------------------------------------
264
- // Trail definition
265
- // ---------------------------------------------------------------------------
266
- export const createScaffold = trail('create.scaffold', {
267
- blaze: async (input) => {
268
- const projectDir = resolve(input.dir ?? '.', input.name);
269
- const starter = (input.starter ?? 'hello');
270
- const fileMap = collectScaffoldFiles(input.name, starter);
271
- const files = await writeScaffoldFiles(projectDir, fileMap);
272
- mkdirSync(join(projectDir, '.trails'), { recursive: true });
273
- return Result.ok({
274
- created: files,
275
- dir: projectDir,
276
- name: input.name,
277
- });
278
- },
279
- description: 'Scaffold a new Trails project',
280
- input: z.object({
281
- dir: z.string().optional().describe('Parent directory'),
282
- name: z.string().describe('Project name'),
283
- starter: z
284
- .enum(['hello', 'entity', 'empty'])
285
- .default('hello')
286
- .describe('Starter trail'),
287
- }),
288
- meta: { internal: true },
289
- output: z.object({
290
- created: z.array(z.string()),
291
- dir: z.string(),
292
- name: z.string(),
293
- }),
294
- });
295
- //# sourceMappingURL=create-scaffold.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"create-scaffold.js","sourceRoot":"","sources":["../../../src/trails/create-scaffold.ts"],"names":[],"mappings":"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"}