@jskit-ai/agent-docs 0.1.279 → 0.1.281

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 (138) hide show
  1. package/guide/agent/app-extras/assistant-conversation.md +5 -1
  2. package/guide/agent/app-extras/assistant.md +123 -0
  3. package/guide/agent/app-extras/realtime.md +20 -10
  4. package/guide/agent/app-setup/authentication.md +54 -4
  5. package/guide/agent/app-setup/database-layer.md +108 -35
  6. package/guide/agent/app-setup/existing-application-migration.md +7 -1
  7. package/guide/agent/app-setup/material-3-migration.md +38 -9
  8. package/guide/agent/app-setup/multi-homing.md +14 -4
  9. package/guide/agent/app-setup/upgrading-jskit.md +105 -0
  10. package/guide/agent/app-setup/users.md +9 -1
  11. package/guide/agent/framework/client-features.md +35 -1
  12. package/guide/agent/framework/material-3.md +111 -71
  13. package/guide/agent/framework/sanity-checks.md +181 -0
  14. package/guide/agent/framework/translation.md +4 -0
  15. package/guide/agent/framework/typed-features.md +222 -120
  16. package/guide/agent/framework/ui-operations.md +3 -1
  17. package/guide/agent/index.md +3 -0
  18. package/package.json +2 -2
  19. package/patterns/feature-package/example/booking-engine/package.json +1 -1
  20. package/patterns/minimal-foundation/PATTERN.md +6 -2
  21. package/patterns/minimal-foundation/example/AGENTS.md +22 -5
  22. package/patterns/minimal-foundation/example/package.json +6 -6
  23. package/patterns/minimal-foundation/example/playwright.config.mjs +3 -30
  24. package/patterns/minimal-foundation/example/server.js +7 -1
  25. package/patterns/minimal-foundation/example/src/main.js +3 -2
  26. package/patterns/minimal-foundation/example/tests/e2e/startup.spec.ts +13 -0
  27. package/patterns/minimal-foundation/example/vite.config.mjs +3 -1
  28. package/patterns/shell-foundation/PATTERN.md +4 -1
  29. package/patterns/shell-foundation/example/AGENTS.md +22 -5
  30. package/patterns/shell-foundation/example/package.json +7 -7
  31. package/patterns/shell-foundation/example/packages/main/package.json +1 -1
  32. package/patterns/shell-foundation/example/packages/main/src/client/providers/MainClientProvider.js +3 -0
  33. package/patterns/shell-foundation/example/playwright.config.mjs +3 -30
  34. package/patterns/shell-foundation/example/server.js +7 -1
  35. package/patterns/shell-foundation/example/src/components/menus/SectionTabLinkItem.vue +42 -0
  36. package/patterns/shell-foundation/example/src/main.js +3 -2
  37. package/patterns/shell-foundation/example/src/pages/home.vue +1 -1
  38. package/patterns/shell-foundation/example/src/views/NotFound.vue +1 -1
  39. package/patterns/shell-foundation/example/tests/e2e/startup.spec.ts +13 -0
  40. package/patterns/shell-foundation/example/vite.config.mjs +3 -1
  41. package/reference/autogen/PATTERN_INDEX.md +37 -37
  42. package/reference/autogen/packages/agent-docs.md +4 -0
  43. package/reference/autogen/packages/architecture-inspector.md +1 -0
  44. package/reference/autogen/packages/assistant-runtime.md +28 -3
  45. package/reference/autogen/packages/auth-provider-local-core.md +2 -1
  46. package/reference/autogen/packages/auth-web.md +10 -0
  47. package/reference/autogen/packages/connectors-catalog.md +8 -0
  48. package/reference/autogen/packages/crud-core.md +3 -0
  49. package/reference/autogen/packages/database-runtime.md +33 -0
  50. package/reference/autogen/packages/http-web.md +0 -4
  51. package/reference/autogen/packages/json-rest-api-core.md +17 -4
  52. package/reference/autogen/packages/kernel.md +37 -2
  53. package/reference/autogen/packages/material-web.md +2 -1
  54. package/reference/autogen/packages/oidc-issuer-core.md +0 -1
  55. package/reference/autogen/packages/realtime.md +8 -5
  56. package/reference/autogen/packages/shell-web.md +88 -3
  57. package/reference/autogen/packages/users-web.md +5 -2
  58. package/reference/autogen/packages/workspaces-core.md +3 -1
  59. package/reference/autogen/tooling/jskit-catalog.md +122 -5
  60. package/reference/autogen/tooling/testUtils.md +15 -1
  61. package/skills/jskit/SKILL.md +17 -5
  62. package/skills/jskit/references/client-features.md +35 -1
  63. package/skills/jskit/references/existing-application-migration.md +7 -1
  64. package/skills/jskit/references/heuristics/INDEX.md +3 -1
  65. package/skills/jskit/references/heuristics/row-policies.md +3 -3
  66. package/skills/jskit/references/heuristics/typed-features.md +7 -7
  67. package/skills/jskit/references/heuristics/ui-testing.md +27 -21
  68. package/skills/jskit/references/material-3.md +111 -71
  69. package/skills/jskit/references/multi-homing.md +14 -4
  70. package/skills/jskit/references/pattern-index.md +37 -37
  71. package/skills/jskit/references/patterns/app/minimal-foundation/PATTERN.md +6 -2
  72. package/skills/jskit/references/patterns/app/minimal-foundation/example/AGENTS.md +22 -5
  73. package/skills/jskit/references/patterns/app/minimal-foundation/example/package.json +6 -6
  74. package/skills/jskit/references/patterns/app/minimal-foundation/example/playwright.config.mjs +3 -30
  75. package/skills/jskit/references/patterns/app/minimal-foundation/example/server.js +7 -1
  76. package/skills/jskit/references/patterns/app/minimal-foundation/example/src/main.js +3 -2
  77. package/skills/jskit/references/patterns/app/minimal-foundation/example/tests/e2e/startup.spec.ts +13 -0
  78. package/skills/jskit/references/patterns/app/minimal-foundation/example/vite.config.mjs +3 -1
  79. package/skills/jskit/references/patterns/app/shell-foundation/PATTERN.md +4 -1
  80. package/skills/jskit/references/patterns/app/shell-foundation/example/AGENTS.md +22 -5
  81. package/skills/jskit/references/patterns/app/shell-foundation/example/package.json +7 -7
  82. package/skills/jskit/references/patterns/app/shell-foundation/example/packages/main/package.json +1 -1
  83. package/skills/jskit/references/patterns/app/shell-foundation/example/packages/main/src/client/providers/MainClientProvider.js +3 -0
  84. package/skills/jskit/references/patterns/app/shell-foundation/example/playwright.config.mjs +3 -30
  85. package/skills/jskit/references/patterns/app/shell-foundation/example/server.js +7 -1
  86. package/skills/jskit/references/patterns/app/shell-foundation/example/src/components/menus/SectionTabLinkItem.vue +42 -0
  87. package/skills/jskit/references/patterns/app/shell-foundation/example/src/main.js +3 -2
  88. package/skills/jskit/references/patterns/app/shell-foundation/example/src/pages/home.vue +1 -1
  89. package/skills/jskit/references/patterns/app/shell-foundation/example/src/views/NotFound.vue +1 -1
  90. package/skills/jskit/references/patterns/app/shell-foundation/example/tests/e2e/startup.spec.ts +13 -0
  91. package/skills/jskit/references/patterns/app/shell-foundation/example/vite.config.mjs +3 -1
  92. package/skills/jskit/references/patterns/auth/accounts-hub/example/package.json +2 -2
  93. package/skills/jskit/references/patterns/auth/auth-surface/PATTERN.md +18 -5
  94. package/skills/jskit/references/patterns/auth/auth-surface/example/src/components/AppBrand.vue +17 -0
  95. package/skills/jskit/references/patterns/auth/auth-surface/example/src/pages/auth/login.vue +2 -2
  96. package/skills/jskit/references/patterns/auth/auth-surface/example/src/pages/auth/reset-password.vue +2 -2
  97. package/skills/jskit/references/patterns/auth/auth-surface/example/src/pages/auth/signout.vue +2 -2
  98. package/skills/jskit/references/patterns/auth/auth-surface/example/src/views/auth/LoginView.vue +6 -1
  99. package/skills/jskit/references/patterns/auth/auth-surface/example/src/views/auth/ResetPasswordView.vue +6 -1
  100. package/skills/jskit/references/patterns/auth/auth-surface/example/src/views/auth/SignOutView.vue +6 -1
  101. package/skills/jskit/references/patterns/auth/oidc-sign-in/example/package.json +2 -2
  102. package/skills/jskit/references/patterns/auth/supabase-auth/example/package.json +1 -1
  103. package/skills/jskit/references/patterns/connectors/aws-storage-queries/example/formats/package.json +1 -1
  104. package/skills/jskit/references/patterns/connectors/calendar-cli/example/package.json +4 -4
  105. package/skills/jskit/references/patterns/console/console-surface/example/src/pages/console.vue +1 -1
  106. package/skills/jskit/references/patterns/crud/json-api-resource-package/example/packages/books/package.json +2 -2
  107. package/skills/jskit/references/patterns/database/mysql-application/PATTERN.md +34 -24
  108. package/skills/jskit/references/patterns/database/mysql-application/example/package.json +3 -2
  109. package/skills/jskit/references/patterns/database/mysql-application/example/tests/e2e/databases.js +25 -0
  110. package/skills/jskit/references/patterns/database/postgres-application/PATTERN.md +12 -0
  111. package/skills/jskit/references/patterns/database/postgres-application/example/package.json +3 -2
  112. package/skills/jskit/references/patterns/database/postgres-application/example/tests/e2e/databases.js +25 -0
  113. package/skills/jskit/references/patterns/realtime/realtime-application/example/package.json +2 -2
  114. package/skills/jskit/references/patterns/rewards/google-rewarded/example/googlePublisherTag.js +5 -2
  115. package/skills/jskit/references/patterns/server/feature-package/example/booking-engine/package.json +1 -1
  116. package/skills/jskit/references/patterns/shell/application-shell/PATTERN.md +11 -6
  117. package/skills/jskit/references/patterns/shell/application-shell/example/src/components/menus/SectionTabLinkItem.vue +42 -0
  118. package/skills/jskit/references/patterns/shell/application-shell/example/src/pages/home.vue +1 -1
  119. package/skills/jskit/references/patterns/shell/application-shell/example/src/views/NotFound.vue +1 -1
  120. package/skills/jskit/references/patterns/ui/page-and-placement/PATTERN.md +6 -0
  121. package/skills/jskit/references/patterns/ui/page-and-placement/example/src/pages/home/reports.vue +9 -4
  122. package/skills/jskit/references/patterns/ui/page-and-placement/example/src/placementTopology.js +5 -3
  123. package/skills/jskit/references/patterns/users/account-settings/PATTERN.md +24 -3
  124. package/skills/jskit/references/patterns/users/account-settings/example/src/components/account/settings/AccountSettingsNotificationsSection.vue +1 -1
  125. package/skills/jskit/references/patterns/users/account-settings/example/src/components/account/settings/AccountSettingsPreferencesSection.vue +2 -1
  126. package/skills/jskit/references/patterns/users/account-settings/example/src/components/account/settings/AccountSettingsProfileSection.vue +3 -2
  127. package/skills/jskit/references/patterns/users/account-settings/example/src/pages/account/[section].vue +23 -0
  128. package/skills/jskit/references/patterns/users/account-settings/example/src/pages/account.vue +4 -3
  129. package/skills/jskit/references/patterns/users/user-administration-server/example/packages/users/package.json +2 -2
  130. package/skills/jskit/references/patterns/users/user-administration-server/example/packages/users-workspace/package.json +3 -3
  131. package/skills/jskit/references/patterns/workspaces/workspace-surfaces/example/packages/main/src/client/components/AccountPendingInvitesCue.vue +3 -3
  132. package/skills/jskit/references/patterns/workspaces/workspace-surfaces/example/src/surfaces/admin/root.vue +1 -1
  133. package/skills/jskit/references/patterns/workspaces/workspace-surfaces/example/src/surfaces/app/root.vue +1 -1
  134. package/skills/jskit/references/sanity-checks.md +181 -0
  135. package/skills/jskit/references/translation.md +4 -0
  136. package/skills/jskit/references/typed-features.md +222 -120
  137. package/skills/jskit/references/ui-operations.md +3 -1
  138. package/skills/jskit/references/patterns/database/mysql-application/example/tests/browser/database.js +0 -68
