@ontrails/trails 1.0.0-beta.14 → 1.0.0-beta.16

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 (197) hide show
  1. package/CHANGELOG.md +208 -0
  2. package/README.md +27 -0
  3. package/package.json +19 -8
  4. package/src/app.ts +17 -7
  5. package/src/clack.ts +1 -1
  6. package/src/cli.ts +304 -10
  7. package/src/completions.ts +240 -0
  8. package/src/load-app-mirror.ts +160 -0
  9. package/src/local-state-io.ts +153 -0
  10. package/src/project-writes.ts +320 -0
  11. package/src/run-collision.ts +125 -0
  12. package/src/run-completions-install.ts +179 -0
  13. package/src/run-example.ts +149 -0
  14. package/src/run-examples.ts +148 -0
  15. package/src/run-quiet.ts +75 -0
  16. package/src/run-trace.ts +273 -0
  17. package/src/run-warden.ts +39 -0
  18. package/src/run-watch.ts +432 -0
  19. package/src/scaffold-versions.generated.ts +12 -0
  20. package/src/trails/add-surface.ts +172 -0
  21. package/src/trails/add-trail.ts +73 -27
  22. package/src/trails/add-verify.ts +68 -23
  23. package/src/trails/completions-complete.ts +165 -0
  24. package/src/trails/completions.ts +47 -0
  25. package/src/trails/create-scaffold.ts +101 -35
  26. package/src/trails/create.ts +87 -74
  27. package/src/trails/dev-clean.ts +31 -22
  28. package/src/trails/dev-reset.ts +9 -3
  29. package/src/trails/dev-stats.ts +28 -20
  30. package/src/trails/dev-support.ts +109 -95
  31. package/src/trails/draft-promote.ts +351 -107
  32. package/src/trails/guide.ts +55 -38
  33. package/src/trails/load-app.ts +712 -38
  34. package/src/trails/root-dir.ts +21 -0
  35. package/src/trails/run-example.ts +482 -0
  36. package/src/trails/run-examples.ts +141 -0
  37. package/src/trails/run.ts +403 -0
  38. package/src/trails/survey.ts +517 -186
  39. package/src/trails/topo-activation.ts +385 -0
  40. package/src/trails/topo-compile.ts +55 -0
  41. package/src/trails/topo-history.ts +14 -11
  42. package/src/trails/topo-output-schemas.ts +175 -0
  43. package/src/trails/topo-pin.ts +25 -16
  44. package/src/trails/topo-read-support.ts +178 -238
  45. package/src/trails/topo-reports.ts +445 -63
  46. package/src/trails/topo-store-support.ts +67 -35
  47. package/src/trails/topo-support.ts +93 -147
  48. package/src/trails/topo-unpin.ts +17 -7
  49. package/src/trails/topo-verify.ts +19 -10
  50. package/src/trails/topo.ts +64 -31
  51. package/src/trails/warden-guide.ts +121 -0
  52. package/src/trails/warden.ts +137 -47
  53. package/src/versions.ts +28 -0
  54. package/.turbo/turbo-build.log +0 -1
  55. package/.turbo/turbo-lint.log +0 -3
  56. package/.turbo/turbo-typecheck.log +0 -1
  57. package/__tests__/examples.test.ts +0 -20
  58. package/dist/bin/trails.d.ts +0 -3
  59. package/dist/bin/trails.d.ts.map +0 -1
  60. package/dist/bin/trails.js +0 -4
  61. package/dist/bin/trails.js.map +0 -1
  62. package/dist/src/app.d.ts +0 -2
  63. package/dist/src/app.d.ts.map +0 -1
  64. package/dist/src/app.js +0 -22
  65. package/dist/src/app.js.map +0 -1
  66. package/dist/src/clack.d.ts +0 -9
  67. package/dist/src/clack.d.ts.map +0 -1
  68. package/dist/src/clack.js +0 -84
  69. package/dist/src/clack.js.map +0 -1
  70. package/dist/src/cli.d.ts +0 -2
  71. package/dist/src/cli.d.ts.map +0 -1
  72. package/dist/src/cli.js +0 -13
  73. package/dist/src/cli.js.map +0 -1
  74. package/dist/src/trails/add-surface.d.ts +0 -13
  75. package/dist/src/trails/add-surface.d.ts.map +0 -1
  76. package/dist/src/trails/add-surface.js +0 -88
  77. package/dist/src/trails/add-surface.js.map +0 -1
  78. package/dist/src/trails/add-trail.d.ts +0 -10
  79. package/dist/src/trails/add-trail.d.ts.map +0 -1
  80. package/dist/src/trails/add-trail.js +0 -77
  81. package/dist/src/trails/add-trail.js.map +0 -1
  82. package/dist/src/trails/add-trailhead.d.ts +0 -13
  83. package/dist/src/trails/add-trailhead.d.ts.map +0 -1
  84. package/dist/src/trails/add-trailhead.js +0 -88
  85. package/dist/src/trails/add-trailhead.js.map +0 -1
  86. package/dist/src/trails/add-verify.d.ts +0 -10
  87. package/dist/src/trails/add-verify.d.ts.map +0 -1
  88. package/dist/src/trails/add-verify.js +0 -67
  89. package/dist/src/trails/add-verify.js.map +0 -1
  90. package/dist/src/trails/create-scaffold.d.ts +0 -15
  91. package/dist/src/trails/create-scaffold.d.ts.map +0 -1
  92. package/dist/src/trails/create-scaffold.js +0 -288
  93. package/dist/src/trails/create-scaffold.js.map +0 -1
  94. package/dist/src/trails/create.d.ts +0 -22
  95. package/dist/src/trails/create.d.ts.map +0 -1
  96. package/dist/src/trails/create.js +0 -121
  97. package/dist/src/trails/create.js.map +0 -1
  98. package/dist/src/trails/dev-clean.d.ts +0 -9
  99. package/dist/src/trails/dev-clean.d.ts.map +0 -1
  100. package/dist/src/trails/dev-clean.js +0 -65
  101. package/dist/src/trails/dev-clean.js.map +0 -1
  102. package/dist/src/trails/dev-reset.d.ts +0 -6
  103. package/dist/src/trails/dev-reset.d.ts.map +0 -1
  104. package/dist/src/trails/dev-reset.js +0 -38
  105. package/dist/src/trails/dev-reset.js.map +0 -1
  106. package/dist/src/trails/dev-stats.d.ts +0 -7
  107. package/dist/src/trails/dev-stats.d.ts.map +0 -1
  108. package/dist/src/trails/dev-stats.js +0 -61
  109. package/dist/src/trails/dev-stats.js.map +0 -1
  110. package/dist/src/trails/dev-support.d.ts +0 -64
  111. package/dist/src/trails/dev-support.d.ts.map +0 -1
  112. package/dist/src/trails/dev-support.js +0 -178
  113. package/dist/src/trails/dev-support.js.map +0 -1
  114. package/dist/src/trails/draft-promote.d.ts +0 -18
  115. package/dist/src/trails/draft-promote.d.ts.map +0 -1
  116. package/dist/src/trails/draft-promote.js +0 -386
  117. package/dist/src/trails/draft-promote.js.map +0 -1
  118. package/dist/src/trails/guide.d.ts +0 -21
  119. package/dist/src/trails/guide.d.ts.map +0 -1
  120. package/dist/src/trails/guide.js +0 -64
  121. package/dist/src/trails/guide.js.map +0 -1
  122. package/dist/src/trails/load-app.d.ts +0 -6
  123. package/dist/src/trails/load-app.d.ts.map +0 -1
  124. package/dist/src/trails/load-app.js +0 -67
  125. package/dist/src/trails/load-app.js.map +0 -1
  126. package/dist/src/trails/project.d.ts +0 -8
  127. package/dist/src/trails/project.d.ts.map +0 -1
  128. package/dist/src/trails/project.js +0 -54
  129. package/dist/src/trails/project.js.map +0 -1
  130. package/dist/src/trails/survey.d.ts +0 -18
  131. package/dist/src/trails/survey.d.ts.map +0 -1
  132. package/dist/src/trails/survey.js +0 -212
  133. package/dist/src/trails/survey.js.map +0 -1
  134. package/dist/src/trails/topo-constants.d.ts +0 -3
  135. package/dist/src/trails/topo-constants.d.ts.map +0 -1
  136. package/dist/src/trails/topo-constants.js +0 -3
  137. package/dist/src/trails/topo-constants.js.map +0 -1
  138. package/dist/src/trails/topo-export.d.ts +0 -18
  139. package/dist/src/trails/topo-export.d.ts.map +0 -1
  140. package/dist/src/trails/topo-export.js +0 -34
  141. package/dist/src/trails/topo-export.js.map +0 -1
  142. package/dist/src/trails/topo-history.d.ts +0 -24
  143. package/dist/src/trails/topo-history.d.ts.map +0 -1
  144. package/dist/src/trails/topo-history.js +0 -33
  145. package/dist/src/trails/topo-history.js.map +0 -1
  146. package/dist/src/trails/topo-pin.d.ts +0 -21
  147. package/dist/src/trails/topo-pin.d.ts.map +0 -1
  148. package/dist/src/trails/topo-pin.js +0 -35
  149. package/dist/src/trails/topo-pin.js.map +0 -1
  150. package/dist/src/trails/topo-read-support.d.ts +0 -54
  151. package/dist/src/trails/topo-read-support.d.ts.map +0 -1
  152. package/dist/src/trails/topo-read-support.js +0 -178
  153. package/dist/src/trails/topo-read-support.js.map +0 -1
  154. package/dist/src/trails/topo-reports.d.ts +0 -50
  155. package/dist/src/trails/topo-reports.d.ts.map +0 -1
  156. package/dist/src/trails/topo-reports.js +0 -122
  157. package/dist/src/trails/topo-reports.js.map +0 -1
  158. package/dist/src/trails/topo-show.d.ts +0 -23
  159. package/dist/src/trails/topo-show.d.ts.map +0 -1
  160. package/dist/src/trails/topo-show.js +0 -53
  161. package/dist/src/trails/topo-show.js.map +0 -1
  162. package/dist/src/trails/topo-store-support.d.ts +0 -13
  163. package/dist/src/trails/topo-store-support.d.ts.map +0 -1
  164. package/dist/src/trails/topo-store-support.js +0 -55
  165. package/dist/src/trails/topo-store-support.js.map +0 -1
  166. package/dist/src/trails/topo-support.d.ts +0 -87
  167. package/dist/src/trails/topo-support.d.ts.map +0 -1
  168. package/dist/src/trails/topo-support.js +0 -165
  169. package/dist/src/trails/topo-support.js.map +0 -1
  170. package/dist/src/trails/topo-unpin.d.ts +0 -15
  171. package/dist/src/trails/topo-unpin.d.ts.map +0 -1
  172. package/dist/src/trails/topo-unpin.js +0 -39
  173. package/dist/src/trails/topo-unpin.js.map +0 -1
  174. package/dist/src/trails/topo-verify.d.ts +0 -5
  175. package/dist/src/trails/topo-verify.d.ts.map +0 -1
  176. package/dist/src/trails/topo-verify.js +0 -28
  177. package/dist/src/trails/topo-verify.js.map +0 -1
  178. package/dist/src/trails/topo.d.ts +0 -5
  179. package/dist/src/trails/topo.d.ts.map +0 -1
  180. package/dist/src/trails/topo.js +0 -67
  181. package/dist/src/trails/topo.js.map +0 -1
  182. package/dist/src/trails/warden.d.ts +0 -19
  183. package/dist/src/trails/warden.d.ts.map +0 -1
  184. package/dist/src/trails/warden.js +0 -89
  185. package/dist/src/trails/warden.js.map +0 -1
  186. package/dist/tsconfig.tsbuildinfo +0 -1
  187. package/src/__tests__/create.test.ts +0 -351
  188. package/src/__tests__/draft-promote.test.ts +0 -144
  189. package/src/__tests__/guide.test.ts +0 -91
  190. package/src/__tests__/load-app.test.ts +0 -58
  191. package/src/__tests__/survey.test.ts +0 -301
  192. package/src/__tests__/topo-dev.test.ts +0 -424
  193. package/src/__tests__/warden.test.ts +0 -74
  194. package/src/trails/add-trailhead.ts +0 -121
  195. package/src/trails/topo-export.ts +0 -39
  196. package/src/trails/topo-show.ts +0 -58
  197. package/tsconfig.json +0 -9
