@ontrails/warden 1.0.0-beta.2 → 1.0.0-beta.22

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 (249) hide show
  1. package/CHANGELOG.md +508 -6
  2. package/README.md +77 -26
  3. package/bin/warden.ts +50 -0
  4. package/package.json +27 -5
  5. package/src/adapter-check.ts +136 -0
  6. package/src/ast.ts +28 -0
  7. package/src/cli.ts +1374 -103
  8. package/src/command.ts +953 -0
  9. package/src/config.ts +184 -0
  10. package/src/draft.ts +22 -0
  11. package/src/drift.ts +106 -22
  12. package/src/fix.ts +120 -0
  13. package/src/formatters.ts +79 -9
  14. package/src/guide.ts +245 -0
  15. package/src/index.ts +206 -14
  16. package/src/project-context.ts +163 -0
  17. package/src/resolve.ts +530 -0
  18. package/src/rules/activation-orphan.ts +97 -0
  19. package/src/rules/ast.ts +3176 -85
  20. package/src/rules/circular-refs.ts +154 -0
  21. package/src/rules/composes-declarations.ts +704 -0
  22. package/src/rules/context-no-surface-types.ts +68 -8
  23. package/src/rules/contour-exists.ts +251 -0
  24. package/src/rules/contour-ids.ts +15 -0
  25. package/src/rules/dead-internal-trail.ts +154 -0
  26. package/src/rules/draft-file-marking.ts +160 -0
  27. package/src/rules/draft-visible-debt.ts +87 -0
  28. package/src/rules/error-mapping-completeness.ts +288 -0
  29. package/src/rules/example-valid.ts +401 -0
  30. package/src/rules/fires-declarations.ts +758 -0
  31. package/src/rules/implementation-returns-result.ts +1265 -95
  32. package/src/rules/incomplete-accessor-for-standard-op.ts +272 -0
  33. package/src/rules/incomplete-crud.ts +580 -0
  34. package/src/rules/index.ts +219 -18
  35. package/src/rules/intent-propagation.ts +127 -0
  36. package/src/rules/layer-field-name-drift.ts +96 -0
  37. package/src/rules/metadata.ts +654 -0
  38. package/src/rules/missing-reconcile.ts +98 -0
  39. package/src/rules/missing-visibility.ts +110 -0
  40. package/src/rules/no-destructured-compose.ts +192 -0
  41. package/src/rules/no-dev-permit-in-source.ts +99 -0
  42. package/src/rules/no-direct-implementation-call.ts +7 -7
  43. package/src/rules/no-legacy-layer-imports.ts +211 -0
  44. package/src/rules/no-native-error-result.ts +111 -0
  45. package/src/rules/no-redundant-result-error-wrap.ts +331 -0
  46. package/src/rules/no-retired-cross-vocabulary.ts +194 -0
  47. package/src/rules/no-sync-result-assumption.ts +1134 -99
  48. package/src/rules/no-throw-in-detour-recover.ts +225 -0
  49. package/src/rules/no-throw-in-implementation.ts +10 -9
  50. package/src/rules/no-top-level-surface.ts +389 -0
  51. package/src/rules/on-references-exist.ts +194 -0
  52. package/src/rules/orphaned-signal.ts +150 -0
  53. package/src/rules/owner-projection-parity.ts +146 -0
  54. package/src/rules/permit-governance.ts +25 -0
  55. package/src/rules/public-export-example-coverage.ts +553 -0
  56. package/src/rules/public-internal-deep-imports.ts +517 -0
  57. package/src/rules/public-output-schema.ts +29 -0
  58. package/src/rules/public-union-output-discriminants.ts +150 -0
  59. package/src/rules/read-intent-fires.ts +187 -0
  60. package/src/rules/reference-exists.ts +98 -0
  61. package/src/rules/registry-names.ts +145 -0
  62. package/src/rules/resolved-import-boundary.ts +146 -0
  63. package/src/rules/resource-declarations.ts +704 -0
  64. package/src/rules/resource-exists.ts +179 -0
  65. package/src/rules/resource-id-grammar.ts +65 -0
  66. package/src/rules/resource-mock-coverage.ts +115 -0
  67. package/src/rules/scan.ts +38 -25
  68. package/src/rules/scheduled-destroy-intent.ts +44 -0
  69. package/src/rules/signal-graph-coaching.ts +191 -0
  70. package/src/rules/specs.ts +9 -5
  71. package/src/rules/static-resource-accessor-preference.ts +657 -0
  72. package/src/rules/surface-facet-coherence.ts +370 -0
  73. package/src/rules/trail-versioning-source.ts +1094 -0
  74. package/src/rules/trail-versioning-topo.ts +172 -0
  75. package/src/rules/types.ts +270 -6
  76. package/src/rules/unmaterialized-activation-source.ts +84 -0
  77. package/src/rules/unreachable-detour-shadowing.ts +344 -0
  78. package/src/rules/valid-describe-refs.ts +160 -32
  79. package/src/rules/valid-detour-contract.ts +78 -0
  80. package/src/rules/warden-export-symmetry.ts +533 -0
  81. package/src/rules/warden-rules-use-ast.ts +996 -0
  82. package/src/rules/webhook-route-collision.ts +243 -0
  83. package/src/trails/activation-orphan.trail.ts +84 -0
  84. package/src/trails/circular-refs.trail.ts +29 -0
  85. package/src/trails/composes-declarations.trail.ts +22 -0
  86. package/src/trails/context-no-surface-types.trail.ts +21 -0
  87. package/src/trails/contour-exists.trail.ts +21 -0
  88. package/src/trails/dead-internal-trail.trail.ts +26 -0
  89. package/src/trails/deprecation-without-guidance.trail.ts +21 -0
  90. package/src/trails/draft-file-marking.trail.ts +16 -0
  91. package/src/trails/draft-visible-debt.trail.ts +16 -0
  92. package/src/trails/error-mapping-completeness.trail.ts +29 -0
  93. package/src/trails/example-valid.trail.ts +25 -0
  94. package/src/trails/fires-declarations.trail.ts +23 -0
  95. package/src/trails/fork-without-preserved-blaze.trail.ts +31 -0
  96. package/src/trails/implementation-returns-result.trail.ts +20 -0
  97. package/src/trails/incomplete-accessor-for-standard-op.trail.ts +76 -0
  98. package/src/trails/incomplete-crud.trail.ts +39 -0
  99. package/src/trails/index.ts +78 -0
  100. package/src/trails/intent-propagation.trail.ts +30 -0
  101. package/src/trails/layer-field-name-drift.trail.ts +39 -0
  102. package/src/trails/marker-schema-unsupported.trail.ts +23 -0
  103. package/src/trails/missing-reconcile.trail.ts +33 -0
  104. package/src/trails/missing-visibility.trail.ts +22 -0
  105. package/src/trails/no-destructured-compose.trail.ts +44 -0
  106. package/src/trails/no-dev-permit-in-source.trail.ts +16 -0
  107. package/src/trails/no-direct-implementation-call.trail.ts +16 -0
  108. package/src/trails/no-legacy-layer-imports.trail.ts +41 -0
  109. package/src/trails/no-native-error-result.trail.ts +18 -0
  110. package/src/trails/no-redundant-result-error-wrap.trail.ts +55 -0
  111. package/src/trails/no-retired-cross-vocabulary.trail.ts +42 -0
  112. package/src/trails/no-sync-result-assumption.trail.ts +19 -0
  113. package/src/trails/no-throw-in-detour-recover.trail.ts +24 -0
  114. package/src/trails/no-throw-in-implementation.trail.ts +20 -0
  115. package/src/trails/no-top-level-surface.trail.ts +43 -0
  116. package/src/trails/on-references-exist.trail.ts +21 -0
  117. package/src/trails/orphaned-signal.trail.ts +36 -0
  118. package/src/trails/owner-projection-parity.trail.ts +26 -0
  119. package/src/trails/pending-force.trail.ts +21 -0
  120. package/src/trails/permit-governance.trail.ts +51 -0
  121. package/src/trails/prefer-schema-inference.trail.ts +21 -0
  122. package/src/trails/public-export-example-coverage.trail.ts +16 -0
  123. package/src/trails/public-internal-deep-imports.trail.ts +94 -0
  124. package/src/trails/public-output-schema.trail.ts +55 -0
  125. package/src/trails/public-union-output-discriminants.trail.ts +33 -0
  126. package/src/trails/read-intent-fires.trail.ts +20 -0
  127. package/src/trails/reference-exists.trail.ts +25 -0
  128. package/src/trails/resolved-import-boundary.trail.ts +109 -0
  129. package/src/trails/resource-declarations.trail.ts +25 -0
  130. package/src/trails/resource-exists.trail.ts +27 -0
  131. package/src/trails/resource-id-grammar.trail.ts +39 -0
  132. package/src/trails/resource-mock-coverage.trail.ts +40 -0
  133. package/src/trails/run.ts +162 -0
  134. package/src/trails/scheduled-destroy-intent.trail.ts +56 -0
  135. package/src/trails/schema.ts +194 -0
  136. package/src/trails/signal-graph-coaching.trail.ts +77 -0
  137. package/src/trails/static-resource-accessor-preference.trail.ts +25 -0
  138. package/src/trails/surface-facet-coherence.trail.ts +25 -0
  139. package/src/trails/topo.ts +6 -0
  140. package/src/trails/unmaterialized-activation-source.trail.ts +72 -0
  141. package/src/trails/unreachable-detour-shadowing.trail.ts +45 -0
  142. package/src/trails/valid-describe-refs.trail.ts +18 -0
  143. package/src/trails/valid-detour-contract.trail.ts +71 -0
  144. package/src/trails/version-gap.trail.ts +35 -0
  145. package/src/trails/version-pinned-compose.trail.ts +23 -0
  146. package/src/trails/version-without-examples.trail.ts +38 -0
  147. package/src/trails/warden-export-symmetry.trail.ts +16 -0
  148. package/src/trails/warden-rules-use-ast.trail.ts +45 -0
  149. package/src/trails/webhook-route-collision.trail.ts +50 -0
  150. package/src/trails/wrap-rule.ts +213 -0
  151. package/src/workspaces.ts +238 -0
  152. package/.turbo/turbo-build.log +0 -1
  153. package/.turbo/turbo-lint.log +0 -3
  154. package/.turbo/turbo-typecheck.log +0 -1
  155. package/dist/cli.d.ts +0 -46
  156. package/dist/cli.d.ts.map +0 -1
  157. package/dist/cli.js +0 -221
  158. package/dist/cli.js.map +0 -1
  159. package/dist/drift.d.ts +0 -26
  160. package/dist/drift.d.ts.map +0 -1
  161. package/dist/drift.js +0 -27
  162. package/dist/drift.js.map +0 -1
  163. package/dist/formatters.d.ts +0 -29
  164. package/dist/formatters.d.ts.map +0 -1
  165. package/dist/formatters.js +0 -87
  166. package/dist/formatters.js.map +0 -1
  167. package/dist/index.d.ts +0 -26
  168. package/dist/index.d.ts.map +0 -1
  169. package/dist/index.js +0 -26
  170. package/dist/index.js.map +0 -1
  171. package/dist/rules/ast.d.ts +0 -41
  172. package/dist/rules/ast.d.ts.map +0 -1
  173. package/dist/rules/ast.js +0 -163
  174. package/dist/rules/ast.js.map +0 -1
  175. package/dist/rules/context-no-surface-types.d.ts +0 -12
  176. package/dist/rules/context-no-surface-types.d.ts.map +0 -1
  177. package/dist/rules/context-no-surface-types.js +0 -96
  178. package/dist/rules/context-no-surface-types.js.map +0 -1
  179. package/dist/rules/implementation-returns-result.d.ts +0 -13
  180. package/dist/rules/implementation-returns-result.d.ts.map +0 -1
  181. package/dist/rules/implementation-returns-result.js +0 -231
  182. package/dist/rules/implementation-returns-result.js.map +0 -1
  183. package/dist/rules/index.d.ts +0 -22
  184. package/dist/rules/index.d.ts.map +0 -1
  185. package/dist/rules/index.js +0 -41
  186. package/dist/rules/index.js.map +0 -1
  187. package/dist/rules/no-direct-impl-in-route.d.ts +0 -12
  188. package/dist/rules/no-direct-impl-in-route.d.ts.map +0 -1
  189. package/dist/rules/no-direct-impl-in-route.js +0 -46
  190. package/dist/rules/no-direct-impl-in-route.js.map +0 -1
  191. package/dist/rules/no-direct-implementation-call.d.ts +0 -12
  192. package/dist/rules/no-direct-implementation-call.d.ts.map +0 -1
  193. package/dist/rules/no-direct-implementation-call.js +0 -39
  194. package/dist/rules/no-direct-implementation-call.js.map +0 -1
  195. package/dist/rules/no-sync-result-assumption.d.ts +0 -6
  196. package/dist/rules/no-sync-result-assumption.d.ts.map +0 -1
  197. package/dist/rules/no-sync-result-assumption.js +0 -98
  198. package/dist/rules/no-sync-result-assumption.js.map +0 -1
  199. package/dist/rules/no-throw-in-detour-target.d.ts +0 -12
  200. package/dist/rules/no-throw-in-detour-target.d.ts.map +0 -1
  201. package/dist/rules/no-throw-in-detour-target.js +0 -87
  202. package/dist/rules/no-throw-in-detour-target.js.map +0 -1
  203. package/dist/rules/no-throw-in-implementation.d.ts +0 -9
  204. package/dist/rules/no-throw-in-implementation.d.ts.map +0 -1
  205. package/dist/rules/no-throw-in-implementation.js +0 -34
  206. package/dist/rules/no-throw-in-implementation.js.map +0 -1
  207. package/dist/rules/prefer-schema-inference.d.ts +0 -7
  208. package/dist/rules/prefer-schema-inference.d.ts.map +0 -1
  209. package/dist/rules/prefer-schema-inference.js +0 -86
  210. package/dist/rules/prefer-schema-inference.js.map +0 -1
  211. package/dist/rules/scan.d.ts +0 -8
  212. package/dist/rules/scan.d.ts.map +0 -1
  213. package/dist/rules/scan.js +0 -32
  214. package/dist/rules/scan.js.map +0 -1
  215. package/dist/rules/specs.d.ts +0 -29
  216. package/dist/rules/specs.d.ts.map +0 -1
  217. package/dist/rules/specs.js +0 -192
  218. package/dist/rules/specs.js.map +0 -1
  219. package/dist/rules/structure.d.ts +0 -13
  220. package/dist/rules/structure.d.ts.map +0 -1
  221. package/dist/rules/structure.js +0 -142
  222. package/dist/rules/structure.js.map +0 -1
  223. package/dist/rules/types.d.ts +0 -52
  224. package/dist/rules/types.d.ts.map +0 -1
  225. package/dist/rules/types.js +0 -2
  226. package/dist/rules/types.js.map +0 -1
  227. package/dist/rules/valid-describe-refs.d.ts +0 -7
  228. package/dist/rules/valid-describe-refs.d.ts.map +0 -1
  229. package/dist/rules/valid-describe-refs.js +0 -51
  230. package/dist/rules/valid-describe-refs.js.map +0 -1
  231. package/dist/rules/valid-detour-refs.d.ts +0 -6
  232. package/dist/rules/valid-detour-refs.d.ts.map +0 -1
  233. package/dist/rules/valid-detour-refs.js +0 -116
  234. package/dist/rules/valid-detour-refs.js.map +0 -1
  235. package/src/__tests__/cli.test.ts +0 -198
  236. package/src/__tests__/drift.test.ts +0 -74
  237. package/src/__tests__/formatters.test.ts +0 -157
  238. package/src/__tests__/implementation-returns-result.test.ts +0 -75
  239. package/src/__tests__/no-direct-implementation-call.test.ts +0 -83
  240. package/src/__tests__/no-sync-result-assumption.test.ts +0 -85
  241. package/src/__tests__/no-throw-in-detour-target.test.ts +0 -78
  242. package/src/__tests__/prefer-schema-inference.test.ts +0 -84
  243. package/src/__tests__/rules.test.ts +0 -188
  244. package/src/__tests__/valid-describe-refs.test.ts +0 -60
  245. package/src/rules/no-direct-impl-in-route.ts +0 -77
  246. package/src/rules/no-throw-in-detour-target.ts +0 -150
  247. package/src/rules/valid-detour-refs.ts +0 -187
  248. package/tsconfig.json +0 -9
  249. package/tsconfig.tsbuildinfo +0 -1
