@jskit-ai/agent-docs 0.1.242 → 0.1.244

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 (128) hide show
  1. package/guide/agent/app-extras/assistant-conversation.md +4 -2
  2. package/guide/agent/app-extras/assistant.md +3 -1
  3. package/guide/agent/app-extras/realtime.md +12 -3
  4. package/guide/agent/app-setup/database-layer.md +1 -1
  5. package/guide/agent/app-setup/existing-application-migration.md +0 -7
  6. package/guide/agent/framework/application-operations.md +1 -1
  7. package/guide/agent/framework/crud-operations.md +9 -9
  8. package/guide/agent/index.md +2 -0
  9. package/package.json +2 -3
  10. package/patterns/feature-package/example/booking-engine/package.json +1 -1
  11. package/patterns/feature-package/example/booking-engine/src/server/actions.js +0 -2
  12. package/patterns/feature-package/example/variations/AvailabilityEngineProvider.js +1 -1
  13. package/patterns/feature-package/example/variations/InvoiceRollupProvider.js +1 -1
  14. package/patterns/minimal-foundation/example/AGENTS.md +19 -0
  15. package/patterns/minimal-foundation/example/package.json +3 -3
  16. package/patterns/minimal-foundation/example/server/lib/runtimeEnv.js +3 -11
  17. package/patterns/minimal-foundation/example/src/main.js +0 -2
  18. package/patterns/shell-foundation/PATTERN.md +11 -20
  19. package/patterns/shell-foundation/example/AGENTS.md +19 -0
  20. package/patterns/shell-foundation/example/package.json +4 -4
  21. package/patterns/shell-foundation/example/packages/main/package.json +1 -1
  22. package/patterns/shell-foundation/example/server/lib/runtimeEnv.js +3 -11
  23. package/patterns/shell-foundation/example/src/components/ShellLayout.vue +1 -0
  24. package/patterns/shell-foundation/example/src/main.js +0 -2
  25. package/patterns/shell-foundation/example/src/pages/home/settings.vue +2 -2
  26. package/reference/autogen/KERNEL_MAP.md +16 -147
  27. package/reference/autogen/PATTERN_INDEX.md +37 -37
  28. package/reference/autogen/packages/agent-docs.md +1 -9
  29. package/reference/autogen/packages/assistant-core.md +102 -68
  30. package/reference/autogen/packages/assistant-runtime.md +29 -15
  31. package/reference/autogen/packages/assistant-voice-sherpa.md +2 -1
  32. package/reference/autogen/packages/assistant-voice.md +8 -11
  33. package/reference/autogen/packages/auth-core.md +1 -1
  34. package/reference/autogen/packages/auth-provider-local-core.md +1 -1
  35. package/reference/autogen/packages/auth-provider-local-db-core.md +1 -1
  36. package/reference/autogen/packages/auth-provider-oidc-core.md +1 -1
  37. package/reference/autogen/packages/auth-provider-supabase-core.md +1 -1
  38. package/reference/autogen/packages/auth-web.md +1 -2
  39. package/reference/autogen/packages/connector-google-calendar.md +6 -2
  40. package/reference/autogen/packages/connectors-catalog.md +26 -7
  41. package/reference/autogen/packages/connectors-core.md +14 -3
  42. package/reference/autogen/packages/connectors-web.md +6 -1
  43. package/reference/autogen/packages/console-core.md +1 -1
  44. package/reference/autogen/packages/console-web.md +1 -1
  45. package/reference/autogen/packages/crud-core.md +1 -1
  46. package/reference/autogen/packages/database-runtime-mysql.md +1 -1
  47. package/reference/autogen/packages/database-runtime-postgres.md +1 -1
  48. package/reference/autogen/packages/database-runtime.md +2 -86
  49. package/reference/autogen/packages/http-runtime.md +6 -92
  50. package/reference/autogen/packages/http-web.md +29 -49
  51. package/reference/autogen/packages/json-rest-api-core.md +1 -1
  52. package/reference/autogen/packages/kernel.md +108 -405
  53. package/reference/autogen/packages/mobile-capacitor.md +11 -1
  54. package/reference/autogen/packages/oidc-issuer-core.md +1 -1
  55. package/reference/autogen/packages/payments-core.md +12 -4
  56. package/reference/autogen/packages/payments-web.md +1 -1
  57. package/reference/autogen/packages/realtime.md +7 -5
  58. package/reference/autogen/packages/resource-core.md +1 -4
  59. package/reference/autogen/packages/resource-crud-core.md +4 -3
  60. package/reference/autogen/packages/rewarded-core.md +1 -1
  61. package/reference/autogen/packages/rewarded-web.md +1 -1
  62. package/reference/autogen/packages/shell-web.md +114 -49
  63. package/reference/autogen/packages/storage-runtime.md +1 -1
  64. package/reference/autogen/packages/uploads-image-web.md +1 -1
  65. package/reference/autogen/packages/uploads-runtime.md +1 -1
  66. package/reference/autogen/packages/users-core.md +1 -1
  67. package/reference/autogen/packages/users-web.md +1 -2
  68. package/reference/autogen/packages/workspaces-core.md +3 -1
  69. package/reference/autogen/packages/workspaces-web.md +1 -1
  70. package/reference/autogen/tooling/config-eslint.md +1 -1
  71. package/reference/autogen/tooling/jskit-catalog.md +8 -9
  72. package/reference/autogen/tooling/jskit-release.md +3 -4
  73. package/reference/autogen/tooling/testUtils.md +1 -28
  74. package/skills/jskit/SKILL.md +8 -6
  75. package/skills/jskit/references/app-operations.md +1 -1
  76. package/skills/jskit/references/crud-form-actions.md +62 -0
  77. package/skills/jskit/references/crud-operations.md +9 -9
  78. package/skills/jskit/references/existing-application-migration.md +0 -7
  79. package/{patterns → skills/jskit/references/heuristics}/INDEX.md +24 -38
  80. package/{patterns → skills/jskit/references/heuristics}/child-cruds.md +2 -0
  81. package/{patterns → skills/jskit/references/heuristics}/client-requests.md +2 -0
  82. package/{patterns → skills/jskit/references/heuristics}/crud-authoring.md +2 -0
  83. package/{patterns → skills/jskit/references/heuristics}/crud-links.md +2 -0
  84. package/{patterns → skills/jskit/references/heuristics}/crud-repository-mapping.md +3 -1
  85. package/{patterns → skills/jskit/references/heuristics}/filters.md +3 -1
  86. package/{patterns → skills/jskit/references/heuristics}/live-actions.md +2 -0
  87. package/{patterns → skills/jskit/references/heuristics}/page-redirects.md +2 -0
  88. package/{patterns → skills/jskit/references/heuristics}/page-scaffolding.md +5 -3
  89. package/{patterns → skills/jskit/references/heuristics}/placements.md +2 -0
  90. package/{patterns → skills/jskit/references/heuristics}/row-policies.md +2 -0
  91. package/{patterns → skills/jskit/references/heuristics}/server-search.md +2 -0
  92. package/{patterns → skills/jskit/references/heuristics}/surfaces.md +5 -3
  93. package/{patterns → skills/jskit/references/heuristics}/ui-contract.md +3 -1
  94. package/{patterns → skills/jskit/references/heuristics}/ui-testing.md +2 -0
  95. package/skills/jskit/references/pattern-index.md +37 -37
  96. package/skills/jskit/references/patterns/app/minimal-foundation/example/AGENTS.md +19 -0
  97. package/skills/jskit/references/patterns/app/minimal-foundation/example/package.json +3 -3
  98. package/skills/jskit/references/patterns/app/minimal-foundation/example/server/lib/runtimeEnv.js +3 -11
  99. package/skills/jskit/references/patterns/app/minimal-foundation/example/src/main.js +0 -2
  100. package/skills/jskit/references/patterns/app/shell-foundation/PATTERN.md +11 -20
  101. package/skills/jskit/references/patterns/app/shell-foundation/example/AGENTS.md +19 -0
  102. package/skills/jskit/references/patterns/app/shell-foundation/example/package.json +4 -4
  103. package/skills/jskit/references/patterns/app/shell-foundation/example/packages/main/package.json +1 -1
  104. package/skills/jskit/references/patterns/app/shell-foundation/example/server/lib/runtimeEnv.js +3 -11
  105. package/skills/jskit/references/patterns/app/shell-foundation/example/src/components/ShellLayout.vue +1 -0
  106. package/skills/jskit/references/patterns/app/shell-foundation/example/src/main.js +0 -2
  107. package/skills/jskit/references/patterns/app/shell-foundation/example/src/pages/home/settings.vue +2 -2
  108. package/skills/jskit/references/patterns/auth/accounts-hub/example/package.json +2 -2
  109. package/skills/jskit/references/patterns/auth/oidc-sign-in/example/package.json +2 -2
  110. package/skills/jskit/references/patterns/auth/supabase-auth/example/package.json +1 -1
  111. package/skills/jskit/references/patterns/connectors/calendar-cli/example/package.json +4 -4
  112. package/skills/jskit/references/patterns/connectors/oauth-connection/PATTERN.md +27 -610
  113. package/skills/jskit/references/patterns/connectors/paddle-catalogue/example/create-products.js +2 -1
  114. package/skills/jskit/references/patterns/connectors/redshift-queries/PATTERN.md +1 -1
  115. package/skills/jskit/references/patterns/crud/crud-screen-set/PATTERN.md +11 -1
  116. package/skills/jskit/references/patterns/crud/json-api-resource-package/example/packages/books/package.json +2 -2
  117. package/skills/jskit/references/patterns/database/mysql-application/example/package.json +1 -1
  118. package/skills/jskit/references/patterns/database/postgres-application/example/package.json +1 -1
  119. package/skills/jskit/references/patterns/realtime/realtime-application/example/package.json +2 -2
  120. package/skills/jskit/references/patterns/server/feature-package/example/booking-engine/package.json +1 -1
  121. package/skills/jskit/references/patterns/server/feature-package/example/booking-engine/src/server/actions.js +0 -2
  122. package/skills/jskit/references/patterns/server/feature-package/example/variations/AvailabilityEngineProvider.js +1 -1
  123. package/skills/jskit/references/patterns/server/feature-package/example/variations/InvoiceRollupProvider.js +1 -1
  124. package/skills/jskit/references/patterns/shell/application-shell/example/src/pages/home/index.vue +15 -5
  125. package/skills/jskit/references/patterns/shell/application-shell/example/tests/e2e/adaptive-shell.spec.ts +1 -1
  126. package/skills/jskit/references/patterns/users/user-administration-server/example/packages/users/package.json +2 -2
  127. package/skills/jskit/references/patterns/users/user-administration-server/example/packages/users-workspace/package.json +3 -3
  128. package/templates/app/AGENTS.md +0 -38