@@ -536,6 +536,10 @@ Local functions
536
536
  - `ignoreBootstrapStep()`
537
537
  - `installAppPlugins(app, appPlugins = [])`
538
538
  - `isSurfaceRootRecord(record)`
539
+ - `hostsChildViews(record)`
540
+ - `hashScrollMargin(hash)`
541
+ - `isLazyRouteComponent(component)`
542
+ - `preloadOpeningRouteComponents(router, fallbackRoute)`
539
543
 
540
544
  ### `client/shellRouting.js`
541
545
  Exports
@@ -579,6 +583,9 @@ Exports
579
583
  Exports
580
584
  - `installedClientModules`
581
585
  - `bootInstalledClientModules(context = {})`
586
+ - `VUETIFY_LAYER_ORDER`
587
+ - `namedCascadeLayers(css)`
588
+ - `checkVuetifyLayerOrder(stylesheets = [])`
582
589
  - `CLIENT_BOOTSTRAP_VIRTUAL_ID`
583
590
  - `CLIENT_BOOTSTRAP_RESOLVED_ID`
584
591
  - `createVirtualModuleSource(clientModules, localePackageIds)`
@@ -593,13 +600,18 @@ Exports
593
600
  - `resolveInstalledViteProxyEntries(installedPackages = [], { proxyTarget = "" } = {})`
