@ontrails/trails 1.0.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/.turbo/turbo-build.log +1 -0
  2. package/.turbo/turbo-lint.log +3 -0
  3. package/.turbo/turbo-typecheck.log +1 -0
  4. package/CHANGELOG.md +12 -0
  5. package/__tests__/examples.test.ts +6 -0
  6. package/bin/trails.ts +3 -0
  7. package/dist/bin/trails.d.ts +3 -0
  8. package/dist/bin/trails.d.ts.map +1 -0
  9. package/dist/bin/trails.js +4 -0
  10. package/dist/bin/trails.js.map +1 -0
  11. package/dist/src/app.d.ts +2 -0
  12. package/dist/src/app.d.ts.map +1 -0
  13. package/dist/src/app.js +11 -0
  14. package/dist/src/app.js.map +1 -0
  15. package/dist/src/clack.d.ts +9 -0
  16. package/dist/src/clack.d.ts.map +1 -0
  17. package/dist/src/clack.js +62 -0
  18. package/dist/src/clack.js.map +1 -0
  19. package/dist/src/cli.d.ts +2 -0
  20. package/dist/src/cli.d.ts.map +1 -0
  21. package/dist/src/cli.js +13 -0
  22. package/dist/src/cli.js.map +1 -0
  23. package/dist/src/trails/add-surface.d.ts +13 -0
  24. package/dist/src/trails/add-surface.d.ts.map +1 -0
  25. package/dist/src/trails/add-surface.js +88 -0
  26. package/dist/src/trails/add-surface.js.map +1 -0
  27. package/dist/src/trails/add-trail.d.ts +11 -0
  28. package/dist/src/trails/add-trail.d.ts.map +1 -0
  29. package/dist/src/trails/add-trail.js +85 -0
  30. package/dist/src/trails/add-trail.js.map +1 -0
  31. package/dist/src/trails/add-verify.d.ts +10 -0
  32. package/dist/src/trails/add-verify.d.ts.map +1 -0
  33. package/dist/src/trails/add-verify.js +67 -0
  34. package/dist/src/trails/add-verify.js.map +1 -0
  35. package/dist/src/trails/create-scaffold.d.ts +15 -0
  36. package/dist/src/trails/create-scaffold.d.ts.map +1 -0
  37. package/dist/src/trails/create-scaffold.js +288 -0
  38. package/dist/src/trails/create-scaffold.js.map +1 -0
  39. package/dist/src/trails/create.d.ts +22 -0
  40. package/dist/src/trails/create.d.ts.map +1 -0
  41. package/dist/src/trails/create.js +121 -0
  42. package/dist/src/trails/create.js.map +1 -0
  43. package/dist/src/trails/guide.d.ts +11 -0
  44. package/dist/src/trails/guide.d.ts.map +1 -0
  45. package/dist/src/trails/guide.js +80 -0
  46. package/dist/src/trails/guide.js.map +1 -0
  47. package/dist/src/trails/load-app.d.ts +4 -0
  48. package/dist/src/trails/load-app.d.ts.map +1 -0
  49. package/dist/src/trails/load-app.js +24 -0
  50. package/dist/src/trails/load-app.js.map +1 -0
  51. package/dist/src/trails/project.d.ts +8 -0
  52. package/dist/src/trails/project.d.ts.map +1 -0
  53. package/dist/src/trails/project.js +43 -0
  54. package/dist/src/trails/project.js.map +1 -0
  55. package/dist/src/trails/survey.d.ts +33 -0
  56. package/dist/src/trails/survey.d.ts.map +1 -0
  57. package/dist/src/trails/survey.js +225 -0
  58. package/dist/src/trails/survey.js.map +1 -0
  59. package/dist/src/trails/warden.d.ts +19 -0
  60. package/dist/src/trails/warden.d.ts.map +1 -0
  61. package/dist/src/trails/warden.js +88 -0
  62. package/dist/src/trails/warden.js.map +1 -0
  63. package/dist/tsconfig.tsbuildinfo +1 -0
  64. package/package.json +28 -0
  65. package/src/__tests__/create.test.ts +349 -0
  66. package/src/__tests__/guide.test.ts +91 -0
  67. package/src/__tests__/load-app.test.ts +15 -0
  68. package/src/__tests__/survey.test.ts +161 -0
  69. package/src/__tests__/warden.test.ts +74 -0
  70. package/src/app.ts +22 -0
  71. package/src/clack.ts +89 -0
  72. package/src/cli.ts +14 -0
  73. package/src/trails/add-surface.ts +119 -0
  74. package/src/trails/add-trail.ts +103 -0
  75. package/src/trails/add-verify.ts +87 -0
  76. package/src/trails/create-scaffold.ts +352 -0
  77. package/src/trails/create.ts +203 -0
  78. package/src/trails/guide.ts +104 -0
  79. package/src/trails/load-app.ts +37 -0
  80. package/src/trails/project.ts +51 -0
  81. package/src/trails/survey.ts +307 -0
  82. package/src/trails/warden.ts +104 -0
  83. package/tsconfig.json +9 -0