@@ -56,8 +56,10 @@ admission; Claude's `duplicate-checked`, `native-history-read`, `process-ready`,
56
56
  `prompt-rendered`, `metadata-ready`, `receipt-written` and `state-active`; and
57
57
  `admission-authorized` and `turn-located` before `accepted`. A bound host's
58
58
  `prepareInput(input, context, { deliveryTiming })` and Claude's
59
- `preparation.message(..., { deliveryTiming })` receive the same observer and may
60
- mark `git-actor` and `genesis-rendered`. Unknown stage names are ignored.
59
+ `preparation.message(..., { deliveryTiming })` receive the same observer. A host
60
+ that marks stages of its own preparation declares them with
61
+ `createConversationRuntime({ hostDeliveryStages: ["my-step"] })`; each name is
62
+ lowercase letters and hyphens. Undeclared stage names are ignored.
61
63
  Native acknowledgement precedes the application's receipt write. Accepted delivery
62
64
  still waits for the existing durable receipt contract.
63
65
 
@@ -399,7 +399,9 @@ catalog, the runtime automatically exposes compact paged action search, exact
399
399
  one-action contract lookup, and contract-gated execution tools. Search returns
400
400
  at most 20 compact matches and never includes schemas. Tool arguments and
401
401
  results are byte-bounded; an oversized result returns a controlled error so it