594
601
  - `createJskitClientBootstrapPlugin({ proxyTarget = "" } = {})`
595
602
  Local functions
603
+ - `builtPageStylesheets(bundle)`
596
604
  - `isLocalScopePackageId(value)`
597
605
  - `readJsonFile(filePath, fallback)`
598
606
  - `hasClientExport(packageJson)`
599
607
  - `isPathInsideRoot(rootPath, candidatePath)`
600
608
  - `splitSpecifierSuffix(source)`
609
+ - `exportFile(target)`
610
+ - `resolveClientBootImports(installedPackage, { packageMetadataUiRoutes, packageMetadataClientProviders })`
601
611
  - `resolveClientModulesFromInstalledPackages(installedPackages = [])`
602
612
  - `normalizeClientModulePackageMetadataEntries(value)`
613
+ - `normalizeBootProviders(bootImports)`
614
+ - `clientBootSpecifiers(entry)`
603
615
  - `resolveClientRuntimeDedupeSpecifiers(userResolveConfig = {})`
604
616
 
605
617
  ### `client/vite/index.js`
@@ -637,7 +649,10 @@ Exports
637
649
  Local functions
638
650
  - `normalizeActionDomain(value, { context = "domain" } = {})`
639
651
  - `normalizeStringArray(value, fieldName)`
640
- - `normalizeActionSchema(value, fieldName, { required = false, defaultMode = "" } = {})`
652
+ - `schemaFieldDefinitions(value)`
653
+ - `refuseOneOfFields(fields, fieldName, parentPath = "")`
654
+ - `refuseOneOfField(definition, fieldName, path)`
655
+ - `normalizeActionSchema(value, fieldName, { required = false, defaultMode = "", refuseOneOf = false } = {})`
641
656
  - `normalizeActionPermission(permission, actionId)`
642
657
  - `normalizeActionExtensions(value)`
643
658
  - `normalizeActionEvents(value, actionId)`
@@ -789,6 +804,12 @@ Local functions
789
804
  - `emptyInput()`
790
805
  - `handlerAsGiven(handler)`
791
806
 
807
+ ### `server/http/lib/deepFrozen.js`
808
+ Exports
809
+ - `isDeepFrozen(value)`
810
+ Local functions
811
+ - `isFrozenThroughout(node, checked)`
812
+
792
813
  ### `server/http/lib/errors.js`
793
814
  Exports
794
815
  - `HttpKernelError`
@@ -822,6 +843,10 @@ Exports
822
843
  - `type ActionCatalogue`
823
844
  - `type RuntimeFastify`
824
845
  Local functions
846
+ - `sharedValidationSchema(schema)`
847
+ - `namesEveryType(value)`
848
+ - `isSharedResponseSchema(entry)`
849
+ - `copyRouteSchema(schema)`
825
850
  - `toFastifyRouteOptions(route)`
826
851
  - `shouldStripFastifyBodySchema(route, schema)`
827
852
  - `normalizeHeaderValue(value)`
@@ -851,6 +876,7 @@ Exports
851
876
  - `resolveRouteValidatorOptions({ method = "", path = "", options = {} } = {})`
852
877
  Local functions
853
878
  - `stripJsonRestTransportExtensions(value)`
879
+ - `stripSchemaCopy(value)`
854
880
  - `normalizeRouteSchemaSection(value, { context = "route section", defaultMode = "patch" } = {})`
