@orkestrel/scaffold 0.0.102 → 0.0.104

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 (89) hide show
  1. package/dist/agents/skills/orkestrel-dispatch/scripts/helpers.js +84 -1
  2. package/dist/agents/skills/orkestrel-dispatch/scripts/launch.js +21 -6
  3. package/dist/agents/skills/orkestrel-harden/scripts/titles.js +338 -0
  4. package/dist/agents/skills/orkestrel-publish/scripts/swap.js +3 -39
  5. package/dist/agents/skills/orkestrel-publish/scripts/wave.js +433 -47
  6. package/dist/agents/skills/orkestrel-publish/scripts/window.js +2 -1
  7. package/dist/bin/main.js +16 -9
  8. package/dist/bin/main.js.map +1 -1
  9. package/dist/host/agents/orchestration.md +3 -3
  10. package/dist/host/agents/skills/enterprise-bootstrap/references/components.md +2 -2
  11. package/dist/host/agents/skills/enterprise-bootstrap/references/inspection.md +1 -1
  12. package/dist/host/agents/skills/orkestrel-build/SKILL.md +2 -2
  13. package/dist/host/agents/skills/orkestrel-debrief/SKILL.md +2 -2
  14. package/dist/host/agents/skills/orkestrel-debrief/references/field-testing.md +1 -1
  15. package/dist/host/agents/skills/orkestrel-debrief/references/instruction-audit.md +3 -3
  16. package/dist/host/agents/skills/orkestrel-dispatch/SKILL.md +10 -10
  17. package/dist/host/agents/skills/orkestrel-dispatch/references/launch.md +1 -0
  18. package/dist/host/agents/skills/orkestrel-dispatch/scripts/helpers.ts +100 -1
  19. package/dist/host/agents/skills/orkestrel-dispatch/scripts/launch.ts +27 -6
  20. package/dist/host/agents/skills/orkestrel-falsify/SKILL.md +4 -4
  21. package/dist/host/agents/skills/orkestrel-falsify/agents/openai.yaml +1 -1
  22. package/dist/host/agents/skills/orkestrel-falsify/references/brief.md +8 -7
  23. package/dist/host/agents/skills/orkestrel-falsify/references/reconcile.md +6 -6
  24. package/dist/host/agents/skills/orkestrel-harden/SKILL.md +6 -1
  25. package/dist/host/agents/skills/orkestrel-harden/references/bindings.md +1700 -0
  26. package/dist/host/agents/skills/orkestrel-harden/references/contract.md +2 -2
  27. package/dist/host/agents/skills/orkestrel-harden/references/equivalence.md +48 -0
  28. package/dist/host/agents/skills/orkestrel-harden/references/hardening.md +4 -2
  29. package/dist/host/agents/skills/orkestrel-harden/scripts/titles.ts +425 -0
  30. package/dist/host/agents/skills/orkestrel-journey/SKILL.md +2 -2
  31. package/dist/host/agents/skills/orkestrel-journey/references/captures.md +9 -8
  32. package/dist/host/agents/skills/orkestrel-polish/SKILL.md +3 -3
  33. package/dist/host/agents/skills/orkestrel-publish/SKILL.md +2 -2
  34. package/dist/host/agents/skills/orkestrel-publish/references/release.md +1 -0
  35. package/dist/host/agents/skills/orkestrel-publish/references/wave.md +56 -13
  36. package/dist/host/agents/skills/orkestrel-publish/references/window.md +6 -6
  37. package/dist/host/agents/skills/orkestrel-publish/scripts/swap.ts +5 -49
  38. package/dist/host/agents/skills/orkestrel-publish/scripts/wave.ts +646 -49
  39. package/dist/host/agents/skills/orkestrel-publish/scripts/window.ts +2 -1
  40. package/dist/host/agents/transports/codex.md +1 -1
  41. package/dist/host/claude/agents/orkestrel.md +54 -53
  42. package/dist/host/claude/agents/reviewer.md +4 -4
  43. package/dist/host/claude/rules/documentation.md +2 -1
  44. package/dist/host/claude/rules/patterns.md +1 -1
  45. package/dist/host/claude/rules/quality.md +2 -2
  46. package/dist/host/claude/rules/styles.md +1 -1
  47. package/dist/host/claude/rules/tests.md +34 -8
  48. package/dist/host/claude/rules/typescript.md +29 -0
  49. package/dist/host/claude/rules/workspace.md +35 -28
  50. package/dist/host/claude/rules/writing.md +34 -26
  51. package/dist/host/claude/settings.json +2 -0
  52. package/dist/host/claude/skills/orkestrel-debrief/SKILL.md +1 -1
  53. package/dist/host/claude/skills/orkestrel-falsify/SKILL.md +1 -1
  54. package/dist/host/codex/agents/analyst.toml +3 -3
  55. package/dist/host/codex/agents/reviewer.toml +4 -4
  56. package/dist/host/configs/helpers.ts +4 -16
  57. package/dist/host/configs/policy.ts +13 -2
  58. package/dist/host/dotfiles/editorconfig +0 -1
  59. package/dist/host/dotfiles/gitattributes +0 -1
  60. package/dist/host/dotfiles/gitignore +0 -1
  61. package/dist/host/dotfiles/oxlintrc.json +25 -11
  62. package/dist/host/guides/agent.md +1638 -598
  63. package/dist/host/guides/budget.md +89 -29
  64. package/dist/host/guides/form.md +477 -91
  65. package/dist/host/guides/mcp.md +14 -2
  66. package/dist/host/guides/ollama.md +97 -73
  67. package/dist/host/guides/probe.md +1 -1
  68. package/dist/host/guides/scaffold.md +158 -101
  69. package/dist/host/guides/study.md +2635 -0
  70. package/dist/host/guides/table.md +225 -15
  71. package/dist/host/guides/terminal.md +22 -20
  72. package/dist/host/guides/test.md +689 -255
  73. package/dist/host/manifest.json +88 -64
  74. package/dist/host/tests/config.test.ts +189 -146
  75. package/dist/host/tests/policy.test.ts +39 -1
  76. package/dist/host/tests/setupPolicy.ts +104 -57
  77. package/dist/src/core/index.cjs +1387 -611
  78. package/dist/src/core/index.cjs.map +1 -1
  79. package/dist/src/core/index.d.cts +35 -20
  80. package/dist/src/core/index.d.ts +35 -20
  81. package/dist/src/core/index.js +1385 -612
  82. package/dist/src/core/index.js.map +1 -1
  83. package/dist/src/server/index.cjs +12 -12
  84. package/dist/src/server/index.cjs.map +1 -1
  85. package/dist/src/server/index.d.cts +12 -12
  86. package/dist/src/server/index.d.ts +12 -12
  87. package/dist/src/server/index.js +12 -12
  88. package/dist/src/server/index.js.map +1 -1
  89. package/package.json +4 -4