402
- cannot overflow assistant transcript storage.
402
+ cannot overflow assistant transcript storage. Empty tool arguments mean no
403
+ input; any other arguments must be one JSON object, so truncated JSON, arrays
404
+ and scalars return `assistant_tool_arguments_invalid` without running the action.
403
405
 
404
406
  The runtime tells the model that discovery tools are entry points into the
405
407
  authorized action catalog. Before claiming a capability or dataset is missing,
@@ -40,9 +40,18 @@ new handshake establishes the current actor.
40
40
 
41
41
  When `auth.service.authenticateRequest()` is present, delivery reauthenticates
42
42
  each socket before sending and rechecks idle sockets every 30 seconds. Revoked,
43
- expired, or changed actors are disconnected. Workspace membership rooms are
44
- refreshed from the current membership repository. Authentication lookup errors
45
- fail closed.
43
+ expired, or changed actors are disconnected. Authentication lookup errors fail
44
+ closed.
45
+
46
+ Packages that know which scopes an actor belongs to contribute them through
47
+ `runtime.realtime.registerAudienceContributor({ id, resolveActorScopes })` during
48
+ setup. `resolveActorScopes(actorId)` returns event scopes (`{ kind: "user", id }`,
49
+ `{ kind: "workspace", id }` or `{ kind: "workspace_user", workspaceId, userId }`);
50
+ realtime turns each into the same room an `event_scope` audience targets. Sockets
51
+ join those rooms on connection and, on every revalidation, leave the contributed
52
+ rooms the actor no longer belongs to; rooms joined by anything else are left
53
+ alone. `@jskit-ai/workspaces-core` contributes the actor's active workspace
54
+ memberships this way when realtime is installed.
46
55
 