@@ -0,0 +1,238 @@
1
+ /**
2
+ * Workspace-manifest discovery for Warden project-aware rules.
3
+ */
4
+
5
+ import { existsSync, readdirSync, readFileSync, realpathSync } from 'node:fs';
6
+ import { dirname, join, resolve } from 'node:path';
7
+
8
+ export interface WardenPublicWorkspace {
9
+ readonly name: string;
10
+ readonly rootDir: string;
11
+ readonly packageJsonPath: string;
12
+ readonly hasExports: boolean;
13
+ readonly bin?: Readonly<Record<string, string>> | undefined;
14
+ readonly exportTargets?: Readonly<Record<string, string>> | undefined;
15
+ readonly files?: readonly string[] | undefined;
16
+ }
17
+
18
+ interface RootManifest {
19
+ readonly workspaces?: unknown;
20
+ }
21
+
22
+ interface PackageManifest {
23
+ readonly bin?: unknown;
24
+ readonly exports?: unknown;
25
+ readonly files?: unknown;
26
+ readonly name?: unknown;
27
+ readonly private?: unknown;
28
+ }
29
+
30
+ const normalizePath = (path: string): string => path.replaceAll('\\', '/');
31
+
32
+ const normalizeRealPath = (path: string): string => {
33
+ try {
34
+ return normalizePath(realpathSync(path));
35
+ } catch {
36
+ return normalizePath(resolve(path));
37
+ }
38
+ };
39
+
40
+ const isRecord = (value: unknown): value is Record<string, unknown> =>
41
+ Boolean(value && typeof value === 'object' && !Array.isArray(value));
42
+
43
+ const readJson = <T>(path: string): T | undefined => {
44
+ try {
45
+ return JSON.parse(readFileSync(path, 'utf8')) as T;
46
+ } catch {
47
+ return undefined;
48
+ }
49
+ };
50
+
51
+ const workspacePatternsFromManifest = (
52
+ manifest: RootManifest | undefined
53
+ ): readonly string[] => {
54
+ const { workspaces } = manifest ?? {};
55
+ if (Array.isArray(workspaces)) {
56
+ return workspaces.filter(
57
+ (pattern): pattern is string => typeof pattern === 'string'
58
+ );
59
+ }
60
+
61
+ const packages = isRecord(workspaces) ? workspaces['packages'] : undefined;
62
+ return Array.isArray(packages)
63
+ ? packages.filter(
64
+ (pattern): pattern is string => typeof pattern === 'string'
65
+ )
66
+ : [];
67
+ };
68
+
69
+ const workspaceDirsForPattern = (
70
+ rootDir: string,
71
+ pattern: string
72
+ ): readonly string[] => {
73
+ if (!pattern.endsWith('/*')) {
74
+ const workspaceDir = join(rootDir, pattern);
75
+ return existsSync(workspaceDir) ? [workspaceDir] : [];
76
+ }
77
+
78
+ const groupDir = join(rootDir, pattern.slice(0, -2));
79
+ if (!existsSync(groupDir)) {
80
+ return [];
81
+ }
82
+
83
+ return readdirSync(groupDir, { withFileTypes: true })
84
+ .filter((entry) => entry.isDirectory())
85
+ .map((entry) => join(groupDir, entry.name))
86
+ .toSorted();
87
+ };
88
+
89
+ const packageLocalName = (name: string): string =>
90
+ name.split('/').at(-1) ?? name;
91
+
92
+ const normalizeBin = (
93
+ name: string,
94
+ value: unknown
95
+ ): Readonly<Record<string, string>> | undefined => {
96
+ if (typeof value === 'string') {
97
+ return { [packageLocalName(name)]: value };
98
+ }
99
+ if (!isRecord(value)) {
100
+ return undefined;
101
+ }
102
+
103
+ const entries = Object.entries(value).filter(
104
+ (entry): entry is [string, string] => typeof entry[1] === 'string'
105
+ );
106
+ return entries.length > 0 ? Object.fromEntries(entries) : undefined;
107
+ };
108
+
109
+ const normalizeFiles = (value: unknown): readonly string[] | undefined => {
110
+ if (!Array.isArray(value)) {
111
+ return undefined;
112
+ }
113
+
114
+ const files = value.filter(
115
+ (entry): entry is string => typeof entry === 'string'
116
+ );
117
+ return files.length > 0 ? files : undefined;
118
+ };
119
+
120
+ const resolveExportTarget = (
121
+ target: unknown,
122
+ depth = 0
123
+ ): string | undefined => {
124
+ if (typeof target === 'string') {
125
+ return target;
126
+ }
127
+ if (!isRecord(target) || depth > 8) {
128
+ return undefined;
129
+ }
130
+
131
+ for (const condition of ['bun', 'import', 'default', 'require'] as const) {
132
+ const conditionalTarget = target[condition];
133
+ const resolvedTarget = resolveExportTarget(conditionalTarget, depth + 1);
134
+ if (resolvedTarget) {
135
+ return resolvedTarget;
136
+ }
137
+ }
138
+ return undefined;
139
+ };
140
+
141
+ const exportSpecifierFromKey = (
142
+ packageName: string,
143
+ key: string
144
+ ): string | undefined => {
145
+ if (key === '.') {
146
+ return packageName;
147
+ }
148
+ if (!key.startsWith('./') || key.includes('*')) {
149
+ return undefined;
150
+ }
151
+ return `${packageName}/${key.slice(2)}`;
152
+ };
153
+
154
+ const normalizeExportTargets = (
155
+ packageDir: string,
156
+ packageName: string,
157
+ exportsValue: unknown
158
+ ): Readonly<Record<string, string>> | undefined => {
159
+ if (!isRecord(exportsValue)) {
160
+ return undefined;
161
+ }
162
+
163
+ const targets: Record<string, string> = {};
164
+ for (const [key, value] of Object.entries(exportsValue)) {
165
+ const specifier = exportSpecifierFromKey(packageName, key);
166
+ const target = resolveExportTarget(value);
167
+ if (!specifier || !target) {
168
+ continue;
169
+ }
170
+ targets[specifier] = normalizeRealPath(join(packageDir, target));
171
+ }
172
+
173
+ return Object.keys(targets).length > 0 ? targets : undefined;
174
+ };
175
+
176
+ const publicWorkspaceFromManifest = (
177
+ packageJsonPath: string,
178
+ manifest: PackageManifest
179
+ ): WardenPublicWorkspace | undefined => {
180
+ if (typeof manifest.name !== 'string') {
181
+ return undefined;
182
+ }
183
+ if (!manifest.name.startsWith('@ontrails/')) {
184
+ return undefined;
185
+ }
186
+ if (manifest.private === true) {
187
+ return undefined;
188
+ }
189
+
190
+ const packageDir = dirname(packageJsonPath);
191
+ const bin = normalizeBin(manifest.name, manifest.bin);
192
+ const exportTargets = normalizeExportTargets(
193
+ packageDir,
194
+ manifest.name,
195
+ manifest.exports
196
+ );
197
+ const files = normalizeFiles(manifest.files);
198
+
199
+ return {
200
+ ...(bin ? { bin } : {}),
201
+ ...(exportTargets ? { exportTargets } : {}),
202
+ ...(files ? { files } : {}),
203
+ hasExports: manifest.exports !== undefined,
204
+ name: manifest.name,
205
+ packageJsonPath: normalizeRealPath(packageJsonPath),
206
+ rootDir: normalizeRealPath(dirname(packageJsonPath)),
207
+ };
208
+ };
209
+
210
+ export const collectPublicWorkspaces = (
211
+ rootDir: string
212
+ ): ReadonlyMap<string, WardenPublicWorkspace> => {
213
+ const normalizedRoot = normalizeRealPath(rootDir);
214
+ const rootManifest = readJson<RootManifest>(
215
+ join(normalizedRoot, 'package.json')
216
+ );
217
+ const workspaces = new Map<string, WardenPublicWorkspace>();
218
+
219
+ for (const pattern of workspacePatternsFromManifest(rootManifest)) {
220
+ for (const workspaceDir of workspaceDirsForPattern(
221
+ normalizedRoot,
222
+ pattern
223
+ )) {
224
+ const packageJsonPath = join(workspaceDir, 'package.json');
225
+ const manifest = readJson<PackageManifest>(packageJsonPath);
226
+ if (!manifest) {
227
+ continue;
228
+ }
229
+
230
+ const workspace = publicWorkspaceFromManifest(packageJsonPath, manifest);
231
+ if (workspace) {
232
+ workspaces.set(workspace.name, workspace);
233
+ }
234
+ }
235
+ }
236
+
237
+ return workspaces;
238
+ };
@@ -1 +0,0 @@
1
- $ tsc -b
@@ -1,3 +0,0 @@
1
- $ oxlint ./src
2
- Found 0 warnings and 0 errors.
3
- Finished in 24ms on 30 files with 93 rules using 24 threads.
@@ -1 +0,0 @@
1
- $ tsc --noEmit
package/dist/cli.d.ts DELETED
@@ -1,46 +0,0 @@
1
- /**
2
- * Warden CLI command runner.
3
- *
4
- * Scans TypeScript files, runs all warden rules, optionally checks drift,
5
- * and returns a structured report.
6
- */
7
- import type { Topo } from '@ontrails/core';
8
- import type { DriftResult } from './drift.js';
9
- import type { WardenDiagnostic } from './rules/types.js';
10
- /**
11
- * Options for the warden CLI runner.
12
- */
13
- export interface WardenOptions {
14
- /** Root directory to scan for TypeScript files. Defaults to cwd. */
15
- readonly rootDir?: string | undefined;
16
- /** Only run lint rules, skip drift detection */
17
- readonly lintOnly?: boolean | undefined;
18
- /** Only run drift detection, skip lint rules */
19
- readonly driftOnly?: boolean | undefined;
20
- /** App topology for drift detection. When provided, enables real surface lock comparison. */
21
- readonly topo?: Topo | undefined;
22
- }
23
- /**
24
- * Result of a warden run.
25
- */
26
- export interface WardenReport {
27
- /** All diagnostics from lint rules */
28
- readonly diagnostics: readonly WardenDiagnostic[];
29
- /** Count of error-severity diagnostics */
30
- readonly errorCount: number;
31
- /** Count of warn-severity diagnostics */
32
- readonly warnCount: number;
33
- /** Drift detection result, or null if skipped */
34
- readonly drift: DriftResult | null;
35
- /** Whether the warden run passed (no errors, no drift) */
36
- readonly passed: boolean;
37
- }
38
- /**
39
- * Run all warden checks and return a structured report.
40
- */
41
- export declare const runWarden: (options?: WardenOptions) => Promise<WardenReport>;
42
- /**
43
- * Format a warden report as a human-readable string.
44
- */
45
- export declare const formatWardenReport: (report: WardenReport) => string;
46
- //# sourceMappingURL=cli.d.ts.map
package/dist/cli.d.ts.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAE3C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAS9C,OAAO,KAAK,EAGV,gBAAgB,EAEjB,MAAM,kBAAkB,CAAC;AAE1B;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,oEAAoE;IACpE,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,gDAAgD;IAChD,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACxC,gDAAgD;IAChD,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACzC,6FAA6F;IAC7F,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,GAAG,SAAS,CAAC;CAClC;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,sCAAsC;IACtC,QAAQ,CAAC,WAAW,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAClD,0CAA0C;IAC1C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,yCAAyC;IACzC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,iDAAiD;IACjD,QAAQ,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,CAAC;IACnC,0DAA0D;IAC1D,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;CAC1B;AAyLD;;GAEG;AACH,eAAO,MAAM,SAAS,GACpB,UAAS,aAAkB,KAC1B,OAAO,CAAC,YAAY,CAqBtB,CAAC;AAsDF;;GAEG;AACH,eAAO,MAAM,kBAAkB,GAAI,QAAQ,YAAY,KAAG,MAmBzD,CAAC"}
package/dist/cli.js DELETED
@@ -1,221 +0,0 @@
1
- /**
2
- * Warden CLI command runner.
3
- *
4
- * Scans TypeScript files, runs all warden rules, optionally checks drift,
5
- * and returns a structured report.
6
- */
7
- import { resolve } from 'node:path';
8
- import { checkDrift } from './drift.js';
9
- import { findConfigProperty, findTrailDefinitions, parse, walk, } from './rules/ast.js';
10
- import { wardenRules } from './rules/index.js';
11
- /**
12
- * Collect all .ts files under a directory, excluding node_modules, dist, and .git.
13
- */
14
- const isSourceFile = (match) => !match.endsWith('.d.ts') &&
15
- !match.startsWith('node_modules/') &&
16
- !match.startsWith('dist/') &&
17
- !match.startsWith('.git/') &&
18
- !match.includes('__tests__/') &&
19
- !match.includes('__test__/') &&
20
- !match.endsWith('.test.ts') &&
21
- !match.endsWith('.spec.ts');
22
- const collectTsFiles = (dir) => {
23
- const glob = new Bun.Glob('**/*.ts');
24
- let matches;
25
- try {
26
- matches = glob.scanSync({ cwd: dir, dot: false, onlyFiles: true });
27
- }
28
- catch {
29
- return [];
30
- }
31
- const files = [];
32
- for (const match of matches) {
33
- if (isSourceFile(match)) {
34
- files.push(`${dir}/${match}`);
35
- }
36
- }
37
- return files;
38
- };
39
- const collectKnownTrailIds = (sourceCode, filePath, knownTrailIds) => {
40
- const ast = parse(filePath, sourceCode);
41
- if (!ast) {
42
- return;
43
- }
44
- for (const def of findTrailDefinitions(ast)) {
45
- knownTrailIds.add(def.id);
46
- }
47
- };
48
- const collectDetourTargetTrailIds = (sourceCode, filePath, detourTargetTrailIds) => {
49
- const ast = parse(filePath, sourceCode);
50
- if (!ast) {
51
- return;
52
- }
53
- for (const def of findTrailDefinitions(ast)) {
54
- const detoursProp = findConfigProperty(def.config, 'detours');
55
- if (!detoursProp) {
56
- continue;
57
- }
58
- // Walk the detours value for string literals that look like trail IDs
59
- walk(detoursProp, (node) => {
60
- if (node.type !== 'Literal') {
61
- return;
62
- }
63
- const val = node.value;
64
- if (val && val.includes('.')) {
65
- detourTargetTrailIds.add(val);
66
- }
67
- });
68
- }
69
- };
70
- const loadSourceFiles = async (rootDir) => {
71
- const sourceFiles = [];
72
- for (const filePath of collectTsFiles(rootDir)) {
73
- try {
74
- sourceFiles.push({
75
- filePath,
76
- sourceCode: await Bun.file(filePath).text(),
77
- });
78
- }
79
- catch {
80
- continue;
81
- }
82
- }
83
- return sourceFiles;
84
- };
85
- const buildProjectContextFromTopo = (appTopo) => {
86
- const knownTrailIds = new Set([
87
- ...appTopo.trails.keys(),
88
- ...appTopo.hikes.keys(),
89
- ]);
90
- const detourTargetTrailIds = new Set();
91
- for (const t of appTopo.trails.values()) {
92
- const detours = t['detours'];
93
- if (!detours) {
94
- continue;
95
- }
96
- for (const targets of Object.values(detours)) {
97
- for (const id of targets) {
98
- detourTargetTrailIds.add(id);
99
- }
100
- }
101
- }
102
- return { detourTargetTrailIds, knownTrailIds };
103
- };
104
- const buildProjectContextFromFiles = (sourceFiles) => {
105
- const knownTrailIds = new Set();
106
- const detourTargetTrailIds = new Set();
107
- for (const sourceFile of sourceFiles) {
108
- collectKnownTrailIds(sourceFile.sourceCode, sourceFile.filePath, knownTrailIds);
109
- collectDetourTargetTrailIds(sourceFile.sourceCode, sourceFile.filePath, detourTargetTrailIds);
110
- }
111
- return {
112
- detourTargetTrailIds,
113
- knownTrailIds,
114
- };
115
- };
116
- const isProjectAwareRule = (rule) => 'checkWithContext' in rule;
117
- /**
118
- * Lint all files against all warden rules.
119
- */
120
- const lintFiles = async (rootDir, appTopo) => {
121
- const allDiagnostics = [];
122
- const sourceFiles = await loadSourceFiles(rootDir);
123
- const context = appTopo
124
- ? buildProjectContextFromTopo(appTopo)
125
- : buildProjectContextFromFiles(sourceFiles);
126
- for (const sourceFile of sourceFiles) {
127
- for (const rule of wardenRules.values()) {
128
- if (isProjectAwareRule(rule)) {
129
- allDiagnostics.push(...rule.checkWithContext(sourceFile.sourceCode, sourceFile.filePath, context));
130
- continue;
131
- }
132
- allDiagnostics.push(...rule.check(sourceFile.sourceCode, sourceFile.filePath));
133
- }
134
- }
135
- return allDiagnostics;
136
- };
137
- /**
138
- * Run all warden checks and return a structured report.
139
- */
140
- export const runWarden = async (options = {}) => {
141
- const rootDir = resolve(options.rootDir ?? process.cwd());
142
- const allDiagnostics = options.driftOnly
143
- ? []
144
- : await lintFiles(rootDir, options.topo);
145
- const drift = options.lintOnly
146
- ? null
147
- : await checkDrift(rootDir, options.topo);
148
- const errorCount = allDiagnostics.filter((d) => d.severity === 'error').length;
149
- const warnCount = allDiagnostics.filter((d) => d.severity === 'warn').length;
150
- return {
151
- diagnostics: allDiagnostics,
152
- drift,
153
- errorCount,
154
- passed: errorCount === 0 && !(drift?.stale ?? false),
155
- warnCount,
156
- };
157
- };
158
- /**
159
- * Format the lint section of the report.
160
- */
161
- const formatLintSection = (report) => {
162
- if (report.diagnostics.length === 0) {
163
- return ['Lint: clean'];
164
- }
165
- const lines = [
166
- `Lint: ${report.errorCount} errors, ${report.warnCount} warnings`,
167
- ];
168
- for (const d of report.diagnostics) {
169
- const prefix = d.severity === 'error' ? 'ERROR' : 'WARN';
170
- lines.push(` ${d.filePath}:${String(d.line)} [${prefix}] ${d.rule} ${d.message}`);
171
- }
172
- return lines;
173
- };
174
- /**
175
- * Format the drift section of the report.
176
- */
177
- const formatDriftSection = (drift) => {
178
- if (drift === null) {
179
- return [];
180
- }
181
- const label = drift.stale
182
- ? 'Drift: surface.lock is stale (regenerate with `trails survey generate`)'
183
- : 'Drift: clean';
184
- return [label, ''];
185
- };
186
- /**
187
- * Format the result line.
188
- */
189
- const formatResultLine = (report) => {
190
- if (report.passed) {
191
- return 'Result: PASS';
192
- }
193
- const parts = [];
194
- if (report.errorCount > 0) {
195
- parts.push(`${report.errorCount} errors`);
196
- }
197
- if (report.drift?.stale) {
198
- parts.push('drift detected');
199
- }
200
- return `Result: FAIL (${parts.join(', ')})`;
201
- };
202
- /**
203
- * Format a warden report as a human-readable string.
204
- */
205
- export const formatWardenReport = (report) => {
206
- const lintLines = formatLintSection(report);
207
- const driftLines = formatDriftSection(report.drift);
208
- if (lintLines.length === 0 && driftLines.length === 0) {
209
- return ['Warden Report', '=============', '', 'No checks were run.'].join('\n');
210
- }
211
- return [
212
- 'Warden Report',
213
- '=============',
214
- '',
215
- ...lintLines,
216
- '',
217
- ...driftLines,
218
- formatResultLine(report),
219
- ].join('\n');
220
- };
221
- //# sourceMappingURL=cli.js.map
package/dist/cli.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
package/dist/drift.d.ts DELETED
@@ -1,26 +0,0 @@
1
- /**
2
- * Surface lock drift detection.
3
- *
4
- * Compares the committed `surface.lock` hash against a freshly generated
5
- * surface map hash to detect when the trail topology has changed without
6
- * updating the lock file.
7
- */
8
- import type { Topo } from '@ontrails/core';
9
- /**
10
- * Result of a drift check comparing committed surface.lock against the current state.
11
- */
12
- export interface DriftResult {
13
- /** Whether the committed lock is out of date */
14
- readonly stale: boolean;
15
- /** Hash from the committed surface.lock file, or null if not found */
16
- readonly committedHash: string | null;
17
- /** Hash computed from the current trail topology */
18
- readonly currentHash: string;
19
- }
20
- /**
21
- * Check whether the committed surface.lock is stale compared to the current topology.
22
- *
23
- * When no topo is provided, returns a clean result (no drift detectable without runtime info).
24
- */
25
- export declare const checkDrift: (rootDir: string, topo?: Topo | undefined) => Promise<DriftResult>;
26
- //# sourceMappingURL=drift.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"drift.d.ts","sourceRoot":"","sources":["../src/drift.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAO3C;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,gDAAgD;IAChD,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,sEAAsE;IACtE,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,oDAAoD;IACpD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED;;;;GAIG;AACH,eAAO,MAAM,UAAU,GACrB,SAAS,MAAM,EACf,OAAO,IAAI,GAAG,SAAS,KACtB,OAAO,CAAC,WAAW,CAcrB,CAAC"}
package/dist/drift.js DELETED
@@ -1,27 +0,0 @@
1
- /**
2
- * Surface lock drift detection.
3
- *
4
- * Compares the committed `surface.lock` hash against a freshly generated
5
- * surface map hash to detect when the trail topology has changed without
6
- * updating the lock file.
7
- */
8
- import { generateSurfaceMap, hashSurfaceMap, readSurfaceLock, } from '@ontrails/schema';
9
- /**
10
- * Check whether the committed surface.lock is stale compared to the current topology.
11
- *
12
- * When no topo is provided, returns a clean result (no drift detectable without runtime info).
13
- */
14
- export const checkDrift = async (rootDir, topo) => {
15
- if (!topo) {
16
- return { committedHash: null, currentHash: 'unknown', stale: false };
17
- }
18
- const surfaceMap = generateSurfaceMap(topo);
19
- const currentHash = hashSurfaceMap(surfaceMap);
20
- const committedHash = await readSurfaceLock({ dir: rootDir });
21
- return {
22
- committedHash,
23
- currentHash,
24
- stale: committedHash !== null && committedHash !== currentHash,
25
- };
26
- };
27
- //# sourceMappingURL=drift.js.map
package/dist/drift.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"drift.js","sourceRoot":"","sources":["../src/drift.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EACL,kBAAkB,EAClB,cAAc,EACd,eAAe,GAChB,MAAM,kBAAkB,CAAC;AAc1B;;;;GAIG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,KAAK,EAC7B,OAAe,EACf,IAAuB,EACD,EAAE;IACxB,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IACvE,CAAC;IAED,MAAM,UAAU,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAC5C,MAAM,WAAW,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;IAC/C,MAAM,aAAa,GAAG,MAAM,eAAe,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;IAE9D,OAAO;QACL,aAAa;QACb,WAAW;QACX,KAAK,EAAE,aAAa,KAAK,IAAI,IAAI,aAAa,KAAK,WAAW;KAC/D,CAAC;AACJ,CAAC,CAAC"}
@@ -1,29 +0,0 @@
1
- /**
2
- * CI-oriented formatters for warden reports.
3
- *
4
- * Each formatter takes a `WardenReport` and produces output suited to a
5
- * specific CI environment: GitHub Actions annotations, structured JSON,
6
- * or a concise markdown summary.
7
- */
8
- import type { WardenReport } from './cli.js';
9
- /**
10
- * Produce GitHub Actions workflow command annotations, one per diagnostic.
11
- *
12
- * Severity mapping: `error` to `::error`, `warn` to `::warning`.
13
- * Drift staleness is emitted as a single `::error` annotation when detected.
14
- */
15
- export declare const formatGitHubAnnotations: (report: WardenReport) => string;
16
- /**
17
- * Produce a structured JSON string from the report.
18
- *
19
- * Includes a `summary` object with error, warning, and suggestion counts
20
- * for easy consumption by downstream tooling.
21
- */
22
- export declare const formatJson: (report: WardenReport) => string;
23
- /**
24
- * Produce a concise markdown summary suitable for a GitHub job summary or PR comment.
25
- *
26
- * Groups diagnostics by severity and includes drift status when relevant.
27
- */
28
- export declare const formatSummary: (report: WardenReport) => string;
29
- //# sourceMappingURL=formatters.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"formatters.d.ts","sourceRoot":"","sources":["../src/formatters.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAS7C;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB,GAAI,QAAQ,YAAY,KAAG,MAiB9D,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,UAAU,GAAI,QAAQ,YAAY,KAAG,MAiBjD,CAAC;AA6BF;;;;GAIG;AACH,eAAO,MAAM,aAAa,GAAI,QAAQ,YAAY,KAAG,MAapD,CAAC"}