geospec 0.1.0-beta.9 → 0.4.1-next.331

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 (105) hide show
  1. package/README.md +34 -9
  2. package/agent/doctrine.md +2 -1
  3. package/agent/geospec-authoring/SKILL.md +3 -3
  4. package/agent/geospec-authoring/api-index.md +20 -92
  5. package/agent/geospec-authoring/api-types.md +85 -480
  6. package/agent/geospec-authoring/public-api-functions.md +21 -1
  7. package/agent/geospec-authoring/public-api-index.md +215 -319
  8. package/agent/geospec-authoring/public-api-types-2.md +480 -352
  9. package/agent/geospec-authoring/public-api-types-3.md +79 -215
  10. package/agent/geospec-authoring/public-api-types.md +334 -849
  11. package/agent/resources.js +12 -13
  12. package/agent/skills.json +2 -3
  13. package/dist/assertion-client/client.d.mts +14 -15
  14. package/dist/assertion-client/client.mjs +1 -1
  15. package/dist/cli/check.mjs +2 -0
  16. package/dist/cli/cli.d.mts +5 -5
  17. package/dist/cli/cli.mjs +20 -3
  18. package/dist/cli/node-host.d.mts +5 -4
  19. package/dist/cli/node-host.mjs +1 -1
  20. package/dist/cli/wire-value.mjs +1 -1
  21. package/dist/config/define-config.d.mts +2 -3
  22. package/dist/config/node/index.mjs +1 -1
  23. package/dist/config/node/load.d.mts +2 -3
  24. package/dist/config/node/load.mjs +1 -1
  25. package/dist/config/read-geospec-config.d.mts +10 -6
  26. package/dist/config/read-geospec-config.mjs +1 -1
  27. package/dist/config/types.d.mts +6 -7
  28. package/dist/create-geospec.d.mts +7 -6
  29. package/dist/engine/client.d.mts +15 -15
  30. package/dist/engine/client.mjs +1 -1
  31. package/dist/engine/matchers.d.mts +10 -11
  32. package/dist/engine/pmi.types.d.mts +11 -12
  33. package/dist/engine/protocol.d.mts +7 -8
  34. package/dist/engine/protocol.mjs +1 -1
  35. package/dist/geometry-unit.d.mts +2 -3
  36. package/dist/index.d.mts +2 -2
  37. package/dist/index.mjs +1 -1
  38. package/dist/mesh/index.d.mts +2 -2
  39. package/dist/mesh/types.d.mts +8 -505
  40. package/dist/model/errors.d.mts +2 -3
  41. package/dist/model/load-model.d.mts +3 -4
  42. package/dist/model/mesh-evidence-matchers.d.mts +2 -3
  43. package/dist/model/native-model-loader.d.mts +14 -17
  44. package/dist/model/native-model-loader.mjs +1 -1
  45. package/dist/model/node/command-exporter.d.mts +3 -4
  46. package/dist/model/node/command-exporter.mjs +1 -1
  47. package/dist/model/node/index.mjs +1 -1
  48. package/dist/model/region-scope.d.mts +3 -6
  49. package/dist/model/region-scope.mjs +1 -1
  50. package/dist/model/subject.d.mts +2 -5
  51. package/dist/model/subject.mjs +1 -1
  52. package/dist/model/types.d.mts +19 -20
  53. package/dist/runner/collector.d.mts +7 -8
  54. package/dist/runner/collector.mjs +3 -1
  55. package/dist/runner/discovery.d.mts +10 -11
  56. package/dist/runner/discovery.mjs +5 -1
  57. package/dist/runner/filter.d.mts +6 -7
  58. package/dist/runner/filter.mjs +3 -1
  59. package/dist/runner/index.d.mts +3 -1
  60. package/dist/runner/index.mjs +1 -1
  61. package/dist/runner/native/native-pool-grants.d.mts +2 -3
  62. package/dist/runner/native/native-serial-runner.d.mts +4 -7
  63. package/dist/runner/native/native-serial-runner.mjs +1 -1
  64. package/dist/runner/node/engine.d.mts +5 -6
  65. package/dist/runner/node/index.mjs +1 -1
  66. package/dist/runner/node/node-vm-filesystem.d.mts +4 -5
  67. package/dist/runner/node/node-vm-filesystem.mjs +1 -1
  68. package/dist/runner/node/pool-runner.d.mts +15 -6
  69. package/dist/runner/node/pool-runner.mjs +1 -1
  70. package/dist/runner/node/pool-worker-entry.d.mts +9 -6
  71. package/dist/runner/node/pool-worker-entry.mjs +1 -1
  72. package/dist/runner/pool/events.mjs +1 -1
  73. package/dist/runner/pool/pool-messages.d.mts +8 -9
  74. package/dist/runner/pool/pool.d.mts +4 -6
  75. package/dist/runner/pool/pool.mjs +1 -1
  76. package/dist/runner/pool/shard-timings.d.mts +3 -4
  77. package/dist/runner/pool/worker-host.d.mts +6 -5
  78. package/dist/runner/pool/worker-host.mjs +1 -1
  79. package/dist/runner/run-geospec-module.d.mts +2 -3
  80. package/dist/runner/run-geospec-module.mjs +2 -2
  81. package/dist/runner/timeout-codes.d.mts +6 -8
  82. package/dist/runner/types.d.mts +56 -53
  83. package/dist/runner/worker/no-matching-tests-issue.d.mts +3 -4
  84. package/dist/runner/worker/runner-types.d.mts +17 -16
  85. package/dist/runner/worker/serial-runner.mjs +1 -1
  86. package/dist/selector/types.d.mts +22 -23
  87. package/dist/step/types.d.mts +4 -119
  88. package/dist/support/filesystem-errors.mjs +1 -0
  89. package/dist/support/hash.mjs +1 -0
  90. package/dist/support/path.mjs +1 -0
  91. package/dist/support/sha256.mjs +1 -0
  92. package/dist/support/types.d.mts +38 -0
  93. package/dist/vitest/adapter.d.mts +5 -6
  94. package/dist/vitest/adapter.mjs +1 -1
  95. package/dist/vitest/index.d.mts +0 -1
  96. package/dist/vitest/index.mjs +1 -1
  97. package/dist/vitest/node/index.d.mts +2 -0
  98. package/dist/vitest/node/index.mjs +1 -0
  99. package/dist/vitest/node/setup-project.d.mts +60 -0
  100. package/dist/vitest/node/setup-project.mjs +1 -0
  101. package/dist/vm/plain-module-vm.d.mts +13 -0
  102. package/dist/vm/plain-module-vm.mjs +8 -0
  103. package/dist/vm/types.d.mts +142 -0
  104. package/package.json +17 -9
  105. package/agent/geospec-authoring/api-types-2.md +0 -85