855
881
  - `normalizeResponseDefinition(value, { context = "route responses" } = {})`
856
882
  - `normalizeAdvancedFastifySchema(value, { context = "route validator" } = {})`
@@ -860,9 +886,14 @@ Local functions
860
886
  ### `server/http/responseSerializerFactory.js`
861
887
  Exports
862
888
  - `createCachedResponseSerializerFactory(buildSerializer)`
889
+ - `schemaCacheKey(schema)`
863
890
  Local functions
891
+ - `schemaTools()`
864
892
  - `isJsonValue(value, ancestors = new Set())`
865
- - `schemaCacheKey(schema)`
893
+ - `assertValidSchema(schema, name)`
894
+ - `filedSchemaId(schema, fallback)`
895
+ - `everyRefResolves(schema, externalSchemas)`
896
+ - `compiledOnFirstUse(compile, options, key)`
866
897
 
867
898
  ### `server/http/securityHeaders.js`
868
899
  Exports
@@ -1046,6 +1077,7 @@ Exports
1046
1077
  Local functions
1047
1078
  - `fileLockError(message = "", code = FILE_LOCK_ERROR_CODE)`
1048
1079
  - `normalizedAbsolutePath(value = "", label = "path", errorCode = FILE_LOCK_ERROR_CODE)`
1080
+ - `lockThroughDescriptor(fd, cwd)`
1049
1081
 
1050
1082
  ### `server/support/importFreshModuleFromAbsolutePath.js`
1051
1083
  Exports
@@ -1137,3 +1169,6 @@ Local functions
1137
1169
  - `resolveFileDependencyRoot(appRoot, specifier = "")`
1138
1170
  - `resolveInstalledPackageRoot({ appRoot, packageId, parentPackageRoot = "" })`
1139
1171
  - `resolvePackageRoots({ appRoot, packageId, directSpecifier = "", parentPackageRoot = "" })`
1172
+ - `fileStamp(filePath)`
1173
+ - `stampsOf(filePaths)`
1174
+ - `walkInstalledPackages(normalizedAppRoot)`
@@ -33,8 +33,9 @@ Exports
33
33
  ### `src/client/index.js`
34
34
  Exports
35
35
  - `materialThemes`
36
- - `createMaterialVuetifyOptions({ seed = DEFAULT_SEED, colors = {}, icons = {} } = {})`
36
+ - `createMaterialVuetifyOptions({ seed = DEFAULT_SEED, colors = {}, icons = {}, typography = {} } = {})`
37
37
  Local functions
38
+ - `typefaceVariables({ brand = ROBOTO_FLEX, plain = ROBOTO_FLEX } = {})`
38
39
  - `appIconAliases(icons)`
39
40
 
40
41
  ### `src/client/symbols.js`
@@ -174,7 +174,6 @@ Local functions
174
174
  - `isHubPath(url)`
175
175
  - `bearerToken(request)`
176
176
  - `sendRegistrationError(reply, error)`
177
- - `onProviderStatus(reply, matches, action)`
178
177
  - `parseJsonBody(buffer)`
179
178
 
180
179
  ### `src/server/mailer.js`
@@ -76,6 +76,7 @@ Exports
76
76
  - `type RuntimeDatabase`
77
77
  - `type RuntimeLogger`
78
78
  - `type ActorRoomsResolver`
79
+ - `type ActorsRoomsResolver`
79
80
  - `type AudienceContributors`
80
81
  Local functions
81
82
  - `flattenEntries(value)`
@@ -107,16 +108,17 @@ Exports
107
108
 
108
109
  ### `src/server/realtimeDelivery.js`
109
110
  Exports
110
- - `createRealtimeDelivery({ io, database, logger, authService, audiences: { mayContribute, resolveActorRooms } })`
111
+ - `createRealtimeDelivery({ io, database, logger, authService, audiences: { mayContribute, resolveActorsRooms } })`
111
112
  - `matchesRealtimeEvent(event)`
112
113
  - `type AuthService`
113
114
  - `type ActorRoomsResolver`
115
+ - `type ActorsRoomsResolver`
114
116
  - `type AudienceContributors`
115
117
  Local functions
116
118
  - `publicRealtimePayload(event)`
117
- - `valueAsKey(value)`
118
- - `sharedWithinPass(load, keyOf = valueAsKey)`
119
- - `createPassChecks(authService, resolveActorRooms)`
119
+ - `sharedWithinPass(load, keyOf)`
120
+ - `createPassChecks(authService, resolveActorsRooms)`
121
+ - `rememberedActorId(socket)`
120
122
 
121
123
  ### `src/server/RealtimeProvider.js`
122
124
  Exports
@@ -133,7 +135,7 @@ Exports
133
135
  - `REDIS_NAMESPACE_ENV_KEY`
134
136
  - `resolveRealtimeRedisUrl(env)`
135
137
  - `resolveRealtimeRedisNamespace(env)`
136
- - `configureSocketIoRedisAdapter(io, { redisUrl = "", redisNamespace = "", logger, createRedisAdapter = createSocketIoRedisAdapter, createRedisConnection = createRedisClient })`
138
+ - `configureSocketIoRedisAdapter(io, { redisUrl = "", redisNamespace = "", logger, createRedisAdapter, createRedisConnection })`
137
139
  - `closeSocketIoRedisConnections({ pubClient, subClient })`
138
140
  - `countConnectedClients(io)`
139
141
  Local functions
@@ -149,6 +151,7 @@ Exports
149
151
  Exports
150
152
  - `type RuntimeRealtime`
151
153
  - `type ActorRoomsResolver`
154
+ - `type ActorsRoomsResolver`
152
155
  - `type AudienceContributors`
153
156
  - `type RealtimeAudienceContributor`
154
157
 