package/dist/src/clack.js DELETED
@@ -1,84 +0,0 @@
1
- /**
2
- * Clack-backed input resolver for the Trails CLI.
3
- *
4
- * This stays at the app gate so @ontrails/cli remains prompt-library agnostic.
5
- */
6
- import { isInteractive } from '@ontrails/cli';
7
- import * as clack from '@clack/prompts';
8
- /** Check whether a field still needs input. */
9
- const needsInput = (field, current) => current[field.name] === undefined &&
10
- field.required &&
11
- field.default === undefined;
12
- /** Build Clack options from field options. */
13
- const toClackOptions = (field) => field.options?.map((option) => ({
14
- ...(option.hint === undefined ? {} : { hint: option.hint }),
15
- label: option.label ?? option.value,
16
- value: option.value,
17
- })) ?? [];
18
- /** Normalize cancelled prompts to `undefined`. */
19
- const cancelable = async (value) => await (clack.isCancel(value) ? undefined : value);
20
- const fieldResolvers = {
21
- boolean: async (field) => cancelable(await clack.confirm({
22
- initialValue: field.default ?? false,
23
- message: field.label,
24
- })),
25
- enum: async (field) => cancelable(await clack.select({
26
- message: field.label,
27
- options: toClackOptions(field),
28
- })),
29
- multiselect: async (field) => cancelable(await clack.multiselect({
30
- initialValues: field.default ?? [],
31
- message: field.label,
32
- options: toClackOptions(field),
33
- })),
34
- number: async (field) => {
35
- const raw = await clack.text({ message: field.label });
36
- return clack.isCancel(raw) ? undefined : Number(raw);
37
- },
38
- 'number[]': async (field) => {
39
- const raw = await clack.text({
40
- message: `${field.label} (comma-separated numbers)`,
41
- });
42
- if (clack.isCancel(raw)) {
43
- return;
44
- }
45
- return String(raw)
46
- .split(',')
47
- .map((s) => Number(s.trim()));
48
- },
49
- string: async (field) => cancelable(await clack.text({ message: field.label })),
50
- 'string[]': async (field) => {
51
- const raw = await clack.text({
52
- message: `${field.label} (comma-separated)`,
53
- });
54
- if (clack.isCancel(raw)) {
55
- return;
56
- }
57
- return String(raw)
58
- .split(',')
59
- .map((s) => s.trim());
60
- },
61
- };
62
- /** Resolve a single field value with Clack. */
63
- const resolveField = (field) => {
64
- const resolver = fieldResolvers[field.type];
65
- return resolver(field);
66
- };
67
- /** Fill missing input by prompting with Clack when interactive. */
68
- export const resolveInputWithClack = async (fields, provided, options) => {
69
- if (!isInteractive(options)) {
70
- return provided;
71
- }
72
- const resolved = { ...provided };
73
- for (const field of fields) {
74
- if (!needsInput(field, resolved)) {
75
- continue;
76
- }
77
- const value = await resolveField(field);
78
- if (value !== undefined) {
79
- resolved[field.name] = value;
80
- }
81
- }
82
- return resolved;
83
- };
84
- //# sourceMappingURL=clack.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"clack.js","sourceRoot":"","sources":["../../src/clack.ts"],"names":[],"mappings":"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"}
package/dist/src/cli.d.ts DELETED
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=cli.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":""}
package/dist/src/cli.js DELETED
@@ -1,13 +0,0 @@
1
- import { outputModePreset } from '@ontrails/cli';
2
- import { trailhead } from '@ontrails/cli/commander';
3
- import { app } from './app.js';
4
- import { resolveInputWithClack } from './clack.js';
5
- // oxlint-disable-next-line require-hook -- CLI entry point
6
- trailhead(app, {
7
- description: 'Agent-native, contract-first TypeScript framework',
8
- name: 'trails',
9
- presets: [outputModePreset()],
10
- resolveInput: resolveInputWithClack,
11
- version: '0.1.0',
12
- });
13
- //# sourceMappingURL=cli.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAEpD,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAEnD,2DAA2D;AAC3D,SAAS,CAAC,GAAG,EAAE;IACb,WAAW,EAAE,mDAAmD;IAChE,IAAI,EAAE,QAAQ;IACd,OAAO,EAAE,CAAC,gBAAgB,EAAE,CAAC;IAC7B,YAAY,EAAE,qBAAqB;IACnC,OAAO,EAAE,OAAO;CACjB,CAAC,CAAC"}
@@ -1,13 +0,0 @@
1
- /**
2
- * `add.surface` trail -- Add a surface to an existing project.
3
- *
4
- * Generates the CLI or MCP entry point and updates package.json dependencies.
5
- */
6
- export declare const addSurface: import("@ontrails/core").Trail<{
7
- surface: "cli" | "mcp";
8
- dir?: string | undefined;
9
- }, {
10
- created: string;
11
- dependency: string;
12
- }>;
13
- //# sourceMappingURL=add-surface.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"add-surface.d.ts","sourceRoot":"","sources":["../../../src/trails/add-surface.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAwFH,eAAO,MAAM,UAAU;;;;;;EA0BrB,CAAC"}
@@ -1,88 +0,0 @@
1
- /**
2
- * `add.surface` trail -- Add a surface 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 { blaze } from '@ontrails/cli/commander';
12
-
13
- import { app } from '${appImportPath}';
14
-
15
- blaze(app);
16
- `;
17
- const generateMcpEntry = (appImportPath) => `import { blaze } from '@ontrails/mcp';
18
-
19
- import { app } from '${appImportPath}';
20
-
21
- await blaze(app);
22
- `;
23
- /** Resolve the entry file for a surface. */
24
- const getEntryFile = (surface) => surface === '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, surface, cwd) => {
30
- const depName = surface === 'cli' ? '@ontrails/cli' : '@ontrails/mcp';
31
- const deps = (pkg['dependencies'] ?? {});
32
- deps[depName] = 'workspace:*';
33
- if (surface === '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 surface dependency and CLI bin if needed. */
43
- const updatePkgJsonForSurface = async (cwd, surface) => {
44
- const pkgPath = join(cwd, 'package.json');
45
- if (!existsSync(pkgPath)) {
46
- return surface === 'cli' ? '@ontrails/cli' : '@ontrails/mcp';
47
- }
48
- const pkg = (await Bun.file(pkgPath).json());
49
- const depName = patchPkgDeps(pkg, surface, cwd);
50
- await Bun.write(pkgPath, `${JSON.stringify(pkg, null, 2)}\n`);
51
- return depName;
52
- };
53
- /** Create the entry file for a surface and return the relative path. */
54
- const writeSurfaceEntry = async (cwd, surface) => {
55
- const entryFile = getEntryFile(surface);
56
- const fullEntryPath = join(cwd, entryFile);
57
- const appImport = (await findTopoPath(cwd)) ?? './app.js';
58
- const content = surface === '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 addSurface = trail('add.surface', {
66
- description: 'Add a surface to an existing project',
67
- input: z.object({
68
- dir: z.string().optional().describe('Project directory'),
69
- surface: z.enum(['cli', 'mcp']).describe('Surface to add'),
70
- }),
71
- output: z.object({
72
- created: z.string(),
73
- dependency: z.string(),
74
- }),
75
- run: async (input) => {
76
- const cwd = resolve(input.dir ?? '.');
77
- const { surface } = input;
78
- const entryFile = getEntryFile(surface);
79
- if (existsSync(join(cwd, entryFile))) {
80
- return Result.err(new Error(`${surface.toUpperCase()} is already blazed. Nothing to do.`));
81
- }
82
- return Result.ok({
83
- created: await writeSurfaceEntry(cwd, surface),
84
- dependency: await updatePkgJsonForSurface(cwd, surface),
85
- });
86
- },
87
- });
88
- //# sourceMappingURL=add-surface.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"add-surface.js","sourceRoot":"","sources":["../../../src/trails/add-surface.ts"],"names":[],"mappings":"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"}
@@ -1,10 +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
- id: string;
6
- intent: "read" | "write" | "destroy";
7
- }, {
8
- created: string[];
9
- }>;
10
- //# 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;AA+DH,eAAO,MAAM,QAAQ;;;;;EA4BnB,CAAC"}
@@ -1,77 +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 generateTrailFile = (id, intent) => {
12
- const intentLine = intent === 'write' ? '' : `\n intent: '${intent}',`;
13
- return `import { Result, trail } from '@ontrails/core';
14
- import { z } from 'zod';
15
-
16
- export const ${id.replaceAll('.', '_')} = trail('${id}', {
17
- description: 'TODO: describe this trail',
18
- examples: [
19
- {
20
- input: {},
21
- name: 'TODO: add example',
22
- },
23
- ],
24
- blaze: async (input) => {
25
- return Result.ok({ message: 'TODO' });
26
- },
27
- input: z.object({}),${intentLine}
28
- output: z.object({ message: z.string() }),
29
- });
30
- `;
31
- };
32
- const generateTestFile = (id) => {
33
- const moduleName = id.replaceAll('.', '-');
34
- const trailName = id.replaceAll('.', '_');
35
- return `import { testTrail } from '@ontrails/testing';
36
- import { ${trailName} } from '../src/trails/${moduleName}.js';
37
-
38
- testTrail(${trailName}, [
39
- { description: 'basic test', input: {}, expectOk: true },
40
- ]);
41
- `;
42
- };
43
- // ---------------------------------------------------------------------------
44
- // Trail definition
45
- // ---------------------------------------------------------------------------
46
- /** Write a file, creating parent directories as needed. */
47
- const writeWithDirs = async (filePath, content) => {
48
- mkdirSync(dirname(filePath), { recursive: true });
49
- await Bun.write(filePath, content);
50
- };
51
- export const addTrail = trail('add.trail', {
52
- blaze: async (input, ctx) => {
53
- const { id } = input;
54
- const moduleName = id.replaceAll('.', '-');
55
- const cwd = resolve(ctx.cwd ?? '.');
56
- const files = new Map([
57
- [`src/trails/${moduleName}.ts`, generateTrailFile(id, input.intent)],
58
- [`__tests__/${moduleName}.test.ts`, generateTestFile(id)],
59
- ]);
60
- for (const [relativePath, content] of files) {
61
- await writeWithDirs(join(cwd, relativePath), content);
62
- }
63
- return Result.ok({ created: [...files.keys()] });
64
- },
65
- description: 'Scaffold a new trail with tests and examples',
66
- input: z.object({
67
- id: z.string().describe('Trail ID (e.g., entity.update)'),
68
- intent: z
69
- .enum(['read', 'write', 'destroy'])
70
- .default('write')
71
- .describe('Trail intent'),
72
- }),
73
- output: z.object({
74
- created: z.array(z.string()),
75
- }),
76
- });
77
- //# 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
- }>;
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;;;;;;EA4BvB,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 { trailhead } from '@ontrails/cli/commander';
12
-
13
- import { app } from '${appImportPath}';
14
-
15
- trailhead(app);
16
- `;
17
- const generateMcpEntry = (appImportPath) => `import { trailhead } from '@ontrails/mcp';
18
-
19
- import { app } from '${appImportPath}';
20
-
21
- await trailhead(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":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE7D,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,MAAM,gBAAgB,GAAG,CAAC,aAAqB,EAAU,EAAE,CACzD;;uBAEqB,aAAa;;;CAGnC,CAAC;AAEF,MAAM,gBAAgB,GAAG,CAAC,aAAqB,EAAU,EAAE,CACzD;;uBAEqB,aAAa;;;CAGnC,CAAC;AAEF,8CAA8C;AAC9C,MAAM,YAAY,GAAG,CAAC,SAAwB,EAAU,EAAE,CACxD,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC;AAEpD,8EAA8E;AAC9E,mBAAmB;AACnB,8EAA8E;AAE9E,8DAA8D;AAC9D,MAAM,YAAY,GAAG,CACnB,GAA4B,EAC5B,SAAwB,EACxB,GAAW,EACH,EAAE;IACV,MAAM,OAAO,GAAG,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,eAAe,CAAC;IACxE,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAA2B,CAAC;IACnE,IAAI,CAAC,OAAO,CAAC,GAAG,aAAa,CAAC;IAC9B,IAAI,SAAS,KAAK,KAAK,EAAE,CAAC;QACxB,IAAI,CAAC,WAAW,CAAC,GAAG,SAAS,CAAC;QAC9B,GAAG,CAAC,KAAK,CAAC,GAAG;YACX,CAAE,GAAG,CAAC,MAAM,CAAwB,IAAI,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,cAAc;SACvE,CAAC;IACJ,CAAC;IACD,GAAG,CAAC,cAAc,CAAC,GAAG,MAAM,CAAC,WAAW,CACtC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAChE,CAAC;IACF,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC;AAEF,2EAA2E;AAC3E,MAAM,yBAAyB,GAAG,KAAK,EACrC,GAAW,EACX,SAAwB,EACP,EAAE;IACnB,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IAC1C,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACzB,OAAO,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,eAAe,CAAC;IACjE,CAAC;IACD,MAAM,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAA4B,CAAC;IACxE,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;IAClD,MAAM,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;IAC9D,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC;AAEF,0EAA0E;AAC1E,MAAM,mBAAmB,GAAG,KAAK,EAC/B,GAAW,EACX,SAAwB,EACP,EAAE;IACnB,MAAM,SAAS,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;IAC1C,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IAC3C,MAAM,SAAS,GAAG,CAAC,MAAM,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,UAAU,CAAC;IAC1D,MAAM,OAAO,GACX,SAAS,KAAK,KAAK;QACjB,CAAC,CAAC,gBAAgB,CAAC,SAAS,CAAC;QAC7B,CAAC,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;IAElC,SAAS,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvD,MAAM,GAAG,CAAC,KAAK,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;IACxC,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,CAAC,eAAe,EAAE;IACjD,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;QACrB,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC;QACtC,MAAM,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC;QAC5B,MAAM,SAAS,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;QAE1C,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC;YACrC,OAAO,MAAM,CAAC,GAAG,CACf,IAAI,KAAK,CACP,GAAG,SAAS,CAAC,WAAW,EAAE,2CAA2C,CACtE,CACF,CAAC;QACJ,CAAC;QAED,OAAO,MAAM,CAAC,EAAE,CAAC;YACf,OAAO,EAAE,MAAM,mBAAmB,CAAC,GAAG,EAAE,SAAS,CAAC;YAClD,UAAU,EAAE,MAAM,yBAAyB,CAAC,GAAG,EAAE,SAAS,CAAC;SAC5D,CAAC,CAAC;IACL,CAAC;IACD,WAAW,EAAE,wCAAwC;IACrD,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;QACd,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC;QACxD,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,kBAAkB,CAAC;KAC/D,CAAC;IACF,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;QACnB,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;KACvB,CAAC;CACH,CAAC,CAAC"}
@@ -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
- }>;
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;AAsDH,eAAO,MAAM,SAAS;;;;;EA8BpB,CAAC"}
@@ -1,67 +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
- // ---------------------------------------------------------------------------
9
- // Content generators
10
- // ---------------------------------------------------------------------------
11
- const generateTestFile = () => `import { testAll } from '@ontrails/testing';
12
- import { app } from '../src/app.js';
13
-
14
- testAll(app);
15
- `;
16
- const generateLefthookYml = () => `pre-push:
17
- commands:
18
- warden:
19
- run: bunx trails warden --exit-code
20
- `;
21
- /** Add testing and warden devDependencies to package.json when present. */
22
- const patchVerifyDeps = (pkg) => {
23
- const devDeps = (pkg['devDependencies'] ?? {});
24
- devDeps['@ontrails/testing'] = 'workspace:*';
25
- devDeps['@ontrails/warden'] = 'workspace:*';
26
- devDeps['lefthook'] = '^2.1.1';
27
- pkg['devDependencies'] = Object.fromEntries(Object.entries(devDeps).toSorted(([a], [b]) => a.localeCompare(b)));
28
- };
29
- /** Update package.json in the target project with verify dependencies. */
30
- const updatePackageJsonForVerify = async (projectDir) => {
31
- const pkgPath = join(projectDir, 'package.json');
32
- if (!existsSync(pkgPath)) {
33
- return;
34
- }
35
- const pkg = (await Bun.file(pkgPath).json());
36
- patchVerifyDeps(pkg);
37
- await Bun.write(pkgPath, `${JSON.stringify(pkg, null, 2)}\n`);
38
- };
39
- // ---------------------------------------------------------------------------
40
- // Trail definition
41
- // ---------------------------------------------------------------------------
42
- export const addVerify = trail('add.verify', {
43
- blaze: async (input) => {
44
- const projectDir = resolve(input.dir ?? '.', input.name);
45
- const files = [];
46
- const writeFile = async (relativePath, content) => {
47
- const fullPath = join(projectDir, relativePath);
48
- mkdirSync(dirname(fullPath), { recursive: true });
49
- await Bun.write(fullPath, content);
50
- files.push(relativePath);
51
- };
52
- await writeFile('__tests__/examples.test.ts', generateTestFile());
53
- await writeFile('lefthook.yml', generateLefthookYml());
54
- await updatePackageJsonForVerify(projectDir);
55
- return Result.ok({ created: files });
56
- },
57
- description: 'Add testing and warden verification',
58
- input: z.object({
59
- dir: z.string().optional().describe('Parent directory'),
60
- name: z.string().describe('Project name'),
61
- }),
62
- meta: { internal: true },
63
- output: z.object({
64
- created: z.array(z.string()),
65
- }),
66
- });
67
- //# sourceMappingURL=add-verify.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"add-verify.js","sourceRoot":"","sources":["../../../src/trails/add-verify.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEnD,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,8EAA8E;AAC9E,qBAAqB;AACrB,8EAA8E;AAE9E,MAAM,gBAAgB,GAAG,GAAW,EAAE,CACpC;;;;CAID,CAAC;AAEF,MAAM,mBAAmB,GAAG,GAAW,EAAE,CACvC;;;;CAID,CAAC;AAEF,2EAA2E;AAC3E,MAAM,eAAe,GAAG,CAAC,GAA4B,EAAQ,EAAE;IAC7D,MAAM,OAAO,GAAG,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,EAAE,CAA2B,CAAC;IACzE,OAAO,CAAC,mBAAmB,CAAC,GAAG,aAAa,CAAC;IAC7C,OAAO,CAAC,kBAAkB,CAAC,GAAG,aAAa,CAAC;IAC5C,OAAO,CAAC,UAAU,CAAC,GAAG,QAAQ,CAAC;IAC/B,GAAG,CAAC,iBAAiB,CAAC,GAAG,MAAM,CAAC,WAAW,CACzC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CACnE,CAAC;AACJ,CAAC,CAAC;AAEF,0EAA0E;AAC1E,MAAM,0BAA0B,GAAG,KAAK,EACtC,UAAkB,EACH,EAAE;IACjB,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;IACjD,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACzB,OAAO;IACT,CAAC;IACD,MAAM,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAA4B,CAAC;IACxE,eAAe,CAAC,GAAG,CAAC,CAAC;IACrB,MAAM,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;AAChE,CAAC,CAAC;AAEF,8EAA8E;AAC9E,mBAAmB;AACnB,8EAA8E;AAE9E,MAAM,CAAC,MAAM,SAAS,GAAG,KAAK,CAAC,YAAY,EAAE;IAC3C,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;QACrB,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACzD,MAAM,KAAK,GAAa,EAAE,CAAC;QAE3B,MAAM,SAAS,GAAG,KAAK,EACrB,YAAoB,EACpB,OAAe,EACA,EAAE;YACjB,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;YAChD,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAClD,MAAM,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YACnC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC3B,CAAC,CAAC;QAEF,MAAM,SAAS,CAAC,4BAA4B,EAAE,gBAAgB,EAAE,CAAC,CAAC;QAClE,MAAM,SAAS,CAAC,cAAc,EAAE,mBAAmB,EAAE,CAAC,CAAC;QACvD,MAAM,0BAA0B,CAAC,UAAU,CAAC,CAAC;QAE7C,OAAO,MAAM,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;IACvC,CAAC;IACD,WAAW,EAAE,qCAAqC;IAClD,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;QACd,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC;QACvD,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC;KAC1C,CAAC;IACF,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE;IACxB,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;KAC7B,CAAC;CACH,CAAC,CAAC"}
@@ -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
- }>;
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;AA8TH,eAAO,MAAM,cAAc;;;;;;;;EA6BzB,CAAC"}