@@ -61,32 +61,40 @@
61
61
 
62
62
  ## Substitutions
63
63
 
64
- Replace each term with its replacement. A code identifier and a string inside a fence or a fixture are data and exempt.
65
-
66
- | Term | Replacement |
67
- | ---------------------------------- | -------------------------------------------- |
68
- | `should` | `must`, `can`, `might`, or the imperative |
69
- | `simply`, `easy`, `just` | Delete |
70
- | `currently`, `now` | Delete, or give the date |
71
- | `new`, `latest` | Delete, or give the version |
72
- | `utilize`, `leverage` | `use` |
73
- | `via` | `through`, `by using` |
74
- | `in order to` | `to` |
75
- | `e.g.`, `i.e.` | `for example`, `that is` |
76
- | `etc.` | Bound the list, or recast the sentence |
77
- | `performant`, `robust` | The measured property |
78
- | `allows you to` | `lets you` |
79
- | `and/or` | `and`, `or`, or `both` |
80
- | `since` (causal) | `because` |
81
- | `once` (temporal) | `after` |
82
- | `above`, `below` (cross-reference) | `preceding`, `following`, `earlier`, `later` |
83
- | `please` | Delete |
84
- | `sanity check` | `quick check` |
85
- | `dummy` | `placeholder` |
86
- | `blacklist`, `whitelist` | `denylist`, `allowlist` |
87
- | `master`, `slave` | `primary`, `replica` |
88
-
89
- - `policy/no-banned-term` reads comments and the prose sweep in `tests/setupPolicy.ts` reads authored Markdown; each matches the rows banned unconditionally. Rule a hit in `now`, `new`, `latest`, `once`, `since`, `above`, `below`, or `master` yourself by the banned sense.
64
+ Replace each term with its replacement. A code identifier, an API name, and a string inside a fence or a fixture are data and exempt.
65
+
66
+ | Term | Replacement |
67
+ | --------------------------------------- | --------------------------------------------------------------- |
68
+ | `should` | `must`, `can`, `might`, or the imperative |
69
+ | `simply`, `easy`, `just` | Delete |
70
+ | `currently`, `now` | Delete, or give the date |
71
+ | `new`, `latest` | Delete, or give the version |
72
+ | `utilize`, `leverage` | `use` |
73
+ | `via` | `through`, `by using` |
74
+ | `in order to` | `to` |
75
+ | `e.g.`, `i.e.` | `for example`, `that is` |
76
+ | `etc.` | Bound the list, or recast the sentence |
77
+ | `performant`, `robust` | The measured property |
78
+ | `allows you to` | `lets you` |
79
+ | `and/or` | `and`, `or`, or `both` |
80
+ | `since` (causal) | `because` |
81
+ | `once` (temporal) | `after` |
82
+ | `above`, `below` (cross-reference) | `preceding`, `following`, `earlier`, `later` |
83
+ | `please` | Delete |
84
+ | `sanity check` | `quick check` |
85
+ | `dummy` | `placeholder` |
86
+ | `blacklist`, `whitelist` | `denylist`, `allowlist` |
87
+ | `master`, `slave` | `primary`, `replica` |
88
+ | `hostile`, `adversarial` (input, value) | `malformed`, `unexpected`, or `untrusted` |
89
+ | `adversarial` (review, round, audit) | `independent` or `skeptical` |
90
+ | `attack`, `break` (a claim) | `test` or `falsify` |
91
+ | `forge` | `fabricate`, `fake`, or `does not match` |
92
+ | `bypass` | `skip`, or recast as reaching one thing without passing another |
93
+ | `poison` | `corrupt`, `invalidate`, or `stale` |
94
+ | `escape` (a root, a sandbox) | `read outside` or `resolve outside` |
95
+ | `exploit`, `payload` (attack sense) | Name the defect, or `input` |
96
+
97
+ - `policy/no-banned-term` reads comments and the prose sweep in `tests/setupPolicy.ts` reads authored Markdown; each matches the rows banned unconditionally. Rule a hit in `now`, `new`, `latest`, `once`, `since`, `above`, `below`, `master`, `hostile`, `adversarial`, `attack`, `break`, `forge`, `bypass`, `poison`, `escape`, `exploit`, or `payload` yourself by the banned sense.
90
98
  - Sweep case-insensitively and across inflections. Name the pattern and the paths behind every sweep result.