@@ -125,15 +125,25 @@ Exports
125
125
  ### `src/client/components/ShellPageActionsTarget.vue`
126
126
  Exports
127
127
  - None
128
+ Local functions
129
+ - `itemProps(entry)`
128
130
 
129
131
  ### `src/client/components/ShellPageTitle.vue`
130
132
  Exports
131
133
  - None
132
134
 
135
+ ### `src/client/components/ShellPrimaryAction.vue`
136
+ Exports
137
+ - None
138
+
133
139
  ### `src/client/components/ShellRouteTransition.vue`
134
140
  Exports
135
141
  - None
136
142
 
143
+ ### `src/client/components/ShellSectionTabLinkItem.vue`
144
+ Exports
145
+ - None
146
+
137
147
  ### `src/client/components/ShellSurfaceAwareMenuLinkItem.vue`
138
148
  Exports
139
149
  - None
@@ -186,6 +196,10 @@ Exports
186
196
  Exports
187
197
  - `useShellOutletPlacements(target, context = {})`
188
198
 
199
+ ### `src/client/composables/useShellPageClose.js`
200
+ Exports
201
+ - `useShellPageClose({ label, close })`
202
+
189
203
  ### `src/client/composables/useShellPageTitle.js`
190
204
  Exports
191
205
  - `useShellPageTitle(title)`
@@ -296,8 +310,10 @@ Exports
296
310
  - `ShellMenuLinkItem`
297
311
  - `ShellSurfaceAwareMenuLinkItem`
298
312
  - `ShellTabLinkItem`
313
+ - `ShellSectionTabLinkItem`
299
314
  - `ShellPageActions`
300
315
  - `ShellPageAction`
316
+ - `ShellPrimaryAction`
301
317
  - `ShellListDetail`
302
318
  - `ShellUpButton`
303
319
  - `ShellPageTitle`
@@ -305,6 +321,7 @@ Exports
305
321
  - `useShellAppBar`
306
322
  - `useShellLayoutState`
307
323
  - `useShellPageTitle`
324
+ - `useShellPageClose`
308
325
  - `useShellWindowSizeClass`
309
326
  - `useShellNavigation`
310
327
  - `leaveApp`
@@ -350,9 +367,11 @@ Exports
350
367
  - `createShellNavigationRuntime({ router })`
351
368
  - `resolvePageParent(matched)`
352
369
  - `resolvePageTitle(matched)`
370
+ - `type ShellPageClose`
353
371
  Local functions
354
372
  - `normalizeTrail(value)`
355
373
  - `cssAttributeValue(value)`
374
+ - `createClaimStack()`
356
375
 
357
376
  ### `src/client/navigation/usePaths.js`
358
377
  Exports
@@ -481,10 +500,11 @@ Exports
481
500
  - `resolveAppPlacementTopologyExport(exported, logger)`
482
501
  Local functions
483
502
  - `loadAppModule({ importModule, specifier, label, resolve, invalidExportMessage = "", loadFailureMessage, fallback, logger, asyncModuleRecoveryRuntime })`
484
- - `loadAppPlacementDefinitions(logger, asyncModuleRecoveryRuntime)`
485
- - `loadAppPlacementTopology(logger, asyncModuleRecoveryRuntime)`
503
+ - `importAppModules()`
504
+ - `loadAppPlacementDefinitions(logger, asyncModuleRecoveryRuntime, pendingImport)`
505
+ - `loadAppPlacementTopology(logger, asyncModuleRecoveryRuntime, pendingImport)`
486
506
  - `createErrorConfigToolkit(errorRuntime)`
487
- - `loadAppErrorConfig(logger, errorRuntime, asyncModuleRecoveryRuntime)`
507
+ - `loadAppErrorConfig(logger, errorRuntime, asyncModuleRecoveryRuntime, pendingImport)`
488
508
  - `installVueErrorBridge(vueApp, errorRuntime, logger)`
489
509
  - `installRouterErrorBridge(router, errorRuntime, logger)`
490
510
 
@@ -552,6 +572,7 @@ Exports
552
572
  - `resolveShellDrawerPresentation({ modal = false, open = false, desktopClosedMode = "rail" } = {})`
553
573
  - `resolveShellDrawerToggleLabel({ modal = false, open = false } = {})`
554
574
  - `shellLayoutHasDrawer({ menuSlot = false, menuCount = 0, identityCount = 0, bottomNavigationCount = 0 } = {})`
575
+ - `shellLayoutHasNavigationBar({ bottomNavigationCount = 0, menuCount = 0 } = {})`
555
576
 
556
577
  ### `src/client/support/drawerWidth.js`
557
578
  Exports
@@ -602,6 +623,18 @@ Exports
602
623
  - `VUETIFY_ICONS_KEY`
603
624
  - `filledIconAlias(icon, aliases)`
604
625
 
626
+ ### `src/client/support/pageActions.js`
627
+ Exports
628
+ - `NO_SHELL_PAGE_ACTIONS_REGISTRY`
629
+ - `SHELL_PAGE_ACTIONS_REGISTRY_KEY`
630
+ - `createShellPageActionsRegistry({ isCompact })`
631
+ - `overflowEntries(entries, compact)`
632
+ - `type ShellPageActionState`
633
+ - `type ShellPageActionEntry`
634
+ - `type ShellPageActionsRegistry`
635
+ Local functions
636
+ - `documentOrder(left, right)`
637
+
605
638
  ### `src/client/support/primaryNavigation.js`
606
639
  Exports
607
640
  - `normalizeComparablePathname(value = "")`
@@ -654,6 +687,14 @@ Exports
654
687
 
655
688
  ### fixtures
656
689
 
