@jskit-ai/agent-docs 0.1.26 → 0.1.28

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 (46) hide show
  1. package/DISTR_AGENT.md +1 -0
  2. package/guide/agent/app-extras/assistant.md +9 -20
  3. package/guide/agent/app-extras/mobile-capacitor.md +381 -0
  4. package/guide/agent/app-extras/realtime.md +13 -12
  5. package/guide/agent/app-setup/a-more-interesting-shell.md +102 -87
  6. package/guide/agent/app-setup/authentication.md +50 -31
  7. package/guide/agent/app-setup/console.md +8 -8
  8. package/guide/agent/app-setup/database-layer.md +15 -15
  9. package/guide/agent/app-setup/initial-scaffolding.md +37 -5
  10. package/guide/agent/app-setup/multi-homing.md +50 -47
  11. package/guide/agent/app-setup/quickstart.md +11 -14
  12. package/guide/agent/app-setup/users.md +24 -24
  13. package/guide/agent/app-setup/working-with-the-jskit-cli.md +18 -10
  14. package/guide/agent/generators/advanced-cruds.md +111 -68
  15. package/guide/agent/generators/crud-generators.md +5 -5
  16. package/guide/agent/generators/ui-generators.md +44 -36
  17. package/guide/agent/index.md +3 -2
  18. package/package.json +1 -1
  19. package/patterns/INDEX.md +4 -1
  20. package/patterns/client-requests.md +23 -6
  21. package/patterns/crud-repository-mapping.md +1 -1
  22. package/patterns/crud-scaffolding.md +10 -1
  23. package/patterns/filters.md +28 -10
  24. package/patterns/generated-ui-contract-tracking.md +62 -0
  25. package/patterns/page-scaffolding.md +20 -2
  26. package/patterns/placements.md +67 -1
  27. package/patterns/surfaces.md +5 -1
  28. package/patterns/ui-testing.md +3 -0
  29. package/reference/autogen/KERNEL_MAP.md +46 -1
  30. package/reference/autogen/README.md +3 -0
  31. package/reference/autogen/packages/assistant.md +2 -1
  32. package/reference/autogen/packages/auth-web.md +20 -1
  33. package/reference/autogen/packages/crud-ui-generator.md +20 -8
  34. package/reference/autogen/packages/google-rewarded-core.md +222 -0
  35. package/reference/autogen/packages/google-rewarded-web.md +71 -0
  36. package/reference/autogen/packages/kernel.md +94 -10
  37. package/reference/autogen/packages/mobile-capacitor.md +76 -0
  38. package/reference/autogen/packages/realtime.md +1 -0
  39. package/reference/autogen/packages/shell-web.md +48 -3
  40. package/reference/autogen/packages/ui-generator.md +34 -2
  41. package/reference/autogen/packages/users-core.md +2 -0
  42. package/reference/autogen/packages/users-web.md +92 -4
  43. package/reference/autogen/packages/workspaces-web.md +3 -2
  44. package/reference/autogen/tooling/jskit-cli.md +114 -9
  45. package/templates/app/AGENTS.md +1 -0
  46. package/workflow/bootstrap.md +1 -0
@@ -39,6 +39,7 @@ Exports
39
39
  - None
40
40
  Local functions
41
41
  - `resolveSeverityColor(severity = "error")`
42
+ - `resolveSeverityIcon(severity = "error")`
42
43
  - `resolveTimeout(entry)`
43
44
  - `dismiss(entry)`
44
45
  - `runAction(entry)`
@@ -48,6 +49,17 @@ Local functions
48
49
  ### `src/client/components/ShellLayout.vue`
49
50
  Exports
50
51
  - None
52
+ Local functions
53
+ - `handlePullPointerDown(event)`
54
+ - `handlePullPointerMove(event)`
55
+ - `handlePullPointerEnd(event)`
56
+ - `handlePullPointerCancel(event)`
57
+ - `cancelPullRefresh()`
58
+ - `refreshFromPullGesture()`
59
+ - `canStartPullRefresh(event)`
60
+ - `isPrimaryTouchPointer(event)`
61
+ - `isAtPageTop()`
62
+ - `isPullRefreshIgnoredTarget(target)`
51
63
 
52
64
  ### `src/client/components/ShellMenuLinkItem.vue`
53
65
  Exports
@@ -61,6 +73,21 @@ Exports
61
73
  Exports
62
74
  - None
63
75
 
76
+ ### `src/client/components/ShellRouteTransition.vue`
77
+ Exports
78
+ - None
79
+ Local functions
80
+ - `handlePointerDown(event)`
81
+ - `handlePointerMove(event)`
82
+ - `handlePointerEnd(event)`
83
+ - `handlePointerCancel(event)`
84
+ - `navigateBySwipe(offset = 0)`
85
+ - `isAcceptedSwipe({ deltaX = 0, deltaY = 0, elapsed = 1, velocity = null } = {})`
86
+ - `normalizeComparablePathname(value = "")`
87
+ - `pathMatchesNavigationEntry(pathname = "", entry = {})`
88
+ - `isPrimaryPointerEvent(event)`
89
+ - `isSwipeIgnoredTarget(target)`
90
+
64
91
  ### `src/client/components/ShellSurfaceAwareMenuLinkItem.vue`
65
92
  Exports
66
93
  - None
@@ -96,16 +123,18 @@ Exports
96
123
  Exports
97
124
  - `ERROR_CHANNELS`
98
125
  - `ERROR_SEVERITIES`
126
+ - `ERROR_INTENTS`
99
127
  - `isRecord`
100
128
  - `normalizeText(value, fallback = "")`
101
129
  - `normalizeChannel(value, fallback = "")`
102
130
  - `normalizeSeverity(value, fallback = "error")`
131
+ - `normalizeErrorIntent(value, fallback = "")`
103
132
  - `normalizeNonNegativeInteger(value, fallback = 0)`
104
133
  - `normalizeAction(value)`
105
134
 
106
135
  ### `src/client/error/policy.js`
107
136
  Exports