91
99
  - Write singular `they` for a person of unstated gender.
92
100
  - `.claude/rules/names.md` § Fixed lifecycle vocabulary owns `execute`, `abort`, `kill`, `terminate`, and `run`.
@@ -183,6 +183,8 @@
183
183
  "Bash(npm run test:guides *)",
184
184
  "Bash(npm run test:conformance)",
185
185
  "Bash(npm run test:conformance *)",
186
+ "Bash(npm run test:tree)",
187
+ "Bash(npm run test:tree *)",
186
188
  "Bash(npm run test:integration)",
187
189
  "Bash(npm run test:integration *)",
188
190
  "Bash(npm run test:distribution)",
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: orkestrel-debrief
3
- description: Look back at a long campaign to learn from its mistakes and successes and improve the agents, rules, skills, and processes that ran it. Use after a campaign or milestone closes to run the retrospective - field evidence, layer and boundary audits, package promotion, an adversarial audit of the instruction set itself, process doctrine - and to land every learning as a refinement that propagates, then retire the campaign folder.
3
+ description: Look back at a long campaign to learn from its mistakes and successes and improve the agents, rules, skills, and processes that ran it. Use after a campaign or milestone closes to run the retrospective - field evidence, layer and boundary audits, package promotion, an independent audit of the instruction set itself, process doctrine - and to land every learning as a refinement that propagates, then retire the campaign folder.
4
4
  ---