690
+ ### `fixtures/adaptive-shell/src/ActionsFormPage.vue`
691
+ Exports
692
+ - None
693
+
694
+ ### `fixtures/adaptive-shell/src/ActionsPage.vue`
695
+ Exports
696
+ - None
697
+
657
698
  ### `fixtures/adaptive-shell/src/App.vue`
658
699
  Exports
659
700
  - None
@@ -662,6 +703,22 @@ Exports
662
703
  Exports
663
704
  - None
664
705
 
706
+ ### `fixtures/adaptive-shell/src/ButtonStatesPage.vue`
707
+ Exports
708
+ - None
709
+
710
+ ### `fixtures/adaptive-shell/src/ComponentsPage.vue`
711
+ Exports
712
+ - None
713
+ Local functions
714
+ - `jumpToLastBooking()`
715
+
716
+ ### `fixtures/adaptive-shell/src/FeedbackPage.vue`
717
+ Exports
718
+ - None
719
+ Local functions
720
+ - `press(name)`
721
+
665
722
  ### `fixtures/adaptive-shell/src/main.js`
666
723
  Exports
667
724
  - None
@@ -684,6 +741,10 @@ Exports
684
741
  Exports
685
742
  - `records`
686
743
 
744
+ ### `fixtures/adaptive-shell/src/ReportsPage.vue`
745
+ Exports
746
+ - None
747
+
687
748
  ### `fixtures/adaptive-shell/src/ScreenPage.vue`
688
749
  Exports
689
750
  - None
@@ -692,6 +753,10 @@ Exports
692
753
  Exports
693
754
  - None
694
755
 
756
+ ### `fixtures/adaptive-shell/src/StatusButton.vue`
757
+ Exports
758
+ - None
759
+
695
760
  ### `fixtures/adaptive-shell/src/StudioPage.vue`
696
761
  Exports
697
762
  - None
@@ -701,10 +766,26 @@ Exports
701
766
  - `theme`
702
767
  - `adminTheme`
703
768
 
769
+ ### `fixtures/adaptive-shell/src/TitleClaim.vue`
770
+ Exports
771
+ - None
772
+
704
773
  ### `fixtures/adaptive-shell/vite.config.mjs`
705
774
  Exports
706
775
  - None
707
776
 
777
+ ### `fixtures/production-build/src/App.vue`
778
+ Exports
779
+ - None
780
+
781
+ ### `fixtures/production-build/src/main.js`
782
+ Exports
783
+ - None
784
+
785
+ ### `fixtures/production-build/vite.config.mjs`
786
+ Exports
787
+ - None
788
+
708
789
  ### patterns
709
790
 
710
791
  ### `patterns/application-shell/example/expected-existing/src/App.vue`
@@ -731,6 +812,10 @@ Exports
731
812
  Exports
732
813
  - None
733
814
 
815
+ ### `patterns/application-shell/example/src/components/menus/SectionTabLinkItem.vue`
816
+ Exports
817
+ - None
818
+
734
819
  ### `patterns/application-shell/example/src/components/menus/SurfaceAwareMenuLinkItem.vue`
735
820
  Exports
736
821
  - None
@@ -34,8 +34,7 @@ Exports
34
34
  Exports
35
35
  - None
36
36
  Local functions
37
- - `normalizeSection(value)`
38
- - `readRouteSection()`
37
+ - `sectionTarget(value)`
39
38
 
40
39
  ### `src/client/components/ProfileClientElement.vue`
41
40
  Exports
@@ -213,6 +212,10 @@ Exports
213
212
  Exports
214
213
  - None
215
214
 
215
+ ### `patterns/account-settings/example/src/pages/account/[section].vue`
216
+ Exports
217
+ - None
218
+
216
219
  ### `patterns/account-settings/example/src/pages/account/index.vue`
217
220
  Exports
218
221
  - None
@@ -47,6 +47,8 @@ Exports
47
47
  - `createRepository({ api })`
48
48
  - `normalizeMembershipRecord(payload)`
49
49
  - `normalizeMemberSummaryRow(row)`
50
+ Local functions
51
+ - `memberSummaryFromMembership(row)`
50
52
 
51
53
  ### `src/server/common/repositories/workspacesRepository.js`
52
54
  Exports
@@ -250,7 +252,7 @@ Exports
250
252
  Exports
251
253
  - `WorkspacesIntegrationsProvider`
252
254
  Local functions
253
- - `resolveWorkspaceRealtimeScopes(workspaceMemberships, actorId)`
255
+ - `resolveWorkspaceRealtimeScopes(workspaceMemberships, actorIds)`
254
256
 
255
257
  ### `src/server/workspacesRuntime.js`
256
258
  Exports
@@ -14,6 +14,45 @@ Use this on demand; do not load the full index at startup.
14
14
 
15
15
  ### scripts
16
16
 
17
+ ### `scripts/browser-test-build.mjs`
18
+ Exports
19
+ - `buildFrontend({ appRoot = process.cwd(), build = "npm run build", run = runToCompletion } = {})`
20
+ Local functions
21
+ - `seconds(since)`
22
+ - `digest(file)`
23
+ - `buildFingerprint(appRoot, build, env = process.env)`
24
+ - `runToCompletion(command, appRoot)`
25
+ - `lastBuild(appRoot)`
26
+ - `isRunning(pid)`
27
+ - `lockBuild(appRoot)`
28
+ - `isCurrent(appRoot, inputs)`
29
+
30
+ ### `scripts/browser-test-servers.mjs`
31
+ Exports
32
+ - None
33
+ Local functions
34
+ - `seconds(since)`
35
+ - `words(command)`
36
+ - `prepareWorkers(appRoot, prepare, workers, baseUrls)`
37
+ - `signInWorkers(appRoot, signIn, baseUrls, environments, signedInStates)`
38
+ - `waitUntilReady(url, server, name)`
39
+ - `stopServers()`
40
+
41
+ ### `scripts/browser-test-times.mjs`
42
+ Exports
43
+ - None
44
+
45
+ ### `scripts/browser-tests.mjs`
46
+ Exports
47
+ - `SETTINGS_VARIABLE`
48
+ - `browserTestConfig({ testDir = "./tests/e2e", port = DEFAULT_PORT, server = "node ./bin/server.js", build = "npm run build", prepare = "", signIn = "", env = {}, health = "/api/health", globalTimeout = GLOBAL_TIMEOUT_MS, environment = process.env, cwd = process.cwd() } = {})`
49
+ - `browserTestWorkers({ env = process.env, argv = process.argv } = {})`
50
+ Local functions
51
+ - `positiveInteger(value)`
52
+ - `managedBaseUrl(env)`
53
+ - `commandLineWorkers(argv)`
54
+ - `preparedWorkerEnvironment(file, index)`
55
+
17
56
  ### `scripts/build-catalog.mjs`
