@ontrails/trails 0.2.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 (121) hide show
  1. package/CHANGELOG.md +1906 -0
  2. package/README.md +48 -0
  3. package/bin/trails.ts +3 -0
  4. package/package.json +57 -0
  5. package/src/app.ts +167 -0
  6. package/src/clack.ts +111 -0
  7. package/src/cli.ts +308 -0
  8. package/src/completions.ts +431 -0
  9. package/src/lifecycle-source-io.ts +33 -0
  10. package/src/load-app-mirror.ts +202 -0
  11. package/src/local-state-io.ts +129 -0
  12. package/src/mcp-app.ts +42 -0
  13. package/src/mcp-options.ts +92 -0
  14. package/src/mcp.ts +8 -0
  15. package/src/project-writes.ts +377 -0
  16. package/src/regrade/audit.ts +571 -0
  17. package/src/regrade/config.ts +152 -0
  18. package/src/regrade/history.ts +636 -0
  19. package/src/regrade/lifecycle.ts +76 -0
  20. package/src/regrade/live-api-preserve.ts +123 -0
  21. package/src/regrade/plan-artifact.ts +515 -0
  22. package/src/regrade/plan-derivation.ts +301 -0
  23. package/src/regrade/prepared-run.ts +259 -0
  24. package/src/regrade/receipt-history.ts +446 -0
  25. package/src/regrade/source-transaction.ts +185 -0
  26. package/src/release/bindings.ts +58 -0
  27. package/src/release/changeset-packages.ts +99 -0
  28. package/src/release/check.ts +1191 -0
  29. package/src/release/cli-bundle.ts +575 -0
  30. package/src/release/config.ts +73 -0
  31. package/src/release/contract-facts.ts +425 -0
  32. package/src/release/homebrew.ts +221 -0
  33. package/src/release/index.ts +180 -0
  34. package/src/release/lock-roundtrip-smoke.ts +255 -0
  35. package/src/release/lock-roundtrip-workspace.ts +107 -0
  36. package/src/release/native-bun-publish.ts +964 -0
  37. package/src/release/native-bun-registry.ts +848 -0
  38. package/src/release/notes-cli.ts +171 -0
  39. package/src/release/notes.ts +390 -0
  40. package/src/release/pack-coherence.ts +455 -0
  41. package/src/release/package-route-facts.ts +146 -0
  42. package/src/release/packed-artifacts-smoke.ts +236 -0
  43. package/src/release/policy.ts +1780 -0
  44. package/src/release/semver.ts +104 -0
  45. package/src/release/smoke.ts +56 -0
  46. package/src/release/stable-version-release.ts +80 -0
  47. package/src/release/wayfinder-dogfood-smoke.ts +762 -0
  48. package/src/release/zero-line-transition.ts +68 -0
  49. package/src/retired-topo-command.ts +36 -0
  50. package/src/run-adapter-check.ts +76 -0
  51. package/src/run-argv.ts +133 -0
  52. package/src/run-collision.ts +126 -0
  53. package/src/run-completions-install.ts +179 -0
  54. package/src/run-example.ts +149 -0
  55. package/src/run-examples.ts +148 -0
  56. package/src/run-quiet.ts +75 -0
  57. package/src/run-regrade-progress.ts +47 -0
  58. package/src/run-release-check.ts +74 -0
  59. package/src/run-schema.ts +74 -0
  60. package/src/run-trace.ts +273 -0
  61. package/src/run-warden.ts +39 -0
  62. package/src/run-watch-project.ts +52 -0
  63. package/src/run-watch.ts +381 -0
  64. package/src/run-wayfind-outline.ts +170 -0
  65. package/src/scaffold-version-sync.ts +183 -0
  66. package/src/scaffold-versions.generated.ts +12 -0
  67. package/src/trails/adapter-check.ts +244 -0
  68. package/src/trails/add-surface.ts +816 -0
  69. package/src/trails/add-trail.ts +141 -0
  70. package/src/trails/add-verify.ts +252 -0
  71. package/src/trails/compile.ts +118 -0
  72. package/src/trails/completions-complete.ts +236 -0
  73. package/src/trails/completions.ts +47 -0
  74. package/src/trails/config-explain.ts +43 -0
  75. package/src/trails/create-adapter.ts +785 -0
  76. package/src/trails/create-scaffold.ts +1215 -0
  77. package/src/trails/create-versions.ts +62 -0
  78. package/src/trails/create.ts +652 -0
  79. package/src/trails/deprecate.ts +59 -0
  80. package/src/trails/dev-clean.ts +80 -0
  81. package/src/trails/dev-reset.ts +48 -0
  82. package/src/trails/dev-stats.ts +71 -0
  83. package/src/trails/dev-support.ts +360 -0
  84. package/src/trails/doctor.ts +77 -0
  85. package/src/trails/draft-promote.ts +949 -0
  86. package/src/trails/guide.ts +106 -0
  87. package/src/trails/load-app.ts +1145 -0
  88. package/src/trails/operator-context.ts +66 -0
  89. package/src/trails/project-context-output.ts +304 -0
  90. package/src/trails/project-context.ts +613 -0
  91. package/src/trails/project.ts +65 -0
  92. package/src/trails/regrade.ts +4951 -0
  93. package/src/trails/release-check.ts +113 -0
  94. package/src/trails/release-smoke.ts +49 -0
  95. package/src/trails/revise.ts +53 -0
  96. package/src/trails/root-dir.ts +21 -0
  97. package/src/trails/run-example.ts +592 -0
  98. package/src/trails/run-examples.ts +149 -0
  99. package/src/trails/run.ts +496 -0
  100. package/src/trails/scaffold-json.ts +60 -0
  101. package/src/trails/scaffold-topo-identity.ts +479 -0
  102. package/src/trails/survey.ts +990 -0
  103. package/src/trails/topo-activation.ts +14 -0
  104. package/src/trails/topo-constants.ts +2 -0
  105. package/src/trails/topo-history.ts +47 -0
  106. package/src/trails/topo-output-schemas.ts +259 -0
  107. package/src/trails/topo-pin.ts +38 -0
  108. package/src/trails/topo-read-support.ts +368 -0
  109. package/src/trails/topo-reports.ts +809 -0
  110. package/src/trails/topo-store-support.ts +323 -0
  111. package/src/trails/topo-support.ts +247 -0
  112. package/src/trails/topo-unpin.ts +61 -0
  113. package/src/trails/topo.ts +92 -0
  114. package/src/trails/validate.ts +348 -0
  115. package/src/trails/version-lifecycle-support.ts +936 -0
  116. package/src/trails/warden-guide.ts +134 -0
  117. package/src/trails/warden.ts +598 -0
  118. package/src/trails/wayfind-diff.ts +716 -0
  119. package/src/trails/wayfind-outline.ts +876 -0
  120. package/src/trails/wayfind.ts +1319 -0
  121. package/src/versions.ts +31 -0