108
- - `createDefaultErrorPolicy({ defaultChannel = "snackbar", unauthorizedChannel = "banner", serverErrorChannel = "dialog", defaultSeverity = "error" } = {})`
137
+ - `createDefaultErrorPolicy({ defaultChannel = "snackbar", resourceLoadChannel = "silent", actionFeedbackChannel = "snackbar", appRecoverableChannel = "banner", blockingChannel = "dialog", defaultSeverity = "error" } = {})`
109
138
 
110
139
  ### `src/client/error/presentationDefaults.js`
111
140
  Exports
@@ -143,6 +172,7 @@ Exports
143
172
  - `ShellLayout`
144
173
  - `ShellOutlet`
145
174
  - `ShellOutletMenuWidget`
175
+ - `ShellRouteTransition`
146
176
  - `ShellErrorHost`
147
177
  - `ShellMenuLinkItem`
148
178
  - `ShellSurfaceAwareMenuLinkItem`
@@ -184,6 +214,8 @@ Local functions
184
214
  ### `src/client/placement/index.js`
185
215
  Exports
186
216
  - `createPlacementRegistry`
217
+ - `definePlacement`
218
+ - `definePlacementTopology`
187
219
  - `useWebPlacementContext`
188
220
  - `resolveRuntimePathname`
189
221
  - `readPlacementSurfaceConfig`
@@ -220,7 +252,10 @@ Local functions
220
252
  - `debugLog(message, payload = null)`
221
253
  - `createRuntimeLogger(logger)`
222
254
  - `normalizePlacementList(placements, context = {})`
255
+ - `normalizeTopologyList(topology, context = {})`
223
256
  - `matchesSurface(placementSurfaces, requestedSurface)`
257
+ - `resolveTopologyPlacement(topologyEntries = [], placement = {}, requestedSurface = WEB_PLACEMENT_SURFACE_ANY)`
258
+ - `resolveRenderablePlacement({ placement = {}, topologyEntries = [], requestedSurface = WEB_PLACEMENT_SURFACE_ANY, requestedTarget = "", requestedLayoutClass = "compact" } = {})`
224
259
  - `resolveContextContributors(app, baseContext = {}, logger)`
225
260
  - `resolvePlacementComponent(app, placement, logger, missingTokens, invalidComponentTokens, failedTokens)`
226
261
  - `shouldIncludePlacement(placement, placementContext, logger)`
@@ -253,6 +288,8 @@ Exports
253
288
  - `normalizePlacementSurfaces(value, { strict = false, source = "placement" } = {})`
254
289
  - `normalizePlacementDefinition(value, { strict = false, source = "placement" } = {})`
255
290
  - `definePlacement(value = {})`
291
+ - `definePlacementTopology(value = {})`
292
+ - `normalizeSemanticPlacementId`
256
293
  Local functions
257
294
  - `isValidSurfaceIdToken(value = "")`
258
295
  - `toInteger(value, fallback = 1000)`
@@ -260,13 +297,16 @@ Local functions
260
297
  ### `src/client/providers/ShellWebClientProvider.js`
261
298
  Exports
262
299
  - `ShellWebClientProvider`
300
+ - `resolveAppPlacementTopologyExport(exported, logger)`
263
301
  Local functions
264
- - `createShellWebQueryClient()`
265
302
  - `isMissingDynamicModule(error, moduleSpecifier)`
266
303
  - `loadAppPlacementDefinitions(logger)`
304
+ - `loadAppPlacementTopology(logger)`
267
305
  - `createErrorConfigToolkit(errorRuntime)`
268
306
  - `loadAppErrorConfig(logger, errorRuntime)`
269
307
  - `applyAppErrorConfig(errorRuntime, errorConfig = {})`
308
+ - `isPullRefreshQuery(query = null)`
309
+ - `createShellRefreshRuntime({ app, logger = null } = {})`
270
310
  - `installVueErrorBridge(vueApp, errorRuntime, logger)`
271
311
  - `installRouterErrorBridge(app, errorRuntime, logger)`
272
312
 
@@ -342,7 +382,7 @@ Exports
342
382
 
343
383
  ### `templates/src/components/ShellLayout.vue`
344
384
  Exports
345
- - None
385
+ - `default`
346
386
 
347
387
  ### `templates/src/error.js`
348
388
  Exports
@@ -373,6 +413,11 @@ Exports
373
413
  - `addPlacement`
374
414
  - `getPlacements()`
375
415
 
416
+ ### `templates/src/placementTopology.js`
417
+ Exports
418
+ - `addPlacementTopology(value = {})`
419
+ - `default`
420
+
376
421
  ### root
377
422
 
378
423
  ### `package.descriptor.mjs`
@@ -17,13 +17,20 @@ Use this on demand; do not load the full index at startup.
17
17
  ### `src/server/buildTemplateContext.js`
18
18
  Exports
19
19
  - `buildUiPageTemplateContext({ appRoot, targetFile = "", options = {} } = {})`
20
+ - `normalizeNavigationRole`
21
+ - `resolveNavigationInferenceRoutePath(pageTarget = {})`
22
+ - `resolveNavigationRoleLinkPlacement(options = {}, inferenceContext = {})`
23
+ - `shouldCreateNavigationLink(options = {}, inferenceContext = {})`
20
24
  Local functions
21
25
  - `resolveLinkToPropLine(linkTo = "")`
26
+ - `resolveOwnerLine(owner = "")`
22
27
 
23
28
  ### `src/server/subcommands/addSubpages.js`
24
29
  Exports
25
30
  - `runGeneratorSubcommand({ appRoot, subcommand = "", args = [], options = {}, dryRun = false } = {})`
26
31
  Local functions
32
+ - `resolveOutletOwner(target = "")`
33
+ - `renderSectionNavTopologyBlock({ marker = "", owner = "", surface = "", target = "" } = {})`
27
34
  - `resolveSubpagesOutletTarget(options = {}, pageTarget = {})`
28
35
 
29
36
  ### `src/server/subcommands/element.js`