@@ -0,0 +1,33 @@
1
+ /**
2
+ * `survey` trail -- Full topo introspection.
3
+ *
4
+ * Lists trails, shows detail for individual trails, generates surface maps,
5
+ * and diffs against previous versions.
6
+ */
7
+ import type { Topo, Trail } from '@ontrails/core';
8
+ export interface BriefReport {
9
+ readonly name: string;
10
+ readonly version: string;
11
+ readonly contractVersion: string;
12
+ readonly features: {
13
+ readonly outputSchemas: boolean;
14
+ readonly examples: boolean;
15
+ readonly detours: boolean;
16
+ readonly hikes: boolean;
17
+ readonly events: boolean;
18
+ };
19
+ readonly trails: number;
20
+ readonly hikes: number;
21
+ readonly events: number;
22
+ }
23
+ /** Generate a compact capability report for the given topo. */
24
+ export declare const generateBriefReport: (app: Topo) => BriefReport;
25
+ export declare const surveyTrail: Trail<{
26
+ breakingOnly: boolean;
27
+ brief: boolean;
28
+ generate: boolean;
29
+ module: string;
30
+ diff?: string | undefined;
31
+ trailId?: string | undefined;
32
+ }, object>;
33
+ //# sourceMappingURL=survey.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"survey.d.ts","sourceRoot":"","sources":["../../../src/trails/survey.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAmBlD,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,QAAQ,EAAE;QACjB,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;QAChC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;QAC3B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;QAC1B,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;QACxB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;KAC1B,CAAC;IACF,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAwBD,+DAA+D;AAC/D,eAAO,MAAM,mBAAmB,GAAI,KAAK,IAAI,KAAG,WAkB/C,CAAC;AA2HF,eAAO,MAAM,WAAW;;;;;;;UAoGtB,CAAC"}
@@ -0,0 +1,225 @@
1
+ /**
2
+ * `survey` trail -- Full topo introspection.
3
+ *
4
+ * Lists trails, shows detail for individual trails, generates surface maps,
5
+ * and diffs against previous versions.
6
+ */
7
+ import { Result, trail } from '@ontrails/core';
8
+ import { diffSurfaceMaps, generateSurfaceMap, hashSurfaceMap, readSurfaceMap, writeSurfaceLock, writeSurfaceMap, } from '@ontrails/schema';
9
+ import { z } from 'zod';
10
+ import { loadApp } from './load-app.js';
11
+ /** Check if a trail has a specific feature. */
12
+ const trailHas = (raw, key) => {
13
+ if (key === 'examples') {
14
+ return Array.isArray(raw[key]) && raw[key].length > 0;
15
+ }
16
+ return Boolean(raw[key]);
17
+ };
18
+ /** Detect which features are used across trails. */
19
+ const detectFeatures = (app) => {
20
+ const trails = [...app.trails.values()].map((item) => item);
21
+ return {
22
+ hasDetours: trails.some((r) => trailHas(r, 'detours')),
23
+ hasExamples: trails.some((r) => trailHas(r, 'examples')),
24
+ hasOutputSchemas: trails.some((r) => trailHas(r, 'output')),
25
+ };
26
+ };
27
+ /** Generate a compact capability report for the given topo. */
28
+ export const generateBriefReport = (app) => {
29
+ const { hasDetours, hasExamples, hasOutputSchemas } = detectFeatures(app);
30
+ return {
31
+ contractVersion: '2026-03',
32
+ events: app.events.size,
33
+ features: {
34
+ detours: hasDetours,
35
+ events: app.events.size > 0,
36
+ examples: hasExamples,
37
+ hikes: app.hikes.size > 0,
38
+ outputSchemas: hasOutputSchemas,
39
+ },
40
+ hikes: app.hikes.size,
41
+ name: app.name,
42
+ trails: app.trails.size,
43
+ version: '0.1.0',
44
+ };
45
+ };
46
+ // ---------------------------------------------------------------------------
47
+ // Formatting helpers
48
+ // ---------------------------------------------------------------------------
49
+ const safetyLabel = (entry) => {
50
+ if (entry.destructive) {
51
+ return 'destructive';
52
+ }
53
+ if (entry.readOnly) {
54
+ return 'readOnly';
55
+ }
56
+ return '-';
57
+ };
58
+ const formatTrailList = (app) => {
59
+ const items = app.list();
60
+ const entries = items.map((item) => {
61
+ const safety = safetyLabel(item);
62
+ const examples = Array.isArray(item.examples)
63
+ ? item.examples.length
64
+ : 0;
65
+ return {
66
+ examples,
67
+ id: item.id,
68
+ kind: item.kind,
69
+ safety,
70
+ };
71
+ });
72
+ return { count: items.length, entries };
73
+ };
74
+ /**
75
+ * Build a human-readable detail view for a single trail.
76
+ *
77
+ * Overlaps with `trailToEntry` in `@ontrails/schema` which builds the
78
+ * surface-map entry. The two serve different audiences (human display vs
79
+ * machine-diffable surface map) so they are kept separate.
80
+ */
81
+ const formatTrailDetail = (item) => {
82
+ const safety = safetyLabel(item);
83
+ return {
84
+ description: item.description ?? null,
85
+ detours: item.detours ?? null,
86
+ examples: item.examples ?? [],
87
+ id: item.id,
88
+ kind: item.kind,
89
+ safety,
90
+ };
91
+ };
92
+ const formatDiff = (diff) => ({
93
+ breaking: diff.breaking,
94
+ hasBreaking: diff.hasBreaking,
95
+ info: diff.info,
96
+ warnings: diff.warnings,
97
+ });
98
+ const buildSurveyDiff = async (app, breakingOnly) => {
99
+ const currentMap = generateSurfaceMap(app);
100
+ const previousMap = await readSurfaceMap();
101
+ if (!previousMap) {
102
+ return Result.err(new Error('No previous surface map found. Run `trails survey generate` first.'));
103
+ }
104
+ const diff = diffSurfaceMaps(previousMap, currentMap);
105
+ return Result.ok(breakingOnly
106
+ ? formatDiff({
107
+ ...diff,
108
+ entries: diff.breaking,
109
+ info: [],
110
+ warnings: [],
111
+ })
112
+ : formatDiff(diff));
113
+ };
114
+ const buildSurveyDetail = (app, trailId) => {
115
+ const item = app.get(trailId);
116
+ if (!item) {
117
+ return Result.err(new Error(`Trail not found: ${trailId}`));
118
+ }
119
+ return Result.ok(formatTrailDetail(item));
120
+ };
121
+ const buildSurveyGenerate = async (app) => {
122
+ const surfaceMap = generateSurfaceMap(app);
123
+ const mapPath = await writeSurfaceMap(surfaceMap);
124
+ const hash = hashSurfaceMap(surfaceMap);
125
+ const lockPath = await writeSurfaceLock(hash);
126
+ return Result.ok({ hash, lockPath, mapPath });
127
+ };
128
+ // ---------------------------------------------------------------------------
129
+ // Trail definition
130
+ // ---------------------------------------------------------------------------
131
+ export const surveyTrail = trail('survey', {
132
+ description: 'Full topo introspection',
133
+ examples: [
134
+ {
135
+ description: 'Lists all registered trails with safety and surface info',
136
+ input: {},
137
+ name: 'List all trails',
138
+ },
139
+ {
140
+ description: 'Quick capability summary with counts and feature flags',
141
+ input: { brief: true },
142
+ name: 'Brief capability report',
143
+ },
144
+ ],
145
+ implementation: async (input, ctx) => {
146
+ const app = await loadApp(input.module, ctx.cwd ?? '.');
147
+ if (input.brief) {
148
+ return Result.ok(generateBriefReport(app));
149
+ }
150
+ if (input.diff) {
151
+ return await buildSurveyDiff(app, input.breakingOnly);
152
+ }
153
+ if (input.trailId) {
154
+ return buildSurveyDetail(app, input.trailId);
155
+ }
156
+ if (input.generate) {
157
+ return await buildSurveyGenerate(app);
158
+ }
159
+ return Result.ok(formatTrailList(app));
160
+ },
161
+ input: z.object({
162
+ breakingOnly: z
163
+ .boolean()
164
+ .default(false)
165
+ .describe('Only show breaking changes'),
166
+ brief: z.boolean().default(false).describe('Quick capability summary'),
167
+ diff: z.string().optional().describe('Diff against a git ref'),
168
+ generate: z
169
+ .boolean()
170
+ .default(false)
171
+ .describe('Generate surface map and lock file'),
172
+ module: z
173
+ .string()
174
+ .default('./src/app.ts')
175
+ .describe('Path to the app module'),
176
+ trailId: z.string().optional().describe('Trail ID for detail view'),
177
+ }),
178
+ output: z.union([
179
+ z.object({
180
+ count: z.number(),
181
+ entries: z.array(z.object({
182
+ examples: z.number(),
183
+ id: z.string(),
184
+ kind: z.string(),
185
+ safety: z.string(),
186
+ })),
187
+ }),
188
+ z.object({
189
+ contractVersion: z.string(),
190
+ events: z.number(),
191
+ features: z.object({
192
+ detours: z.boolean(),
193
+ events: z.boolean(),
194
+ examples: z.boolean(),
195
+ hikes: z.boolean(),
196
+ outputSchemas: z.boolean(),
197
+ }),
198
+ hikes: z.number(),
199
+ name: z.string(),
200
+ trails: z.number(),
201
+ version: z.string(),
202
+ }),
203
+ z.object({
204
+ breaking: z.array(z.unknown()),
205
+ hasBreaking: z.boolean(),
206
+ info: z.array(z.unknown()),
207
+ warnings: z.array(z.unknown()),
208
+ }),
209
+ z.object({
210
+ description: z.unknown().nullable(),
211
+ detours: z.unknown().nullable(),
212
+ examples: z.array(z.unknown()),
213
+ id: z.string(),
214
+ kind: z.string(),
215
+ safety: z.string(),
216
+ }),
217
+ z.object({
218
+ hash: z.string(),
219
+ lockPath: z.string(),
220
+ mapPath: z.string(),
221
+ }),
222
+ ]),
223
+ readOnly: true,
224
+ });
225
+ //# sourceMappingURL=survey.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"survey.js","sourceRoot":"","sources":["../../../src/trails/survey.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * `warden` trail -- Governance checks.
3
+ *
4
+ * Thin wrapper around `runWarden` and `formatWardenReport` from @ontrails/warden.
5
+ */
6
+ export declare const wardenTrail: import("@ontrails/core").Trail<{
7
+ driftOnly: boolean;
8
+ format: "text" | "github" | "json" | "summary";
9
+ lintOnly: boolean;
10
+ rootDir?: string | undefined;
11
+ }, {
12
+ diagnostics: readonly import("@ontrails/warden").WardenDiagnostic[];
13
+ drift: import("@ontrails/warden").DriftResult | null;
14
+ errorCount: number;
15
+ formatted: string;
16
+ passed: boolean;
17
+ warnCount: number;
18
+ }>;
19
+ //# sourceMappingURL=warden.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"warden.d.ts","sourceRoot":"","sources":["../../../src/trails/warden.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAkBH,eAAO,MAAM,WAAW;;;;;;;;;;;;EAiFtB,CAAC"}
@@ -0,0 +1,88 @@
1
+ /**
2
+ * `warden` trail -- Governance checks.
3
+ *
4
+ * Thin wrapper around `runWarden` and `formatWardenReport` from @ontrails/warden.
5
+ */
6
+ import { Result, trail } from '@ontrails/core';
7
+ import { formatGitHubAnnotations, formatJson, formatSummary, formatWardenReport, runWarden, } from '@ontrails/warden';
8
+ import { z } from 'zod';
9
+ import { loadApp } from './load-app.js';
10
+ // ---------------------------------------------------------------------------
11
+ // Trail definition
12
+ // ---------------------------------------------------------------------------
13
+ export const wardenTrail = trail('warden', {
14
+ description: 'Run governance checks (lint + drift)',
15
+ examples: [
16
+ {
17
+ input: {
18
+ driftOnly: false,
19
+ lintOnly: false,
20
+ },
21
+ name: 'Default warden run',
22
+ },
23
+ {
24
+ input: {
25
+ format: 'github',
26
+ },
27
+ name: 'GitHub Actions annotations',
28
+ },
29
+ ],
30
+ implementation: async (input, ctx) => {
31
+ const rootDir = input.rootDir ?? ctx.cwd ?? process.cwd();
32
+ // oxlint-disable-next-line prefer-await-to-then -- catch converts rejection to undefined cleanly
33
+ const topo = await loadApp('./src/app.ts', rootDir).catch(() => undefined);
34
+ const report = await runWarden({
35
+ driftOnly: input.driftOnly,
36
+ lintOnly: input.lintOnly,
37
+ rootDir,
38
+ topo,
39
+ });
40
+ const formatters = {
41
+ github: formatGitHubAnnotations,
42
+ json: formatJson,
43
+ summary: formatSummary,
44
+ text: formatWardenReport,
45
+ };
46
+ const formatter = formatters[input.format] ?? formatWardenReport;
47
+ const formatted = formatter(report);
48
+ return Result.ok({
49
+ diagnostics: report.diagnostics,
50
+ drift: report.drift,
51
+ errorCount: report.errorCount,
52
+ formatted,
53
+ passed: report.passed,
54
+ warnCount: report.warnCount,
55
+ });
56
+ },
57
+ input: z.object({
58
+ driftOnly: z.boolean().default(false).describe('Only run drift detection'),
59
+ format: z
60
+ .enum(['text', 'json', 'github', 'summary'])
61
+ .default('text')
62
+ .describe('Output format: text, json, github, or summary'),
63
+ lintOnly: z.boolean().default(false).describe('Only run lint rules'),
64
+ rootDir: z.string().optional().describe('Root directory to scan'),
65
+ }),
66
+ output: z.object({
67
+ diagnostics: z.array(z.object({
68
+ filePath: z.string(),
69
+ line: z.number(),
70
+ message: z.string(),
71
+ rule: z.string(),
72
+ severity: z.enum(['error', 'warn']),
73
+ })),
74
+ drift: z
75
+ .object({
76
+ committedHash: z.string().nullable(),
77
+ currentHash: z.string(),
78
+ stale: z.boolean(),
79
+ })
80
+ .nullable(),
81
+ errorCount: z.number(),
82
+ formatted: z.string(),
83
+ passed: z.boolean(),
84
+ warnCount: z.number(),
85
+ }),
86
+ readOnly: true,
87
+ });
88
+ //# sourceMappingURL=warden.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"warden.js","sourceRoot":"","sources":["../../../src/trails/warden.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"root":["../src/app.ts","../src/clack.ts","../src/cli.ts","../src/trails/add-surface.ts","../src/trails/add-trail.ts","../src/trails/add-verify.ts","../src/trails/create-scaffold.ts","../src/trails/create.ts","../src/trails/guide.ts","../src/trails/load-app.ts","../src/trails/project.ts","../src/trails/survey.ts","../src/trails/warden.ts","../bin/trails.ts"],"version":"5.9.3"}
package/package.json ADDED
@@ -0,0 +1,28 @@
1
+ {
2
+ "name": "@ontrails/trails",
3
+ "version": "1.0.0-beta.0",
4
+ "bin": {
5
+ "trails": "./bin/trails.ts"
6
+ },
7
+ "type": "module",
8
+ "scripts": {
9
+ "build": "tsc -b",
10
+ "test": "bun test",
11
+ "typecheck": "tsc --noEmit",
12
+ "lint": "oxlint ./src",
13
+ "clean": "rm -rf dist *.tsbuildinfo"
14
+ },
15
+ "dependencies": {
16
+ "@clack/prompts": "^1.1.0",
17
+ "@ontrails/cli": "workspace:*",
18
+ "@ontrails/core": "workspace:*",
19
+ "@ontrails/logging": "workspace:*",
20
+ "@ontrails/schema": "workspace:*",
21
+ "@ontrails/warden": "workspace:*",
22
+ "commander": "catalog:",
23
+ "zod": "catalog:"
24
+ },
25
+ "devDependencies": {
26
+ "@ontrails/testing": "workspace:*"
27
+ }
28
+ }