@ontrails/trails 1.0.0-beta.24 → 1.0.0-beta.29

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 (48) hide show
  1. package/CHANGELOG.md +189 -0
  2. package/README.md +6 -5
  3. package/package.json +16 -14
  4. package/src/app.ts +42 -3
  5. package/src/cli.ts +17 -3
  6. package/src/local-state-io.ts +20 -0
  7. package/src/mcp-app.ts +10 -0
  8. package/src/mcp-options.ts +2 -3
  9. package/src/project-writes.ts +11 -11
  10. package/src/release/check.ts +41 -25
  11. package/src/release/index.ts +40 -0
  12. package/src/release/native-bun-registry.ts +282 -19
  13. package/src/release/pack-coherence.ts +457 -0
  14. package/src/release/policy.ts +1684 -0
  15. package/src/release/semver.ts +104 -0
  16. package/src/release/wayfinder-dogfood-smoke.ts +600 -66
  17. package/src/run-completions-install.ts +2 -2
  18. package/src/run-schema.ts +41 -0
  19. package/src/run-wayfind-outline.ts +166 -0
  20. package/src/trails/adapter-check.ts +1 -1
  21. package/src/trails/add-surface.ts +1 -1
  22. package/src/trails/add-verify.ts +3 -3
  23. package/src/trails/compile.ts +17 -25
  24. package/src/trails/create-scaffold.ts +14 -14
  25. package/src/trails/create.ts +5 -5
  26. package/src/trails/dev-support.ts +44 -24
  27. package/src/trails/doctor.ts +23 -2
  28. package/src/trails/draft-promote.ts +7 -7
  29. package/src/trails/guide.ts +15 -19
  30. package/src/trails/load-app.ts +58 -9
  31. package/src/trails/operator-context.ts +66 -0
  32. package/src/trails/regrade.ts +72 -0
  33. package/src/trails/release-check.ts +1 -0
  34. package/src/trails/run-example.ts +21 -37
  35. package/src/trails/run-examples.ts +16 -32
  36. package/src/trails/run.ts +31 -44
  37. package/src/trails/survey.ts +76 -62
  38. package/src/trails/topo-output-schemas.ts +11 -0
  39. package/src/trails/topo-pin.ts +6 -20
  40. package/src/trails/topo-read-support.ts +91 -41
  41. package/src/trails/topo-reports.ts +4 -2
  42. package/src/trails/topo-store-support.ts +172 -39
  43. package/src/trails/topo-support.ts +1 -2
  44. package/src/trails/topo.ts +5 -19
  45. package/src/trails/validate.ts +9 -20
  46. package/src/trails/version-lifecycle-support.ts +10 -20
  47. package/src/trails/warden.ts +18 -0
  48. package/src/trails/wayfind.ts +1001 -0
@@ -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
+ };