@@ -40,8 +47,24 @@ Local functions
40
47
  - `hasShellOutletTarget(source = "", { target = "" } = {})`
41
48
  - `applyScriptImports(source = "")`
42
49
  - `createOutletBlock({ target = "" } = {})`
50
+ - `resolveOutletOwner(target = "")`
51
+ - `resolveSemanticPlacementOption(options = {}, { context = "ui-generator outlet" } = {})`
52
+ - `resolveOptionalSemanticPlacementOption(options = {}, { context = "ui-generator outlet" } = {})`
53
+ - `resolveVariantOwners(variantTargets = {})`
54
+ - `resolveSemanticPlacementOwner({ placementId = "", targetId = "", variantTargets = null, owner = "", context = "ui-generator outlet" } = {})`
55
+ - `resolveTopologyKind(options = {}, { context = "ui-generator outlet", defaultKind = "", required = false } = {})`
56
+ - `resolveTopologyVariantTargets(options = {}, { context = "ui-generator topology", fallbackTarget = "" } = {})`
57
+ - `hasTopologyOptions(options = {})`
58
+ - `resolveTopologySurfaces(options = {})`
59
+ - `renderTopologyOwnerLine(owner = "")`
60
+ - `renderLinkRendererBlock(rendererToken = "")`
61
+ - `renderTopologyVariantBlock({ layoutClass = "", target = "", kind = "", rendererToken = "" } = {})`
62
+ - `renderOutletTopologyBlock({ marker = "", placementId = "", owner = "", surfaces = ["*"], description = "", target = "", variantTargets = null, kind = "link", rendererToken = "" } = {})`
43
63
  - `findLastTemplateCloseTag(source = "")`
44
64
  - `applyOutletTemplateBlock(source = "", { target = "" } = {})`
65
+ - `prepareTopologyBlock({ appRoot, topologyPath = null, context = "ui-generator topology", placementId = "", owner = "", surfaces = ["*"], description = "", target = "", variantTargets = null, kind = "", rendererToken = "" } = {})`
66
+ - `applyTopologyBlock(options = {})`
67
+ - `runTopologySubcommand({ appRoot, options = {}, dryRun = false } = {})`
45
68
 
46
69
  ### `src/server/subcommands/page.js`
47
70
  Exports
@@ -59,11 +82,12 @@ Exports
59
82
  - `resolvePageTargetDetails`
60
83
  - `resolveNearestParentSubpagesHost`
61
84
  - `deriveDefaultSubpagesHost`
62
- - `renderPlainPageSource(pageTitle = "")`
85
+ - `renderPlainPageSource(pageTitle = "", { surfaceId = "", routePath = "" } = {})`
63
86
  - `ensureSubpagesSupportScaffold({ appRoot, componentDirectory = DEFAULT_COMPONENT_DIRECTORY, dryRun = false } = {})`
64
87
  - `applySubpagesUpgradeToPageSource(source = "", { target = "", title = "", subtitle = "", sectionContainerComponentImportPath = "/src/components/SectionContainerShell.vue", preserveExistingContent = true } = {})`
65
88
  - `upgradePageFileToSubpages({ appRoot, targetFile, target = "", title = "", subtitle = "", componentDirectory = DEFAULT_COMPONENT_DIRECTORY, preserveExistingContent = true, dryRun = false } = {})`
66
89
  Local functions
90
+ - `resolveGeneratedPageSurfaceProfile({ surfaceId = "", routePath = "" } = {})`
67
91
  - `trimEdgeBlankLines(source = "")`
68
92
  - `renderSectionContainerShellSource()`
69
93
  - `findTemplateBlock(source = "")`
@@ -79,6 +103,7 @@ Exports
79
103
  - `DEFAULT_COMPONENT_DIRECTORY`
80
104
  - `MAIN_CLIENT_PROVIDER_FILE`
81
105
  - `PLACEMENT_FILE`
106
+ - `PLACEMENT_TOPOLOGY_FILE`
82
107
  - `toKebabCase(value = "")`
83
108
  - `toPascalCase(value = "")`
84
109
  - `requireOption(options = {}, optionName = "", { context = "ui-generator" } = {})`
@@ -90,9 +115,16 @@ Exports
90
115
  - `appendBlockIfMarkerMissing(source = "", marker = "", block = "")`
91
116
  - `insertImportIfMissing(source = "", importLine = "")`
92
117
  - `insertBeforeClassDeclaration(source = "", line = "", { className = "", contextFile = "" } = {})`
93
- - `findScriptBlock(source = "")`
118
+ - `findScriptSetupBlock(source = "")`
119
+ - `insertScriptSetupBlock(source = "", content = "")`
120
+ - `appendTopologyBlockIfPlacementMissing({ topologyPath = {}, source = "", marker = "", block = "", placementId = "", owner = "", variantTargets = null, context = "ui-generator topology" } = {})`
94
121
  - `parseTagAttributes(attributesSource = "")`
95
122
  - `indentBlock(source = "", indent = "")`
123
+ Local functions
124
+ - `loadPlacementTopologyDefinitionFromPath(topologyPath = {}, { context = "ui-generator topology" } = {})`
125
+ - `normalizeExpectedTopologyVariantTargets(variantTargets = null)`
126
+ - `describeTopologyVariantTargets(variantTargets = {})`
127
+ - `placementMatchesExpectedVariantTargets(placement = {}, expectedVariantTargets = null)`
96
128
 
97
129
  ### root
98
130
 
@@ -289,6 +289,8 @@ Exports
289
289
  ### `templates/packages/users-workspace/src/server/actions.js`
290
290
  Exports
291
291
  - `createActions({ surface } = {})`
292
+ Local functions
293
+ - `buildListQuery(input = {})`
292
294
 
293
295
  ### `templates/packages/users-workspace/src/server/registerRoutes.js`
294
296
  Exports
@@ -28,6 +28,12 @@ Exports
28
28
  - `createUsersBootstrapUserHandler()`
29
29
  - `registerUsersBootstrapPayloadHandlers(app)`
