@orkestrel/scaffold 0.0.107 → 0.0.108

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 (42) hide show
  1. package/dist/agents/skills/orkestrel-dispatch/scripts/sweep.js +124 -4
  2. package/dist/bin/main.js +1 -1
  3. package/dist/bin/main.js.map +1 -1
  4. package/dist/host/AGENTS.md +5 -1
  5. package/dist/host/agents/orchestration.md +60 -45
  6. package/dist/host/agents/platforms/posix.md +15 -0
  7. package/dist/host/agents/platforms/windows.md +37 -0
  8. package/dist/host/agents/skills/orkestrel-debrief/references/retention.md +10 -10
  9. package/dist/host/agents/skills/orkestrel-dispatch/SKILL.md +6 -5
  10. package/dist/host/agents/skills/orkestrel-dispatch/references/launch.md +12 -8
  11. package/dist/host/agents/skills/orkestrel-dispatch/scripts/sweep.ts +144 -4
  12. package/dist/host/agents/skills/orkestrel-parallel/SKILL.md +67 -10
  13. package/dist/host/agents/skills/orkestrel-parallel/agents/openai.yaml +2 -2
  14. package/dist/host/agents/skills/orkestrel-parallel/references/claude.md +32 -0
  15. package/dist/host/agents/skills/orkestrel-parallel/references/codex.md +28 -0
  16. package/dist/host/agents/skills/orkestrel-parallel/references/cursor.md +29 -0
  17. package/dist/host/agents/skills/orkestrel-parallel/references/t3.md +31 -0
  18. package/dist/host/agents/skills/orkestrel-publish/references/wave.md +2 -1
  19. package/dist/host/agents/transports/codex.md +1 -1
  20. package/dist/host/claude/AGENTS.md +6 -9
  21. package/dist/host/claude/rules/campaign.md +55 -0
  22. package/dist/host/claude/rules/documentation.md +2 -0
  23. package/dist/host/claude/rules/portability.md +1 -2
  24. package/dist/host/claude/rules/typescript.md +1 -1
  25. package/dist/host/claude/rules/writing.md +5 -2
  26. package/dist/host/claude/skills/orkestrel-parallel/SKILL.md +1 -1
  27. package/dist/host/codex/config.toml +3 -3
  28. package/dist/host/configs/policy.ts +106 -1
  29. package/dist/host/cursor/rules/orchestration.mdc +1 -0
  30. package/dist/host/dotfiles/oxlintrc.json +4 -2
  31. package/dist/host/guides/scaffold.md +56 -1
  32. package/dist/host/manifest.json +64 -27
  33. package/dist/host/tests/config.test.ts +560 -5
  34. package/dist/host/tests/setupPolicy.ts +496 -6
  35. package/dist/src/core/index.cjs +26 -2
  36. package/dist/src/core/index.cjs.map +1 -1
  37. package/dist/src/core/index.d.cts +1 -1
  38. package/dist/src/core/index.d.ts +1 -1
  39. package/dist/src/core/index.js +26 -2
  40. package/dist/src/core/index.js.map +1 -1
  41. package/package.json +1 -1
  42. package/dist/host/agents/skills/orkestrel-parallel/references/harnesses.md +0 -19
@@ -45,6 +45,18 @@ export interface PolicySource {
45
45
  readonly content: string
46
46
  }
47
47
 
48
+ /** Pairs a collected Vue import fixture with its native and independent restriction outcomes. */
49
+ export interface PolicyVueImportCase extends PolicySource {
50
+ readonly boundary: boolean
51
+ readonly restricted: boolean
52
+ }
53
+
54
+ /** Pairs a collected composable fixture with its placement and domain outcomes. */
55
+ export interface PolicyVueDomainCase extends PolicySource {
56
+ readonly misplaced: boolean
57
+ readonly malformed: boolean
58
+ }
59
+
48
60
  /** Describes one policy failure the sweep reports. */