47
56
  The authentication request includes parsed cookies, the `Host`, `Origin` and
48
57
  `X-Forwarded-Proto` headers when present, and the socket address and TLS state.
@@ -200,7 +200,7 @@ product CRUD behavior fixed.
200
200
  phases before commit share one repository transaction, and `execute` receives
201
201
  `standard(nextInput)` for retaining the normal framework write.
202
202
  - Named `actions` expose non-CRUD service methods through normal input,
203
- permission, audit, event, and optional HTTP route contracts.
203
+ permission, event, and optional HTTP route contracts.
204
204
 
205
205
  Repositories own database access. Services and lifecycle hooks orchestrate
206
206
  repositories. External delivery belongs after commit; when it must be durable,
@@ -297,13 +297,6 @@ ACL, and restrictive umask. Setup must fail if it cannot establish that
297
297
  contract. Do not make package installation, Git, agents, or preview startup run
298
298
  recursive ownership or mode repair afterward.
299
299
 
300
- For Vibe64-managed workspaces, the concrete contract is group `vibe64`,
301
- directory mode `2770`, access and inherited default group ACL `vibe64:rwx`, no
302
- access for other users, and process umask `0007`. The enabled human user and
303
- `v64d_<workspace>` identity both belong to the group. Other hosts may use
304
- different concrete identities, but they must provide the same creation-time
305
- guarantee.
306
-
307
300
  Do not conflate these identities:
308
301
 
309
302
  - The filesystem identity controls who may create and replace source files.
@@ -13,7 +13,7 @@ Adopt the foundation's accessible HTML skeleton, inline styles, Reload link and
13
13
  startup-error message; package updates do not rewrite existing app HTML. Follow
14
14
  its cold-browser proof at compact, medium and expanded widths: delay JavaScript,
15
15
  check loading feedback, then release it and check app mount, including production
16
- builds. Compression belongs to hosting, not Genesis.
16
+ builds. Response compression belongs to hosting.
17
17
 
18
18
  ## Establish a new application
19
19
 
@@ -150,16 +150,15 @@ need cross-owner denial tests.
150
150
  `useCrudAddEditScreen()` accepts `saveSuccess` at the top level. After saving,
151
151
  the default behaviour invalidates `saveSuccess.invalidateQueryKey`, navigates
152
152
  to a configured record-view URL when one resolves, and otherwise falls back to
153
- the list URL. For a create-and-list app, use `navigateToView: false` and the
154
- configured `listUrlTemplate`, as in the public example above. The list URL may
155
- also come from `addEditOptions.listUrlTemplate`.
153
+ the list URL. For a create-and-list app, use `navigateToView: false` and
154
+ `saveSuccess.listUrlTemplate`, the only list URL save navigation reads, as in the
155
+ public example above.
156
156
 
157
157
  To keep the saved form open, set both `saveSuccess.navigateToView` and
158
158
  `saveSuccess.navigateToList` to `false`. `addEditOptions.onSaveSuccess` replaces
159
159
  the default success handling, including query invalidation and navigation;
160
160
  reserve it for custom success behaviour. Returning to the list needs only the
161
- documented `saveSuccess` options, not a custom router callback or inspection of
162
- the shared form implementation.
161
+ `saveSuccess` options, not a router callback.
163
162
 
164
163
  ## Browser routes and responsive lists
165
164
 
@@ -307,17 +306,18 @@ this raw test encoding into page code.
307
306
  Deletion requires an explicit shared `DELETE` operation and confirmation
308
307
  decision. Use `CrudDeleteAction` and `useCrudDeleteAction()` through the view
309
308
  actions slot; do not rebuild their confirmation, request, invalidation, and
310
- navigation flow.
309
+ navigation flow. After a delete it returns to the list before invalidating the
310
+ resource's queries, so the deleted record never refetches as "Record not found."
311
311
 