30
30
 
31
+ ### `src/client/bulkActions.js`
32
+ Exports
33
+ - `defineCrudListBulkActions(actions = [])`
34
+ Local functions
35
+ - `normalizeCrudListBulkAction(rawAction = {}, index = 0)`
36
+
31
37
  ### `src/client/components/AccountSettingsClientElement.vue`
32
38
  Exports
33
39
  - None
@@ -35,6 +41,44 @@ Local functions
35
41
  - `normalizeSection(value)`
36
42
  - `readRouteSection()`
37
43
 
44
+ ### `src/client/components/CrudAddEditScreen.vue`
45
+ Exports
46
+ - None
47
+ Local functions
48
+ - `resolveFieldErrors(fieldKey)`
49
+ - `resolveCancelTo(target = cancelTo.value)`
50
+
51
+ ### `src/client/components/CrudListBulkActionSurface.vue`
52
+ Exports
53
+ - None
54
+ Local functions
55
+ - `clearSelection()`
56
+ - `execute(action = {})`
57
+ - `isActionDisabled(action = {})`
58
+ - `isActionExecuting(action = {})`
59
+
60
+ ### `src/client/components/CrudListFilterSurface.vue`
61
+ Exports
62
+ - None
63
+ Local functions
64
+ - `optionItems(filter = {})`
65
+ - `placeholder(filter = {}, fallback = "")`
66
+ - `clearChip(chip = {})`
67
+ - `clearFilters()`
68
+
69
+ ### `src/client/components/CrudListScreen.vue`
70
+ Exports
71
+ - None
72
+ Local functions
73
+ - `resolveListRecordTitle(record)`
74
+ - `formatListCardValue(value)`
75
+ - `resolveViewLocation(record)`
76
+ - `resolveEditLocation(record)`
77
+
78
+ ### `src/client/components/CrudViewScreen.vue`
79
+ Exports
80
+ - None
81
+
38
82
  ### `src/client/components/ProfileClientElement.vue`
39
83
  Exports
40
84
  - None
@@ -226,7 +270,7 @@ Exports
226
270
  ### `src/client/composables/runtime/operationUiHelpers.js`
227
271
  Exports
228
272
  - `setupRouteChangeCleanup({ enabled = true, route = null, feedback = null, fieldBag = null } = {})`
229
- - `setupOperationErrorReporting({ enabled = true, source = "users-web.operation", loadError = null, notFoundError = null, loadActionFactory = null, notFoundActionFactory = null, loadChannel = "banner", notFoundChannel = "banner", loadSeverity = "error", notFoundSeverity = "warning", dedupeWindowMs = 2000 } = {})`
273
+ - `setupOperationErrorReporting({ enabled = true, source = "users-web.operation", loadError = null, notFoundError = null, loadActionFactory = null, notFoundActionFactory = null, loadChannel = "", notFoundChannel = "", loadSeverity = "error", notFoundSeverity = "warning", dedupeWindowMs = 2000 } = {})`
230
274
  Local functions
231
275
  - `normalizeMessage(value)`
232
276
 
@@ -246,7 +290,7 @@ Exports
246
290
  Exports
247
291
  - `buildEndpointReadRequestOptions({ method = "GET", query = null, transport = null } = {})`
248
292
  - `buildEndpointWriteRequestOptions({ method = "PATCH", body = undefined, options = null, transport = null } = {})`
249
- - `useEndpointResource({ queryKey, path = "", enabled = true, client = usersWebHttpClient, readMethod = "GET", writeMethod = "PATCH", readQuery = null, transport = null, queryOptions = null, mutationOptions = null, fallbackLoadError = "Unable to load resource.", fallbackSaveError = "Unable to save resource." } = {})`
293
+ - `useEndpointResource({ queryKey, path = "", enabled = true, client = usersWebHttpClient, readMethod = "GET", writeMethod = "PATCH", readQuery = null, transport = null, refreshOnPull = false, queryOptions = null, mutationOptions = null, fallbackLoadError = "Unable to load resource.", fallbackSaveError = "Unable to save resource." } = {})`
250
294
  Local functions
251
295
  - `resolveRequestQuery(value = null)`
252
296
 
@@ -265,7 +309,7 @@ Local functions
265
309
 
266
310
  ### `src/client/composables/runtime/useUiFeedback.js`
267
311
  Exports
268
- - `useUiFeedback({ initialType = "success", source = "users-web.ui-feedback", successChannel = "snackbar", errorChannel = "banner", dedupeWindowMs = 2000 } = {})`
312
+ - `useUiFeedback({ initialType = "success", source = "users-web.ui-feedback", successChannel = "", errorChannel = "", dedupeWindowMs = 2000 } = {})`
269
313
 
270
314
  ### `src/client/composables/runtime/useViewCore.js`
271
315
  Exports
@@ -337,6 +381,7 @@ Exports
337
381
  ### `src/client/composables/support/resourceLoadStateHelpers.js`
338
382
  Exports
339
383
  - `hasResolvedQueryData({ query = null, data = null } = {})`
384
+ - `mergeQueryMeta(queryOptions = null, meta = {})`
340
385
 
341
386
  ### `src/client/composables/support/routeTemplateHelpers.js`
342
387
  Exports
@@ -388,6 +433,19 @@ Exports
388
433
  Exports
389
434
  - `useCommand({ ownershipFilter = ROUTE_VISIBILITY_WORKSPACE, surfaceId = "", access = "auto", apiSuffix = "", runPermissions = [], writeMethod = "POST", transport = null, placementSource = "users-web.command", fallbackRunError = "Unable to complete action.", fieldErrorKeys = [], clearOnRouteChange = true, model, input, buildRawPayload, buildCommandPayload, buildCommandOptions, onRunSuccess, onRunError, suppressSuccessMessage = false, messages = {}, realtime = null } = {})`
390
435
 
