@ontrails/trails 1.0.0-beta.4 → 1.0.0-beta.42

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 (165) hide show
  1. package/CHANGELOG.md +1106 -4
  2. package/README.md +27 -0
  3. package/package.json +31 -7
  4. package/src/app.ts +147 -3
  5. package/src/cli.ts +345 -11
  6. package/src/completions.ts +240 -0
  7. package/src/lifecycle-source-io.ts +33 -0
  8. package/src/load-app-mirror.ts +202 -0
  9. package/src/local-state-io.ts +173 -0
  10. package/src/mcp-app.ts +42 -0
  11. package/src/mcp-options.ts +91 -0
  12. package/src/mcp.ts +8 -0
  13. package/src/project-writes.ts +377 -0
  14. package/src/regrade/config.ts +152 -0
  15. package/src/regrade/history.ts +430 -0
  16. package/src/regrade/live-api-preserve.ts +8 -0
  17. package/src/regrade/plan-artifact.ts +285 -0
  18. package/src/release/bindings.ts +39 -0
  19. package/src/release/check.ts +844 -0
  20. package/src/release/config.ts +63 -0
  21. package/src/release/contract-facts.ts +425 -0
  22. package/src/release/index.ts +142 -0
  23. package/src/release/lock-roundtrip-smoke.ts +230 -0
  24. package/src/release/native-bun-publish.ts +651 -0
  25. package/src/release/native-bun-registry.ts +765 -0
  26. package/src/release/notes-cli.ts +171 -0
  27. package/src/release/notes.ts +390 -0
  28. package/src/release/pack-coherence.ts +455 -0
  29. package/src/release/packed-artifacts-smoke.ts +236 -0
  30. package/src/release/policy.ts +1687 -0
  31. package/src/release/semver.ts +104 -0
  32. package/src/release/smoke.ts +56 -0
  33. package/src/release/wayfinder-dogfood-smoke.ts +760 -0
  34. package/src/retired-topo-command.ts +36 -0
  35. package/src/run-adapter-check.ts +76 -0
  36. package/src/run-collision.ts +126 -0
  37. package/src/run-completions-install.ts +179 -0
  38. package/src/run-example.ts +149 -0
  39. package/src/run-examples.ts +148 -0
  40. package/src/run-quiet.ts +75 -0
  41. package/src/run-release-check.ts +74 -0
  42. package/src/run-schema.ts +74 -0
  43. package/src/run-trace.ts +273 -0
  44. package/src/run-warden.ts +39 -0
  45. package/src/run-watch.ts +432 -0
  46. package/src/run-wayfind-outline.ts +170 -0
  47. package/src/scaffold-version-sync.ts +183 -0
  48. package/src/scaffold-versions.generated.ts +12 -0
  49. package/src/trails/adapter-check.ts +244 -0
  50. package/src/trails/add-surface.ts +99 -45
  51. package/src/trails/add-trail.ts +84 -37
  52. package/src/trails/add-verify.ts +100 -30
  53. package/src/trails/compile.ts +58 -0
  54. package/src/trails/completions-complete.ts +165 -0
  55. package/src/trails/completions.ts +47 -0
  56. package/src/trails/create-adapter.ts +785 -0
  57. package/src/trails/create-scaffold.ts +401 -106
  58. package/src/trails/create-versions.ts +62 -0
  59. package/src/trails/create.ts +186 -72
  60. package/src/trails/deprecate.ts +59 -0
  61. package/src/trails/dev-clean.ts +82 -0
  62. package/src/trails/dev-reset.ts +50 -0
  63. package/src/trails/dev-stats.ts +72 -0
  64. package/src/trails/dev-support.ts +360 -0
  65. package/src/trails/doctor.ts +77 -0
  66. package/src/trails/draft-promote.ts +949 -0
  67. package/src/trails/guide.ts +70 -68
  68. package/src/trails/load-app.ts +1123 -15
  69. package/src/trails/operator-context.ts +66 -0
  70. package/src/trails/project.ts +17 -3
  71. package/src/trails/regrade.ts +3091 -0
  72. package/src/trails/release-check.ts +105 -0
  73. package/src/trails/release-smoke.ts +49 -0
  74. package/src/trails/revise.ts +53 -0
  75. package/src/trails/root-dir.ts +21 -0
  76. package/src/trails/run-example.ts +475 -0
  77. package/src/trails/run-examples.ts +129 -0
  78. package/src/trails/run.ts +434 -0
  79. package/src/trails/scaffold-json.ts +58 -0
  80. package/src/trails/survey.ts +877 -214
  81. package/src/trails/topo-activation.ts +14 -0
  82. package/src/trails/topo-constants.ts +2 -0
  83. package/src/trails/topo-history.ts +47 -0
  84. package/src/trails/topo-output-schemas.ts +259 -0
  85. package/src/trails/topo-pin.ts +38 -0
  86. package/src/trails/topo-read-support.ts +368 -0
  87. package/src/trails/topo-reports.ts +809 -0
  88. package/src/trails/topo-store-support.ts +325 -0
  89. package/src/trails/topo-support.ts +220 -0
  90. package/src/trails/topo-unpin.ts +61 -0
  91. package/src/trails/topo.ts +92 -0
  92. package/src/trails/validate.ts +27 -0
  93. package/src/trails/version-lifecycle-support.ts +936 -0
  94. package/src/trails/warden-guide.ts +134 -0
  95. package/src/trails/warden.ts +198 -58
  96. package/src/trails/wayfind-outline.ts +876 -0
  97. package/src/trails/wayfind.ts +1053 -0
  98. package/src/versions.ts +31 -0
  99. package/.turbo/turbo-build.log +0 -1
  100. package/.turbo/turbo-lint.log +0 -3
  101. package/.turbo/turbo-typecheck.log +0 -1
  102. package/__tests__/examples.test.ts +0 -6
  103. package/dist/bin/trails.d.ts +0 -3
  104. package/dist/bin/trails.d.ts.map +0 -1
  105. package/dist/bin/trails.js +0 -4
  106. package/dist/bin/trails.js.map +0 -1
  107. package/dist/src/app.d.ts +0 -2
  108. package/dist/src/app.d.ts.map +0 -1
  109. package/dist/src/app.js +0 -11
  110. package/dist/src/app.js.map +0 -1
  111. package/dist/src/clack.d.ts +0 -9
  112. package/dist/src/clack.d.ts.map +0 -1
  113. package/dist/src/clack.js +0 -84
  114. package/dist/src/clack.js.map +0 -1
  115. package/dist/src/cli.d.ts +0 -2
  116. package/dist/src/cli.d.ts.map +0 -1
  117. package/dist/src/cli.js +0 -13
  118. package/dist/src/cli.js.map +0 -1
  119. package/dist/src/trails/add-surface.d.ts +0 -13
  120. package/dist/src/trails/add-surface.d.ts.map +0 -1
  121. package/dist/src/trails/add-surface.js +0 -88
  122. package/dist/src/trails/add-surface.js.map +0 -1
  123. package/dist/src/trails/add-trail.d.ts +0 -10
  124. package/dist/src/trails/add-trail.d.ts.map +0 -1
  125. package/dist/src/trails/add-trail.js +0 -77
  126. package/dist/src/trails/add-trail.js.map +0 -1
  127. package/dist/src/trails/add-verify.d.ts +0 -10
  128. package/dist/src/trails/add-verify.d.ts.map +0 -1
  129. package/dist/src/trails/add-verify.js +0 -67
  130. package/dist/src/trails/add-verify.js.map +0 -1
  131. package/dist/src/trails/create-scaffold.d.ts +0 -15
  132. package/dist/src/trails/create-scaffold.d.ts.map +0 -1
  133. package/dist/src/trails/create-scaffold.js +0 -288
  134. package/dist/src/trails/create-scaffold.js.map +0 -1
  135. package/dist/src/trails/create.d.ts +0 -22
  136. package/dist/src/trails/create.d.ts.map +0 -1
  137. package/dist/src/trails/create.js +0 -121
  138. package/dist/src/trails/create.js.map +0 -1
  139. package/dist/src/trails/guide.d.ts +0 -11
  140. package/dist/src/trails/guide.d.ts.map +0 -1
  141. package/dist/src/trails/guide.js +0 -80
  142. package/dist/src/trails/guide.js.map +0 -1
  143. package/dist/src/trails/load-app.d.ts +0 -4
  144. package/dist/src/trails/load-app.d.ts.map +0 -1
  145. package/dist/src/trails/load-app.js +0 -24
  146. package/dist/src/trails/load-app.js.map +0 -1
  147. package/dist/src/trails/project.d.ts +0 -8
  148. package/dist/src/trails/project.d.ts.map +0 -1
  149. package/dist/src/trails/project.js +0 -43
  150. package/dist/src/trails/project.js.map +0 -1
  151. package/dist/src/trails/survey.d.ts +0 -31
  152. package/dist/src/trails/survey.d.ts.map +0 -1
  153. package/dist/src/trails/survey.js +0 -221
  154. package/dist/src/trails/survey.js.map +0 -1
  155. package/dist/src/trails/warden.d.ts +0 -19
  156. package/dist/src/trails/warden.d.ts.map +0 -1
  157. package/dist/src/trails/warden.js +0 -88
  158. package/dist/src/trails/warden.js.map +0 -1
  159. package/dist/tsconfig.tsbuildinfo +0 -1
  160. package/src/__tests__/create.test.ts +0 -349
  161. package/src/__tests__/guide.test.ts +0 -91
  162. package/src/__tests__/load-app.test.ts +0 -15
  163. package/src/__tests__/survey.test.ts +0 -159
  164. package/src/__tests__/warden.test.ts +0 -74
  165. package/tsconfig.json +0 -9