5
5
 
6
6
  # Load the canonical workflow
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: orkestrel-falsify
3
3
  description: >-
4
- Run one adversarial audit round against finished work: write the subject as numbered falsifiable claims, dispatch independent auditors instructed to break them, reconcile their evidence, and rule. Use when the size gate in `.agents/orchestration.md` names a review, before a fix round is accepted, before a version bump or publication, or when a defect has recurred across rounds. Do not use it for a small change, a mechanical rename, or a round with no added or repaired claim to attack.
4
+ Run one skeptical audit round against finished work: write the subject as numbered falsifiable claims, dispatch independent auditors instructed to falsify them, reconcile their evidence, and rule. Use when the size gate in `.agents/orchestration.md` names a review, before a fix round is accepted, before a version bump or publication, or when a defect has recurred across rounds. Do not use it for a small change, a mechanical rename, or a round with no added or repaired claim to test.
5
5
  ---
6
6
 
7
7
  # Load the canonical workflow
@@ -12,12 +12,12 @@ Hold the lane the dispatch names and say which: objective (correctness under adv
12
12
  what the contracts and installed declarations permit, dependency and range truth, test
13
13
  sufficiency, the letter of the rules) or subjective (shape, naming, ergonomics, design fit).
14
14
 
15
- Attack each numbered claim with a concrete input, state, or interleaving. Before confirming a
16
- claim about a proof, name the mutation that would make the proof fail and whether the assertions
15
+ Try to falsify each numbered claim with a concrete input, state, or interleaving. Before
16
+ confirming a claim about a proof, name the mutation that would make the proof fail and whether the assertions
17
17
  distinguish it. Rule a claim whose only evidence is the writer's report UNRESOLVED. Mark a
18
18
  rendered-surface claim the capture cannot show NOT-EVIDENCED.
19
19
 
20
20
  Return the orkestrel-falsify verdict shape: numbered verdicts with evidence, findings outside the
21
- claims, attacked-and-held, one terminal line. Never edit, implement, reconcile, accept, or spawn.
21
+ claims, tested-and-held, one terminal line. Never edit, implement, reconcile, accept, or spawn.
22
22
  Your final message is the verdict.
23
23
  """
@@ -4,7 +4,7 @@ model = "gpt-6-astra"
4
4
  model_reasoning_effort = "high"
5
5
  sandbox_mode = "read-only"
6
6
  developer_instructions = """
7
- Review one dispatched unit on GPT-6 Astra by trying to break its claims. Use read-only inspection
7
+ Review one dispatched unit on GPT-6 Astra by trying to falsify its claims. Use read-only inspection
8
8
  commands. Never edit, run a mutating command, or spawn. Use a clean context; never review work you wrote.
9
9
 
10
10
  Read the claims file, the actual diff and git status --porcelain the dispatch supplies,
@@ -16,14 +16,14 @@ names and boundaries, the right layer, each concept's purpose, guide parity. Obj
16
16
  correctness under adverse orderings, what contracts and installed declarations permit,
17
17
  dependency and range truth, test sufficiency, and the letter of the rules.
18
18
 
19
- Attack each claim with a concrete input, state, or interleaving. Before confirming a proof,
20
- name the mutation that would make it fail and whether its assertions distinguish it. Rule a
19
+ Try to falsify each claim with a concrete input, state, or interleaving. Before confirming a
20
+ proof, name the mutation that would make it fail and whether its assertions distinguish it. Rule a
21
21
  claim whose only evidence is the writer's report UNRESOLVED. Cite a capture for every rendered
22
22
  surface claim; mark what the portfolio cannot show NOT-EVIDENCED. Refer a question outside your