436
+ ### `src/client/composables/useCrudAddEditScreen.js`
437
+ Exports
438
+ - `useCrudAddEditScreen({ screen = null, mode = "new", title = "", subtitle = "", saveLabel = "Save", cancelTo = "", resource = null, operationName = "", formFields = [], addEditOptions = {}, saveSuccess = {}, fieldBinding = null, createModel = null, buildPayload = null, mapPayloadToModel = null, input = null, preserveCancelQuery = false } = {})`
439
+ Local functions
440
+ - `normalizeProvidedScreen(screen = null)`
441
+
442
+ ### `src/client/composables/useCrudListBulkActions.js`
443
+ Exports
444
+ - `useCrudListBulkActions(actions = [], { resolveRecordId = null, resolveContext = null } = {})`
445
+ Local functions
446
+ - `normalizeSelectedId(value = "")`
447
+ - `resolveActionKey(actionOrKey = "")`
448
+
391
449
  ### `src/client/composables/useCrudListFilterLookups.js`
392
450
  Exports
393
451
  - `useCrudListFilterLookups(definitions = {}, { values = {}, adapter = null, recordIdParam = "recordId", queryKeyPrefix = [], placementSourcePrefix = "", requestQueryParams = {}, labelResolvers = {} } = {})`
@@ -412,6 +470,16 @@ Exports
412
470
  Local functions
413
471
  - `normalizeQueryKeyPrefix(value = [])`
414
472
 
473
+ ### `src/client/composables/useCrudListScreen.js`
474
+ Exports
475
+ - `useCrudListScreen({ adapter = null, resource = null, resourceNamespace = "resource", apiSuffix = "", recordIdParam = "recordId", recordIdSelector = null, titleFallbackFieldKey = "", viewUrlTemplate = "", editUrlTemplate = "", newUrlTemplate = "", recordChangedEvents = [], listFilters = {}, listBulkActions = [], routeQueryBlacklist = Object.freeze(["include", "cursor", "limit"]), fallbackLoadError = "Unable to load records." } = {})`
476
+ Local functions
477
+ - `formatCrudListCardValue(value)`
478
+
479
+ ### `src/client/composables/useCrudViewScreen.js`
480
+ Exports
481
+ - `useCrudViewScreen({ adapter = null, resource = null, resourceNamespace = "resource", apiUrlTemplate = "", recordIdParam = "recordId", titleFallbackFieldKey = "", listUrlTemplate = "", editUrlTemplate = "", recordChangedEvent = "", fallbackLoadError = "Unable to load record.", notFoundMessage = "Record not found." } = {})`
482
+
415
483
  ### `src/client/composables/usePagedCollection.js`
416
484
  Exports
417
485
  - `usePagedCollection({ queryKey, enabled = true, initialPageParam = null, queryFn, getNextPageParam = defaultGetNextPageParam, selectItems = defaultSelectItems, dedupeBy = null, queryOptions = null, fallbackLoadError = "Unable to load list." } = {})`
@@ -450,10 +518,31 @@ Local functions
450
518
  Exports
451
519
  - `useSurfaceRouteContext()`
452
520
 
521
+ ### `src/client/filters.js`
522
+ Exports
523
+ - `CRUD_LIST_FILTER_TYPE_FLAG`
524
+ - `CRUD_LIST_FILTER_TYPE_ENUM`
525
+ - `CRUD_LIST_FILTER_TYPE_ENUM_MANY`
526
+ - `CRUD_LIST_FILTER_TYPE_RECORD_ID`
527
+ - `CRUD_LIST_FILTER_TYPE_RECORD_ID_MANY`
528
+ - `CRUD_LIST_FILTER_TYPE_DATE`
529
+ - `CRUD_LIST_FILTER_TYPE_DATE_RANGE`
530
+ - `CRUD_LIST_FILTER_TYPE_NUMBER_RANGE`
531
+ - `CRUD_LIST_FILTER_TYPE_PRESENCE`
532
+ - `CRUD_LIST_FILTER_PRESENCE_PRESENT`
533
+ - `CRUD_LIST_FILTER_PRESENCE_MISSING`
534
+ - `CRUD_LIST_FILTER_PRESENCE_OPTIONS`
535
+ - `defineCrudListFilters`
536
+
453
537
  ### `src/client/index.js`
454
538
  Exports
455
539
  - `UsersWebClientProvider`
456
540
  - `AccountSettingsClientElement`
541
+ - `CrudAddEditScreen`
542
+ - `CrudListBulkActionSurface`
543
+ - `CrudListFilterSurface`
544
+ - `CrudListScreen`
545
+ - `CrudViewScreen`
457
546
  - `clientProviders`
458
547
 
459
548
  ### `src/client/lib/bootstrap.js`
@@ -502,7 +591,6 @@ Exports
502
591
 
503
592
  ### `src/shared/toolsOutletContracts.js`
504
593
  Exports
505
- - `DEFAULT_COG_LINK_COMPONENT_TOKEN`
506
594
  - `HOME_COG_OUTLET`
507
595
 
508
596
  ### templates
@@ -89,6 +89,7 @@ Local functions
89
89
  - `normalizeInvites(entries)`
90
90
  - `latestPage(pages)`
91
91
  - `applyWorkspaceSettingsPolicy(payload = {})`
92
+ - `refreshLoad()`
92
93
  - `submitInvite()`
93
94
  - `submitRevokeInvite(inviteId)`
94
95
  - `submitMemberRoleUpdate(member, roleSid)`
@@ -103,7 +104,7 @@ Exports
103
104
  - None
104
105
  Local functions
105
106
  - `normalizePendingInvite(entry)`
106
- - `reportFeedback({ message, severity = "error", channel = "banner", dedupeKey = "" } = {})`
107
+ - `reportFeedback({ message, severity = "error", channel = "", dedupeKey = "" } = {})`
107
108
  - `workspaceInitials(workspace)`
108
109
  - `workspaceAvatarStyle(workspace)`
109
110
  - `workspaceHomePath(workspaceSlug)`
@@ -112,6 +113,7 @@ Local functions
112
113
  - `acceptInvite(invite)`
113
114
  - `refuseInvite(invite)`