312
312
  The delete action resolves its HTTP client from the resource's `apiAccess`, just
313
313
  like the list, view and form helpers. For `apiAccess: "public"`, DELETE requests
314
314
  skip session CSRF discovery; no `/api/session` endpoint or page-local client
315
315
  wiring is required. Authenticated resources retain the configured client's CSRF
316
- behavior. An explicit `client` override is supported and receives the same
317
- resource-aware public request options. This does not change server authorization.
316
+ behavior. An explicit `client` override receives the same request options.
317
+ Server authorization is unchanged.
318
318
 
319
319
  For custom form actions, see
320
- [record form actions](https://mobily-enterprises.github.io/jskit-ai/guide/framework/crud-form-actions).
320
+ [record form actions](./crud-form-actions.md).
321
321
 
322
322
  ## Strict temporal values
323
323
 
@@ -25,6 +25,7 @@ apply or adapt. It does not prescribe an agent host or project orchestrator.
25
25
 
26
26
  - [Application operations](/guide/framework/application-operations)
27
27
  - [CRUD operations](/guide/framework/crud-operations)
28
+ - [Record form actions](/guide/framework/crud-form-actions)
28
29
  - [UI operations](/guide/framework/ui-operations)
29
30
  - [Material 3](/guide/framework/material-3)
30
31
  - [Complete source pattern library](/patterns/)
@@ -34,6 +35,7 @@ apply or adapt. It does not prescribe an agent host or project orchestrator.
34
35
  - [Mobile Capacitor](/guide/app-extras/mobile-capacitor)
35
36
  - [Realtime](/guide/app-extras/realtime)
36
37
  - [Assistant](/guide/app-extras/assistant)
38
+ - [Embeddable assistant conversations](/guide/app-extras/assistant-conversation)
37
39
  - [Voice conversations](/guide/app-extras/assistant-voice)
38
40
 
39
41
  ## How to use the guide
package/package.json CHANGED
@@ -1,14 +1,13 @@
1
1
  {
2
2
  "name": "@jskit-ai/agent-docs",
3
- "version": "0.1.242",
3
+ "version": "0.1.244",
4
4
  "description": "Distributed JSKIT agent references, prompts, guides, and generated reference maps.",
5
5
  "type": "module",
6
6
  "files": [
7
7
  "guide",
8
8
  "patterns",
9
9
  "reference",
10
- "skills",
11
- "templates"
10
+ "skills"
12
11
  ],
13
12
  "scripts": {
14
13
  "test": "node --test --test-concurrency=1 test/*.test.js"
@@ -5,7 +5,7 @@
5
5
  "private": true,
6
6
  "type": "module",
7
7
  "dependencies": {
8
- "@jskit-ai/kernel": "0.1.245",
8
+ "@jskit-ai/kernel": "0.1.246",
9
9
  "json-rest-schema": "^1.0.17"
10
10
  },
11
11
  "exports": {
@@ -14,8 +14,6 @@ function createActions({ bookingEngine } = {}) {
14
14
  input: statusQueryInputValidator,
15
15
  output: null,
16
16
  idempotency: "none",
17
- audit: { actionName: ACTION_GET_STATUS },
18
- observability: {},
19
17
  async execute(input) {
20
18
  return bookingEngine.readStatus(input);
21
19
  }
@@ -1,5 +1,5 @@
1
1
  import { defineFeature } from "@jskit-ai/kernel/server/features";
2
- import { emptyInputValidator } from "@jskit-ai/kernel/shared/actions/actionContributorHelpers";
2
+ import { emptyInputValidator } from "@jskit-ai/kernel/server/actions/actionContributorHelpers";
3
3
  import { createService } from "./orchestratorService.js";
4
4
 
5
5
  const AvailabilityEngineProvider = defineFeature({
@@ -1,5 +1,5 @@
1
1
  import { defineFeature } from "@jskit-ai/kernel/server/features";
2
- import { emptyInputValidator } from "@jskit-ai/kernel/shared/actions/actionContributorHelpers";
2
+ import { emptyInputValidator } from "@jskit-ai/kernel/server/actions/actionContributorHelpers";
3
3
  import { createRepository } from "./repository.js";
4
4
 
5
5
  const InvoiceRollupProvider = defineFeature({
@@ -12,6 +12,25 @@ Before implementation, read the narrow relevant source pattern completely. If
12
12
  its owner package is installed, prefer that version-matched package-owned copy.
13
13
  Do not install an unrelated runtime package only to read documentation.
14
14
 
15
+ Before adding or changing browser-test setup, read the browser verification
16
+ guide at
17
+ `https://mobily-enterprises.github.io/jskit-ai/guide/framework/ui-operations#browser-verification`.
18
+ Routine tests reuse the isolated schema and prepare fixtures once per suite
19
+ invocation. Keep `BROWSER_TEST_DB_NAME` distinct from disposable `TEST_DB_NAME`
20
+ and prove that disposable cleanup preserves browser migrations. Require
21
+ repeat-start regression proof; do not rebuild the database or production
22
+ frontend for each focused browser check.
23
+
24
+ Keep verification output small. Run the relevant cases together, save complete
25
+ stdout/stderr to local artifacts, and preserve the exit status. Report counts,
26
+ duration, failed case names and artifact paths; read only actionable failure
27
+ excerpts. Do not dump full JSON/TAP reports, passing assertions, request logs or
28
+ traces into agent context. Wait on the existing run instead of restarting it or
29
+ repeatedly printing unchanged output. Keep startup and cleanup errors visible.
30
+ For browser evidence, use existing automated cases, targeted locators and
31
+ meaningful visual checkpoints. Avoid a full DOM snapshot or screenshot after
32
+ every action; retain the required viewport, identity and security checks.
33
+
15
34
  Pages never start with a page header, title block, welcome heading, or other
16
35
  standalone heading copy. Start with the useful content and actions. If the user
17
36
  wants a heading, they will ask for or add one.
@@ -34,7 +34,7 @@
34
34
  "dependencies": {
35
35
  "@local/main": "0.1.0",
36
36
  "@fastify/static": "^10.1.3",
37
- "@jskit-ai/kernel": "0.1.245",
37
+ "@jskit-ai/kernel": "0.1.246",
38
38
  "@tanstack/vue-query": "^5.101.0",
39
39
  "fastify": "^5.8.5",
40
40
  "json-rest-schema": "^1.0.17",
@@ -42,13 +42,13 @@
42
42
  "vue": "^3.5.44",
43
43
  "vue-router": "^5.3.1",
44
44
  "vuetify": "^4.1.2",
45
- "@jskit-ai/http-runtime": "0.1.243",
45
+ "@jskit-ai/http-runtime": "0.1.244",
46
46
  "@fastify/fast-json-stringify-compiler": "^5.1.0",
47
47
  "@vue/devtools-api": "^8.2.1"
48
48
  },
49
49
  "devDependencies": {
50
50
  "@jskit-ai/config-eslint": "0.1.241",
51
- "@jskit-ai/jskit-catalog": "0.1.295",
51
+ "@jskit-ai/jskit-catalog": "0.1.297",
52
52
  "@playwright/test": "1.61.1",
53
53
  "@vitejs/plugin-vue": "^6.0.7",
54
54
  "eslint": "^10.8.0",
@@ -1,8 +1,6 @@
1
- import { createRequire } from "node:module";
1
+ import { existsSync } from "node:fs";
2
2
  import { surfaceRuntime } from "./surfaceRuntime.js";
3
3
 
4
- const require = createRequire(import.meta.url);
5
-
6
4
  function toPort(value, fallback = 3000) {
7
5
  const parsed = Number.parseInt(String(value || "").trim(), 10);
8
6
  if (Number.isInteger(parsed) && parsed > 0) {
@@ -17,14 +15,8 @@ function ensureRuntimeEnvLoaded() {
17
15
  if (envLoaded) {
18
16
  return;
19
17
  }
20
- try {
21
- const dotenvModule = require("dotenv");
22
- const loadDotEnv = dotenvModule?.config;
23
- if (typeof loadDotEnv === "function") {
24
- loadDotEnv();
25
- }
26
- } catch {
27
- // dotenv is optional in base-shell; bundles can add it when needed.
18
+ if (existsSync(".env")) {
19
+ process.loadEnvFile(".env");
28
20
  }
29
21
  envLoaded = true;
30
22
  }
@@ -35,8 +35,6 @@ const { router, fallbackRoute } = createShellRouter({
35
35
  surfaceMode,
36
36
  notFoundComponent: NotFoundView,
37
37
  guard: {
38
- surfaceDefinitions: config.surfaceDefinitions,
39
- defaultSurfaceId: config.surfaceDefaultId,
40
38
  webRootAllowed: config.webRootAllowed
41
39
  }
42
40
  });
@@ -74,6 +74,10 @@ source files.
74
74
  `.gitignore` when copying it to an app. Managed preview identity belongs to the
75
75
  authentication surface pattern, not the shell foundation.
76
76
 
77
+ The shell files are the `shell/application-shell` pattern's example from
78
+ `@jskit-ai/shell-web`, and the remaining files are the minimal foundation's,
79
+ byte for byte. Change those owners first and keep the copies identical.
80
+
77
81
  Read these together before adapting the shell:
78
82
 
79
83
  - `example/src/App.vue`
@@ -94,29 +98,16 @@ Do not preinstall capabilities solely because they appear in another app.
94
98
 
95
99
  ## Development warmup
96
100
 
97
- Keep development-server warmup limited to the selected application entry.
98
- Warming every page and component transforms and caches screens before they are
99
- visited, increasing startup work and memory as the application grows. Add a
100
- specific frequently used file only when a measured loading delay justifies it.
101
- Keep dependency optimization separate: reducing warmup does not require disabling
102
- the dependency scanner or JSKIT's installed-package optimization settings.
103
- The bootstrap plugin scans local client entries and their shared imports before
104
- page loading. Do not exclude local package roots from optimization: Vite already
105
- keeps their real paths as source, and exclusions hide their dependency imports.
106
- Keep the example's Vuetify component/directive includes because auto-imports are
107
- introduced after the initial scan.
101
+ Keep the development-server warmup, dependency optimization, and Vuetify
102
+ includes exactly as the
103
+ [minimal foundation](../minimal-foundation/PATTERN.md) describes in its
104
+ Development warmup section.
108
105
 
109
106
  ## Verification
110
107
 
111
- Keep the initial loading shell in `index.html`, with its critical inline styles
112
- and Reload link. It must not depend on JavaScript, external fonts, or framework
113
- components. Adapt its skeleton to the product without adding host branding.
114
- Vue replaces it on mount; the bootstrap failure handler retains an actionable
115
- error. A failed module download still leaves the static Reload link available.
116
- Preserve `tests/e2e/startup.spec.ts`: it holds JavaScript requests while proving
117
- visible loading feedback at three widths, then releases them and proves mounting.
118
- Run this check against the production build as part of the application's release
119
- verification, not only against Vite development mode.
108
+ Keep the initial loading shell in `index.html` and preserve
109
+ `tests/e2e/startup.spec.ts` as the minimal foundation's Verification section
110
+ describes, including its production-build check.
120
111
 
121
112
  Install the declared packages once, run `npm run develop` for the live
122
113
  application, then run lint, server tests, client tests, the production build,
@@ -12,6 +12,25 @@ Before implementation, read the narrow relevant source pattern completely. If
12
12
  its owner package is installed, prefer that version-matched package-owned copy.
13
13
  Do not install an unrelated runtime package only to read documentation.
14
14
 
15
+ Before adding or changing browser-test setup, read the browser verification
16
+ guide at
17
+ `https://mobily-enterprises.github.io/jskit-ai/guide/framework/ui-operations#browser-verification`.
18
+ Routine tests reuse the isolated schema and prepare fixtures once per suite
19
+ invocation. Keep `BROWSER_TEST_DB_NAME` distinct from disposable `TEST_DB_NAME`
20
+ and prove that disposable cleanup preserves browser migrations. Require
21
+ repeat-start regression proof; do not rebuild the database or production
22
+ frontend for each focused browser check.
23
+
24
+ Keep verification output small. Run the relevant cases together, save complete
25
+ stdout/stderr to local artifacts, and preserve the exit status. Report counts,
26
+ duration, failed case names and artifact paths; read only actionable failure
27
+ excerpts. Do not dump full JSON/TAP reports, passing assertions, request logs or
28
+ traces into agent context. Wait on the existing run instead of restarting it or
29
+ repeatedly printing unchanged output. Keep startup and cleanup errors visible.
30
+ For browser evidence, use existing automated cases, targeted locators and
31
+ meaningful visual checkpoints. Avoid a full DOM snapshot or screenshot after
32
+ every action; retain the required viewport, identity and security checks.
33
+
15
34
  Pages never start with a page header, title block, welcome heading, or other
16
35
  standalone heading copy. Start with the useful content and actions. If the user
17
36
  wants a heading, they will ask for or add one.
@@ -34,7 +34,7 @@
34
34
  "dependencies": {
35
35
  "@local/main": "0.1.0",
36
36
  "@fastify/static": "^10.1.3",
37
- "@jskit-ai/kernel": "0.1.245",
37
+ "@jskit-ai/kernel": "0.1.246",
38
38
  "@tanstack/vue-query": "^5.101.0",
39
39
  "fastify": "^5.8.5",
40
40
  "json-rest-schema": "^1.0.17",
@@ -42,15 +42,15 @@
42
42
  "vue": "^3.5.44",
43
43
  "vue-router": "^5.3.1",
44
44
  "vuetify": "^4.1.2",
45
- "@jskit-ai/http-runtime": "0.1.243",
45
+ "@jskit-ai/http-runtime": "0.1.244",
46
46
  "@mdi/js": "^7.4.47",
47
- "@jskit-ai/shell-web": "0.1.251",
47
+ "@jskit-ai/shell-web": "0.1.252",
48
48
  "@fastify/fast-json-stringify-compiler": "^5.1.0",
49
49
  "@vue/devtools-api": "^8.2.1"
50
50
  },
51
51
  "devDependencies": {
52
52
  "@jskit-ai/config-eslint": "0.1.241",
53
- "@jskit-ai/jskit-catalog": "0.1.295",
53
+ "@jskit-ai/jskit-catalog": "0.1.297",
54
54
  "@playwright/test": "1.61.1",
55
55
  "@vitejs/plugin-vue": "^6.0.7",
56
56
  "eslint": "^10.8.0",
@@ -9,7 +9,7 @@
9
9
  },
10
10
  "description": "App-local runtime composition and lightweight glue.",
11
11
  "dependencies": {
12
- "@jskit-ai/kernel": "0.1.245"
12
+ "@jskit-ai/kernel": "0.1.246"
13
13
  },
14
14
  "jskit": {
15
15
  "kind": "runtime",
@@ -1,8 +1,6 @@
1
- import { createRequire } from "node:module";
1
+ import { existsSync } from "node:fs";
2
2
  import { surfaceRuntime } from "./surfaceRuntime.js";
3
3
 
4
- const require = createRequire(import.meta.url);
5
-
6
4
  function toPort(value, fallback = 3000) {
7
5
  const parsed = Number.parseInt(String(value || "").trim(), 10);
8
6
  if (Number.isInteger(parsed) && parsed > 0) {
@@ -17,14 +15,8 @@ function ensureRuntimeEnvLoaded() {
17
15
  if (envLoaded) {
18
16
  return;
19
17
  }
20
- try {
21
- const dotenvModule = require("dotenv");
22
- const loadDotEnv = dotenvModule?.config;
23
- if (typeof loadDotEnv === "function") {
24
- loadDotEnv();
25
- }
26
- } catch {
27
- // dotenv is optional in base-shell; bundles can add it when needed.
18
+ if (existsSync(".env")) {
19
+ process.loadEnvFile(".env");
28
20
  }
29
21
  envLoaded = true;
30
22
  }
@@ -6,6 +6,7 @@ export default {
6
6
  name: "ShellLayout",
7
7
  inheritAttrs: false,
8
8
  setup(_, { attrs, slots }) {
9
+ // Keep drawerWidth, railWidth, navigationItemSpacing, and future shell props package-owned.
9
10
  return () => h(PackageShellLayout, attrs, slots);
10
11
  }
11
12
  };
@@ -35,8 +35,6 @@ const { router, fallbackRoute } = createShellRouter({
35
35
  surfaceMode,
36
36
  notFoundComponent: NotFoundView,
37
37
  guard: {
38
- surfaceDefinitions: config.surfaceDefinitions,
39
- defaultSurfaceId: config.surfaceDefaultId,
40
38
  webRootAllowed: config.webRootAllowed
41
39
  }
42
40
  });
@@ -23,7 +23,7 @@ import { RouterView } from "vue-router";
23
23
 
24
24
  <style scoped>
25
25
  .settings-shell {
26
- --settings-panel-padding: 1rem;
26
+ --settings-shell-panel-padding: 1rem;
27
27
  }
28
28
 
29
29
  .settings-shell__panel {
@@ -34,7 +34,7 @@ import { RouterView } from "vue-router";
34
34
  display: grid;
35
35
  gap: 1rem;
36
36
  grid-template-columns: minmax(12rem, 16rem) minmax(0, 1fr);
37
- padding: var(--settings-panel-padding);
37
+ padding: var(--settings-shell-panel-padding);
38
38
  }
39
39
 
40
40
  .settings-shell__content {