23
23
  lane to the other lane or the Orchestrator with evidence; never rule on it. Treat a bench finding
24
24
  as a proposal to test against the code, never as authority.
25
25
 
26
26
  Return the orkestrel-falsify verdict shape: numbered verdicts with evidence, findings outside the
27
- claims, attacked-and-held, one terminal line. Each required change carries file:line, what is
27
+ claims, tested-and-held, one terminal line. Each required change carries file:line, what is
28
28
  wrong, and what right looks like. Nothing else. Your final message is the verdict.
29
29
  """
@@ -911,9 +911,8 @@ export function declarationRollup(options: DeclarationRollupOptions): Plugin {
911
911
  ])
912
912
  const entry = resolvePath(scratch, relative(scope.root, declaration))
913
913
  // A literal `import()` of the extractor reddens `tsc` in a workspace that does not
914
- // install it, and a variable specifier reddens `import/no-dynamic-require`, so the
915
- // literal `createRequire` call is the form that clears every gate in an app-only
916
- // workspace.
914
+ // install it, so the literal `createRequire` call is the form that clears the
915
+ // typecheck in an app-only workspace.
917
916
  const loaded: unknown = load('@microsoft/api-extractor')
918
917
  if (!isExtractorModule(loaded)) {
919
918
  throw new Error(
@@ -999,19 +998,8 @@ export async function environmentAssetSources(
999
998
  : specifier.type === 'TemplateLiteral' && specifier.expressions.length === 0
1000
999
  ? specifier.quasis.map((quasi) => quasi.value.cooked ?? quasi.value.raw).join('')
1001
1000
  : undefined
1002
- if (value === undefined) {
1003
- const location = workspacePath(path)
1004
- if (
1005
- location !== undefined &&
1006
- /^(?:src\/server\/artifacts\/|tools\/artifacts\/|\.orkestrel\/[^/]+\/instruments\/(?:[^/]+\/)*tools\/artifacts\/).+\.(?:js|mjs|ts|mts)$/.test(
1007
- location,
1008
- )
1009
- )
1010
- return
1011
- throw new Error(
1012
- '[orkestrel-environment-boundary] Dynamic imports must use static string values',
1013
- )
1014
- }
1001
+ // A computed specifier names no module to inspect statically.
1002
+ if (value === undefined) return
1015
1003
  const decoded = decodeAssetSource(value)
1016
1004
  if (decoded === undefined) {
1017
1005
  throw new Error('[orkestrel-environment-boundary] Module URLs must use valid URI encoding')
@@ -386,8 +386,9 @@ export const POLICY_BANNED_TERMS: readonly PolicyTerm[] = Object.freeze([
386
386
  *
387
387
  * @remarks
388
388
  * Each row carries a permitted sense: a date value, a version value, a causal clause, the name a
389
- * replication topology takes, and a comparative or spatial relation. The currency check proves each
390
- * row is registered here.
389
+ * replication topology takes, a comparative or spatial relation, and a literal engineering term such
390
+ * as a string escape, a loop `break`, or a request payload. The currency check proves each row is
391
+ * registered here.
391
392
  */
392
393
  export const POLICY_JUDGED_TERMS: readonly string[] = Object.freeze([
393
394
  'now',
@@ -398,6 +399,16 @@ export const POLICY_JUDGED_TERMS: readonly string[] = Object.freeze([
398
399
  'above',
399
400
  'below',
400
401
  'master',
402
+ 'hostile',
403
+ 'adversarial',
404
+ 'attack',
405
+ 'break',
406
+ 'forge',
407
+ 'bypass',
408
+ 'poison',
409
+ 'escape',
410
+ 'exploit',
411
+ 'payload',
401
412
  ])
402
413
 
403
414
  /** Returns the file name a policy rule keys on, read from either host separator. */
@@ -14,4 +14,3 @@ indent_size = 2
14
14
 
15
15
  [*.md]
16
16
  trim_trailing_whitespace = false
17
-
@@ -1,3 +1,2 @@
1
1
  # Enforce LF line endings everywhere — prevents CRLF/LF churn on Windows
2
2
  * text=auto eol=lf
3
-
@@ -47,4 +47,3 @@ playwright-report/
47
47
 
48
48
  # Agent worktrees (created by an isolated subagent dispatch, never committed)
49
49
  .claude/worktrees/
50
-
@@ -38,7 +38,7 @@
38
38
  ],
39
39
 
40
40
  "import/no-default-export": "error",
41
- "import/no-dynamic-require": ["error", { "esmodule": true }],
41
+ "import/no-dynamic-require": ["error", { "esmodule": false }],
42
42
  "import/extensions": "off",
43
43
  "import/no-unassigned-import": [
44
44
  "error",
@@ -70,16 +70,6 @@
70
70
  "restriction": "off"
71
71
  },
72
72
  "overrides": [
73
- {
74
- "files": [
75
- "src/server/artifacts/**/*.{js,mjs,ts,mts}",
76
- "tools/artifacts/**/*.{js,mjs,ts,mts}",
77
- ".orkestrel/*/instruments/**/tools/artifacts/**/*.{js,mjs,ts,mts}"
78
- ],
79
- "rules": {
80
- "import/no-dynamic-require": ["error", { "esmodule": false }]
81
- }
82
- },
83
73
  {
84
74
  "files": ["*.config.ts", "*.config.js"],
85
75
  "rules": {
@@ -230,6 +220,10 @@
230
220
  {
231
221
  "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)(?:[/?#]|$))",
232
222
  "message": "src/browser must not depend on Node or server-only modules"
223
+ },
224
+ {
225
+ "regex": "^(?:\\.\\./)+(?:src/)?core(?:[/?#]|$)",
226
+ "message": "src/browser must import src/core through the @src/core alias"
233
227
  }
234
228
  ]
235
229
  }
@@ -446,6 +440,14 @@
446
440
  {
447
441
  "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)(?:[/?#]|$))",
448
442
  "message": "src/vue must not depend on Node or server-only modules"
443
+ },
444
+ {
445
+ "regex": "^(?:\\.\\./)+(?:src/)?core(?:[/?#]|$)",
446
+ "message": "src/vue must import src/core through the @src/core alias"
447
+ },
448
+ {
449
+ "regex": "^(?:\\.\\./)+(?:src/)?browser(?:[/?#]|$)",
450
+ "message": "src/vue must import src/browser through the @src/browser alias"
449
451
  }
450
452
  ]
451
453
  }
@@ -498,6 +500,10 @@
498
500
  {
499
501
  "regex": "^(?:(?:vue|vite)(?:[/?#]|$)|@(?:vue|vitejs)/|@src/browser(?:[/?#]|$)|@orkestrel/[^/]+/browser(?:[/?#]|$)|(?:\\.\\./)+(?:browser|src/browser|app/browser)(?:[/?#]|$))",
500
502
  "message": "src/server must not depend on Vue or browser-only modules"
503
+ },
504
+ {
505
+ "regex": "^(?:\\.\\./)+(?:src/)?core(?:[/?#]|$)",
506
+ "message": "src/server must import src/core through the @src/core alias"
501
507
  }
502
508
  ]
503
509
  }
@@ -730,6 +736,14 @@
730
736
  {
731
737
  "regex": "^(?:(?:vue|vite)(?:[/?#]|$)|@(?:vue|vitejs)/|@src/(?:browser|vue)(?:[/?#]|$)|@orkestrel/[^/]+/(?:browser|vue)(?:[/?#]|$)|(?:\\.\\./)+(?:browser|vue|src/(?:browser|vue)|app/browser)(?:[/?#]|$))",
732
738
  "message": "src/bin must not depend on browser-only modules"
739
+ },
740
+ {
741
+ "regex": "^(?:\\.\\./)+(?:src/)?core(?:[/?#]|$)",
742
+ "message": "src/bin must import src/core through the @src/core alias"
743
+ },
744
+ {
745
+ "regex": "^(?:\\.\\./)+(?:src/)?server(?:[/?#]|$)",
746
+ "message": "src/bin must import src/server through the @src/server alias"
733
747
  }
734
748
  ]
735
749
  }