114
115
  - `createWorkspace()`
116
+ - `refreshBootstrap()`
115
117
 
116
118
  ### `src/client/components/WorkspaceSettingsClientElement.vue`
117
119
  Exports
@@ -321,7 +323,6 @@ Exports
321
323
 
322
324
  ### `src/shared/toolsOutletContracts.js`
323
325
  Exports
324
- - `DEFAULT_COG_LINK_COMPONENT_TOKEN`
325
326
  - `ADMIN_COG_OUTLET`
326
327
 
327
328
  ### templates
@@ -82,6 +82,8 @@ Local functions
82
82
  - `discoverGenerators(appRoot)`
83
83
  - `discoverRuntimePackages(appRoot)`
84
84
  - `extractMatches(source = "", patterns = [])`
85
+ - `discoverSemanticPlacementTargets(appRoot)`
86
+ - `discoverConcretePlacementTargets(appRoot)`
85
87
  - `discoverComponentTokens(appRoot)`
86
88
  - `isRouteLikeRelativePath(relativePath = "")`
87
89
  - `discoverPagesRelativeDirectories(appRoot)`
@@ -116,6 +118,8 @@ Exports
116
118
  Local functions
117
119
  - `normalizePackageKind(rawValue, descriptorPath)`
118
120
  - `validateFileMutationShape(descriptor, descriptorPath)`
121
+ - `validateLifecycleHookSpec(spec = {}, descriptorPath, label = "lifecycle hook")`
122
+ - `validateLifecycleShape(descriptor, descriptorPath)`
119
123
 
120
124
  ### `src/server/cliRuntime/ioAndMigrations.js`
121
125
  Exports
@@ -166,12 +170,12 @@ Exports
166
170
 
167
171
  ### `src/server/cliRuntime/mutations/fileMutations.js`
168
172
  Exports
169
- - `applyFileMutations(packageEntry, appRoot, preparedMutations, managedFiles, managedMigrations, touchedFiles, warnings = [], existingManagedFiles = [], { reapplyManagedAppFiles = false } = {})`
173
+ - `applyFileMutations(packageEntry, appRoot, preparedMutations, managedFiles, managedMigrations, touchedFiles, warnings = [], existingManagedFiles = [], { dryRun = false, reapplyManagedAppFiles = false } = {})`
170
174
  - `prepareFileMutations(packageEntry, options, appRoot, fileMutations, existingManagedFiles = [])`
171
175
 
172
176
  ### `src/server/cliRuntime/mutations/installMigrationMutation.js`
173
177
  Exports
174
- - `applyInstallMigrationMutation({ packageEntry, preparedMutation, appRoot, managedMigrations, managedMigrationById, touchedFiles, warnings } = {})`
178
+ - `applyInstallMigrationMutation({ packageEntry, preparedMutation, appRoot, managedMigrations, managedMigrationById, touchedFiles, warnings, dryRun = false } = {})`
175
179
 
176
180
  ### `src/server/cliRuntime/mutations/mutationPathUtils.js`
177
181
  Exports
@@ -194,7 +198,7 @@ Exports
194
198
 
195
199
  ### `src/server/cliRuntime/mutations/textMutations.js`
196
200
  Exports
197
- - `applyTextMutations(packageEntry, appRoot, textMutations, options, managedText, touchedFiles)`
201
+ - `applyTextMutations(packageEntry, appRoot, textMutations, options, managedText, touchedFiles, { dryRun = false } = {})`
198
202
  - `partitionPreFileConfigTextMutations(textMutations = [])`
199
203
  - `resolvePositioningMutations(descriptorMutations = {})`
200
204
  Local functions
@@ -219,9 +223,9 @@ Local functions
219
223
  ### `src/server/cliRuntime/packageInstallFlow.js`
220
224
  Exports
221
225
  - `adoptAppLocalPackageDependencies({ appRoot, appPackageJson, lock })`
222
- - `applyPackageInstall({ packageEntry, packageOptions, appRoot, appPackageJson, lock, packageRegistry, touchedFiles, reportTemplateFetchStatus = null })`
223
- - `applyPackageMigrationsOnly({ packageEntry, packageOptions, appRoot, lock, touchedFiles })`
224
- - `applyPackagePositioning({ packageEntry, packageOptions, appRoot, lock, touchedFiles })`
226
+ - `applyPackageInstall({ packageEntry, packageOptions, appRoot, appPackageJson, lock, packageRegistry, touchedFiles, reportTemplateFetchStatus = null, dryRun = false })`
227
+ - `applyPackageMigrationsOnly({ packageEntry, packageOptions, appRoot, lock, touchedFiles, dryRun = false })`
228
+ - `applyPackagePositioning({ packageEntry, packageOptions, appRoot, lock, touchedFiles, dryRun = false })`
225
229
  Local functions
226
230
  - `createManagedRecordBase(packageEntry, options)`
227
231
  - `cloneManagedMap(value = {})`
@@ -262,6 +266,7 @@ Local functions
262
266
  Exports
263
267
  - `normalizePlacementContributions(value)`
264
268
  - `normalizePlacementOutlets(value)`
269
+ - `normalizePlacementTopology(value, { context = "package placement topology" } = {})`
265
270
 
266
271
  ### `src/server/cliRuntime/packageIntrospection/providerBindingIntrospection.js`
267
272
  Exports
@@ -338,10 +343,10 @@ Exports
338
343
  - `normalizeViteDevProxyConfig(value = {}, { context = "vite proxy config" } = {})`
339
344
  - `resolveViteDevProxyConfigAbsolutePath(appRoot)`
340
345
  - `loadViteDevProxyConfig(appRoot, { context = "vite proxy config" } = {})`
341
- - `writeViteDevProxyConfig(appRoot, config = {}, touchedFiles = null)`
346
+ - `writeViteDevProxyConfig(appRoot, config = {}, touchedFiles = null, { dryRun = false } = {})`
342
347
  - `normalizeViteProxyMutationRecord(value = {})`