18
57
  Exports
19
58
  - None
@@ -74,12 +113,20 @@ Local functions
74
113
 
75
114
  ### `scripts/material3-source.mjs`
76
115
  Exports
116
+ - `DEFAULT_IMPORT`
117
+ - `TEMPLATE_TAG`
118
+ - `VOID_TAGS`
77
119
  - `HEX_COLOUR`
120
+ - `balancedFrom(text, start, open = "{", close = "}")`
78
121
  - `blankCssComments(source)`
79
122
  - `blankHtmlComments(source)`
80
123
  - `blankJsComments(source)`
124
+ - `enclosingObject(text, offset)`
125
+ - `exclusiveBranches(left, right)`
81
126
  - `kebab(name)`
82
127
  - `lineIndex(text)`
128
+ - `localComponent(file, specifier, known)`
129
+ - `readConditionalBranches(template)`
83
130
  - `readDeclarations(css, offset)`
84
131
  - `readExceptions(source)`
85
132
  - `readInlineDeclarations(text, offset)`
@@ -99,11 +146,13 @@ Exports
99
146
  - `formatNavigationReport(result)`
100
147
  Local functions
101
148
  - `hexPattern()`
149
+ - `channelColour()`
102
150
  - `quotedHex()`
103
151
  - `isNavigationRule(rule)`
104
152
  - `isSkippedDirectory(name)`
105
153
  - `isSourceFile(relativePath)`
106
- - `walk(projectRoot, directory, files)`
154
+ - `isFrameworkPackage(projectRoot, directory)`
155
+ - `walk(projectRoot, directory, files, wholeApp = false)`
107
156
  - `collectFiles(projectRoot, paths)`
108
157
  - `createReporter(file, source, { navigationOnly = false } = {})`
109
158
  - `checkCode(code, offset, { report, themed })`
@@ -141,10 +190,8 @@ Local functions
141
190
  - `navigatesFromControl(tag, script)`
142
191
  - `attribute(tag, name)`
143
192
  - `visibleText(inner)`
144
- - `isBackTag(tag)`
193
+ - `isBackComponentName(name)`
145
194
  - `looksLikeBack(tag)`
146
- - `balancedFrom(text, start, open = "{", close = "}")`
147
- - `enclosingObject(text, offset)`
148
195
  - `stringValue(text, key)`
149
196
  - `readMainNavigation(sources)`
150
197
  - `computedPlacementPart(placement)`
@@ -156,9 +203,19 @@ Local functions
156
203
  - `routeDeclarations(source)`
157
204
  - `readPage(file, source)`
158
205
  - `createShellBarReader(appFiles, read, tag = SHELL_UP_TAG)`
159
- - `localComponent(file, specifier, known)`
206
+ - `shellPlacement(file, source, drawsShellBar, known, barTag = SHELL_UP_TAG)`
207
+ - `rendersOutsideLayouts(code, name)`
208
+ - `judgePackageRoute(route, { surfaces, appShell, drawsShellBar, isDestination, isAddress, readable, report })`
160
209
  - `pageKey(file)`
161
210
 
211
+ ### `scripts/package-routes.mjs`
212
+ Exports
213
+ - `readPackageRoutes(root, known)`
214
+ Local functions
215
+ - `isRecord(value)`
216
+ - `clientEntryOf(manifest, directory)`
217
+ - `readRouteComponents(entry, code, known)`
218
+
162
219
  ### `scripts/pattern-assets.mjs`
163
220
  Exports
164
221
  - `PATTERN_DOCUMENT_NAME`
@@ -218,6 +275,65 @@ Local functions
218
275
  - `alignLockManifestRecord(lockRecord, manifest, localPackageNames)`
219
276
  - `preparePackageLockForInstall(projectRoot, manifests, packageLockPath)`
220
277
 