49
61
  export interface PolicyViolation {
50
62
  readonly rule: PolicyRule
@@ -4656,16 +4668,468 @@ export const COMPUTED_IMPORT_PATHS: readonly string[] = Object.freeze([
4656
4668
  '.orkestrel/sample/instruments/harness/load.mts',
4657
4669
  ])
4658
4670
 
4671
+ /** Lists nested same-face imports carrying a native collection sentinel in each source. */
4672
+ export const POLICY_VUE_RELATIVE_SOURCES: readonly PolicySource[] = Object.freeze([
4673
+ {
4674
+ path: 'app/vue/components/Panel.vue',
4675
+ content: [
4676
+ '<script lang="ts">',
4677
+ "import * as boundary from '../composables/useTheme.js'",
4678
+ 'void boundary',
4679
+ 'debugger',
4680
+ '</script>',
4681
+ '',
4682
+ ].join('\n'),
4683
+ },
4684
+ {
4685
+ path: 'app/vue/components/dialogs/Panel.vue',
4686
+ content: [
4687
+ '<script setup lang="ts">',
4688
+ "import * as boundary from '../../composables/useTheme.js'",
4689
+ 'void boundary',
4690
+ 'debugger',
4691
+ '</script>',
4692
+ '',
4693
+ ].join('\n'),
4694
+ },
4695
+ {
4696
+ path: 'app/vue/features/editor/dialogs/helpers.ts',
4697
+ content: [
4698
+ "import * as boundary from '../../../components/Toolbar.vue'",
4699
+ 'void boundary',
4700
+ 'debugger',
4701
+ '',
4702
+ ].join('\n'),
4703
+ },
4704
+ {
4705
+ path: 'app/vue/features/helpers.ts',
4706
+ content: [
4707
+ "import * as boundary from '../print/index.js'",
4708
+ 'void boundary',
4709
+ 'debugger',
4710
+ '',
4711
+ ].join('\n'),
4712
+ },
4713
+ {
4714
+ path: 'src/vue/features/helpers.ts',
4715
+ content: [
4716
+ "import * as boundary from '../print/index.js'",
4717
+ 'void boundary',
4718
+ 'debugger',
4719
+ '',
4720
+ ].join('\n'),
4721
+ },
4722
+ {
4723
+ path: 'src/vue/features/editor/helpers.ts',
4724
+ content: [
4725
+ "import * as boundary from '../../components/Toolbar.js'",
4726
+ 'void boundary',
4727
+ 'debugger',
4728
+ '',
4729
+ ].join('\n'),
4730
+ },
4731
+ ])
4732
+
4733
+ /** Supplies a valid direct Vue composable with its collection sentinel inside the exported function. */
4734
+ export const POLICY_VUE_COMPOSABLE_SOURCE: PolicySource = Object.freeze({
4735
+ path: 'app/vue/composables/useTheme.ts',
4736
+ content: [
4737
+ '/** Reads the selected theme. */',
4738
+ 'export function useTheme(): string {',
4739
+ '\tdebugger',
4740
+ "\treturn 'light'",
4741
+ '}',
4742
+ '',
4743
+ ].join('\n'),
4744
+ })
4745
+
4746
+ /** Lists lexical destinations independently of the host running the test. */
4747
+ export const POLICY_VUE_TARGET_CASES: ReadonlyArray<
4748
+ readonly [string, string, string, string | undefined]
4749
+ > = Object.freeze([
4750
+ [
4751
+ '/work/app/vue/components/Panel.vue',
4752
+ '/work',
4753
+ '../composables/useTheme.js',
4754
+ 'app/vue/composables/useTheme.js',
4755
+ ],
4756
+ [
4757
+ '/work/app/vue/components/dialogs/Panel.vue',
4758
+ '/work/',
4759
+ '../../composables/useTheme.js',
4760
+ 'app/vue/composables/useTheme.js',
4761
+ ],
4762
+ ['/work/src/vue/features/editor/helpers.ts', '/work', '../../types.js', 'src/vue/types.js'],
4763
+ [
4764
+ '/work/app/vue/features/editor/dialogs/Panel.vue',
4765
+ '/work',
4766
+ '../../../components/Toolbar.vue',
4767
+ 'app/vue/components/Toolbar.vue',
4768
+ ],
4769
+ ['/work/app/vue/helpers.ts', '/work', '../print/index.js', 'app/print/index.js'],
4770
+ ['/work/app/vue/features/helpers.ts', '/work', '../print/index.js', 'app/vue/print/index.js'],
4771
+ ['/work/src/vue/features/helpers.ts', '/work', '../print/index.js', 'src/vue/print/index.js'],
4772
+ ['/work/app/vue/helpers.ts', '/work', '../browser?x', 'app/browser'],
4773
+ ['/work/app/vue/helpers.ts', '/work', '../browser/#fragment', 'app/browser'],
4774
+ ['/work/app/vue/helpers.ts', '/work', './entry.js?raw#fragment', 'app/vue/entry.js'],
4775
+ ['/work/app/vue/helpers.ts', '/work', './%2e%2e/entry.js', 'app/vue/%2e%2e/entry.js'],
4776
+ ['/work/app/vue/helpers.ts', '/work', '../../src/vue/helpers.js', 'src/vue/helpers.js'],
4777
+ [
4778
+ '/work/src/vue/nested/app/vue/helpers.ts',
4779
+ '/work',
4780
+ '../print/index.js',
4781
+ 'src/vue/nested/app/print/index.js',
4782
+ ],
4783
+ ['/app/vue/helpers.ts', '/', './entry.js', 'app/vue/entry.js'],
4784
+ ['C:/work/app/vue/features/helpers.ts', 'C:/work/', '../types.js', 'app/vue/types.js'],
4785
+ ['C:\\work\\app\\vue\\features\\helpers.ts', 'C:\\work\\', '../types.js', 'app/vue/types.js'],
4786
+ ['C:\\app\\vue\\helpers.ts', 'C:\\', './entry.js', 'app/vue/entry.js'],
4787
+ [
4788
+ '\\\\host\\share\\work\\app\\vue\\features\\helpers.ts',
4789
+ '\\\\host\\share\\work\\',
4790
+ '../types.js',
4791
+ 'app/vue/types.js',
4792
+ ],
4793
+ ['//host/share/app/vue/helpers.ts', '//host/share', './entry.js', 'app/vue/entry.js'],
4794
+ ['/work-other/app/vue/helpers.ts', '/work', './entry.js', undefined],
4795
+ ['C:/work-other/app/vue/helpers.ts', 'C:/work', './entry.js', undefined],
4796
+ ['c:/work/app/vue/helpers.ts', 'C:/work', './entry.js', undefined],
4797
+ ['D:/work/app/vue/helpers.ts', 'C:/work', './entry.js', undefined],
4798
+ ['//host/other/app/vue/helpers.ts', '//host/share', './entry.js', undefined],
4799
+ ['/work/app/vuex/helpers.ts', '/work', './entry.js', undefined],
4800
+ ['/work/other/app/vue/helpers.ts', '/work', './entry.js', undefined],
4801
+ ['app/vue/helpers.ts', '/work', './entry.js', undefined],
4802
+ ['/work/app/vue/helpers.ts', 'work', './entry.js', undefined],
4803
+ ['/work/../other/app/vue/helpers.ts', '/work/../other', './entry.js', undefined],
4804
+ ['/work/app/vue/helpers.ts', '/work', '../../../print/index.js', undefined],
4805
+ ['/work/app/vue/helpers.ts', '/work', './../types.js', undefined],
4806
+ ['/work/app/vue/helpers.ts', '/work', '.././types.js', undefined],
4807
+ ['/work/app/vue/helpers.ts', '/work', './name/../types.js', undefined],
4808
+ ['/work/app/vue/helpers.ts', '/work', './name/./types.js', undefined],
4809
+ ['/work/app/vue/helpers.ts', '/work', './name//types.js', undefined],
4810
+ ['/work/app/vue/helpers.ts', '/work', '..\\types.js', undefined],
4811
+ ['/work/app/vue/helpers.ts', '/work', '/machine/entry.js', undefined],
4812
+ ['/work/app/vue/helpers.ts', '/work', '@src/vue', undefined],
4813
+ ['/work/app/vue/helpers.ts', '/work', '././entry.js', undefined],
4814
+ ['/work/app/vue/helpers.ts', '/work', './.', undefined],
4815
+ ['/work/app/vue/helpers.ts', '/work', '././entry.js?raw#fragment', undefined],
4816
+ ['/work/app/vue/helpers.ts', '/work', './entry.js', 'app/vue/entry.js'],
4817
+ ['/work/app/vue/features/helpers.ts', '/work', '../entry.js', 'app/vue/entry.js'],
4818
+ ['/work/app/vue/helpers.ts', '/work', '.', 'app/vue'],
4819
+ ['/work/app/vue/helpers.ts', '/work', './', 'app/vue'],
4820
+ ])
4821
+
4822
+ /** Lists the two existing override owners without inferring faces from a filename suffix. */
4823
+ export const POLICY_VUE_FACES = Object.freeze(['src/vue', 'app/vue'] as const)
4824
+
4825
+ /** Lists importer locations that a directly invoked Vue rule must refuse to classify. */
4826
+ export const POLICY_VUE_UNCLASSIFIED_FILES = Object.freeze([
4827
+ '../outside/app/vue/helpers.ts',
4828
+ 'other/app/vue/helpers.ts',
4829
+ 'app/vuex/helpers.ts',
4830
+ ])
4831
+
4832
+ /** Lists native source-bearing syntax, distinguishing forms that need TypeScript parsing. */
4833
+ export const POLICY_VUE_IMPORT_FORMS = Object.freeze([
4834
+ { name: 'value', before: 'import * as boundary from ', after: '\nvoid boundary', typed: false },
4835
+ { name: 'type', before: 'import type { Boundary } from ', after: '', typed: true },
4836
+ { name: 'named', before: 'export { boundary } from ', after: '', typed: false },
4837
+ { name: 'star', before: 'export * from ', after: '', typed: false },
4838
+ { name: 'namedType', before: 'export type { Boundary } from ', after: '', typed: true },
4839
+ { name: 'starType', before: 'export type * from ', after: '', typed: true },
4840
+ { name: 'dynamic', before: 'void import(', after: ')', typed: false },
4841
+ ])
4842
+
4843
+ /** Lists every configured extension and both native Vue script extraction forms. */
4844
+ export const POLICY_VUE_POPULATIONS = Object.freeze([
4845
+ { name: 'cjs', extension: 'cjs', before: '', after: '', typed: false },
4846
+ { name: 'cts', extension: 'cts', before: '', after: '', typed: true },
4847
+ { name: 'js', extension: 'js', before: '', after: '', typed: false },
4848
+ { name: 'jsx', extension: 'jsx', before: '', after: '', typed: false },
4849
+ { name: 'mjs', extension: 'mjs', before: '', after: '', typed: false },
4850
+ { name: 'mts', extension: 'mts', before: '', after: '', typed: true },
4851
+ { name: 'ts', extension: 'ts', before: '', after: '', typed: true },
4852
+ { name: 'tsx', extension: 'tsx', before: '', after: '', typed: true },
4853
+ {
4854
+ name: 'script',
4855
+ extension: 'vue',
4856
+ before: '<script lang="ts">\n',
4857
+ after: '</script>\n',
4858
+ typed: true,
4859
+ },
4860
+ {
4861
+ name: 'setup',
4862
+ extension: 'vue',
4863
+ before: '<script setup lang="ts">\n',
4864
+ after: '</script>\n',
4865
+ typed: true,
4866
+ },
4867
+ ])
4868
+
4869
+ /** Crosses admitted nested imports and refused sibling imports with the actual syntax populations. */
4870
+ export const POLICY_VUE_IMPORT_CASES: readonly PolicyVueImportCase[] = Object.freeze(
4871
+ POLICY_VUE_FACES.flatMap((face) =>
4872
+ POLICY_VUE_POPULATIONS.flatMap((population) =>
4873
+ POLICY_VUE_IMPORT_FORMS.filter((form) => !form.typed || population.typed).flatMap((form) =>
4874
+ [false, true].map((boundary) => ({
4875
+ path: `${face}/${boundary ? '' : 'features/editor/'}${population.name}${form.name}.${population.extension}`,
4876
+ content:
4877
+ population.before +
4878
+ form.before +
4879
+ JSON.stringify(boundary ? '../print/index.js' : '../../components/Toolbar.vue') +
4880
+ form.after +
4881
+ '\ndebugger\n' +
4882
+ population.after,
4883
+ boundary,
4884
+ restricted: false,
4885
+ })),
4886
+ ),
4887
+ ),
4888
+ ),
4889
+ )
4890
+
4891
+ /** Lists relative destinations and independent raw-spelling bans under the complete configuration. */
4892
+ export const POLICY_VUE_BOUNDARY_ROWS: ReadonlyArray<readonly [string, string, boolean, boolean]> =
4893
+ Object.freeze([
4894
+ ['helpers.ts', '../print/index.js', true, false],
4895
+ ['helpers.ts', '../src/print/index.js', true, false],
4896
+ ['helpers.ts', '../print.ext/index.js', true, false],
4897
+ ['helpers.ts', '../vuex/index.js', true, false],
4898
+ ['helpers.ts', '../corex/index.js', true, false],
4899
+ ['helpers.ts', '../browserx/index.js', true, false],
4900
+ ['helpers.ts', '../print?raw', true, false],
4901
+ ['helpers.ts', '../print#fragment', true, false],
4902
+ ['features/helpers.ts', '../print/index.js', false, false],
4903
+ ['features/helpers.ts', '../print.ext/index.js', false, false],
4904
+ ['features/editor/dialogs/helpers.ts', '../../../components/Toolbar.vue', false, false],
4905
+ ['features/editor/helpers.ts', '../../../print/index.js', true, false],
4906
+ ['features/editor/helpers.ts', '../../../../src/print/index.js', true, false],
4907
+ ['features/helpers.ts', '../types.js?raw#fragment', false, false],
4908
+ ['helpers.ts', './index.js', false, false],
4909
+ ['helpers.ts', '../../../outside/index.js', true, false],
4910
+ ['helpers.ts', '@src/core', false, false],
4911
+ ['helpers.ts', '@src/browser', false, false],
4912
+ ['helpers.ts', '@src/vue', false, false],
4913
+ ['helpers.ts', '@src/print', false, true],
4914
+ ['helpers.ts', '@src/corex', false, true],
4915
+ ['helpers.ts', '@src/', false, true],
4916
+ ['helpers.ts', '@src/server', false, true],
4917
+ ['helpers.ts', '@orkestrel/sample/server', false, true],
4918
+ ['helpers.ts', 'node:fs', false, true],
4919
+ ['helpers.ts', 'fs/promises', false, true],
4920
+ ['helpers.ts', '/machine/entry.js', false, true],
4921
+ ['helpers.ts', 'C:/machine/entry.js', false, true],
4922
+ ['helpers.ts', 'C:\\machine\\entry.js', false, true],
4923
+ ['helpers.ts', 'file:///machine/entry.js', false, true],
4924
+ ['helpers.ts', 'https://host/entry.js', false, true],
4925
+ ['helpers.ts', 'data:text/javascript,export{}', false, true],
4926
+ ['helpers.ts', '..\\print\\index.js', false, true],
4927
+ ['helpers.ts', './../types.js', true, true],
4928
+ ['helpers.ts', '.././types.js', true, true],
4929
+ ['helpers.ts', './name/../types.js', true, true],
4930
+ ['helpers.ts', './name/./types.js', true, true],
4931
+ ['helpers.ts', './name//types.js', true, true],
4932
+ ['helpers.ts', 'typescript', false, true],
4933
+ ['helpers.ts', '../server/index.js', true, true],
4934
+ ['features/helpers.ts', '../server/index.js', false, true],
4935
+ ])
4936
+
4937
+ /** Supplies face-specific alias requirements and preserves existing application-relative admissions. */
4938
+ export const POLICY_VUE_OWNER_ROWS: Readonly<
4939
+ Record<string, ReadonlyArray<readonly [string, string, boolean, boolean]>>
4940
+ > = Object.freeze({
4941
+ 'src/vue': [
4942
+ ['helpers.ts', '../browser?x', false, true],
4943
+ ['helpers.ts', '../browser#fragment', false, true],
4944
+ ['helpers.ts', '@app/core', false, true],
4945
+ ['features/helpers.ts', '../../../app/core/types.js', true, true],
4946
+ ['features/helpers.ts', '../../core/helpers.js', false, true],
4947
+ ['features/helpers.ts', '../../browser/helpers.js', false, true],
4948
+ ['features/helpers.ts', '../core/helpers.js', false, true],
4949
+ ['features/helpers.ts', '../browser/helpers.js', false, true],
4950
+ ['nested/app/vue/helpers.ts', '../print/index.js', false, false],
4951
+ ],
4952
+ 'app/vue': [
4953
+ ['helpers.ts', '../browser?x', false, false],
4954
+ ['helpers.ts', '../browser#fragment', false, false],
4955
+ ['helpers.ts', '../browser/index.js', false, false],
4956
+ ['features/helpers.ts', '../../browser/helpers.js', false, false],
4957
+ ['helpers.ts', '../core/index.js', false, false],
4958
+ ['helpers.ts', '../../src/core/index.js', false, false],
4959
+ ['helpers.ts', '../../src/browser/index.js', false, false],
4960
+ ['helpers.ts', '../../src/vue/index.js', false, false],
4961
+ ['helpers.ts', '@app/core', false, false],
4962
+ ['helpers.ts', '@app/browser', false, false],
4963
+ ['helpers.ts', '@app/vue', false, false],
4964
+ ['helpers.ts', '@app/print', false, true],
4965
+ ['helpers.ts', '@app/server', false, true],
4966
+ ['features/helpers.ts', '../../server/index.js', true, true],
4967
+ ['helpers.ts', '../../src/server/index.js', true, true],
4968
+ ['nested/src/vue/helpers.ts', '../print/index.js', false, false],
4969
+ ],
4970
+ })
4971
+
4972
+ /** Materializes the boundary rows as separate collected modules without resolving their targets. */
4973
+ export const POLICY_VUE_BOUNDARY_CASES: readonly PolicyVueImportCase[] = Object.freeze([
4974
+ ...POLICY_VUE_FACES.flatMap((face) =>
4975
+ [...POLICY_VUE_BOUNDARY_ROWS, ...(POLICY_VUE_OWNER_ROWS[face] ?? [])].map(
4976
+ ([file, source, boundary, restricted], index) => ({
4977
+ path: `${face}/${file.replace('helpers.ts', `boundary${index}.ts`)}`,
4978
+ content:
4979
+ 'import * as boundary from ' + JSON.stringify(source) + '\nvoid boundary\ndebugger\n',
4980
+ boundary,
4981
+ restricted,
4982
+ }),
4983
+ ),
4984
+ ),
4985
+ ...POLICY_VUE_FACES.flatMap((face) => [
4986
+ {
4987
+ path: `${face}/leadingdotentry.ts`,
4988
+ content: 'import * as boundary from "././entry.js"\nvoid boundary\ndebugger\n',
4989
+ boundary: true,
4990
+ restricted: false,
4991
+ },
4992
+ {
4993
+ path: `${face}/leadingdotonly.ts`,
4994
+ content: 'import * as boundary from "./."\nvoid boundary\ndebugger\n',
4995
+ boundary: true,
4996
+ restricted: false,
4997
+ },
4998
+ {
4999
+ path: `${face}/leadingdotquery.ts`,
5000
+ content: 'import * as boundary from "././entry.js?raw#fragment"\nvoid boundary\ndebugger\n',
5001
+ boundary: true,
5002
+ restricted: false,
5003
+ },
5004
+ ]),
5005
+ ])
5006
+
5007
+ /** Lists nonliteral sources and source-less exports the relative rule leaves to their existing owners. */
5008
+ export const POLICY_VUE_COMPUTED_FORMS = Object.freeze([
5009
+ 'const target = "../print/index.js"; void import(target)',
5010
+ 'void import("../print/" + "index.js")',
5011
+ 'void import(`../print/index.js`)',
5012
+ 'const boundary = 1; export { boundary }',
5013
+ ])
5014
+
5015
+ /** Supplies collection sentinels for nonliteral and source-less forms in every configured population. */
5016
+ export const POLICY_VUE_COMPUTED_CASES: readonly PolicyVueImportCase[] = Object.freeze(
5017
+ POLICY_VUE_FACES.flatMap((face) =>
5018
+ POLICY_VUE_POPULATIONS.flatMap((population) =>
5019
+ POLICY_VUE_COMPUTED_FORMS.map((content, index) => ({
5020
+ path: `${face}/computed${population.name}${index}.${population.extension}`,
5021
+ content: population.before + content + '\ndebugger\n' + population.after,
5022
+ boundary: false,
5023
+ restricted: false,
5024
+ })),
5025
+ ),
5026
+ ),
5027
+ )
5028
+
5029
+ /** Lists the measured CommonJS parser refusals by original relative filename, token, and offset. */
5030
+ export const POLICY_VUE_PARSER_ROWS: ReadonlyArray<readonly [string, string, number]> =
5031
+ Object.freeze([
5032
+ ['cjsvalue.cjs', 'import', 0],
5033
+ ['features/editor/cjsvalue.cjs', 'import', 0],
5034
+ ['cjsnamed.cjs', 'export', 0],
5035
+ ['features/editor/cjsnamed.cjs', 'export', 0],
5036
+ ['cjsstar.cjs', 'export', 0],
5037
+ ['features/editor/cjsstar.cjs', 'export', 0],
5038
+ ['computedcjs3.cjs', 'export', 20],
5039
+ ])
5040
+
5041
+ /** Retains each original parser-refused input on both faces with its exact expected native location. */
5042
+ export const POLICY_VUE_PARSER_CASES = Object.freeze(
5043
+ POLICY_VUE_FACES.flatMap((face) =>
5044
+ POLICY_VUE_PARSER_ROWS.map(([file, keyword, offset]) => {
5045
+ const path = `${face}/${file}`
5046
+ const source = [...POLICY_VUE_IMPORT_CASES, ...POLICY_VUE_COMPUTED_CASES].find(
5047
+ (candidate) => candidate.path === path,
5048
+ )
5049
+ if (source === undefined) throw new Error(`Missing original Vue parser fixture ${path}`)
5050
+ return {
5051
+ ...source,
5052
+ keyword,
5053
+ message: `Cannot use ${keyword} statement outside a module`,
5054
+ span: { offset, length: keyword.length, line: 1, column: offset + 1 },
5055
+ }
5056
+ }),
5057
+ ),
5058
+ )
5059
+
5060
+ /** Retains all other original inputs under strict rule-code and debugger-sentinel validation. */
5061
+ export const POLICY_VUE_PARSED_CASES: readonly PolicyVueImportCase[] = Object.freeze(
5062
+ [...POLICY_VUE_IMPORT_CASES, ...POLICY_VUE_COMPUTED_CASES].filter(
5063
+ (source) => !POLICY_VUE_PARSER_CASES.some((refused) => refused.path === source.path),
5064
+ ),
5065
+ )
5066
+
5067
+ /** Preserves the two removed relative alternatives solely for scratch regression controls. */
5068
+ export const POLICY_VUE_ORIGINAL_RELATIVES: Readonly<Record<string, string>> = Object.freeze({
5069
+ 'src/vue': String.raw`(?:\.\./)+(?:src/)?(?:[^/.scbv][^/.]*|s|s[^/.r][^/.]*|sr|sr[^/.c][^/.]*|src[^/.][^/.]*|c|c[^/.o][^/.]*|co|co[^/.r][^/.]*|cor|cor[^/.e][^/.]*|core[^/.][^/.]*|b|b[^/.r][^/.]*|br|br[^/.o][^/.]*|bro|bro[^/.w][^/.]*|brow|brow[^/.s][^/.]*|brows|brows[^/.e][^/.]*|browse|browse[^/.r][^/.]*|browser[^/.][^/.]*|v|v[^/.u][^/.]*|vu|vu[^/.e][^/.]*|vue[^/.][^/.]*)(?:/|$)`,
5070
+ 'app/vue': String.raw`(?:\.\./)+(?:src/|app/)?(?:[^/.sacbv][^/.]*|s|s[^/.r][^/.]*|sr|sr[^/.c][^/.]*|src[^/.][^/.]*|a|a[^/.p][^/.]*|ap|ap[^/.p][^/.]*|app[^/.][^/.]*|c|c[^/.o][^/.]*|co|co[^/.r][^/.]*|cor|cor[^/.e][^/.]*|core[^/.][^/.]*|b|b[^/.r][^/.]*|br|br[^/.o][^/.]*|bro|bro[^/.w][^/.]*|brow|brow[^/.s][^/.]*|brows|brows[^/.e][^/.]*|browse|browse[^/.r][^/.]*|browser[^/.][^/.]*|v|v[^/.u][^/.]*|vu|vu[^/.e][^/.]*|vue[^/.][^/.]*)(?:/|$)`,
5071
+ })
5072
+
5073
+ /** Lists direct domain failures and look-alike folders that must remain unregistered. */
5074
+ export const POLICY_VUE_DOMAIN_CASES: readonly PolicyVueDomainCase[] = Object.freeze([
5075
+ { ...POLICY_VUE_COMPOSABLE_SOURCE, misplaced: false, malformed: false },
5076
+ {
5077
+ path: 'app/vue/composables/useWrong.ts',
5078
+ content: 'export function useMode(): void { debugger }\n',
5079
+ misplaced: false,
5080
+ malformed: true,
5081
+ },
5082
+ {
5083
+ path: 'app/vue/composables/useHidden.ts',
5084
+ content: 'function useHidden(): void { debugger }\n',
5085
+ misplaced: false,
5086
+ malformed: true,
5087
+ },
5088
+ {
5089
+ path: 'app/vue/composables/useMany.ts',
5090
+ content: 'export function useMany(): void { debugger }\nexport function useOther(): void {}\n',
5091
+ misplaced: false,
5092
+ malformed: true,
5093
+ },
5094
+ {
5095
+ path: 'app/vue/composables/useExtra.ts',
5096
+ content: 'const extra = 1\nexport function useExtra(): void { debugger; void extra }\n',
5097
+ misplaced: false,
5098
+ malformed: true,
5099
+ },
5100
+ ...[
5101
+ 'app/vue/composables/nested/useTheme.ts',
5102
+ 'app/vue/composables/nested/app/vue/composables/useTheme.ts',
5103
+ 'app/vue/composablesExtra/useTheme.ts',
5104
+ 'app/vue/other/useTheme.ts',
5105
+ 'src/vue/composables/useTheme.ts',
5106
+ 'app/vue/composables/index.ts',
5107
+ 'app/vue/composables/main.ts',
5108
+ 'app/vue/composables/UseTheme.ts',
5109
+ ].map((path) => ({
5110
+ path,
5111
+ content: POLICY_VUE_COMPOSABLE_SOURCE.content,
5112
+ misplaced: true,
5113
+ malformed: false,
5114
+ })),
5115
+ {
5116
+ path: 'app/vue/composables/helpers.ts',
5117
+ content: POLICY_VUE_COMPOSABLE_SOURCE.content,
5118
+ misplaced: false,
5119
+ malformed: false,
5120
+ },
5121
+ ])
5122
+
4659
5123
  /**
4660
- * Reads import restrictions and collection sentinels from the installed linter.
5124
+ * Reads native diagnostic records through the installed linter without assigning rule codes.
4661
5125
  * @param directory - The fixture workspace containing the lint configuration.
4662
- * @param paths - The fixtures carrying debugger collection sentinels.
4663
- * @returns Diagnostic codes paired with workspace-relative paths.
5126
+ * @param paths - The fixtures expected to produce native diagnostics.
5127
+ * @returns Readonly native records for the caller's rule or parser validation contract.
4664
5128
  */
4665
- export function readImportDiagnostics(
5129
+ export function readNativeDiagnostics(
4666
5130
  directory: string,
4667
5131
  paths: readonly string[],
4668
- ): ReadonlySet<string> {
5132
+ ): ReadonlyArray<Readonly<Record<string, unknown>>> {
4669
5133
  const manifestPath = createRequire(import.meta.url).resolve('oxlint/package.json')
4670
5134
  const manifest = readConfigRecord(JSON.parse(readFileSync(manifestPath, 'utf8')))
4671
5135
  const entry =
@@ -4691,11 +5155,37 @@ export function readImportDiagnostics(
4691
5155
  )
4692
5156
  const diagnostics = readConfigRecord(JSON.parse(result.stdout)).diagnostics
4693
5157
  if (!Array.isArray(diagnostics)) throw new Error('Missing lint diagnostics')
5158
+ return diagnostics.map(readConfigRecord)
5159
+ }
5160
+
5161
+ /**
5162
+ * Reads import restrictions and collection sentinels from the installed linter.
5163
+ * @param directory - The fixture workspace containing the lint configuration.
5164
+ * @param paths - The fixtures carrying debugger collection sentinels.
5165
+ * @returns Diagnostic codes paired with workspace-relative paths.
5166
+ */
5167
+ export function readImportDiagnostics(
5168
+ directory: string,
5169
+ paths: readonly string[],
5170
+ ): ReadonlySet<string> {
5171
+ const diagnostics = readNativeDiagnostics(directory, paths)
4694
5172
  const codes = new Set(
4695
5173
  diagnostics.map((value: unknown) => {
4696
5174
  const diagnostic = readConfigRecord(value)
4697
5175
  if (typeof diagnostic.code !== 'string' || typeof diagnostic.filename !== 'string')
4698
- throw new Error('Missing diagnostic location')
5176
+ throw new Error(
5177
+ 'Missing diagnostic location: ' +
5178
+ JSON.stringify({
5179
+ offending: value,
5180
+ invalidDiagnostics: diagnostics.filter((candidate: unknown) => {
5181
+ const candidateRecord = readConfigRecord(candidate)
5182
+ return (
5183
+ typeof candidateRecord.code !== 'string' ||
5184
+ typeof candidateRecord.filename !== 'string'
5185
+ )
5186
+ }),
5187
+ }),
5188
+ )
4699
5189
  return (
4700
5190
  diagnostic.code +
4701
5191
  ' ' +
@@ -4,7 +4,7 @@ let _orkestrel_template = require("@orkestrel/template");
4
4
  let _orkestrel_emitter = require("@orkestrel/emitter");
5
5
  var package_default = {
6
6
  name: "@orkestrel/scaffold",
7
- version: "0.0.107",
7
+ version: "0.0.108",
8
8
  description: "Scaffold workspaces with commands: new, audit, repair, catalog, and overwrite.",
9
9
  keywords: [
10
10
  "audit",
@@ -331,6 +331,7 @@ var CANON_PATHS = Object.freeze([
331
331
  ".claude/AGENTS.md",
332
332
  ".mcp.json",
333
333
  ".agents/orchestration.md",
334
+ ".agents/platforms",
334
335
  ".agents/skills",
335
336
  ".agents/templates",
336
337
  ".agents/transports",
@@ -1370,7 +1371,30 @@ export function appServer(override?: UserConfig): UserConfig {
1370
1371
  browser: { enabled: false },
1371
1372
  },
1372
1373
  }
1373
- return mergeOverride(project, override)
1374
+ // Fills the missing codeSplitting of each merged output with false and adds no output,
1375
+ // so an override's output list keeps its own members and their order. A member that
1376
+ // already supplies a value is returned as written, found by property lookup, so a value
1377
+ // an inherited getter supplies survives.
1378
+ const merged = mergeOverride(project, override)
1379
+ const rolldown = merged.build?.rolldownOptions
1380
+ const output = rolldown?.output
1381
+ const unsplit = { codeSplitting: false }
1382
+ return {
1383
+ ...merged,
1384
+ build: {
1385
+ ...merged.build,
1386
+ rolldownOptions: {
1387
+ ...rolldown,
1388
+ output: Array.isArray(output)
1389
+ ? output.map((member) =>
1390
+ member.codeSplitting === undefined ? { ...member, ...unsplit } : member,
1391
+ )
1392
+ : output?.codeSplitting === undefined
1393
+ ? { ...output, ...unsplit }
1394
+ : output,
1395
+ },
1396
+ },
1397
+ }
1374
1398
  }
1375
1399
  `
1376
1400
  }),