343
- - `applyViteMutations(packageEntry, appRoot, viteMutations, options, managedVite, touchedFiles)`
344
- - `removeManagedViteProxyEntries({ appRoot, packageId, managedViteChanges = {}, touchedFiles = null } = {})`
348
+ - `applyViteMutations(packageEntry, appRoot, viteMutations, options, managedVite, touchedFiles, { dryRun = false } = {})`
349
+ - `removeManagedViteProxyEntries({ appRoot, packageId, managedViteChanges = {}, touchedFiles = null, dryRun = false } = {})`
345
350
 
346
351
  ### `src/server/commandHandlers/app.js`
347
352
  Exports
@@ -435,10 +440,103 @@ Local functions
435
440
  - `resolveGeneratorDescription(packageEntry = {})`
436
441
  - `resolveGeneratorQuickStartRows(packageEntry = {}, { limit = 3 } = {})`
437
442
  - `isLinkItemToken(token = "")`
443
+ - `collectPlacementRendererKinds(placementTarget = {})`
444
+ - `collectPlacementConcreteOutlets(placementTarget = {})`
445
+ - `classifyPlacementTarget(placementTarget = {})`
446
+ - `createConcreteTargetSourcePathMap(concreteTargets = [])`
447
+ - `resolveChildPagePatternFromHostSourcePath(sourcePath = "")`
448
+ - `resolveOwnerScopedChildPagePattern(placementTarget = {}, concreteSourcePathByTarget = new Map())`
449
+ - `createPlacementTargetSummary(placementTarget = {}, color, { concreteSourcePathByTarget = new Map() } = {})`
450
+ - `appendPlacementLayoutDetails(lines, placementTarget = {}, color)`
451
+ - `collectMappedConcreteOutletIds(semanticPlacements = [])`
452
+ - `resolveUnmappedConcreteTargets({ semanticPlacements = [], concreteTargets = [] } = {})`
453
+ - `formatPlacementGuidanceLine(line = "", color)`
454
+ - `appendPlacementGroup(lines, { color, title = "", description = "", guidance = [], targets = [], concreteSourcePathByTarget = new Map(), showLayoutDetails = false } = {})`
455
+ - `appendUnmappedConcreteTargetWarnings(lines, { color, concreteTargets = [] } = {})`
456
+ - `appendSemanticPlacementGroups(lines, { color, semanticPlacements = [], concreteTargets = [], showLayoutDetails = false } = {})`
438
457
  - `readFileIfExists(filePath = "")`
439
458
  - `resolveDescriptorFromLockEntry({ appRoot = "", packageId = "", installedPackageEntry = {} } = {})`
440
459
  - `collectProviderSourceFiles(rootPath = "")`
441
460
 
461
+ ### `src/server/commandHandlers/mobile.js`
462
+ Exports
463
+ - `createMobileCommands(ctx = {})`
464
+ Local functions
465
+ - `collectManagedMobileFileDriftIssues({ ctx, appRoot, issues = [] } = {})`
466
+ - `renderAndroidMobileCommandList(lines, color)`
467
+ - `renderMobileHelp(stream, definition = null, platform = "")`
468
+ - `isValidHttpOrHttpsUrl(value = "")`
469
+ - `normalizeInlineOptions(options = {})`
470
+ - `parsePortNumber(rawValue, { createCliError, optionLabel = "--port" } = {})`
471
+ - `parseAdbDeviceList(output = "")`
472
+ - `resolveAdbReversePort({ mobileConfig = null, explicitPort = "", createCliError } = {})`
473
+ - `runCapturedBinary(binaryName, args = [], { cwd = process.cwd(), env = {}, createCliError, notFoundMessage = "" } = {})`
474
+ - `listVisibleAndroidDevices({ ctx, appRoot } = {})`
475
+ - `resolveAndroidDeviceTarget({ ctx, appRoot, explicitTarget = "", commandLabel = "this mobile command" } = {})`
476
+ - `resolveInstalledMobileConfigForCommand({ appRoot, createCliError } = {})`
477
+ - `runLocalBinary(binaryName, args = [], { appRoot, cwd = appRoot, env = {}, stderr, stdout, pathModule, createCliError, dryRun = false } = {})`
478
+ - `hasPackageDependency(packageJson = {}, packageId = "")`
479
+ - `readJsonFileForMobileCommand(filePath = "", label = "", createCliError)`
480
+ - `assertMobileRuntimePackageInstalled({ ctx, appRoot } = {})`
481
+ - `refreshManagedMobileFiles({ ctx, appRoot, options = {}, stdout } = {})`
482
+ - `runMobileSyncAndroidCommand({ ctx, appRoot, options = {}, stdout, stderr })`
483
+ - `runMobileRunAndroidCommand({ ctx, appRoot, options = {}, stdout, stderr })`
484
+ - `runCapRunAndroidCommand({ ctx, appRoot, pathModule, target = "", stdout, stderr, dryRun = false } = {})`
485
+ - `runMobileBuildAndroidCommand({ ctx, appRoot, options = {}, stdout, stderr })`
486
+ - `runMobileDoctorCommand({ ctx, appRoot, stdout })`
487
+ - `runMobileDevicesAndroidCommand({ ctx, appRoot, stdout })`
488
+ - `runMobileTunnelAndroidCommand({ ctx, appRoot, options = {}, stdout })`
489
+ - `runMobileRestartAndroidCommand({ ctx, appRoot, options = {}, stdout })`
490
+ - `runMobileDevAndroidCommand({ ctx, appRoot, options = {}, stdout, stderr })`
491
+
492
+ ### `src/server/commandHandlers/mobileCommandCatalog.js`
493
+ Exports
494
+ - `MOBILE_COMMAND_DEFINITIONS`
495
+ - `listMobileCommandDefinitions()`
496
+ - `resolveMobileCommandDefinition(rawName = "")`
497
+ - `buildMobileCommandOptionMeta(subcommandName = "")`
498
+
499
+ ### `src/server/commandHandlers/mobileShellSupport.js`
500
+ Exports
501
+ - `CAPACITOR_CONFIG_FILE`
502
+ - `ANDROID_DIRECTORY_NAME`
503
+ - `ANDROID_MANIFEST_RELATIVE_PATH`
504
+ - `buildManagedMobileConfigStub({ packageJson = {} } = {})`
505
+ - `isEmptyDisabledMobileConfigPlaceholder(mobileConfig = {})`
506
+ - `resolveInstalledMobileConfig(appRoot = "")`
507
+ - `resolveAndroidSdkDetails({ appRoot = "" } = {})`
508
+ - `collectAndroidSdkComponentIssues({ appRoot = "", sdkRoot = "" } = {})`
509
+ - `assertAndroidSdkConfigured({ ctx, appRoot } = {})`
510
+ - `collectCapacitorShellInstallIssues({ ctx, appRoot } = {})`
511
+ - `ensureMobileConfigStub({ ctx, appRoot, packageJson = {}, dryRun = false, stdout } = {})`
512
+ - `buildManagedDeepLinkIntentFilterBlock(mobileConfig = {})`
513
+ - `injectManagedDeepLinkBlock(manifestSource = "", managedBlock = "")`
514
+ - `assertCapacitorShellInstalled({ ctx, appRoot })`
515
+ - `ensureAndroidManifestDeepLinks({ ctx, appRoot, dryRun = false, stdout } = {})`
516
+ - `collectAndroidNativeShellIdentityIssues({ ctx, appRoot } = {})`
517
+ - `ensureAndroidNativeShellIdentity({ ctx, appRoot, dryRun = false, stdout } = {})`
518
+ - `renderManagedMobileFile({ appRoot, relativeTargetPath, packageId = CAPACITOR_RUNTIME_PACKAGE_ID } = {})`
519
+ Local functions
520
+ - `normalizeRelativePosixPath(pathValue = "")`
521
+ - `escapeRegExp(value = "")`
522
+ - `pathExists(targetPath = "")`
523
+ - `humanizeAppName(value = "")`
524
+ - `slugifyForIdentifier(value = "")`
525
+ - `parseAndroidSdkDirFromLocalProperties(source = "")`
526
+ - `buildAndroidNativeConfig(mobileConfig = {})`
527
+ - `replaceRequiredPattern(source = "", pattern, replacement, label = "pattern")`
528
+ - `escapeXmlText(value = "")`
529
+ - `replaceXmlStringValue(source = "", stringName = "", value = "")`
530
+ - `renderAndroidVariablesGradleSource(source = "", nativeConfig = {})`
531
+ - `renderAndroidAppBuildGradleSource(source = "", nativeConfig = {})`
532
+ - `renderAndroidStringsSource(source = "", nativeConfig = {})`
533
+ - `renderAndroidMainActivitySource(source = "", packageName = "", extension = ".java")`
534
+ - `listFilesRecursively(rootDirectoryPath = "")`
535
+ - `resolveAndroidMainActivityEntry(appRoot = "")`
536
+ - `shouldAllowAndroidCleartextTraffic(mobileConfig = {})`
537
+ - `renderAndroidManifestApplicationTrafficPolicy(manifestSource = "", mobileConfig = {})`
538
+ - `renderManagedAndroidManifest(manifestSource = "", mobileConfig = {})`
539
+
442
540
  ### `src/server/commandHandlers/package.js`
