@orkestrel/scaffold 0.0.92 → 0.0.94

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.
@@ -294,7 +294,8 @@ $utilities: map-merge(
294
294
  values: auto pointer grab,
295
295
  ),
296
296
  // Modify an existing utility: make width responsive.
297
- 'width': map-merge(
297
+ 'width':
298
+ map-merge(
298
299
  map-get($utilities, 'width'),
299
300
  (
300
301
  responsive: true,
@@ -889,7 +890,8 @@ Bootstrap has **no** combobox/autocomplete, date picker, multi-select tags input
889
890
  $utilities: map-merge(
890
891
  $utilities,
891
892
  (
892
- 'width': map-merge(
893
+ 'width':
894
+ map-merge(
893
895
  map-get($utilities, 'width'),
894
896
  (
895
897
  responsive: true,
@@ -109,7 +109,7 @@ the component's own breakpoint class instead
109
109
  Recipes:
110
110
 
111
111
  - **Table scroller.** `<div class="table-responsive" role="region" aria-label="Invoices"
112
- tabindex="0">` — the shipped class is `overflow-x: auto` only; the name and `tabindex` make it
112
+ tabindex="0">` — the shipped class is `overflow-x: auto` only; the name and `tabindex` make it
113
113
  keyboard-reachable. `table-responsive-{bp}` scrolls only below the breakpoint.
114
114
  - **Menus in a scroller.** A scroller clips its `dropdown-menu`. Add
115
115
  `data-bs-popper-config='{"strategy":"fixed"}'` to the toggle, or open row actions in a
@@ -362,7 +362,7 @@ Helpers are single-purpose classes that sit alongside utilities.
362
362
  Protect titles or marks that must retain height with `flex-shrink-0`. Do not add `overflow-hidden`
363
363
  to an ancestor to conceal a layout bug; it can clip menus and focus rings.
364
364
  - **Toolbars:** start with `d-grid gap-2` or labelled `row g-2` controls; expand with `d-sm-flex
365
- flex-sm-wrap` or `col-md-auto` only when the container fits. Do not default to a horizontal
365
+ flex-sm-wrap` or `col-md-auto` only when the container fits. Do not default to a horizontal
366
366
  scroller for search or primary actions. Keep matching control sizes and usable hit areas. Align equal-height
367
367
  cards only where their content benefits, not to fill empty space.
368
368
  - **Responsive content:** follow [responsive-layout.md](responsive-layout.md); unprefixed utilities define the complete narrow task. A class that resolves can still implement the wrong layout. Reflow and prioritize before truncating. Hide a button caption only when
@@ -397,10 +397,10 @@ flex-sm-wrap` or `col-md-auto` only when the container fits. Do not default to a
397
397
  take `object-fit-contain` when the whole asset matters. Guard a user upload against bleeding into
398
398
  a same-color surface with `border border-black border-opacity-10` — translucent, so it does not
399
399
  clash with the photo. Reduce a photo's dynamics before placing text on it: a `bg-dark
400
- bg-opacity-50` (or `-75`) overlay layer under `card-img-overlay`, measured at every crop. Keep a
400
+ bg-opacity-50` (or `-75`) overlay layer under `card-img-overlay`, measured at every crop. Keep a
401
401
  small glyph near 16–24 px inside `rounded-circle bg-primary-subtle p-3` rather than scaling it up.
402
402
  Keep useful image detail and icon optical size rather than stretching assets to fill a box.
403
403
  - **Lists and quotes:** `list-unstyled` with a meaningful glyph per item (`d-flex gap-2
404
- align-items-baseline`, glyph `aria-hidden="true"`); `.blockquote` with `.blockquote-footer`.
404
+ align-items-baseline`, glyph `aria-hidden="true"`); `.blockquote` with `.blockquote-footer`.
405
405
  - **Print:** mark chrome `d-print-none` and keep results readable; do not hide data merely because
406
406
  its interactive controls have no print role.
@@ -269,7 +269,7 @@ Prove the harness from the browser project, through the object and the markup to
269
269
  zero, and the passed tally equals the total.
270
270
  - Assert the inventory before the tally. A harness that mounted no row would pass every tally
271
271
  assertion, and `createHarness` refuses an empty table with `Statechart harness mounted no
272
- transition`.
272
+ transition`.
273
273
  - Name the failing rows from `failures`, which lists each row whose rendered `result` reads failed,
274
274
  in table order. A red gate says which transition broke.
275
275
  - Read the tally off `harness.root` as well as off the object, so the attribute contract a gate
@@ -48,7 +48,7 @@ so network-controlled descriptions never enter agent instruction context.
48
48
  | `@orkestrel/abort` | `0.0.12` | L1 | `@orkestrel/contract` `^0.0.18` | |
49
49
  | `@orkestrel/agent` | `0.0.26` | L5 | `@orkestrel/tool` `^0.0.18`, `@orkestrel/abort` `^0.0.12`, `@orkestrel/queue` `^0.0.16`, `@orkestrel/budget` `^0.0.12`, `@orkestrel/emitter` `^0.0.11`, `@orkestrel/timeout` `^0.0.12`, `@orkestrel/contract` `^0.0.19`, `@orkestrel/database` `^0.0.17`, `@orkestrel/workflow` `^0.0.21`, `@orkestrel/workspace` `^0.0.11` | |
50
50
  | `@orkestrel/brief` | `0.0.10` | L4 | `@orkestrel/reason` `^0.0.12`, `@orkestrel/emitter` `^0.0.11`, `@orkestrel/contract` `^0.0.18`, `@orkestrel/interpret` `^0.0.15` | |
51
- | `@orkestrel/browser` | `0.0.24` | L5 | `@orkestrel/mcp` `^0.0.36`, `@orkestrel/html` `^0.0.12`, `@orkestrel/pool` `^0.0.15`, `@orkestrel/tool` `^0.0.18`, `@orkestrel/router` `^0.0.16`, `@orkestrel/server` `^0.0.22`, `@orkestrel/emitter` `^0.0.11`, `@orkestrel/contract` `^0.0.19`, `@orkestrel/markdown` `^0.0.17`, `@orkestrel/websocket` `^0.0.14` | |
51
+ | `@orkestrel/browser` | `0.0.26` | L5 | `@orkestrel/mcp` `^0.0.36`, `@orkestrel/html` `^0.0.12`, `@orkestrel/pool` `^0.0.16`, `@orkestrel/tool` `^0.0.18`, `@orkestrel/router` `^0.0.16`, `@orkestrel/server` `^0.0.22`, `@orkestrel/emitter` `^0.0.11`, `@orkestrel/contract` `^0.0.19`, `@orkestrel/markdown` `^0.0.17`, `@orkestrel/websocket` `^0.0.14` | |
52
52
  | `@orkestrel/budget` | `0.0.12` | L1 | `@orkestrel/contract` `^0.0.18` | |
53
53
  | `@orkestrel/codec` | `0.0.5` | L1 | `@orkestrel/contract` `^0.0.18` | |
54
54
  | `@orkestrel/console` | `0.0.15` | L2 | `@orkestrel/emitter` `^0.0.11`, `@orkestrel/contract` `^0.0.18` | |
@@ -68,8 +68,8 @@ so network-controlled descriptions never enter agent instruction context.
68
68
  | `@orkestrel/msg` | `0.0.12` | L1 | `@orkestrel/contract` `^0.0.18` | |
69
69
  | `@orkestrel/ndjson` | `0.0.11` | L1 | `@orkestrel/contract` `^0.0.18` | |
70
70
  | `@orkestrel/ollama` | `0.0.20` | L6 | `@orkestrel/tool` `^0.0.18`, `@orkestrel/agent` `^0.0.25`, `@orkestrel/budget` `^0.0.12`, `@orkestrel/ndjson` `^0.0.11`, `@orkestrel/contract` `^0.0.19` | |
71
- | `@orkestrel/pool` | `0.0.15` | L2 | `@orkestrel/emitter` `^0.0.11`, `@orkestrel/contract` `^0.0.19` | |
72
- | `@orkestrel/probe` | `0.0.20` | L5 | `@orkestrel/lsp` `^0.0.10`, `@orkestrel/mcp` `^0.0.36`, `@orkestrel/tool` `^0.0.18`, `@orkestrel/queue` `^0.0.16`, `@orkestrel/emitter` `^0.0.11`, `@orkestrel/timeout` `^0.0.12`, `@orkestrel/contract` `^0.0.19` | `vitest` `^4.1.11`, `typescript` `^6.0.3` |
71
+ | `@orkestrel/pool` | `0.0.16` | L2 | `@orkestrel/emitter` `^0.0.11`, `@orkestrel/contract` `^0.0.19` | |
72
+ | `@orkestrel/probe` | `0.0.21` | L5 | `@orkestrel/lsp` `^0.0.10`, `@orkestrel/mcp` `^0.0.36`, `@orkestrel/pool` `^0.0.16`, `@orkestrel/tool` `^0.0.18`, `@orkestrel/emitter` `^0.0.11`, `@orkestrel/timeout` `^0.0.12`, `@orkestrel/contract` `^0.0.19` | `vitest` `^4.1.11`, `typescript` `^6.0.3` |
73
73
  | `@orkestrel/process` | `0.0.14` | L2 | `@orkestrel/emitter` `^0.0.11`, `@orkestrel/contract` `^0.0.18` | |
74
74
  | `@orkestrel/program` | `0.0.15` | L4 | `@orkestrel/rater` `^0.0.16`, `@orkestrel/reason` `^0.0.12`, `@orkestrel/emitter` `^0.0.11`, `@orkestrel/contract` `^0.0.18`, `@orkestrel/qualifier` `^0.0.16` | |
75
75
  | `@orkestrel/qualifier` | `0.0.16` | L3 | `@orkestrel/reason` `^0.0.12`, `@orkestrel/emitter` `^0.0.11`, `@orkestrel/contract` `^0.0.18` | |
@@ -78,7 +78,7 @@ so network-controlled descriptions never enter agent instruction context.
78
78
  | `@orkestrel/reason` | `0.0.12` | L2 | `@orkestrel/emitter` `^0.0.11`, `@orkestrel/contract` `^0.0.18` | |
79
79
  | `@orkestrel/relation` | `0.0.15` | L3 | `@orkestrel/emitter` `^0.0.11`, `@orkestrel/contract` `^0.0.19`, `@orkestrel/database` `^0.0.17` | |
80
80
  | `@orkestrel/router` | `0.0.16` | L2 | `@orkestrel/abort` `^0.0.12`, `@orkestrel/emitter` `^0.0.11`, `@orkestrel/contract` `^0.0.18` | |
81
- | `@orkestrel/scaffold` | `0.0.91` | L3 | `@orkestrel/console` `^0.0.15`, `@orkestrel/emitter` `^0.0.11`, `@orkestrel/process` `^0.0.14`, `@orkestrel/contract` `^0.0.19`, `@orkestrel/markdown` `^0.0.17`, `@orkestrel/template` `^0.0.9` | |
81
+ | `@orkestrel/scaffold` | `0.0.92` | L3 | `@orkestrel/console` `^0.0.15`, `@orkestrel/emitter` `^0.0.11`, `@orkestrel/process` `^0.0.14`, `@orkestrel/contract` `^0.0.19`, `@orkestrel/markdown` `^0.0.17`, `@orkestrel/template` `^0.0.9` | |
82
82
  | `@orkestrel/sea` | `0.0.18` | L3 | `@orkestrel/emitter` `^0.0.11`, `@orkestrel/process` `^0.0.14`, `@orkestrel/contract` `^0.0.18` | |
83
83
  | `@orkestrel/server` | `0.0.22` | L3 | `@orkestrel/abort` `^0.0.12`, `@orkestrel/codec` `^0.0.5`, `@orkestrel/router` `^0.0.16`, `@orkestrel/emitter` `^0.0.11`, `@orkestrel/timeout` `^0.0.12`, `@orkestrel/contract` `^0.0.19` | |
84
84
  | `@orkestrel/sqlite` | `0.0.14` | L1 | `@orkestrel/contract` `^0.0.19` | |
@@ -92,7 +92,7 @@ so network-controlled descriptions never enter agent instruction context.
92
92
  | `@orkestrel/tool` | `0.0.18` | L2 | `@orkestrel/emitter` `^0.0.11`, `@orkestrel/contract` `^0.0.19` | |
93
93
  | `@orkestrel/toolbox` | `0.0.17` | L6 | `@orkestrel/form` `^0.0.8`, `@orkestrel/tool` `^0.0.18`, `@orkestrel/agent` `^0.0.26`, `@orkestrel/server` `^0.0.22`, `@orkestrel/contract` `^0.0.19`, `@orkestrel/database` `^0.0.17`, `@orkestrel/relation` `^0.0.15`, `@orkestrel/terminal` `^0.0.18`, `@orkestrel/workflow` `^0.0.21`, `@orkestrel/workspace` `^0.0.11` | |
94
94
  | `@orkestrel/websocket` | `0.0.14` | L2 | `@orkestrel/emitter` `^0.0.11`, `@orkestrel/contract` `^0.0.18` | |
95
- | `@orkestrel/worker` | `0.0.15` | L4 | `@orkestrel/pool` `^0.0.14`, `@orkestrel/queue` `^0.0.16`, `@orkestrel/emitter` `^0.0.11`, `@orkestrel/contract` `^0.0.19`, `@orkestrel/database` `^0.0.17` | |
95
+ | `@orkestrel/worker` | `0.0.16` | L4 | `@orkestrel/pool` `^0.0.16`, `@orkestrel/queue` `^0.0.16`, `@orkestrel/emitter` `^0.0.11`, `@orkestrel/contract` `^0.0.19`, `@orkestrel/database` `^0.0.17` | |
96
96
  | `@orkestrel/workflow` | `0.0.21` | L4 | `@orkestrel/abort` `^0.0.12`, `@orkestrel/queue` `^0.0.16`, `@orkestrel/budget` `^0.0.12`, `@orkestrel/emitter` `^0.0.11`, `@orkestrel/timeout` `^0.0.12`, `@orkestrel/contract` `^0.0.19`, `@orkestrel/database` `^0.0.17` | |
97
97
  | `@orkestrel/workspace` | `0.0.11` | L3 | `@orkestrel/emitter` `^0.0.11`, `@orkestrel/contract` `^0.0.19`, `@orkestrel/database` `^0.0.17` | |
98
98
 
@@ -74,6 +74,11 @@ SCSS mirrors TypeScript centralization. Concrete token prefixes are project-spec
74
74
  for that framework and every `!important` declaration outside every layer. A derived build of that
75
75
  recreation for a utility library may place the framework's reset rules in `reset` under a switch
76
76
  the guide records, keeping every `!important` declaration outside every layer.
77
+ - A derived build of a recreation for a utility library may substitute the framework's token
78
+ literals (colors and scale values) with the utility library's theme values under a switch the guide
79
+ records, when a committed record maps every substituted literal to its source token and resolved
80
+ value and a proof reads the derived sheet against the framework's own compile from the mapped
81
+ bases; the substitution changes no selector, declaration order, or declaration count.
77
82
  - Declare cascade-layer order once in the consumer entry before `@import 'tailwindcss'`, so utilities win predictably. When a package publishes several sheets, open every published sheet with the same full order statement, so the order holds whichever sheet loads first.
78
83
  - Open `themes/index.scss` with `@use '../tokens'`, whose first emitted rule is the order statement, then `@use 'default'`; Sass refuses a `@use` after another rule, so never write the statement there literally.
79
84
 
@@ -226,6 +226,174 @@
226
226
  ]
227
227
  }
228
228
  },
229
+ {
230
+ "files": ["src/bootstrap/**/*.{cjs,cts,js,jsx,mjs,mts,ts,tsx,vue}"],
231
+ "rules": {
232
+ "no-restricted-imports": [
233
+ "error",
234
+ {
235
+ "patterns": [
236
+ {
237
+ "regex": "^(?:(?:vue|vite)(?:[/?#]|$)|@(?:vue|vitejs)/|@(?:src|app)/vue(?:[/?#]|$)|@orkestrel/[^/]+/vue(?:[/?#]|$)|(?:\\.\\./)+(?:vue|src/vue|app/vue)(?:[/?#]|$))",
238
+ "message": "src/bootstrap must not depend on Vue extension modules"
239
+ },
240
+ {
241
+ "regex": "^(?:/|[A-Za-z]:[\\\\/])",
242
+ "message": "imports must not use machine-specific absolute paths"
243
+ },
244
+ {
245
+ "regex": "^(?:[A-Za-mo-z][A-Za-z0-9+.-]*|n(?:[A-Za-np-z0-9+.-][A-Za-z0-9+.-]*)?|no(?:[A-Za-ce-z0-9+.-][A-Za-z0-9+.-]*)?|nod(?:[A-Za-df-z0-9+.-][A-Za-z0-9+.-]*)?|node[A-Za-z0-9+.-]+):",
246
+ "message": "imports must not use non-Node URL schemes"
247
+ },
248
+ {
249
+ "regex": "(?:^|/)(?:[^/.][^/]*|\\.[^/.][^/]*|\\.\\.[^/]+)/\\.{1,2}(?:/|$)",
250
+ "message": "internal import paths must not contain noncanonical dot segments"
251
+ },
252
+ {
253
+ "regex": "^(?:(?:\\./)+\\.\\.(?:/|$)|(?:\\.\\./)+(?:\\./)+)|//",
254
+ "message": "relative import paths must not contain normalized traversal segments"
255
+ },
256
+ {
257
+ "regex": "\\\\",
258
+ "message": "import paths must use portable forward slashes"
259
+ },
260
+ {
261
+ "regex": "^typescript(?:[/?#]|$)",
262
+ "message": "the in-process compiler API is not a surface the fleet uses"
263
+ },
264
+ {
265
+ "regex": "^(?:@app(?:[/?#]|$)|(?:\\.\\./)+app(?:[/?#]|$))",
266
+ "message": "src environments must not depend on private app modules"
267
+ },
268
+ {
269
+ "regex": "^(?:node:|(?:_(?:http_(?:agent|client|common|incoming|outgoing|server)|stream_(?:duplex|passthrough|readable|transform|wrap|writable)|tls_(?:common|wrap))|assert(?:/strict)?|async_hooks|buffer|child_process|cluster|console|constants|crypto|dgram|diagnostics_channel|dns(?:/promises)?|domain|events|fs(?:/promises)?|http|http2|https|inspector(?:/promises)?|module|net|os|path(?:/(?:posix|win32))?|perf_hooks|process|punycode|querystring|readline(?:/promises)?|repl|sqlite|stream(?:/(?:consumers|promises|web))?|string_decoder|sys|timers(?:/promises)?|tls|trace_events|tty|url|util(?:/types)?|v8|vm|wasi|worker_threads|zlib)(?:[/?#]|$)|@src/server(?:[/?#]|$)|@orkestrel/[^/]+/server(?:[/?#]|$)|(?:\\.\\./)+(?:server|src/server|app/server)(?:[/?#]|$))",
270
+ "message": "src/bootstrap must not depend on Node or server-only modules"
271
+ },
272
+ {
273
+ "regex": "^(?:@src/tailwindcss(?:[/?#]|$)|@orkestrel/[^/]+/tailwindcss(?:[/?#]|$)|(?:\\.\\./)+(?:tailwindcss|src/tailwindcss)(?:[/?#]|$))",
274
+ "message": "src/bootstrap must not import another styles face's TypeScript"
275
+ },
276
+ {
277
+ "regex": "^(?:@src/styles(?:[/?#]|$)|@orkestrel/[^/]+/styles(?:[/?#]|$)|(?:\\.\\./)+(?:styles|src/styles)(?:[/?#]|$))",
278
+ "message": "src/bootstrap must not import another styles face's TypeScript"
279
+ }
280
+ ]
281
+ }
282
+ ]
283
+ }
284
+ },
285
+ {
286
+ "files": ["src/tailwindcss/**/*.{cjs,cts,js,jsx,mjs,mts,ts,tsx,vue}"],
287
+ "rules": {
288
+ "no-restricted-imports": [
289
+ "error",
290
+ {
291
+ "patterns": [
292
+ {
293
+ "regex": "^(?:(?:vue|vite)(?:[/?#]|$)|@(?:vue|vitejs)/|@(?:src|app)/vue(?:[/?#]|$)|@orkestrel/[^/]+/vue(?:[/?#]|$)|(?:\\.\\./)+(?:vue|src/vue|app/vue)(?:[/?#]|$))",
294
+ "message": "src/tailwindcss must not depend on Vue extension modules"
295
+ },
296
+ {
297
+ "regex": "^(?:/|[A-Za-z]:[\\\\/])",
298
+ "message": "imports must not use machine-specific absolute paths"
299
+ },
300
+ {
301
+ "regex": "^(?:[A-Za-mo-z][A-Za-z0-9+.-]*|n(?:[A-Za-np-z0-9+.-][A-Za-z0-9+.-]*)?|no(?:[A-Za-ce-z0-9+.-][A-Za-z0-9+.-]*)?|nod(?:[A-Za-df-z0-9+.-][A-Za-z0-9+.-]*)?|node[A-Za-z0-9+.-]+):",
302
+ "message": "imports must not use non-Node URL schemes"
303
+ },
304
+ {
305
+ "regex": "(?:^|/)(?:[^/.][^/]*|\\.[^/.][^/]*|\\.\\.[^/]+)/\\.{1,2}(?:/|$)",
306
+ "message": "internal import paths must not contain noncanonical dot segments"
307
+ },
308
+ {
309
+ "regex": "^(?:(?:\\./)+\\.\\.(?:/|$)|(?:\\.\\./)+(?:\\./)+)|//",
310
+ "message": "relative import paths must not contain normalized traversal segments"
311
+ },
312
+ {
313
+ "regex": "\\\\",
314
+ "message": "import paths must use portable forward slashes"
315
+ },
316
+ {
317
+ "regex": "^typescript(?:[/?#]|$)",
318
+ "message": "the in-process compiler API is not a surface the fleet uses"
319
+ },
320
+ {
321
+ "regex": "^(?:@app(?:[/?#]|$)|(?:\\.\\./)+app(?:[/?#]|$))",
322
+ "message": "src environments must not depend on private app modules"
323
+ },
324
+ {
325
+ "regex": "^(?:node:|(?:_(?:http_(?:agent|client|common|incoming|outgoing|server)|stream_(?:duplex|passthrough|readable|transform|wrap|writable)|tls_(?:common|wrap))|assert(?:/strict)?|async_hooks|buffer|child_process|cluster|console|constants|crypto|dgram|diagnostics_channel|dns(?:/promises)?|domain|events|fs(?:/promises)?|http|http2|https|inspector(?:/promises)?|module|net|os|path(?:/(?:posix|win32))?|perf_hooks|process|punycode|querystring|readline(?:/promises)?|repl|sqlite|stream(?:/(?:consumers|promises|web))?|string_decoder|sys|timers(?:/promises)?|tls|trace_events|tty|url|util(?:/types)?|v8|vm|wasi|worker_threads|zlib)(?:[/?#]|$)|@src/server(?:[/?#]|$)|@orkestrel/[^/]+/server(?:[/?#]|$)|(?:\\.\\./)+(?:server|src/server|app/server)(?:[/?#]|$))",
326
+ "message": "src/tailwindcss must not depend on Node or server-only modules"
327
+ },
328
+ {
329
+ "regex": "^(?:@src/bootstrap(?:[/?#]|$)|@orkestrel/[^/]+/bootstrap(?:[/?#]|$)|(?:\\.\\./)+(?:bootstrap|src/bootstrap)(?:[/?#]|$))",
330
+ "message": "src/tailwindcss must not import another styles face's TypeScript"
331
+ },
332
+ {
333
+ "regex": "^(?:@src/styles(?:[/?#]|$)|@orkestrel/[^/]+/styles(?:[/?#]|$)|(?:\\.\\./)+(?:styles|src/styles)(?:[/?#]|$))",
334
+ "message": "src/tailwindcss must not import another styles face's TypeScript"
335
+ }
336
+ ]
337
+ }
338
+ ]
339
+ }
340
+ },
341
+ {
342
+ "files": ["src/styles/**/*.{cjs,cts,js,jsx,mjs,mts,ts,tsx,vue}"],
343
+ "rules": {
344
+ "no-restricted-imports": [
345
+ "error",
346
+ {
347
+ "patterns": [
348
+ {
349
+ "regex": "^(?:(?:vue|vite)(?:[/?#]|$)|@(?:vue|vitejs)/|@(?:src|app)/vue(?:[/?#]|$)|@orkestrel/[^/]+/vue(?:[/?#]|$)|(?:\\.\\./)+(?:vue|src/vue|app/vue)(?:[/?#]|$))",
350
+ "message": "src/styles must not depend on Vue extension modules"
351
+ },
352
+ {
353
+ "regex": "^(?:/|[A-Za-z]:[\\\\/])",
354
+ "message": "imports must not use machine-specific absolute paths"
355
+ },
356
+ {
357
+ "regex": "^(?:[A-Za-mo-z][A-Za-z0-9+.-]*|n(?:[A-Za-np-z0-9+.-][A-Za-z0-9+.-]*)?|no(?:[A-Za-ce-z0-9+.-][A-Za-z0-9+.-]*)?|nod(?:[A-Za-df-z0-9+.-][A-Za-z0-9+.-]*)?|node[A-Za-z0-9+.-]+):",
358
+ "message": "imports must not use non-Node URL schemes"
359
+ },
360
+ {
361
+ "regex": "(?:^|/)(?:[^/.][^/]*|\\.[^/.][^/]*|\\.\\.[^/]+)/\\.{1,2}(?:/|$)",
362
+ "message": "internal import paths must not contain noncanonical dot segments"
363
+ },
364
+ {
365
+ "regex": "^(?:(?:\\./)+\\.\\.(?:/|$)|(?:\\.\\./)+(?:\\./)+)|//",
366
+ "message": "relative import paths must not contain normalized traversal segments"
367
+ },
368
+ {
369
+ "regex": "\\\\",
370
+ "message": "import paths must use portable forward slashes"
371
+ },
372
+ {
373
+ "regex": "^typescript(?:[/?#]|$)",
374
+ "message": "the in-process compiler API is not a surface the fleet uses"
375
+ },
376
+ {
377
+ "regex": "^(?:@app(?:[/?#]|$)|(?:\\.\\./)+app(?:[/?#]|$))",
378
+ "message": "src environments must not depend on private app modules"
379
+ },
380
+ {
381
+ "regex": "^(?:node:|(?:_(?:http_(?:agent|client|common|incoming|outgoing|server)|stream_(?:duplex|passthrough|readable|transform|wrap|writable)|tls_(?:common|wrap))|assert(?:/strict)?|async_hooks|buffer|child_process|cluster|console|constants|crypto|dgram|diagnostics_channel|dns(?:/promises)?|domain|events|fs(?:/promises)?|http|http2|https|inspector(?:/promises)?|module|net|os|path(?:/(?:posix|win32))?|perf_hooks|process|punycode|querystring|readline(?:/promises)?|repl|sqlite|stream(?:/(?:consumers|promises|web))?|string_decoder|sys|timers(?:/promises)?|tls|trace_events|tty|url|util(?:/types)?|v8|vm|wasi|worker_threads|zlib)(?:[/?#]|$)|@src/server(?:[/?#]|$)|@orkestrel/[^/]+/server(?:[/?#]|$)|(?:\\.\\./)+(?:server|src/server|app/server)(?:[/?#]|$))",
382
+ "message": "src/styles must not depend on Node or server-only modules"
383
+ },
384
+ {
385
+ "regex": "^(?:@src/bootstrap(?:[/?#]|$)|@orkestrel/[^/]+/bootstrap(?:[/?#]|$)|(?:\\.\\./)+(?:bootstrap|src/bootstrap)(?:[/?#]|$))",
386
+ "message": "src/styles must not import another styles face's TypeScript"
387
+ },
388
+ {
389
+ "regex": "^(?:@src/tailwindcss(?:[/?#]|$)|@orkestrel/[^/]+/tailwindcss(?:[/?#]|$)|(?:\\.\\./)+(?:tailwindcss|src/tailwindcss)(?:[/?#]|$))",
390
+ "message": "src/styles must not import another styles face's TypeScript"
391
+ }
392
+ ]
393
+ }
394
+ ]
395
+ }
396
+ },
229
397
  {
230
398
  "files": ["src/vue/**/*.{cjs,cts,js,jsx,mjs,mts,ts,tsx,vue}"],
231
399
  "rules": {