@@ -0,0 +1,104 @@
1
+ /**
2
+ * Minimal semver comparison shared across release tooling.
3
+ *
4
+ * Extracted from `policy.ts` so the release policy engine and the registry
5
+ * classifier compare versions through one implementation instead of two.
6
+ */
7
+
8
+ interface ParsedSemver {
9
+ readonly major: number;
10
+ readonly minor: number;
11
+ readonly patch: number;
12
+ readonly prerelease: string | undefined;
13
+ }
14
+
15
+ export const parseSemver = (version: string): ParsedSemver | undefined => {
16
+ const match = version.match(/^(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?$/u);
17
+ if (!match) {
18
+ return;
19
+ }
20
+ const [, major, minor, patch, prerelease] = match;
21
+ if (!major || !minor || !patch) {
22
+ return;
23
+ }
24
+ return {
25
+ major: Number.parseInt(major, 10),
26
+ minor: Number.parseInt(minor, 10),
27
+ patch: Number.parseInt(patch, 10),
28
+ prerelease,
29
+ };
30
+ };
31
+
32
+ const parsePrerelease = (value: string): (number | string)[] =>
33
+ value
34
+ .split('.')
35
+ .map((part) => (/^[0-9]+$/u.test(part) ? Number.parseInt(part, 10) : part));
36
+
37
+ const comparePrerelease = (leftValue: string, rightValue: string): number => {
38
+ const left = parsePrerelease(leftValue);
39
+ const right = parsePrerelease(rightValue);
40
+ const length = Math.max(left.length, right.length);
41
+
42
+ for (let index = 0; index < length; index += 1) {
43
+ const leftPart = left[index];
44
+ const rightPart = right[index];
45
+ if (leftPart === undefined) {
46
+ return -1;
47
+ }
48
+ if (rightPart === undefined) {
49
+ return 1;
50
+ }
51
+ if (leftPart === rightPart) {
52
+ continue;
53
+ }
54
+ if (typeof leftPart === 'number' && typeof rightPart === 'number') {
55
+ return leftPart - rightPart;
56
+ }
57
+ if (typeof leftPart === 'number') {
58
+ return -1;
59
+ }
60
+ if (typeof rightPart === 'number') {
61
+ return 1;
62
+ }
63
+ const delta = leftPart.localeCompare(rightPart);
64
+ if (delta !== 0) {
65
+ return delta;
66
+ }
67
+ }
68
+
69
+ return 0;
70
+ };
71
+
72
+ /**
73
+ * Compare two semver strings. Returns a negative number when `leftVersion`
74
+ * sorts before `rightVersion`, a positive number when it sorts after, and 0
75
+ * when equal. Unparseable inputs fall back to a locale comparison.
76
+ */
77
+ export const compareSemver = (
78
+ leftVersion: string,
79
+ rightVersion: string
80
+ ): number => {
81
+ const left = parseSemver(leftVersion);
82
+ const right = parseSemver(rightVersion);
83
+ if (!left || !right) {
84
+ return leftVersion.localeCompare(rightVersion);
85
+ }
86
+
87
+ for (const key of ['major', 'minor', 'patch'] as const) {
88
+ const delta = left[key] - right[key];
89
+ if (delta !== 0) {
90
+ return delta;
91
+ }
92
+ }
93
+
94
+ if (left.prerelease === right.prerelease) {
95
+ return 0;
96
+ }
97
+ if (!left.prerelease) {
98
+ return 1;
99
+ }
100
+ if (!right.prerelease) {
101
+ return -1;
102
+ }
103
+ return comparePrerelease(left.prerelease, right.prerelease);
104
+ };
@@ -0,0 +1,56 @@
1
+ import { runLockRoundtripSmoke } from './lock-roundtrip-smoke.js';
2
+ import type { LockRoundtripSmokeResult } from './lock-roundtrip-smoke.js';
3
+ import { runPackedArtifactsSmoke } from './packed-artifacts-smoke.js';
4
+ import type { PackedArtifactsSmokeResult } from './packed-artifacts-smoke.js';
5
+ import { runWayfinderDogfoodSmoke } from './wayfinder-dogfood-smoke.js';
6
+ import type { WayfinderDogfoodSmokeResult } from './wayfinder-dogfood-smoke.js';
7
+
8
+ export const releaseSmokeCheckValues = [
9
+ 'all',
10
+ 'lock-roundtrip',
11
+ 'packed-artifacts',
12
+ 'wayfinder-dogfood',
13
+ ] as const;
14
+ export type ReleaseSmokeCheck = (typeof releaseSmokeCheckValues)[number];
15
+
16
+ export type ReleaseSmokeCheckResult =
17
+ | LockRoundtripSmokeResult
18
+ | PackedArtifactsSmokeResult
19
+ | WayfinderDogfoodSmokeResult;
20
+
21
+ export interface ReleaseSmokeResult {
22
+ readonly checks: readonly ReleaseSmokeCheckResult[];
23
+ readonly message: string;
24
+ readonly passed: true;
25
+ }
26
+
27
+ const checksForInput = (
28
+ check: ReleaseSmokeCheck
29
+ ): readonly Exclude<ReleaseSmokeCheck, 'all'>[] =>
30
+ check === 'all'
31
+ ? ['lock-roundtrip', 'packed-artifacts', 'wayfinder-dogfood']
32
+ : [check];
33
+
34
+ export const runReleaseSmoke = async (
35
+ check: ReleaseSmokeCheck
36
+ ): Promise<ReleaseSmokeResult> => {
37
+ const results: ReleaseSmokeCheckResult[] = [];
38
+
39
+ for (const selectedCheck of checksForInput(check)) {
40
+ if (selectedCheck === 'lock-roundtrip') {
41
+ results.push(await runLockRoundtripSmoke());
42
+ continue;
43
+ }
44
+ if (selectedCheck === 'packed-artifacts') {
45
+ results.push(await runPackedArtifactsSmoke());
46
+ continue;
47
+ }
48
+ results.push(await runWayfinderDogfoodSmoke());
49
+ }
50
+
51
+ return {
52
+ checks: results,
53
+ message: results.map((result) => result.message).join('\n'),
54
+ passed: true,
55
+ };
56
+ };