278
+ ### `scripts/test-budget.mjs`
279
+ Exports
280
+ - `BUDGET_VARIABLE`
281
+ - `testConcurrency({ env = process.env, parallelism = os.availableParallelism() } = {})`
282
+
283
+ ### `scripts/test-command.mjs`
284
+ Exports
285
+ - `planTestRuns(args, { cwd = process.cwd(), concurrency = testConcurrency() } = {})`
286
+ - `runTests(args)`
287
+ - `withTimeReporter(run, destination)`
288
+ Local functions
289
+ - `findTestFiles(patterns, cwd)`
290
+ - `readAloneFiles(files, cwd)`
291
+ - `aloneDestination(destination)`
292
+ - `aloneRunOptions(options)`
293
+ - `aloneShard(files, options)`
294
+ - `runNode(args, env)`
295
+
296
+ ### `scripts/test-databases.mjs`
297
+ Exports
298
+ - `DATABASES_OPTION`
299
+ - `testDatabaseRunFor(count, cwd = process.cwd())`
300
+ Local functions
301
+ - `withOwnEnvironment(load)`
302
+
303
+ ### `scripts/test-file-stop.mjs`
304
+ Exports
305
+ - `STOPPED_PREFIX`
306
+ - `STOPS_VARIABLE`
307
+
308
+ ### `scripts/test-runs.mjs`
309
+ Exports
310
+ - `checkTestRuns({ projectRoot, manifests })`
311
+ - `formatTestRunsReport(result)`
312
+ Local functions
313
+ - `commandsOf(script)`
314
+ - `isProgram(token, name)`
315
+ - `runsNodeTest(tokens)`
316
+ - `runnerArguments(tokens, runner)`
317
+ - `configOption(args)`
318
+ - `lineOf(contents, needle, after = "")`
319
+ - `findConfig(directory, explicit, names)`
320
+ - `usesBrowserHarness(source)`
321
+ - `developmentServerCommand(source)`
322
+ - `checkPlaywrightIsolation({ file, source, report })`
323
+ - `checkRunnerConfig({ root, configPath, directory, runner, report })`
324
+
325
+ ### `scripts/test-time-report.mjs`
326
+ Exports
327
+ - `BOUNDS_FILE`
328
+ - `FILE_TIMES`
329
+ - `checkTestTimes({ bounds, files, tests, wallMs, stopped = [] })`
330
+ - `fileStop({ bound, recorded })`
331
+ - `reportTestTimes({ cwd, collected, directory, wallMs })`
332
+ - `writeFileStops({ cwd, files, directory })`
333
+ Local functions
334
+ - `seconds(ms)`
335
+ - `readTestTimeBounds(cwd)`
336
+
221
337
  ### `scripts/verify-packages.mjs`
222
338
  Exports
223
339
  - `main()`
@@ -234,3 +350,4 @@ Local functions
234
350
  - `validateMigrationsAfter(packageJson)`
235
351
  - `validateMigrationDirectory(packageName, absoluteDirectory, relativeDirectory, migrationOwners)`
236
352
  - `validatePackage(packageRecord, localVersions, migrationOwners)`
353
+ - `verifyTestRuns()`
@@ -14,13 +14,22 @@ Use this on demand; do not load the full index at startup.
14
14
 
15
15
  ### root
16
16
 
17
+ ### `browserExpect.mjs`
18
+ Exports
19
+ - `expect`
20
+
17
21
  ### `browserFixture.mjs`
18
22
  Exports
19
23
  - `createChromiumLaunchOptions({ env = process.env } = {})`
20
24
  - `reservePort()`
25
+ - `sharedBrowserFixture(viteOptions)`
21
26
  - `startCapturedProcess(command, args, { cwd, env = {} } = {})`
22
- - `startViteFixture({ fixtureRoot, configFile = "vite.config.mjs", env = {}, port: requestedPort } = {})`
27
+ - `startViteFixture({ fixtureRoot, configFile = "vite.config.mjs", env = {}, port: requestedPort, cacheDir: requestedCacheDir } = {})`
23
28
  - `stopProcess(runtime)`
29
+ Local functions
30
+ - `stopChild(child)`
31
+ - `takeCacheDir(configPath)`
32
+ - `returnCacheDir(configPath, cacheDir)`
24
33
 
25
34
  ### `fakeFastify.mjs`
26
35
  Exports
@@ -34,3 +43,8 @@ Exports
34
43
  - `readMaterialStyles(page, probes)`
35
44
  Local functions
36
45
  - `comparePixels(page, actual, expected)`
46
+ - `waitForStillPage(page)`
47
+
48
+ ### `viteFixtureServer.mjs`
49
+ Exports
50
+ - None
@@ -58,6 +58,8 @@ manifests, migrations, tests, and runtime behaviour are the evidence.
58
58
  also read [Material 3](references/material-3.md) completely before acting.
59
59
  - For a UI pass (the changes, a section, or the whole app), also read
60
60
  [UI pass](references/ui-pass.md) completely.
61
+ - Before writing a list, save, batch or test, a refactor, or calling work
62
+ done, read [sanity checks](references/sanity-checks.md).
61
63
 
62
64
  These are complete operational references required by this skill. Do not load
63
65
  irrelevant references or other docs.
@@ -122,8 +124,18 @@ whole changeset. Use the current-state owners in application operations and
122
124
  Playwright for affected UI. There is no current JSKIT Doctor command; ignore
123
125
  old CLI authoring-history diagnoses. Never expose environment values.
124
126
 
125
- Tests and requests take the time their work needs, no more: a list reads each
126
- table once, a row policy is bounded by the rows it reads, list and batch paths
127
- have a query budget tested at realistic row counts, and test databases restore
128
- a stored snapshot instead of replaying migrations. Find why a check is slow;
129
- never raise its time limit. Typed features' repository and Tests rules say how.
127
+ Tests and requests take the time their work needs, no more: count a list's or
128
+ save's queries at a few rows and at a realistic number and
129
+ judge whether they grow with the rows, and read the suite's time and its
130
+ slowest files. Find why a check is slow; never raise its time limit. Typed
131
+ features' repository and Tests rules say how.
132
+
133
+ Test files run in parallel by default, bounded by the machine: a script runs
134
+ `jskit test` (`--databases`: a `TEST_DB_NAME` copy per file), never
135
+ `node --test` or a fixed `--test-concurrency`; Playwright's config is
136
+ `browserTestConfig()` from `@jskit-ai/jskit-catalog/browser-tests` and Vitest's
137
+ `maxWorkers` is `testConcurrency()` from `@jskit-ai/jskit-catalog/test-budget`.
138
+ Plain `jskit check` fails anything else. Files that collide when run together
139
+ get isolated (their own port, temporary directory and database), never
140
+ serialised. A file that truly must run alone says why on its first line,
141
+ `// jskit-test: alone - <reason>`.