@@ -1,6 +1,6 @@
1
1
  # geospec — Types
2
2
 
3
- 89 top-level symbols. Signatures are verbatim typescript.
3
+ 66 top-level symbols. Signatures are verbatim typescript.
4
4
 
5
5
  // A model admitted by one live GeoSpec host scope
6
6
  GeoSpecSubject: {
@@ -34,7 +34,7 @@ GeoSpecAssertion: {
34
34
  * holds for this millimetre box, never for the whole model.
35
35
  */
36
36
  region?: GeoSpecLoadRegion;
37
- /** Wall-clock cost of matcher evaluation in milliseconds (R1: budgeted matchers only). */
37
+ /** Wall-clock cost of matcher evaluation in milliseconds (budgeted matchers only). */
38
38
  durationMs?: number;
39
39
  }
40
40
 
@@ -62,7 +62,7 @@ GeoSpecAssertion: {
62
62
  // The crop this assertion's subject was loaded with
63
63
  region?: GeoSpecLoadRegion
64
64
 
65
- // Wall-clock cost of matcher evaluation in milliseconds (R1
65
+ // Wall-clock cost of matcher evaluation in milliseconds (budgeted matchers only)
66
66
  durationMs?: number
67
67
 
68
68
  // Assembly occurrence rule accepted by `expectGeo(...).toHaveAssemblyOccurrences(...)`
@@ -830,256 +830,6 @@ GeoSpecVolumeExpectation: {
830
830
 
831
831
  tolerance?: number
832
832
 
833
- // Basic exact or topology-derived BRep evidence consumed by early feature matchers
834
- BrepEvidence: {
835
- validity?: {
836
- valid: boolean;
837
- checks?: Array<{
838
- shape: string;
839
- status: string;
840
- }>;
841
- maxTolerance?: number;
842
- freeBounds?: {
843
- count: number;
844
- };
845
- smallEdges?: Array<{
846
- length: number;
847
- shape?: string;
848
- location?: Vec3;
849
- }>;
850
- sameParameter?: boolean;
851
- closedShells?: boolean;
852
- closedSolids?: boolean;
853
- solidCount?: number;
854
- invalidSolidCount?: number;
855
- openEdgeCount?: number;
856
- reason?: string;
857
- closedWires?: boolean;
858
- };
859
- topologyCounts?: {
860
- vertices?: number;
861
- edges?: number;
862
- wires?: number;
863
- faces?: number;
864
- shells?: number;
865
- solids?: number;
866
- compounds?: number;
867
- };
868
- boundingBox?: {
869
- min: Vec3;
870
- max: Vec3;
871
- size: Vec3;
872
- center: Vec3;
873
- };
874
- massProperties?: {
875
- surfaceArea?: number;
876
- volume?: number;
877
- centerOfMass?: Vec3;
878
- mass?: number;
879
- };
880
- planarFaces?: Array<{
881
- normal: Vec3;
882
- offset: number;
883
- area?: number;
884
- center?: Vec3;
885
- }>;
886
- cylindricalFaces?: Array<{
887
- radius: number;
888
- axis: 'x' | 'y' | 'z';
889
- center?: Vec3;
890
- axisRange?: {
891
- min: number;
892
- max: number;
893
- };
894
- }>;
895
- circularHoles?: Array<{
896
- diameter: number;
897
- through: boolean;
898
- axis: 'x' | 'y' | 'z';
899
- center?: Vec3;
900
- axisRange?: {
901
- min: number;
902
- max: number;
903
- };
904
- }>;
905
- circularHolePatterns?: Array<{
906
- count: number;
907
- holeDiameter: number;
908
- boltCircleDiameter: number;
909
- axis: 'x' | 'y' | 'z';
910
- center?: Vec3;
911
- }>;
912
- chamferFeatures?: Array<{
913
- distance: number;
914
- selection?: string;
915
- }>;
916
- filletFeatures?: Array<{
917
- radius: number;
918
- selection?: string;
919
- }>;
920
- minimumWallThickness?: {
921
- value: number;
922
- location?: Vec3;
923
- pointA?: Vec3;
924
- pointB?: Vec3;
925
- solidIndex?: number;
926
- tieCount?: number;
927
- algorithm?: string;
928
- tolerance?: number;
929
- supportA?: {
930
- faceIndex?: number;
931
- surfaceType?: string;
932
- supportType?: string;
933
- };
934
- supportB?: {
935
- faceIndex?: number;
936
- surfaceType?: string;
937
- supportType?: string;
938
- };
939
- rejections?: Record<string, number>;
940
- };
941
- }
942
-
943
- validity?: {
944
- valid: boolean;
945
- checks?: Array<{
946
- shape: string;
947
- status: string;
948
- }>;
949
- maxTolerance?: number;
950
- freeBounds?: {
951
- count: number;
952
- };
953
- smallEdges?: Array<{
954
- length: number;
955
- shape?: string;
956
- location?: Vec3;
957
- }>;
958
- sameParameter?: boolean;
959
- closedShells?: boolean;
960
- closedSolids?: boolean;
961
- solidCount?: number;
962
- invalidSolidCount?: number;
963
- openEdgeCount?: number;
964
- reason?: string;
965
- closedWires?: boolean;
966
- }
967
-
968
- topologyCounts?: {
969
- vertices?: number;
970
- edges?: number;
971
- wires?: number;
972
- faces?: number;
973
- shells?: number;
974
- solids?: number;
975
- compounds?: number;
976
- }
977
-
978
- boundingBox?: {
979
- min: Vec3;
980
- max: Vec3;
981
- size: Vec3;
982
- center: Vec3;
983
- }
984
-
985
- massProperties?: {
986
- surfaceArea?: number;
987
- volume?: number;
988
- centerOfMass?: Vec3;
989
- mass?: number;
990
- }
991
-
992
- planarFaces?: Array<{
993
- normal: Vec3;
994
- offset: number;
995
- area?: number;
996
- center?: Vec3;
997
- }>
998
-
999
- cylindricalFaces?: Array<{
1000
- radius: number;
1001
- axis: 'x' | 'y' | 'z';
1002
- center?: Vec3;
1003
- axisRange?: {
1004
- min: number;
1005
- max: number;
1006
- };
1007
- }>
1008
-
1009
- circularHoles?: Array<{
1010
- diameter: number;
1011
- through: boolean;
1012
- axis: 'x' | 'y' | 'z';
1013
- center?: Vec3;
1014
- axisRange?: {
1015
- min: number;
1016
- max: number;
1017
- };
1018
- }>
1019
-
1020
- circularHolePatterns?: Array<{
1021
- count: number;
1022
- holeDiameter: number;
1023
- boltCircleDiameter: number;
1024
- axis: 'x' | 'y' | 'z';
1025
- center?: Vec3;
1026
- }>
1027
-
1028
- chamferFeatures?: Array<{
1029
- distance: number;
1030
- selection?: string;
1031
- }>
1032
-
1033
- filletFeatures?: Array<{
1034
- radius: number;
1035
- selection?: string;
1036
- }>
1037
-
1038
- minimumWallThickness?: {
1039
- value: number;
1040
- location?: Vec3;
1041
- pointA?: Vec3;
1042
- pointB?: Vec3;
1043
- solidIndex?: number;
1044
- tieCount?: number;
1045
- algorithm?: string;
1046
- tolerance?: number;
1047
- supportA?: {
1048
- faceIndex?: number;
1049
- surfaceType?: string;
1050
- supportType?: string;
1051
- };
1052
- supportB?: {
1053
- faceIndex?: number;
1054
- surfaceType?: string;
1055
- supportType?: string;
1056
- };
1057
- rejections?: Record<string, number>;
1058
- }
1059
-
1060
- // Geometry file formats understood by GeoSpec provenance
1061
- GeometryFileFormat: MeshFileFormat | 'step' | 'stp'
1062
-
1063
- // Capability exposed by a loaded subject
1064
- GeometryCapability: {
1065
- kind: 'mesh';
1066
- feature: 'triangles' | 'bounding-box' | 'connected-components' | 'watertightness' | 'surface-area' | 'volume' | 'center-of-mass' | 'distance' | 'component-overlap';
1067
- } | {
1068
- kind: 'brep';
1069
- feature: 'validity' | 'topology-counts' | 'bounding-box' | 'mass-properties' | 'planar-faces' | 'cylindrical-faces' | 'circular-holes' | 'circular-hole-patterns' | 'chamfer-features' | 'fillet-features' | 'wall-thickness';
1070
- } | {
1071
- kind: 'step';
1072
- feature: 'schema' | 'units' | 'product-structure' | 'reader-provenance';
1073
- } | {
1074
- kind: 'unsupported';
1075
- feature: string;
1076
- reason: string;
1077
- }
1078
-
1079
- kind: 'mesh'
1080
-
1081
- feature: 'triangles' | 'bounding-box' | 'connected-components' | 'watertightness' | 'surface-area' | 'volume' | 'center-of-mass' | 'distance' | 'component-overlap'
1082
-
1083
833
  // Diagnostic emitted by GeoSpec loaders, analyzers, and matchers
1084
834
  GeometryDiagnostic: {
1085
835
  code: KernelIssueCode | (string & {});
@@ -1110,233 +860,6 @@ GeometryDiagnostic: {
1110
860
 
1111
861
  details?: unknown
1112
862
 
1113
- // Provenance recorded by GeoSpec loaders
1114
- GeometryProvenance: {
1115
- source: GeometrySource;
1116
- unit: GeoSpecUnit;
1117
- loader: 'gltf-transform' | 'in-memory' | 'opencascade-step';
1118
- contentHash?: string;
1119
- parameters?: Record<string, JSONValue>;
1120
- exportIntent?: GeometryExportIntent;
1121
- }
1122
-
1123
- source: GeometrySource
1124
-
1125
- unit: GeoSpecUnit
1126
-
1127
- loader: 'gltf-transform' | 'in-memory' | 'opencascade-step'
1128
-
1129
- contentHash?: string
1130
-
1131
- parameters?: Record<string, JSONValue>
1132
-
1133
- exportIntent?: GeometryExportIntent
1134
-
1135
- // Source metadata for a loaded geometry subject
1136
- GeometrySource: {
1137
- kind: 'bytes' | 'array-buffer' | 'blob' | 'file' | 'path' | 'url' | 'mesh-buffer' | 'readable-stream' | 'async-iterable';
1138
- format: GeometryFileFormat;
1139
- path?: string;
1140
- name?: string;
1141
- byteLength?: number;
1142
- }
1143
-
1144
- kind: 'bytes' | 'array-buffer' | 'blob' | 'file' | 'path' | 'url' | 'mesh-buffer' | 'readable-stream' | 'async-iterable'
1145
-
1146
- format: GeometryFileFormat
1147
-
1148
- path?: string
1149
-
1150
- name?: string
1151
-
1152
- byteLength?: number
1153
-
1154
- // Canonical P0 object under test for GeoSpec
1155
- // Remarks: This is intentionally a GeoSpec-loaded subject rather than a Tau runtime contract. Runtime integrations pass GLB/glTF bytes or files into loaders.
1156
- GeometrySubject: {
1157
- kind: 'geometry-subject';
1158
- /** Opaque engine-owned identifier used by every protocol claim. */
1159
- subjectId: string;
1160
- mesh: GeometrySubjectMeshEvidence;
1161
- brep?: BrepEvidence;
1162
- step?: StepEvidence;
1163
- provenance: GeometryProvenance;
1164
- capabilities: GeometryCapability[];
1165
- diagnostics: GeometryEvidenceDiagnostic[];
1166
- }
1167
-
1168
- kind: 'geometry-subject'
1169
-
1170
- // Opaque engine-owned identifier used by every protocol claim
1171
- subjectId: string
1172
-
1173
- mesh: GeometrySubjectMeshEvidence
1174
-
1175
- brep?: BrepEvidence
1176
-
1177
- step?: StepEvidence
1178
-
1179
- provenance: GeometryProvenance
1180
-
1181
- capabilities: GeometryCapability[]
1182
-
1183
- diagnostics: GeometryEvidenceDiagnostic[]
1184
-
1185
- // Wire-safe mesh summary carried by an opaque geometry subject
1186
- GeometrySubjectMeshEvidence: {
1187
- format: MeshFileFormat;
1188
- stats: Pick<GeometryStats, 'vertexCount' | 'meshCount' | 'triangleCount'>;
1189
- }
1190
-
1191
- format: MeshFileFormat
1192
-
1193
- stats: Pick<GeometryStats, 'vertexCount' | 'meshCount' | 'triangleCount'>
1194
-
1195
- // Mesh evidence loaded from geometry bytes or buffers
1196
- MeshEvidence: {
1197
- format: MeshFileFormat;
1198
- stats: GeometryStats;
1199
- }
1200
-
1201
- format: MeshFileFormat
1202
-
1203
- stats: GeometryStats
1204
-
1205
- // Geometry file formats supported by the P0 mesh loader
1206
- MeshFileFormat: 'glb' | 'gltf' | 'mesh-buffer'
1207
-
1208
- // Triangle quality and scalar mesh metrics used by P0 GeoSpec matchers
1209
- // Remarks: Values are reported in the glTF document coordinate units.
1210
- MeshQualityStats: {
1211
- triangleCount: number;
1212
- nonFiniteVertices: Array<{
1213
- primitive: string;
1214
- vertexIndex: number;
1215
- position: [number, number, number];
1216
- }>;
1217
- degenerateTriangles: Array<{
1218
- primitive: string;
1219
- triangleIndex: number;
1220
- area: number;
1221
- center: [number, number, number];
1222
- }>;
1223
- duplicateFaces: Array<{
1224
- primitive: string;
1225
- triangleIndex: number;
1226
- firstTriangleIndex: number;
1227
- }>;
1228
- triangles: MeshTriangle[];
1229
- surfaceArea: number;
1230
- signedVolume: number;
1231
- centerOfMass?: Vec3;
1232
- }
1233
-
1234
- triangleCount: number
1235
-
1236
- nonFiniteVertices: Array<{
1237
- primitive: string;
1238
- vertexIndex: number;
1239
- position: [number, number, number];
1240
- }>
1241
-
1242
- degenerateTriangles: Array<{
1243
- primitive: string;
1244
- triangleIndex: number;
1245
- area: number;
1246
- center: [number, number, number];
1247
- }>
1248
-
1249
- duplicateFaces: Array<{
1250
- primitive: string;
1251
- triangleIndex: number;
1252
- firstTriangleIndex: number;
1253
- }>
1254
-
1255
- triangles: MeshTriangle[]
1256
-
1257
- surfaceArea: number
1258
-
1259
- signedVolume: number
1260
-
1261
- centerOfMass?: Vec3
1262
-
1263
- // One triangle from mesh evidence, in geometry document coordinates
1264
- MeshTriangle: {
1265
- primitive: string;
1266
- triangleIndex: number;
1267
- a: [number, number, number];
1268
- b: [number, number, number];
1269
- c: [number, number, number];
1270
- center: [number, number, number];
1271
- area: number;
1272
- }
1273
-
1274
- primitive: string
1275
-
1276
- triangleIndex: number
1277
-
1278
- a: [number, number, number]
1279
-
1280
- b: [number, number, number]
1281
-
1282
- c: [number, number, number]
1283
-
1284
- center: [number, number, number]
1285
-
1286
- area: number
1287
-
1288
- // STEP/XDE evidence extracted while loading a STEP subject
1289
- StepEvidence: {
1290
- schema?: string;
1291
- unit?: GeoSpecUnit;
1292
- productStructure?: Array<{
1293
- name: string;
1294
- path: string;
1295
- transform?: number[];
1296
- }>;
1297
- readStrategy: {
1298
- strategy: 'native-stream' | 'filesystem';
1299
- inputKind: GeometrySource['kind'];
1300
- bytesRead: number;
1301
- nativeReadStream: boolean;
1302
- copiedToEmscriptenFs: boolean;
1303
- };
1304
- capabilities: Array<{
1305
- feature: string;
1306
- supported: boolean;
1307
- reason?: string;
1308
- }>;
1309
- /** Structured AP242 XDE read result (occurrences, subshape names, datum placements). */
1310
- xde?: XdeReadResult;
1311
- }
1312
-
1313
- schema?: string
1314
-
1315
- unit?: GeoSpecUnit
1316
-
1317
- productStructure?: Array<{
1318
- name: string;
1319
- path: string;
1320
- transform?: number[];
1321
- }>
1322
-
1323
- readStrategy: {
1324
- strategy: 'native-stream' | 'filesystem';
1325
- inputKind: GeometrySource['kind'];
1326
- bytesRead: number;
1327
- nativeReadStream: boolean;
1328
- copiedToEmscriptenFs: boolean;
1329
- }
1330
-
1331
- capabilities: Array<{
1332
- feature: string;
1333
- supported: boolean;
1334
- reason?: string;
1335
- }>
1336
-
1337
- // Structured AP242 XDE read result (occurrences, subshape names, datum placements)
1338
- xde?: XdeReadResult
1339
-
1340
863
  // Numeric 3D vector
1341
864
  Vec3: readonly [number, number, number]
1342
865
 
@@ -1385,179 +908,6 @@ MeshBufferSource: {
1385
908
  // Mesh source forms accepted by {@link import ('./load-model.js').loadModel}
1386
909
  MeshSource: Uint8Array<ArrayBuffer> | ArrayBuffer | Blob | File | URL | string | MeshBufferSource
1387
910
 
1388
- // Axis-aligned bounding box in glTF document units (meters)
1389
- AabbMeters: {
1390
- min: [number, number, number];
1391
- max: [number, number, number];
1392
- }
1393
-
1394
- min: [number, number, number]
1395
-
1396
- max: [number, number, number]
1397
-
1398
- // Dominant primitive on an axis extremum for `boundingBox` failures
1399
- BoundingBoxAxisExtremum: {
1400
- name: string;
1401
- aabb: AabbMeters;
1402
- value: number;
1403
- }
1404
-
1405
- name: string
1406
-
1407
- aabb: AabbMeters
1408
-
1409
- value: number
1410
-
1411
- // One axis failure for `boundingBox` checks
1412
- BoundingBoxAxisFailure: {
1413
- axis: 'x' | 'y' | 'z';
1414
- field: 'size' | 'center';
1415
- expected: number;
1416
- actual: number;
1417
- tolerance: number;
1418
- minExtremum?: BoundingBoxAxisExtremum;
1419
- maxExtremum?: BoundingBoxAxisExtremum;
1420
- }
1421
-
1422
- axis: 'x' | 'y' | 'z'
1423
-
1424
- field: 'size' | 'center'
1425
-
1426
- expected: number
1427
-
1428
- actual: number
1429
-
1430
- tolerance: number
1431
-
1432
- minExtremum?: BoundingBoxAxisExtremum
1433
-
1434
- maxExtremum?: BoundingBoxAxisExtremum
1435
-
1436
- // Structured payload when `boundingBox` fails
1437
- BoundingBoxFailure: {
1438
- axisFailures: BoundingBoxAxisFailure[];
1439
- }
1440
-
1441
- axisFailures: BoundingBoxAxisFailure[]
1442
-
1443
- // Scene bounding box with per-primitive contributors in the subject's unit and frame
1444
- BoundingBoxStats: {
1445
- size: [number, number, number];
1446
- center: [number, number, number];
1447
- primitives: PrimitiveRecord[];
1448
- }
1449
-
1450
- size: [number, number, number]
1451
-
1452
- center: [number, number, number]
1453
-
1454
- primitives: PrimitiveRecord[]
1455
-
1456
- // Result of evaluating a single test requirement against geometry stats
1457
- CheckResult: {
1458
- passed: true;
1459
- } | {
1460
- passed: false;
1461
- check: 'boundingBox';
1462
- reason: string;
1463
- suggestion: string;
1464
- failure: BoundingBoxFailure;
1465
- } | {
1466
- passed: false;
1467
- check: 'connectedComponents';
1468
- reason: string;
1469
- suggestion: string;
1470
- failure: ConnectedComponentsFailure;
1471
- } | {
1472
- passed: false;
1473
- check: 'watertight';
1474
- reason: string;
1475
- suggestion: string;
1476
- failure: WatertightFailure;
1477
- } | {
1478
- passed: false;
1479
- check: 'invalid';
1480
- reason: string;
1481
- suggestion: string;
1482
- }
1483
-
1484
- passed: true
1485
-
1486
- // Smallest clearance between two clusters along the dominant separation axis
1487
- ClusterGap: {
1488
- fromLabel: string;
1489
- toLabel: string;
1490
- axis: 'x' | 'y' | 'z';
1491
- /** Millimetres — clearance between the two named primitives' AABBs. */
1492
- gapMm: number;
1493
- fromPrimitive: string;
1494
- toPrimitive: string;
1495
- }
1496
-
1497
- fromLabel: string
1498
-
1499
- toLabel: string
1500
-
1501
- axis: 'x' | 'y' | 'z'
1502
-
1503
- // Millimetres — clearance between the two named primitives' AABBs
1504
- gapMm: number
1505
-
1506
- fromPrimitive: string
1507
-
1508
- toPrimitive: string
1509
-
1510
- // One spatial cluster from AABB overlap grouping
1511
- ClusterReport: {
1512
- label: string;
1513
- primitives: PrimitiveRecord[];
1514
- aabb: AabbMeters;
1515
- centroid: [number, number, number];
1516
- totalVertices: number;
1517
- }
1518
-
1519
- label: string
1520
-
1521
- primitives: PrimitiveRecord[]
1522
-
1523
- aabb: AabbMeters
1524
-
1525
- centroid: [number, number, number]
1526
-
1527
- totalVertices: number
1528
-
1529
- // Structured payload when `connectedComponents` fails
1530
- ConnectedComponentsFailure: {
1531
- expected: number;
1532
- got: number;
1533
- toleranceMm: number;
1534
- clusters: ClusterReport[];
1535
- gaps: ClusterGap[];
1536
- }
1537
-
1538
- expected: number
1539
-
1540
- got: number
1541
-
1542
- toleranceMm: number
1543
-
1544
- clusters: ClusterReport[]
1545
-
1546
- gaps: ClusterGap[]
1547
-
1548
- // Full connected-components analysis at one tolerance
1549
- ConnectedComponentsResult: {
1550
- count: number;
1551
- clusters: ClusterReport[];
1552
- gaps: ClusterGap[];
1553
- }
1554
-
1555
- count: number
1556
-
1557
- clusters: ClusterReport[]
1558
-
1559
- gaps: ClusterGap[]
1560
-
1561
911
  // Runtime export intent recorded when GeoSpec obtains evidence from a CAD runtime instead of a direct geometry file
1562
912
  GeometryExportIntent: {
1563
913
  requested: {
@@ -1627,203 +977,11 @@ GeometryExportIntent: {
1627
977
  direct: boolean;
1628
978
  }
1629
979
 
1630
- // Diagnostic form permitted inside a wire-safe subject snapshot
1631
- GeometryEvidenceDiagnostic: Omit<GeometryDiagnostic, 'details'> & {
1632
- details?: JSONValue;
1633
- }
1634
-
1635
- code: KernelIssueCode | (string & {})
1636
-
1637
- severity: 'error' | 'warning' | 'info'
1638
-
1639
- message: string
1640
-
1641
- suggestion?: string
1642
-
1643
- spatial?: {
1644
- min?: Vec3;
1645
- max?: Vec3;
1646
- center?: Vec3;
1647
- }
1648
-
1649
- details?: JSONValue
1650
-
1651
- // Statistics about a parsed GLB geometry
1652
- // Remarks: `vertexCount` and `meshCount` are kept on the type for internal diagnostic use (and for the kernel-author Vitest harness in `kernel-geometry-testing.utils.ts`); they are no longer exposed via the agent-facing requirement schema.
1653
- GeometryStats: {
1654
- vertexCount: number;
1655
- meshCount: number;
1656
- triangleCount: number;
1657
- meshQuality: MeshQualityStats;
1658
- watertight: boolean;
1659
- boundingBox?: BoundingBoxStats;
1660
- }
1661
-
1662
- vertexCount: number
1663
-
1664
- meshCount: number
1665
-
1666
- triangleCount: number
1667
-
1668
- meshQuality: MeshQualityStats
1669
-
1670
- watertight: boolean
1671
-
1672
- boundingBox?: BoundingBoxStats
1673
-
1674
- // One TRIANGLES primitive with identity for spatial-test feedback
1675
- PrimitiveRecord: {
1676
- /** The glTF node / mesh name (from kernel ShapeConfig.name when present). */
1677
- name: string;
1678
- color?: string;
1679
- vertices: number;
1680
- aabb: AabbMeters;
1681
- }
1682
-
1683
- // The glTF node / mesh name (from kernel ShapeConfig.name when present)
1684
- name: string
1685
-
1686
- color?: string
1687
-
1688
- vertices: number
1689
-
1690
- aabb: AabbMeters
1691
-
1692
- // Structured payload when `watertight` fails
1693
- WatertightFailure: {
1694
- /** Edges with incidence ≠ 2 (open or non-manifold). */
1695
- irregularEdges: number;
1696
- /** Edges shared by exactly one triangle (open boundary). */
1697
- openBoundaryEdges: number;
1698
- /** Edges shared by more than two triangles (over-adjacent/non-manifold). */
1699
- nonManifoldEdges: number;
1700
- irregularEdgeKindCounts: {
1701
- openBoundary: number;
1702
- nonManifold: number;
1703
- };
1704
- irregularEdgeClusters: WatertightIrregularEdgeCluster[];
1705
- irregularEdgeFraction: number;
1706
- perPrimitive: WatertightPrimitiveBreakdown[];
1707
- }
1708
-
1709
- // Edges with incidence ≠ 2 (open or non-manifold)
1710
- irregularEdges: number
1711
-
1712
- // Edges shared by exactly one triangle (open boundary)
1713
- openBoundaryEdges: number
1714
-
1715
- // Edges shared by more than two triangles (over-adjacent/non-manifold)
1716
- nonManifoldEdges: number
1717
-
1718
- irregularEdgeKindCounts: {
1719
- openBoundary: number;
1720
- nonManifold: number;
1721
- }
1722
-
1723
- irregularEdgeClusters: WatertightIrregularEdgeCluster[]
1724
-
1725
- irregularEdgeFraction: number
1726
-
1727
- perPrimitive: WatertightPrimitiveBreakdown[]
1728
-
1729
- // Spatial cluster of related irregular edges
1730
- WatertightIrregularEdgeCluster: {
1731
- kind: WatertightIrregularEdgeKind;
1732
- edgeCount: number;
1733
- aabb: {
1734
- min: Vec3;
1735
- max: Vec3;
1736
- center: Vec3;
1737
- };
1738
- samples: WatertightIrregularEdgeSample[];
1739
- }
1740
-
1741
- kind: WatertightIrregularEdgeKind
1742
-
1743
- edgeCount: number
1744
-
1745
- aabb: {
1746
- min: Vec3;
1747
- max: Vec3;
1748
- center: Vec3;
1749
- }
1750
-
1751
- samples: WatertightIrregularEdgeSample[]
1752
-
1753
- // Class of irregular mesh edge found during watertight analysis
1754
- WatertightIrregularEdgeKind: 'open-boundary' | 'non-manifold'
1755
-
1756
- // Representative irregular edge, in glTF document coordinates
1757
- WatertightIrregularEdgeSample: {
1758
- start: Vec3;
1759
- end: Vec3;
1760
- center: Vec3;
1761
- incidentTriangleCount: number;
1762
- primitives: string[];
1763
- color?: string;
1764
- }
1765
-
1766
- start: Vec3
1767
-
1768
- end: Vec3
1769
-
1770
- center: Vec3
1771
-
1772
- incidentTriangleCount: number
1773
-
1774
- primitives: string[]
1775
-
1776
- color?: string
1777
-
1778
- // Per-primitive watertight diagnostic (local tessellation only)
1779
- WatertightPrimitiveBreakdown: {
1780
- name: string;
1781
- boundaryEdges: number;
1782
- loopCentroid: [number, number, number];
1783
- }
1784
-
1785
- name: string
1786
-
1787
- boundaryEdges: number
1788
-
1789
- loopCentroid: [number, number, number]
1790
-
1791
- // Full watertight analysis (global + per-primitive breakdown)
1792
- WatertightResult: {
1793
- watertight: boolean;
1794
- irregularEdges: number;
1795
- openBoundaryEdges: number;
1796
- nonManifoldEdges: number;
1797
- irregularEdgeKindCounts: {
1798
- openBoundary: number;
1799
- nonManifold: number;
1800
- };
1801
- irregularEdgeClusters: WatertightIrregularEdgeCluster[];
1802
- totalEdges: number;
1803
- irregularEdgeFraction: number;
1804
- perPrimitive: WatertightPrimitiveBreakdown[];
1805
- }
1806
-
1807
- watertight: boolean
1808
-
1809
- irregularEdges: number
1810
-
1811
- openBoundaryEdges: number
1812
-
1813
- nonManifoldEdges: number
1814
-
1815
- irregularEdgeKindCounts: {
1816
- openBoundary: number;
1817
- nonManifold: number;
1818
- }
1819
-
1820
- irregularEdgeClusters: WatertightIrregularEdgeCluster[]
1821
-
1822
- totalEdges: number
1823
-
1824
- irregularEdgeFraction: number
980
+ // Geometry file formats a GeoSpec export intent can name
981
+ GeometryFileFormat: MeshFileFormat | 'step' | 'stp'
1825
982
 
1826
- perPrimitive: WatertightPrimitiveBreakdown[]
983
+ // Geometry file formats supported by the P0 mesh loader
984
+ MeshFileFormat: 'glb' | 'gltf' | 'mesh-buffer'
1827
985
 
1828
986
  // Defaults accepted by {@link import ('./load-model.js').createModelLoader}
1829
987
  CreateModelLoaderOptions: {
@@ -2057,3 +1215,330 @@ GeoSpecConsumedSources: ReadonlyArray<{
2057
1215
  readonly path: string;
2058
1216
  readonly sha256: string;
2059
1217
  }>
1218
+
1219
+ // Inline code-CAD model load options
1220
+ LoadModelCodeOptions: {
1221
+ /** Source files keyed by project-relative path. */
1222
+ code: Code;
1223
+ /** Entry path to render from {@link code}. */
1224
+ file: keyof Code & string;
1225
+ /** Not accepted: inline code has no project folder to resolve in, and a load naming one is refused. */
1226
+ rootDir?: never;
1227
+ /** Geometry format to export. Defaults to `glb`. */
1228
+ format?: GeoSpecModelFormat;
1229
+ /** Explicit parameters passed to the exporter. */
1230
+ parameters?: Record<string, unknown>;
1231
+ /** Absolute project root passed to the exporter. */
1232
+ projectPath?: string;
1233
+ /** STEP reader strategy used for STEP exports. */
1234
+ stepStreaming?: StepStreamingMode;
1235
+ /** Whether STEP loading should also produce mesh evidence. Defaults to true. */
1236
+ mesh?: boolean;
1237
+ /** Linear tolerance used while meshing exact BRep evidence. */
1238
+ meshLinearTolerance?: number;
1239
+ /** Angular tolerance in degrees used while meshing exact BRep evidence. */
1240
+ meshAngularToleranceDegrees?: number;
1241
+ /**
1242
+ * Default work-unit budget for every claim on this subject: a positive integer no greater than
1243
+ * the host's maximum (default `geoSpecMaximumWorkUnitLimit`, 512 000 000). `expectGeo(subject, { workUnitLimit })` overrides
1244
+ * it per chain. Recorded in the load evidence; it never changes the exported or admitted bytes.
1245
+ */
1246
+ workUnitLimit?: number;
1247
+ /**
1248
+ * Axis-aligned millimetre box the exporter crops the model to before export, so a large mesh model
1249
+ * can be checked region by region. Only an exporter that declares `region` honours it; any other
1250
+ * exporter, or a crop the exporter cannot make, refuses with a typed diagnostic instead of loading
1251
+ * the whole model. The cropped subject is a different subject: its load evidence records `region`,
1252
+ * so a claim on it never stands for the whole model.
1253
+ */
1254
+ region?: GeoSpecLoadRegion;
1255
+ }
1256
+
1257
+ // Source files keyed by project-relative path
1258
+ code: Code
1259
+
1260
+ // Entry path to render from {@link code }
1261
+ file: keyof Code & string
1262
+
1263
+ // Not accepted
1264
+ rootDir?: never
1265
+
1266
+ // Geometry format to export
1267
+ format?: GeoSpecModelFormat
1268
+
1269
+ // Explicit parameters passed to the exporter
1270
+ parameters?: Record<string, unknown>
1271
+
1272
+ // Absolute project root passed to the exporter
1273
+ projectPath?: string
1274
+
1275
+ // STEP reader strategy used for STEP exports
1276
+ stepStreaming?: StepStreamingMode
1277
+
1278
+ // Whether STEP loading should also produce mesh evidence
1279
+ mesh?: boolean
1280
+
1281
+ // Linear tolerance used while meshing exact BRep evidence
1282
+ meshLinearTolerance?: number
1283
+
1284
+ // Angular tolerance in degrees used while meshing exact BRep evidence
1285
+ meshAngularToleranceDegrees?: number
1286
+
1287
+ // Default work-unit budget for every claim on this subject
1288
+ workUnitLimit?: number
1289
+
1290
+ // Axis-aligned millimetre box the exporter crops the model to before export, so a large mesh model can be checked region by region
1291
+ region?: GeoSpecLoadRegion
1292
+
1293
+ // Filesystem-backed model load options
1294
+ LoadModelFileOptions: {
1295
+ /**
1296
+ * Model file to render, as a path from the project root: the same root every tool's `targetFile` resolves
1297
+ * against, which the result names as `projectRoot` where the host reports it, as `tau mcp` does.
1298
+ */
1299
+ file: string;
1300
+ /**
1301
+ * Project-relative folder `file` resolves in, for a suite that loads from somewhere other than the project root:
1302
+ * `loadModel({ file: 'main.ts', rootDir: 'parts/gear' })` loads `parts/gear/main.ts`. Recorded in the load
1303
+ * evidence.
1304
+ */
1305
+ rootDir?: string;
1306
+ /** Absolute project root passed to the exporter. */
1307
+ projectPath?: string;
1308
+ /** Geometry format to export. Defaults to `glb`. */
1309
+ format?: GeoSpecModelFormat;
1310
+ /** Explicit parameters passed to the exporter. */
1311
+ parameters?: Record<string, unknown>;
1312
+ /** STEP reader strategy used for STEP exports. */
1313
+ stepStreaming?: StepStreamingMode;
1314
+ /** Whether STEP loading should also produce mesh evidence. Defaults to true. */
1315
+ mesh?: boolean;
1316
+ /** Linear tolerance used while meshing exact BRep evidence. */
1317
+ meshLinearTolerance?: number;
1318
+ /** Angular tolerance in degrees used while meshing exact BRep evidence. */
1319
+ meshAngularToleranceDegrees?: number;
1320
+ /**
1321
+ * Default work-unit budget for every claim on this subject: a positive integer no greater than
1322
+ * the host's maximum (default `geoSpecMaximumWorkUnitLimit`, 512 000 000). `expectGeo(subject, { workUnitLimit })` overrides
1323
+ * it per chain. Recorded in the load evidence; it never changes the exported or admitted bytes.
1324
+ */
1325
+ workUnitLimit?: number;
1326
+ /**
1327
+ * Axis-aligned millimetre box the exporter crops the model to before export, so a large mesh model
1328
+ * can be checked region by region. Only an exporter that declares `region` honours it; any other
1329
+ * exporter, or a crop the exporter cannot make, refuses with a typed diagnostic instead of loading
1330
+ * the whole model. The cropped subject is a different subject: its load evidence records `region`,
1331
+ * so a claim on it never stands for the whole model.
1332
+ */
1333
+ region?: GeoSpecLoadRegion;
1334
+ }
1335
+
1336
+ // Model file to render, as a path from the project root
1337
+ file: string
1338
+
1339
+ // Project-relative folder `file` resolves in, for a suite that loads from somewhere other than the project root
1340
+ rootDir?: string
1341
+
1342
+ // Absolute project root passed to the exporter
1343
+ projectPath?: string
1344
+
1345
+ // Geometry format to export
1346
+ format?: GeoSpecModelFormat
1347
+
1348
+ // Explicit parameters passed to the exporter
1349
+ parameters?: Record<string, unknown>
1350
+
1351
+ // STEP reader strategy used for STEP exports
1352
+ stepStreaming?: StepStreamingMode
1353
+
1354
+ // Whether STEP loading should also produce mesh evidence
1355
+ mesh?: boolean
1356
+
1357
+ // Linear tolerance used while meshing exact BRep evidence
1358
+ meshLinearTolerance?: number
1359
+
1360
+ // Angular tolerance in degrees used while meshing exact BRep evidence
1361
+ meshAngularToleranceDegrees?: number
1362
+
1363
+ // Default work-unit budget for every claim on this subject
1364
+ workUnitLimit?: number
1365
+
1366
+ // Axis-aligned millimetre box the exporter crops the model to before export, so a large mesh model can be checked region by region
1367
+ region?: GeoSpecLoadRegion
1368
+
1369
+ // Options accepted by {@link import ('./load-model.js').loadModel}
1370
+ LoadModelOptions: LoadModelSourceOptions | LoadModelCodeOptions<Code> | LoadModelFileOptions
1371
+
1372
+ // Project-relative folder `file` resolves in, for a suite that loads from somewhere other than the project root
1373
+ rootDir?: string
1374
+
1375
+ // Geometry format to export
1376
+ format?: GeoSpecModelFormat
1377
+
1378
+ // Explicit parameters passed to the exporter
1379
+ parameters?: Record<string, unknown>
1380
+
1381
+ // STEP reader strategy used for STEP exports
1382
+ stepStreaming?: StepStreamingMode
1383
+
1384
+ // Whether STEP loading should also produce mesh evidence
1385
+ mesh?: boolean
1386
+
1387
+ // Linear tolerance used while meshing exact BRep evidence
1388
+ meshLinearTolerance?: number
1389
+
1390
+ // Angular tolerance in degrees used while meshing exact BRep evidence
1391
+ meshAngularToleranceDegrees?: number
1392
+
1393
+ // Default work-unit budget for every claim on this subject
1394
+ workUnitLimit?: number
1395
+
1396
+ // Direct geometry-source model load options
1397
+ LoadModelSourceOptions: {
1398
+ /** Geometry bytes, path, browser file/blob, or in-memory mesh buffer. */
1399
+ source: MeshSource | StepSource;
1400
+ /** Named external resources consumed alongside the direct geometry bytes. */
1401
+ resources?: ReadonlyArray<{
1402
+ readonly name: string;
1403
+ readonly source: MeshSource | StepSource;
1404
+ }>;
1405
+ /**
1406
+ * Project-relative folder a path `source` and each resource path resolve in. Omitted, they resolve against the
1407
+ * project root. Recorded in the load evidence.
1408
+ */
1409
+ rootDir?: string;
1410
+ /** Source geometry format. Defaults to `glb`. */
1411
+ format?: GeoSpecModelFormat;
1412
+ /** Source path recorded in provenance. */
1413
+ path?: string;
1414
+ /** Human-readable source name recorded in provenance. */
1415
+ name?: string;
1416
+ /** Coordinate unit of raw GLB/glTF or mesh-buffer data before canonical millimetre normalization. */
1417
+ sourceUnit?: GeoSpecUnit;
1418
+ /** Explicit parameters recorded in provenance. */
1419
+ parameters?: Record<string, unknown>;
1420
+ /** STEP reader strategy used for STEP sources. */
1421
+ stepStreaming?: StepStreamingMode;
1422
+ /** Whether STEP loading should also produce mesh evidence. Defaults to true. */
1423
+ mesh?: boolean;
1424
+ /** Linear tolerance used while meshing exact BRep evidence. */
1425
+ meshLinearTolerance?: number;
1426
+ /** Angular tolerance in degrees used while meshing exact BRep evidence. */
1427
+ meshAngularToleranceDegrees?: number;
1428
+ /**
1429
+ * Default work-unit budget for every claim on this subject: a positive integer no greater than
1430
+ * the host's maximum (default `geoSpecMaximumWorkUnitLimit`, 512 000 000). `expectGeo(subject, { workUnitLimit })` overrides
1431
+ * it per chain. Recorded in the load evidence; it never changes the exported or admitted bytes.
1432
+ */
1433
+ workUnitLimit?: number;
1434
+ }
1435
+
1436
+ // Geometry bytes, path, browser file/blob, or in-memory mesh buffer
1437
+ source: MeshSource | StepSource
1438
+
1439
+ // Named external resources consumed alongside the direct geometry bytes
1440
+ resources?: ReadonlyArray<{
1441
+ readonly name: string;
1442
+ readonly source: MeshSource | StepSource;
1443
+ }>
1444
+
1445
+ // Project-relative folder a path `source` and each resource path resolve in
1446
+ rootDir?: string
1447
+
1448
+ // Source geometry format
1449
+ format?: GeoSpecModelFormat
1450
+
1451
+ // Source path recorded in provenance
1452
+ path?: string
1453
+
1454
+ // Human-readable source name recorded in provenance
1455
+ name?: string
1456
+
1457
+ // Coordinate unit of raw GLB/glTF or mesh-buffer data before canonical millimetre normalization
1458
+ sourceUnit?: GeoSpecUnit
1459
+
1460
+ // Explicit parameters recorded in provenance
1461
+ parameters?: Record<string, unknown>
1462
+
1463
+ // STEP reader strategy used for STEP sources
1464
+ stepStreaming?: StepStreamingMode
1465
+
1466
+ // Whether STEP loading should also produce mesh evidence
1467
+ mesh?: boolean
1468
+
1469
+ // Linear tolerance used while meshing exact BRep evidence
1470
+ meshLinearTolerance?: number
1471
+
1472
+ // Angular tolerance in degrees used while meshing exact BRep evidence
1473
+ meshAngularToleranceDegrees?: number
1474
+
1475
+ // Default work-unit budget for every claim on this subject
1476
+ workUnitLimit?: number
1477
+
1478
+ // Options for {@link commandExporter}
1479
+ CommandExporterOptions: {
1480
+ readonly id: string;
1481
+ /** File extensions without the dot, or `'*'`. */
1482
+ readonly extensions: readonly string[];
1483
+ /** Executable and leading arguments, such as `['python', 'export.py']`. */
1484
+ readonly command: readonly string[];
1485
+ /** What the command can do. Protocol 1 carries no inline sources, so `inlineSources` must not be set. */
1486
+ readonly capabilities: GeoSpecExporterCapabilities;
1487
+ /** Working directory of the command; defaults to the request's project root. */
1488
+ readonly cwd?: string;
1489
+ /** Extra environment variables, merged over this process's. */
1490
+ readonly env?: Readonly<Record<string, string>>;
1491
+ /** Positive milliseconds one export may run before the command is killed and the export fails. */
1492
+ readonly exportTimeout?: number;
1493
+ }
1494
+
1495
+ readonly id: string
1496
+
1497
+ // File extensions without the dot, or `'*'`
1498
+ readonly extensions: readonly string[]
1499
+
1500
+ // Executable and leading arguments, such as `['python', 'export.py']`
1501
+ readonly command: readonly string[]
1502
+
1503
+ // What the command can do
1504
+ readonly capabilities: GeoSpecExporterCapabilities
1505
+
1506
+ // Working directory of the command
1507
+ readonly cwd?: string
1508
+
1509
+ // Extra environment variables, merged over this process's
1510
+ readonly env?: Readonly<Record<string, string>>
1511
+
1512
+ // Positive milliseconds one export may run before the command is killed and the export fails
1513
+ readonly exportTimeout?: number
1514
+
1515
+ // Collects suites, tests, assertions, and async completion state for one GeoSpec module execution
1516
+ GeoSpecCollector: {
1517
+ tests: GeoSpecTestCase[];
1518
+ describe(name: string, function_: GeoSpecTestFunction): void;
1519
+ describeSkip(name: string, _function?: GeoSpecTestFunction): void;
1520
+ it(name: string, function_: GeoSpecTestFunction): void;
1521
+ itSkip(name: string, _function?: GeoSpecTestFunction): void;
1522
+ expectGeo(subject: unknown, options?: GeoSpecExpectOptions): GeoSpecMatcher;
1523
+ waitForCompletion(testTimeout?: number, testNamePattern?: GeoSpecTestNamePattern): Promise<void>;
1524
+ }
1525
+
1526
+ tests: GeoSpecTestCase[]
1527
+
1528
+ // GeoSpecCollector.describe (method)
1529
+ describe(name: string, function_: GeoSpecTestFunction): void;
1530
+
1531
+ // GeoSpecCollector.describeSkip (method)
1532
+ describeSkip(name: string, _function?: GeoSpecTestFunction): void;
1533
+
1534
+ // GeoSpecCollector.it (method)
1535
+ it(name: string, function_: GeoSpecTestFunction): void;
1536
+
1537
+ // GeoSpecCollector.itSkip (method)
1538
+ itSkip(name: string, _function?: GeoSpecTestFunction): void;
1539
+
1540
+ // GeoSpecCollector.expectGeo (method)
1541
+ expectGeo(subject: unknown, options?: GeoSpecExpectOptions): GeoSpecMatcher;
1542
+
1543
+ // GeoSpecCollector.waitForCompletion (method)
1544
+ waitForCompletion(testTimeout?: number, testNamePattern?: GeoSpecTestNamePattern): Promise<void>;