443
541
  Exports
444
542
  - `createPackageCommands(ctx = {})`
@@ -448,6 +546,13 @@ Exports
448
546
  - `runPackageAddCommand(ctx = {}, { positional, options, cwd, io })`
449
547
  Local functions
450
548
  - `collectPlacementComponentTokensFromManagedRecords(installedPackageRecords = [])`
549
+ - `renderWrappedShellCommand(binaryName, args = [], { maxWidth = 100, continuationIndent = " " } = {})`
550
+ - `runLocalProjectBinary(binaryName, args = [], { appRoot, io, pathModule = path, createCliError, explanation = "", dryRun = false } = {})`
551
+ - `installAppDependenciesForHook({ appRoot, appPackageJson, io, pathModule = path, createCliError, dryRun = false, runDevlinks = false } = {})`
552
+ - `validateHookResult(result = {}, { packageId = "", hookLabel = "" } = {})`
553
+ - `loadInstallHook({ packageEntry, appRoot, hookSpec, hookLabel = "" } = {})`
554
+ - `createInstallHookHelpers({ ctx, appRoot, io, appPackageJson, commandOptions = {} } = {})`
555
+ - `invokeInstallHook({ packageEntry, appRoot, hookSpec, hookLabel, hookContext, createCliError } = {})`
451
556
 
452
557
  ### `src/server/commandHandlers/packageCommands/create.js`
453
558
  Exports
@@ -63,6 +63,7 @@ Core rules:
63
63
  - `Not doing: ...`
64
64
  - Keep that checkpoint compact. Do not expand it into a long preamble unless the developer asks for detail.
65
65
  - Reuse existing JSKIT helpers and runtime seams before adding new local helpers.
66
+ - If `npm install` is run while the app is using local JSKIT checkout links, run `npm run devlinks` immediately afterward.
66
67
  - A freshly scaffolded JSKIT app can still be in Stage 1. If the app was just created and platform decisions are not settled yet, continue with the initialize workflow before adding runtime packages.
67
68
  - Do not treat a missing `config.tenancyMode` line or an untouched minimal scaffold as a final tenancy decision.
68
69
  - Do not install tenancy-sensitive packages until Stage 1 decisions are complete and the chosen tenancy is written into `config/public.js`.
@@ -54,6 +54,7 @@ Baseline expectations after initialization:
54
54
  - create the app scaffold
55
55
  - install the baseline runtime packages in the documented order
56
56
  - install dependencies
57
+ - run `npm run devlinks` immediately after `npm install` when the app is using local JSKIT checkout links
57
58
  - run database migrations when the chosen package set requires them
58
59
  - use the standard packaged workflows that come with those packages unless the blueprint records an override
59
60
  - leave the app in a reproducible, verified baseline state