@@ -0,0 +1,113 @@
1
+ /**
2
+ * `release.check` trail -- Branch-local release rule evaluation.
3
+ */
4
+
5
+ import { Result, trail, ValidationError } from '@ontrails/core';
6
+ import { z } from 'zod';
7
+
8
+ import { runReleaseCheck } from '../release/check.js';
9
+ import { resolveTrailRootDir } from './root-dir.js';
10
+
11
+ const releaseCheckInputSchema = z.object({
12
+ baseRef: z
13
+ .string()
14
+ .optional()
15
+ .describe('Base git ref for changed-file and contract fact comparison'),
16
+ changedFiles: z
17
+ .string()
18
+ .optional()
19
+ .describe('Path to a newline-delimited changed-file list'),
20
+ configPath: z.string().optional().describe('Path to trails.config.ts'),
21
+ releaseNone: z
22
+ .boolean()
23
+ .default(false)
24
+ .describe('Compatibility no-release override'),
25
+ rootDir: z.string().optional().describe('Workspace root directory'),
26
+ });
27
+
28
+ const contractReleaseFactAspectSchema = z.enum([
29
+ 'input',
30
+ 'output',
31
+ 'surfaces',
32
+ 'trail',
33
+ 'visibility',
34
+ ]);
35
+
36
+ const contractReleaseFactSchema = z.object({
37
+ aspect: contractReleaseFactAspectSchema,
38
+ baseHash: z.string().nullable(),
39
+ changedFiles: z.array(z.string()).readonly(),
40
+ currentHash: z.string().nullable(),
41
+ packageName: z.string().optional(),
42
+ path: z.string(),
43
+ trailId: z.string(),
44
+ workspacePath: z.string().optional(),
45
+ });
46
+
47
+ const packageRouteReleaseFactSchema = z.object({
48
+ kind: z.enum(['classified', 'single']),
49
+ sourcePackage: z.string(),
50
+ targetPackage: z.string().optional(),
51
+ transitionId: z.string(),
52
+ });
53
+
54
+ const releaseCheckOutputSchema = z.object({
55
+ activePackageChangesetsWithoutReleaseFacts: z.array(z.string()).readonly(),
56
+ affectedPackages: z.array(z.string()).readonly(),
57
+ changedChangesets: z.array(z.string()).readonly(),
58
+ configPath: z.string().optional(),
59
+ contractFacts: z.array(contractReleaseFactSchema).readonly(),
60
+ coveredPackages: z.array(z.string()).readonly(),
61
+ errors: z.array(z.string()).readonly(),
62
+ formatted: z.string(),
63
+ matchedRuleIds: z.array(z.string()).readonly(),
64
+ noReleaseOverride: z.boolean(),
65
+ packageRouteFacts: z.array(packageRouteReleaseFactSchema).readonly(),
66
+ passed: z.boolean(),
67
+ releaseNone: z.boolean(),
68
+ uncoveredContractFacts: z.array(contractReleaseFactSchema).readonly(),
69
+ versionRelease: z.boolean(),
70
+ });
71
+
72
+ export const releaseCheckTrail = trail('release.check', {
73
+ description: 'Check branch-local release rules',
74
+ examples: [
75
+ {
76
+ input: { baseRef: 'HEAD' },
77
+ name: 'Check release rules from the current HEAD',
78
+ },
79
+ ],
80
+ implementation: async (input, ctx) => {
81
+ const rootDirResult = resolveTrailRootDir(input.rootDir, ctx.cwd);
82
+ if (rootDirResult.isErr()) {
83
+ return rootDirResult;
84
+ }
85
+
86
+ try {
87
+ return Result.ok(
88
+ await runReleaseCheck({
89
+ ...(input.baseRef === undefined ? {} : { baseRef: input.baseRef }),
90
+ ...(input.changedFiles === undefined
91
+ ? {}
92
+ : { changedFilesPath: input.changedFiles }),
93
+ ...(input.configPath === undefined
94
+ ? {}
95
+ : { configPath: input.configPath }),
96
+ env: ctx.env ?? {},
97
+ releaseNone: input.releaseNone,
98
+ repoRoot: rootDirResult.value,
99
+ })
100
+ );
101
+ } catch (error) {
102
+ return Result.err(
103
+ new ValidationError(
104
+ error instanceof Error ? error.message : String(error)
105
+ )
106
+ );
107
+ }
108
+ },
109
+ input: releaseCheckInputSchema,
110
+ intent: 'read',
111
+ output: releaseCheckOutputSchema,
112
+ permit: 'public',
113
+ });
@@ -0,0 +1,49 @@
1
+ /**
2
+ * `release.smoke` trail -- Local release confidence checks.
3
+ */
4
+
5
+ import { Result, trail, ValidationError } from '@ontrails/core';
6
+ import { z } from 'zod';
7
+
8
+ import { releaseSmokeCheckValues, runReleaseSmoke } from '../release/smoke.js';
9
+
10
+ const releaseSmokeCheckSchema = z.enum(releaseSmokeCheckValues);
11
+
12
+ const releaseSmokeInputSchema = z.object({
13
+ check: z.string().default('all').describe('Release smoke check to run'),
14
+ });
15
+
16
+ const releaseSmokeCheckResultSchema = z.object({
17
+ check: z.enum(['lock-roundtrip', 'packed-artifacts', 'wayfinder-dogfood']),
18
+ lockCount: z.number().optional(),
19
+ message: z.string(),
20
+ packageCount: z.number().optional(),
21
+ passed: z.literal(true),
22
+ trailCount: z.number().optional(),
23
+ });
24
+
25
+ const releaseSmokeOutputSchema = z.object({
26
+ checks: z.array(releaseSmokeCheckResultSchema).readonly(),
27
+ message: z.string(),
28
+ passed: z.literal(true),
29
+ });
30
+
31
+ export const releaseSmokeTrail = trail('release.smoke', {
32
+ description: 'Run local release confidence smoke checks',
33
+ implementation: async (input) => {
34
+ try {
35
+ const check = releaseSmokeCheckSchema.parse(input.check);
36
+ return Result.ok(await runReleaseSmoke(check));
37
+ } catch (error) {
38
+ return Result.err(
39
+ new ValidationError(
40
+ error instanceof Error ? error.message : String(error)
41
+ )
42
+ );
43
+ }
44
+ },
45
+ input: releaseSmokeInputSchema,
46
+ intent: 'read',
47
+ output: releaseSmokeOutputSchema,
48
+ permit: 'public',
49
+ });
@@ -0,0 +1,53 @@
1
+ import { Result, ValidationError, trail } from '@ontrails/core';
2
+ import { z } from 'zod';
3
+
4
+ import {
5
+ findLifecycleTrail,
6
+ forkVersionEntrySource,
7
+ parseLifecycleTarget,
8
+ reviseTrailSource,
9
+ withLifecycleApp,
10
+ } from './version-lifecycle-support.js';
11
+
12
+ export const reviseTrail = trail('revise', {
13
+ args: ['target'],
14
+ description: 'Scaffold the next trail version entry',
15
+ implementation: async (input, ctx) =>
16
+ withLifecycleApp(input, ctx.cwd, async (app, rootDir) => {
17
+ const target = parseLifecycleTarget(input.target);
18
+ if (target.isErr()) {
19
+ return target;
20
+ }
21
+ if (target.value.version !== undefined) {
22
+ return input.as === 'fork'
23
+ ? forkVersionEntrySource(rootDir, target.value)
24
+ : Result.err(
25
+ new ValidationError(
26
+ 'Revising a specific historical entry requires --as fork'
27
+ )
28
+ );
29
+ }
30
+ const found = findLifecycleTrail(app, target.value.trailId);
31
+ if (found.isErr()) {
32
+ return found;
33
+ }
34
+ return reviseTrailSource(rootDir, found.value, input.as);
35
+ }),
36
+ input: z.object({
37
+ as: z
38
+ .enum(['revision', 'fork'])
39
+ .default('revision')
40
+ .describe('Version entry shape to scaffold'),
41
+ module: z.string().optional().describe('Path to the app module'),
42
+ rootDir: z.string().optional().describe('Workspace root directory'),
43
+ target: z.string().min(1).describe('Trail target, optionally trail.id@N'),
44
+ }),
45
+ intent: 'write',
46
+ output: z.object({
47
+ filePath: z.string(),
48
+ trailId: z.string(),
49
+ updated: z.boolean(),
50
+ warnings: z.array(z.string()).optional(),
51
+ }),
52
+ permit: { scopes: ['version:write'] },
53
+ });
@@ -0,0 +1,21 @@
1
+ import { Result, ValidationError } from '@ontrails/core';
2
+
3
+ const ROOT_DIR_MESSAGE =
4
+ 'Trail execution requires rootDir input or ctx.cwd from the runtime context.';
5
+
6
+ export const resolveTrailRootDir = (
7
+ rootDir: string | undefined,
8
+ cwd: string | undefined
9
+ ): Result<string, ValidationError> => {
10
+ const resolved = rootDir ?? cwd;
11
+ return resolved === undefined
12
+ ? Result.err(new ValidationError(ROOT_DIR_MESSAGE))
13
+ : Result.ok(resolved);
14
+ };
15
+
16
+ export const requireTrailRootDir = (rootDir: string | undefined): string => {
17
+ if (rootDir === undefined) {
18
+ throw new ValidationError(ROOT_DIR_MESSAGE);
19
+ }
20
+ return rootDir;
21
+ };