@jskit-ai/agent-docs 0.1.139 → 0.1.141

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.
@@ -72,6 +72,31 @@ The assistant validates the transformed result against
72
72
  JSON:API CRUD actions supply these assistant contracts and transformations
73
73
  automatically; their native action and HTTP result shapes do not change.
74
74
 
75
+ Generated list and view actions use JSON:API query shapes directly. `include`
76
+ is a comma-separated string, and `fields` is keyed by resource type:
77
+
78
+ ```json
79
+ {
80
+ "include": "pet",
81
+ "fields": {
82
+ "bookings": ["petId"],
83
+ "pets": ["name"]
84
+ },
85
+ "limit": 5
86
+ }
87
+ ```
88
+
89
+ Sparse primary fields remain sparse in the result. Requested included records
90
+ use the resource's lookup container and relationship name, for example
91
+ `items[0].lookups.pet.name`. Invalid array forms such as `include: ["pet"]` or
92
+ `fields: ["pet.name"]` are rejected with field-specific shape guidance. A
93
+ relationship name is not a fieldset key: for a `pet` relationship whose
94
+ JSON:API resource type is `pets`, use `fields: { "pets": ["name"] }`, not
95
+ `fields: { "pet": ["name"] }`. Generated contracts enumerate the allowed
96
+ resource-type keys and reject relationship aliases with the corresponding
97
+ resource type in the validation error.
98
+ Applications do not need an assistant discovery or CRUD transformation bridge.
99
+
75
100
  Up to 32 authorized actions remain direct tools. For a larger authorized
76
101
  catalog, the runtime automatically exposes compact paged action search, exact
77
102
  one-action contract lookup, and contract-gated execution tools. Search returns
@@ -79,6 +104,20 @@ at most 20 compact matches and never includes schemas. Tool arguments and
79
104
  results are byte-bounded; an oversized result returns a controlled error so it
80
105
  cannot overflow assistant transcript storage.
81
106
 
107
+ ## Height and scrolling
108
+
109
+ `AssistantSurfaceClientElement` owns its bounded responsive layout. Below the
110
+ medium breakpoint the sidebar column is absent and the compact conversation
111
+ control remains available; at medium and expanded widths the non-wrapping 8/4
112
+ chat and sidebar layout is visible. Long conversations scroll inside the
113
+ message panel while the composer remains in view.
114
+
115
+ Do not deep-override `.assistant-layout`, `.assistant-main-col`, or
116
+ `.assistant-side-col`. A normal page can mount the public element directly. If
117
+ the product deliberately embeds it in a shorter flex pane, that app-owned pane
118
+ must have a definite height and `min-height: 0` so its child is allowed to
119
+ shrink.
120
+
82
121
  ## Verification
83
122
 
84
123
  Run migrations, load assistant and settings pages through normal navigation,
@@ -53,8 +53,12 @@ generic CRUD merely to make the structure look uniform.
53
53
  Use the installed JSKIT pattern index and package metadata to select the
54
54
  smallest complete package set. Plan the top-level dependencies and their
55
55
  ordinary npm closure before changing the lockfile, then install that planned
56
- closure once. Review `package.json` and the lockfile as source changes. There
57
- is no framework synchronization step after npm installation.
56
+ closure once. Review `package.json` and the lockfile as source changes. Adopt
57
+ the supported package-graph scripts and run `npm run jskit:update` before
58
+ changing application source; see the **Upgrade JSKIT** guide in the agent docs.
59
+ The updater aligns root and workspace declarations to one published release
60
+ cohort, installs once at the project root, and verifies the resulting lockfile.
61
+ It does not regenerate or synchronize application source.
58
62
 
59
63
  Model product domains through `defineFeature()` when they own a real capability
60
64
  or operation boundary. A Feature declares stable named `requires`, optional
@@ -78,10 +82,12 @@ still have callers and tests.
78
82
 
79
83
  Audit application `AGENTS.md` files, ordinary documentation, npm scripts, CI,
80
84
  and package metadata as well as executable source. There is no supported
81
- `jskit doctor` command or general JSKIT authoring CLI. Replace stale
82
- instructions to run them with current-state checks owned by runtime startup,
83
- the client build, migration status and disposable rebuilds, the application's
84
- normal verification script, and Playwright.
85
+ `jskit doctor` command or general JSKIT source-authoring CLI. The supported
86
+ `jskit update` and `jskit check` commands own only the installed package graph;
87
+ they do not author, regenerate, or certify application source. Replace stale
88
+ doctor or authoring instructions with current-state checks owned by runtime
89
+ startup, the client build, migration status and disposable rebuilds, the
90
+ application's normal verification script, and Playwright.
85
91
 
86
92
  ## 3. Choose the narrowest server seam that owns each behavior
87
93
 
@@ -46,9 +46,11 @@ database product may need a local auth provider, auth UI, users, and one
46
46
  database runtime. A public single-user tool may need none of those.
47
47
 
48
48
  Inspect package details and patterns before modifying the package graph. Apply
49
- one coherent dependency plan, then run `npm install` once. Environment values
50
- come from the selected technology contract. They are not product questions and
51
- must not be copied into committed source.
49
+ one coherent dependency plan, then run `npm install` once and `npm run
50
+ jskit:check`. Use `npm run jskit:update` for later coordinated framework
51
+ upgrades; see [Upgrade JSKIT](/guide/app-setup/upgrading-jskit). Environment
52
+ values come from the selected technology contract. They are not product
53
+ questions and must not be copied into committed source.
52
54
 
53
55
  ## Build the first product operation
54
56
 
@@ -0,0 +1,110 @@
1
+ <!-- Generated by `npm run agent-docs:build` from `packages/agent-docs/site/guide/app-setup/upgrading-jskit.md`. Do not edit manually. -->
2
+
3
+ ---
4
+ title: Upgrade JSKIT
5
+ description: Keep root and workspace package declarations on one published JSKIT release cohort and enforce it in CI.
6
+ ---
7
+
8
+ # Upgrade JSKIT
9
+
10
+ JSKIT packages are released as one coordinated catalog. Upgrade the whole
11
+ declared graph together; do not update an assistant, shell, web runtime, or
12
+ workspace package in isolation.
13
+
14
+ ## Add the supported project commands
15
+
16
+ Current application foundations already contain these entries. For an older
17
+ application, add the catalog and scripts at the project root:
18
+
19
+ ```json
20
+ {
21
+ "scripts": {
22
+ "jskit:update": "npx --yes @jskit-ai/jskit-catalog@latest update",
23
+ "jskit:check": "jskit check"
24
+ },
25
+ "devDependencies": {
26
+ "@jskit-ai/jskit-catalog": "<current exact version>"
27
+ }
28
+ }
29
+ ```
30
+
31
+ If a legacy application still declares the retired authoring CLI, remove it
32
+ first:
33
+
34
+ ```bash
35
+ npm uninstall --save-dev @jskit-ai/jskit-cli
36
+ ```
37
+
38
+ Then install the catalog once and let the updater select its exact coordinated
39
+ version:
40
+
41
+ ```bash
42
+ npm install --save-dev --save-exact @jskit-ai/jskit-catalog@latest
43
+ npm run jskit:update
44
+ ```
45
+
46
+ The updater rejects unknown JSKIT packages and private JSKIT overrides during
47
+ preflight, before changing any manifest.
48
+
49
+ `jskit:update` reads the latest published catalog, discovers the root manifest
50
+ and npm workspaces, and preflights every declared `@jskit-ai/*` package. It then
51
+ updates all matching dependency, development-dependency, peer-dependency, and
52
+ optional-dependency declarations as one validated manifest set. Non-JSKIT
53
+ dependencies are unchanged. It installs once from the root and checks the new
54
+ `package-lock.json` before succeeding.
55
+
56
+ If writing one manifest fails, the updater restores any manifests already
57
+ replaced. If `npm install` fails because of registry access or a real peer
58
+ conflict, the aligned manifests remain visible for repair; resolve the reported
59
+ problem and rerun `npm run jskit:update`.
60
+
61
+ ## Enforce the graph in CI
62
+
63
+ Run this after `npm ci`, and include it in the application's normal verifier:
64
+
65
+ ```bash
66
+ npm run jskit:check
67
+ ```
68
+
69
+ For example:
70
+
71
+ ```json
72
+ {
73
+ "scripts": {
74
+ "verify": "npm run jskit:check && npm run lint && npm test && npm run build"
75
+ }
76
+ }
77
+ ```
78
+
79
+ The check fails when:
80
+
81
+ - a root or workspace JSKIT declaration differs from the installed coordinated
82
+ catalog;
83
+ - resolved JSKIT packages use stale, unknown, or multiple release versions;
84
+ - a shared singleton client package has a private nested installation;
85
+ - a JSKIT override tries to force a private graph;
86
+ - a declared package has no lockfile installation, or the lockfile is missing.
87
+
88
+ Shared client owners such as the kernel, HTTP runtime, shell, auth web runtime,
89
+ realtime runtime, and assistant runtime use exact peer dependencies where they
90
+ must share application state. A partial upgrade can therefore fail during npm
91
+ installation instead of silently nesting a second client stack.
92
+
93
+ ## Application migration
94
+
95
+ The updater changes package manifests and the lockfile only. It does not
96
+ regenerate routes, resources, pages, migrations, or application-owned source.
97
+ Review the diff, run the normal database migration command if the selected
98
+ release contains database migrations, then run the full application verifier.
99
+
100
+ For the native assistant action and responsive layout fixes, updating the
101
+ packages and lockfile is sufficient. No application regeneration or database
102
+ migration is required. Remove temporary app-local action discovery/execution
103
+ bridges, JSON:API result transformers, `patch-package` patches, and deep
104
+ `.assistant-*` layout overrides that duplicated those framework owners. Keep
105
+ the public assistant surface id and normal page composition unchanged.
106
+
107
+ Commit `package.json`, every changed workspace manifest, and
108
+ `package-lock.json` together. Do not hand-edit one JSKIT version after the
109
+ updater succeeds; select a different published cohort only through a catalog
110
+ that advertises it.
@@ -10,6 +10,7 @@ apply or adapt. It does not prescribe an agent host or project orchestrator.
10
10
 
11
11
  - [Quickstart](/guide/app-setup/quickstart)
12
12
  - [Application foundations](/guide/app-setup/initial-scaffolding)
13
+ - [Upgrade JSKIT](/guide/app-setup/upgrading-jskit)
13
14
  - [Migrate an existing application](/guide/app-setup/existing-application-migration)
14
15
  - [A more interesting shell](/guide/app-setup/a-more-interesting-shell)
15
16
  - [Authentication](/guide/app-setup/authentication)
@@ -31,6 +32,7 @@ capabilities selected by the product. For implementation, the installed JSKIT
31
32
  skill routes the agent to package-owned `PATTERN.md` files and the smallest
32
33
  relevant public API reference.
33
34
 
34
- There are no generator or CLI chapters. Their useful source examples are
35
- package-owned patterns; their questionnaire, mutation, and provenance machinery
36
- is not part of JSKIT.
35
+ There are no source-generator chapters. Package-owned patterns replace their
36
+ useful source examples; questionnaire, mutation, and provenance machinery is
37
+ not part of JSKIT. The supported `jskit update` and `jskit check` commands own
38
+ only dependency manifests and lockfile conformance.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jskit-ai/agent-docs",
3
- "version": "0.1.139",
3
+ "version": "0.1.141",
4
4
  "description": "Distributed JSKIT agent references, prompts, guides, and generated reference maps.",
5
5
  "type": "module",
6
6
  "files": [
@@ -5,7 +5,7 @@
5
5
  "private": true,
6
6
  "type": "module",
7
7
  "dependencies": {
8
- "@jskit-ai/kernel": "0.1.167",
8
+ "@jskit-ai/kernel": "0.1.169",
9
9
  "json-rest-schema": "^1.0.17"
10
10
  },
11
11
  "exports": {
@@ -24,12 +24,14 @@
24
24
  "test": "node --test",
25
25
  "test:client": "vitest run tests/client",
26
26
  "test:e2e": "playwright test tests/e2e",
27
- "verify": "npm run lint && npm run test && npm run test:client && npm run build"
27
+ "jskit:update": "npx --yes @jskit-ai/jskit-catalog@latest update",
28
+ "jskit:check": "jskit check",
29
+ "verify": "npm run jskit:check && npm run lint && npm run test && npm run test:client && npm run build"
28
30
  },
29
31
  "dependencies": {
30
32
  "@local/main": "file:packages/main",
31
33
  "@fastify/static": "^10.1.3",
32
- "@jskit-ai/kernel": "0.1.167",
34
+ "@jskit-ai/kernel": "0.1.169",
33
35
  "@tanstack/vue-query": "^5.101.0",
34
36
  "fastify": "^5.8.5",
35
37
  "json-rest-schema": "^1.0.17",
@@ -37,11 +39,12 @@
37
39
  "vue": "^3.5.38",
38
40
  "vue-router": "^5.1.0",
39
41
  "vuetify": "^4.1.2",
40
- "@jskit-ai/http-runtime": "0.1.165"
42
+ "@jskit-ai/http-runtime": "0.1.167"
41
43
  },
42
44
  "devDependencies": {
43
- "@jskit-ai/agent-docs": "0.1.139",
44
- "@jskit-ai/config-eslint": "0.1.164",
45
+ "@jskit-ai/agent-docs": "0.1.141",
46
+ "@jskit-ai/config-eslint": "0.1.166",
47
+ "@jskit-ai/jskit-catalog": "0.1.194",
45
48
  "@playwright/test": "1.61.1",
46
49
  "@vitejs/plugin-vue": "^6.0.7",
47
50
  "eslint": "^10.8.0",
@@ -24,12 +24,14 @@
24
24
  "test": "node --test",
25
25
  "test:client": "vitest run tests/client",
26
26
  "test:e2e": "playwright test tests/e2e",
27
- "verify": "npm run lint && npm run test && npm run test:client && npm run build"
27
+ "jskit:update": "npx --yes @jskit-ai/jskit-catalog@latest update",
28
+ "jskit:check": "jskit check",
29
+ "verify": "npm run jskit:check && npm run lint && npm run test && npm run test:client && npm run build"
28
30
  },
29
31
  "dependencies": {
30
32
  "@local/main": "file:packages/main",
31
33
  "@fastify/static": "^10.1.3",
32
- "@jskit-ai/kernel": "0.1.167",
34
+ "@jskit-ai/kernel": "0.1.169",
33
35
  "@tanstack/vue-query": "^5.101.0",
34
36
  "fastify": "^5.8.5",
35
37
  "json-rest-schema": "^1.0.17",
@@ -37,13 +39,14 @@
37
39
  "vue": "^3.5.38",
38
40
  "vue-router": "^5.1.0",
39
41
  "vuetify": "^4.1.2",
40
- "@jskit-ai/http-runtime": "0.1.165",
42
+ "@jskit-ai/http-runtime": "0.1.167",
41
43
  "@mdi/js": "^7.4.47",
42
- "@jskit-ai/shell-web": "0.1.171"
44
+ "@jskit-ai/shell-web": "0.1.173"
43
45
  },
44
46
  "devDependencies": {
45
- "@jskit-ai/agent-docs": "0.1.139",
46
- "@jskit-ai/config-eslint": "0.1.164",
47
+ "@jskit-ai/agent-docs": "0.1.141",
48
+ "@jskit-ai/config-eslint": "0.1.166",
49
+ "@jskit-ai/jskit-catalog": "0.1.194",
47
50
  "@playwright/test": "1.61.1",
48
51
  "@vitejs/plugin-vue": "^6.0.7",
49
52
  "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.167"
12
+ "@jskit-ai/kernel": "0.1.169"
13
13
  },
14
14
  "jskit": {
15
15
  "kind": "runtime",
@@ -321,6 +321,7 @@ Exports
321
321
  Local functions
322
322
  - `requireJsonRestSchemaInstance(schemaDefinition = null, { context = "schema definition.schema" } = {})`
323
323
  - `resolveJsonRestSchemaFieldMessages(schemaDefinition = null, fieldName = "")`
324
+ - `resolveJsonRestSchemaParentFieldMessages(schemaDefinition = null, fieldName = "")`
324
325
  - `resolveJsonRestSchemaFieldErrorMessage(fieldName, entry, schemaDefinition = null)`
325
326
 
326
327
  ### `validators/mergeObjectSchemas.js`
@@ -15,7 +15,7 @@ A concrete Fastify, Vue, and JSKIT application foundation for products that do n
15
15
 
16
16
  - Id: `app/minimal-foundation`
17
17
  - Keywords: `app`, `fastify`, `foundation`, `minimal`, `server`, `vite`, `vue`
18
- - Owner: `@jskit-ai/agent-docs@0.1.139`
18
+ - Owner: `@jskit-ai/agent-docs@0.1.141`
19
19
  - Read: `node_modules/@jskit-ai/agent-docs/patterns/minimal-foundation/PATTERN.md`
20
20
  - Examples: `node_modules/@jskit-ai/agent-docs/patterns/minimal-foundation/example/`
21
21
  - Requires: `@jskit-ai/http-runtime`, `@jskit-ai/kernel`
@@ -26,7 +26,7 @@ A concrete JSKIT web application foundation with responsive shell navigation, se
26
26
 
27
27
  - Id: `app/shell-foundation`
28
28
  - Keywords: `app`, `foundation`, `material`, `navigation`, `placements`, `shell`, `vite`, `vue`
29
- - Owner: `@jskit-ai/agent-docs@0.1.139`
29
+ - Owner: `@jskit-ai/agent-docs@0.1.141`
30
30
  - Read: `node_modules/@jskit-ai/agent-docs/patterns/shell-foundation/PATTERN.md`
31
31
  - Examples: `node_modules/@jskit-ai/agent-docs/patterns/shell-foundation/example/`
32
32
  - Requires: `@jskit-ai/http-runtime`, `@jskit-ai/kernel`, `@jskit-ai/shell-web`
@@ -37,7 +37,7 @@ Configure an assistant runtime for one application surface and expose its chat a
37
37
 
38
38
  - Id: `assistant/assistant-surface`
39
39
  - Keywords: `ai`, `assistant`, `chat`, `config`, `environment`, `page`, `placement`, `settings`, `surface`
40
- - Owner: `@jskit-ai/assistant-runtime@0.1.138`
40
+ - Owner: `@jskit-ai/assistant-runtime@0.1.140`
41
41
  - Read: `node_modules/@jskit-ai/assistant-runtime/patterns/assistant-surface/PATTERN.md`
42
42
  - Examples: `node_modules/@jskit-ai/assistant-runtime/patterns/assistant-surface/example/`
43
43
  - Requires: `@jskit-ai/assistant-runtime`, `@jskit-ai/shell-web`
@@ -48,7 +48,7 @@ Compose JSKIT authentication routes, views, profile controls, and public surface
48
48
 
49
49
  - Id: `auth/auth-surface`
50
50
  - Keywords: `account`, `auth`, `login`, `logout`, `password`, `placement`, `profile`, `reset`, `surface`
51
- - Owner: `@jskit-ai/auth-web@0.1.167`
51
+ - Owner: `@jskit-ai/auth-web@0.1.169`
52
52
  - Read: `node_modules/@jskit-ai/auth-web/patterns/auth-surface/PATTERN.md`
53
53
  - Examples: `node_modules/@jskit-ai/auth-web/patterns/auth-surface/example/`
54
54
  - Requires: `@jskit-ai/auth-core`, `@jskit-ai/auth-web`, `@jskit-ai/shell-web`
@@ -59,7 +59,7 @@ Add Supabase authentication through normal npm composition, explicit environment
59
59
 
60
60
  - Id: `auth/supabase-auth`
61
61
  - Keywords: `auth`, `authentication`, `oauth`, `sessions`, `supabase`
62
- - Owner: `@jskit-ai/auth-provider-supabase-core@0.1.164`
62
+ - Owner: `@jskit-ai/auth-provider-supabase-core@0.1.166`
63
63
  - Read: `node_modules/@jskit-ai/auth-provider-supabase-core/patterns/supabase-auth/PATTERN.md`
64
64
  - Examples: `node_modules/@jskit-ai/auth-provider-supabase-core/patterns/supabase-auth/example/`
65
65
  - Requires: `@jskit-ai/auth-provider-supabase-core`
@@ -70,7 +70,7 @@ Add a protected administration surface, settings shell, and semantic navigation
70
70
 
71
71
  - Id: `console/console-surface`
72
72
  - Keywords: `admin`, `console`, `navigation`, `owner`, `placement`, `settings`, `surface`
73
- - Owner: `@jskit-ai/console-web@0.1.135`
73
+ - Owner: `@jskit-ai/console-web@0.1.137`
74
74
  - Read: `node_modules/@jskit-ai/console-web/patterns/console-surface/PATTERN.md`
75
75
  - Examples: `node_modules/@jskit-ai/console-web/patterns/console-surface/example/`
76
76
  - Requires: `@jskit-ai/console-core`, `@jskit-ai/console-web`, `@jskit-ai/shell-web`
@@ -81,7 +81,7 @@ Build a routed CRUD user interface as thin application pages over JSKIT's shared
81
81
 
82
82
  - Id: `crud/crud-screen-set`
83
83
  - Keywords: `actions`, `add`, `crud`, `delete`, `edit`, `filters`, `list`, `material`, `routes`, `view`, `vue`
84
- - Owner: `@jskit-ai/http-web@0.1.12`
84
+ - Owner: `@jskit-ai/http-web@0.1.14`
85
85
  - Read: `node_modules/@jskit-ai/http-web/patterns/crud-screen-set/PATTERN.md`
86
86
  - Examples: `node_modules/@jskit-ai/http-web/patterns/crud-screen-set/example/`
87
87
  - Requires: `@jskit-ai/http-web`, `@jskit-ai/resource-crud-core`
@@ -92,7 +92,7 @@ Build a complete application-owned CRUD server package from a migration, resourc
92
92
 
93
93
  - Id: `crud/json-api-resource-package`
94
94
  - Keywords: `actions`, `crud`, `database`, `json-api`, `migration`, `permissions`, `provider`, `repository`, `routes`, `service`
95
- - Owner: `@jskit-ai/crud-core@0.1.178`
95
+ - Owner: `@jskit-ai/crud-core@0.1.180`
96
96
  - Read: `node_modules/@jskit-ai/crud-core/patterns/json-api-resource-package/PATTERN.md`
97
97
  - Examples: `node_modules/@jskit-ai/crud-core/patterns/json-api-resource-package/example/`
98
98
  - Requires: `@jskit-ai/crud-core`, `@jskit-ai/resource-crud-core`
@@ -103,7 +103,7 @@ Define an authenticated application resource whose records belong to the current
103
103
 
104
104
  - Id: `crud/resource-contract`
105
105
  - Keywords: `authenticated`, `crud`, `database`, `owner-scoped`, `resource`, `user`
106
- - Owner: `@jskit-ai/resource-crud-core@0.1.109`
106
+ - Owner: `@jskit-ai/resource-crud-core@0.1.111`
107
107
  - Read: `node_modules/@jskit-ai/resource-crud-core/patterns/resource-contract/PATTERN.md`
108
108
  - Examples: `node_modules/@jskit-ai/resource-crud-core/patterns/resource-contract/example/`
109
109
  - Requires: `@jskit-ai/resource-crud-core`
@@ -114,7 +114,7 @@ Configure a JSKIT application for MySQL with a fixed driver, ordinary environmen
114
114
 
115
115
  - Id: `database/mysql-application`
116
116
  - Keywords: `database`, `knex`, `mariadb`, `migrations`, `mysql`, `mysql2`
117
- - Owner: `@jskit-ai/database-runtime-mysql@0.1.165`
117
+ - Owner: `@jskit-ai/database-runtime-mysql@0.1.167`
118
118
  - Read: `node_modules/@jskit-ai/database-runtime-mysql/patterns/mysql-application/PATTERN.md`
119
119
  - Examples: `node_modules/@jskit-ai/database-runtime-mysql/patterns/mysql-application/example/`
120
120
  - Requires: `@jskit-ai/database-runtime-mysql`
@@ -125,7 +125,7 @@ Configure a JSKIT application for PostgreSQL with a fixed driver, ordinary envir
125
125
 
126
126
  - Id: `database/postgres-application`
127
127
  - Keywords: `database`, `knex`, `migrations`, `pg`, `postgres`, `postgresql`
128
- - Owner: `@jskit-ai/database-runtime-postgres@0.1.164`
128
+ - Owner: `@jskit-ai/database-runtime-postgres@0.1.166`
129
129
  - Read: `node_modules/@jskit-ai/database-runtime-postgres/patterns/postgres-application/PATTERN.md`
130
130
  - Examples: `node_modules/@jskit-ai/database-runtime-postgres/patterns/postgres-application/example/`
131
131
  - Requires: `@jskit-ai/database-runtime-postgres`
@@ -136,7 +136,7 @@ Wrap a JSKIT web application in a Capacitor Android shell using native Capacitor
136
136
 
137
137
  - Id: `mobile/android-application`
138
138
  - Keywords: `android`, `capacitor`, `device`, `mobile`, `native`, `shell`, `webview`
139
- - Owner: `@jskit-ai/mobile-capacitor@0.1.102`
139
+ - Owner: `@jskit-ai/mobile-capacitor@0.1.104`
140
140
  - Read: `node_modules/@jskit-ai/mobile-capacitor/patterns/android-application/PATTERN.md`
141
141
  - Examples: `node_modules/@jskit-ai/mobile-capacitor/patterns/android-application/example/`
142
142
  - Requires: `@capacitor/android`, `@capacitor/app`, `@capacitor/cli`, `@jskit-ai/mobile-capacitor`
@@ -147,7 +147,7 @@ Add JSKIT realtime events with an optional Redis backplane and an explicit shell
147
147
 
148
148
  - Id: `realtime/realtime-application`
149
149
  - Keywords: `realtime`, `redis`, `socket.io`, `sockets`, `status`, `websocket`
150
- - Owner: `@jskit-ai/realtime@0.1.164`
150
+ - Owner: `@jskit-ai/realtime@0.1.166`
151
151
  - Read: `node_modules/@jskit-ai/realtime/patterns/realtime-application/PATTERN.md`
152
152
  - Examples: `node_modules/@jskit-ai/realtime/patterns/realtime-application/example/`
153
153
  - Requires: `@jskit-ai/realtime`, `@jskit-ai/shell-web`
@@ -158,7 +158,7 @@ Define a server feature through explicit capabilities and first-class actions, a
158
158
 
159
159
  - Id: `server/feature-package`
160
160
  - Keywords: `actions`, `feature`, `json-rest`, `knex`, `orchestration`, `package`, `provider`, `repository`, `routes`, `server`
161
- - Owner: `@jskit-ai/agent-docs@0.1.139`
161
+ - Owner: `@jskit-ai/agent-docs@0.1.141`
162
162
  - Read: `node_modules/@jskit-ai/agent-docs/patterns/feature-package/PATTERN.md`
163
163
  - Examples: `node_modules/@jskit-ai/agent-docs/patterns/feature-package/example/`
164
164
  - Requires: `@jskit-ai/kernel`
@@ -169,7 +169,7 @@ Compose the JSKIT responsive shell, semantic placements, settings navigation, an
169
169
 
170
170
  - Id: `shell/application-shell`
171
171
  - Keywords: `adaptive`, `app`, `layout`, `navigation`, `placement`, `responsive`, `settings`, `shell`
172
- - Owner: `@jskit-ai/shell-web@0.1.171`
172
+ - Owner: `@jskit-ai/shell-web@0.1.173`
173
173
  - Read: `node_modules/@jskit-ai/shell-web/patterns/application-shell/PATTERN.md`
174
174
  - Examples: `node_modules/@jskit-ai/shell-web/patterns/application-shell/example/`
175
175
  - Requires: `@jskit-ai/kernel`, `@jskit-ai/shell-web`
@@ -180,7 +180,7 @@ Add product routes and shell extensions through file routing, semantic placement
180
180
 
181
181
  - Id: `ui/page-and-placement`
182
182
  - Keywords: `component`, `navigation`, `outlet`, `page`, `placement`, `routes`, `section`, `shell`, `subpages`, `vue`
183
- - Owner: `@jskit-ai/shell-web@0.1.171`
183
+ - Owner: `@jskit-ai/shell-web@0.1.173`
184
184
  - Read: `node_modules/@jskit-ai/shell-web/patterns/page-and-placement/PATTERN.md`
185
185
  - Examples: `node_modules/@jskit-ai/shell-web/patterns/page-and-placement/example/`
186
186
  - Requires: `@jskit-ai/kernel`, `@jskit-ai/shell-web`
@@ -191,7 +191,7 @@ Compose an account settings route and profile, preference, and notification sect
191
191
 
192
192
  - Id: `users/account-settings`
193
193
  - Keywords: `account`, `notifications`, `preferences`, `profile`, `settings`, `user`, `vue`
194
- - Owner: `@jskit-ai/users-web@0.1.185`
194
+ - Owner: `@jskit-ai/users-web@0.1.187`
195
195
  - Read: `node_modules/@jskit-ai/users-web/patterns/account-settings/PATTERN.md`
196
196
  - Examples: `node_modules/@jskit-ai/users-web/patterns/account-settings/example/`
197
197
  - Requires: `@jskit-ai/shell-web`, `@jskit-ai/users-core`, `@jskit-ai/users-web`
@@ -202,7 +202,7 @@ Expose user administration and workspace-scoped member operations through app-ow
202
202
 
203
203
  - Id: `users/user-administration-server`
204
204
  - Keywords: `account`, `admin`, `member`, `repository`, `resource`, `routes`, `service`, `user`, `workspace`
205
- - Owner: `@jskit-ai/users-core@0.1.180`
205
+ - Owner: `@jskit-ai/users-core@0.1.182`
206
206
  - Read: `node_modules/@jskit-ai/users-core/patterns/user-administration-server/PATTERN.md`
207
207
  - Examples: `node_modules/@jskit-ai/users-core/patterns/user-administration-server/example/`
208
208
  - Requires: `@jskit-ai/crud-core`, `@jskit-ai/users-core`
@@ -213,7 +213,7 @@ Configure roles, workspace access policy, invitations, and app-owned invitation
213
213
 
214
214
  - Id: `workspaces/workspace-server`
215
215
  - Keywords: `access`, `invite`, `membership`, `multitenancy`, `policy`, `role`, `tenancy`, `workspace`
216
- - Owner: `@jskit-ai/workspaces-core@0.1.145`
216
+ - Owner: `@jskit-ai/workspaces-core@0.1.147`
217
217
  - Read: `node_modules/@jskit-ai/workspaces-core/patterns/workspace-server/PATTERN.md`
218
218
  - Examples: `node_modules/@jskit-ai/workspaces-core/patterns/workspace-server/example/`
219
219
  - Requires: `@jskit-ai/users-core`, `@jskit-ai/workspaces-core`
@@ -224,7 +224,7 @@ Compose workspace selection, invitation, member administration, settings, and re
224
224
 
225
225
  - Id: `workspaces/workspace-surfaces`
226
226
  - Keywords: `admin`, `invite`, `member`, `navigation`, `settings`, `surface`, `switcher`, `workspace`
227
- - Owner: `@jskit-ai/workspaces-web@0.1.146`
227
+ - Owner: `@jskit-ai/workspaces-web@0.1.148`
228
228
  - Read: `node_modules/@jskit-ai/workspaces-web/patterns/workspace-surfaces/PATTERN.md`
229
229
  - Examples: `node_modules/@jskit-ai/workspaces-web/patterns/workspace-surfaces/example/`
230
230
  - Requires: `@jskit-ai/shell-web`, `@jskit-ai/workspaces-core`, `@jskit-ai/workspaces-web`
@@ -187,6 +187,7 @@ Local functions
187
187
  - `encodeDiscoveryCursor(offset, query)`
188
188
  - `decodeDiscoveryCursor(value, query)`
189
189
  - `truncateDescription(value, maxLength = 240)`
190
+ - `resolveValidationFailureMessage(error)`
190
191
  - `canInvokeMethod(permission, context)`
191
192
  - `normalizePermissionSpec(permission)`
192
193
  - `stripWorkspaceSlugFromSchema(schema, context = {})`
@@ -79,9 +79,12 @@ Exports
79
79
  Local functions
80
80
  - `isRecord(value)`
81
81
  - `normalizeOptionalCursor(value)`
82
- - `resolveDocumentNextCursor(document = {})`
83
82
  - `resolveAssistantResultValue(result)`
84
- - `transformCrudAssistantResult(operation, result, { input = {} } = {})`
83
+ - `createProjectionRecordSchema(recordSchema, { lookupContainerKey = "", relationshipEntries = [] } = {})`
84
+ - `createProjectionOutputDefinition(output, operation, relationshipEntries, lookupContainerKey)`
85
+ - `createCrudAssistantTransport(resource, operation, relationshipEntries, lookupContainerKey)`
86
+ - `transformCrudAssistantResult(operation, result, { input = {}, resource, relationshipEntries = [], lookupContainerKey = "" } = {})`
87
+ - `createCrudAssistantReadDescription({ fieldsetContract, lookupContainerKey = "", namespace = "", operation = "list" } = {})`
85
88
  - `createCrudAssistantExtension(resource, namespace, operation)`
86
89
  - `createActionInput(resource, operation, scopeInputValidator = null, listFilterQueryValidator = null, operationInputs = {})`
87
90
  - `omitInputKeys(input = {}, keys = [])`
@@ -106,6 +109,14 @@ Exports
106
109
  Local functions
107
110
  - `requireDocument(document = null)`
108
111
 
112
+ ### `src/server/jsonApiResourceContract.js`
113
+ Exports
114
+ - `resolveJsonApiFieldsetContract(resource = {})`
115
+ - `resolveJsonApiRelationshipEntries(definition = null)`
116
+ - `resolveSchemaFieldDefinitions(definition = null)`
117
+ Local functions
118
+ - `isRecord(value)`
119
+
109
120
  ### `src/server/listFilters.js`
110
121
  Exports
111
122
  - `CRUD_LIST_FILTER_INVALID_VALUES_REJECT`
@@ -142,14 +153,16 @@ Local functions
142
153
  ### `src/server/listQueryValidators.js`
143
154
  Exports
144
155
  - `createCrudCursorPaginationQueryValidator(list = {})`
156
+ - `createJsonApiFieldsetsQueryValidator({ resource = {} } = {})`
145
157
  - `listSearchQueryValidator`
146
158
  - `lookupIncludeQueryValidator`
147
159
  - `jsonApiFieldsetsQueryValidator`
148
160
  - `resolveCrudParentFilterKeys(resource = {})`
149
161
  - `createCrudParentFilterQueryValidator(resource = {})`
150
- - `createStandardCrudListQueryValidators({ resource = {}, listFilterQueryValidator = null, searchQueryValidator = listSearchQueryValidator, includeQueryValidator = lookupIncludeQueryValidator } = {})`
151
- - `createStandardCrudViewQueryValidators({ includeQueryValidator = lookupIncludeQueryValidator } = {})`
162
+ - `createStandardCrudListQueryValidators({ resource = {}, listFilterQueryValidator = null, searchQueryValidator = listSearchQueryValidator, includeQueryValidator = lookupIncludeQueryValidator, fieldsetsQueryValidator = jsonApiFieldsetsQueryValidator } = {})`
163
+ - `createStandardCrudViewQueryValidators({ includeQueryValidator = lookupIncludeQueryValidator, fieldsetsQueryValidator = jsonApiFieldsetsQueryValidator } = {})`
152
164
  Local functions
165
+ - `createJsonApiFieldsetValueDefinition({ allowedFields = [] } = {})`
153
166
  - `resolveCrudListUsesOrderedCursor(list = {})`
154
167
 
155
168
  ### `src/server/lookupHydration.js`
@@ -291,10 +304,9 @@ Local functions
291
304
  ### `src/server/routeContracts.js`
292
305
  Exports
293
306
  - `createCrudJsonApiRouteContracts({ resource = {}, routeParamsValidator = null, operations = ["list", "view", "create", "update", "delete"], operationInputs = {}, listSearchQueryValidator = defaultListSearchQueryValidator, lookupIncludeQueryValidator = defaultLookupIncludeQueryValidator, listFilterQueryValidator = null } = {})`
307
+ - `resolveJsonApiRelationshipEntries`
294
308
  Local functions
295
309
  - `isRecord(value)`
296
- - `resolveSchemaFieldDefinitions(definition = null)`
297
- - `resolveJsonApiRelationshipEntries(definition = null)`
298
310
  - `readOwnValue(source = {}, key = "")`
299
311
  - `resolveLookupContainer(record = {}, lookupContainerKey = "")`
300
312
  - `resolveRelationshipValueSource(record = {}, entry = {}, { lookupContainerKey = "", preferLookup = false } = {})`
@@ -185,6 +185,7 @@ Exports
185
185
  - `encodeJsonApiResourceQueryObject`
186
186
  - `decodeJsonApiResourceQueryObject`
187
187
  - `createJsonApiResourceQueryTransportSchema`
188
+ - `decodeJsonApiResourceResponse`
188
189
  - `JSON_API_ERROR_DOCUMENT_SCHEMA`
189
190
  - `createJsonApiResourceObjectTransportSchema`
190
191
  - `createJsonApiResourceRequestBodyTransportSchema`
@@ -441,6 +441,7 @@ Exports
441
441
  Local functions
442
442
  - `requireJsonRestSchemaInstance(schemaDefinition = null, { context = "schema definition.schema" } = {})`
443
443
  - `resolveJsonRestSchemaFieldMessages(schemaDefinition = null, fieldName = "")`
444
+ - `resolveJsonRestSchemaParentFieldMessages(schemaDefinition = null, fieldName = "")`
444
445
  - `resolveJsonRestSchemaFieldErrorMessage(fieldName, entry, schemaDefinition = null)`
445
446
 
446
447
  ### `shared/validators/mergeObjectSchemas.js`
@@ -22,10 +22,23 @@ Local functions
22
22
  - `toSortedUniqueStrings(values)`
23
23
  - `fileExists(absolutePath)`
24
24
  - `collectPackageRoots(packagesRoot)`
25
+ - `normalizeWorkspacePatterns(value)`
26
+ - `createWorkspaceSegmentPattern(segment = "")`
27
+ - `expandWorkspacePattern(repoRoot, workspacePattern = "")`
28
+ - `collectReleasePackageVersions(repoRoot)`
25
29
  - `readJson(absolutePath)`
26
30
  - `buildCatalog({ repoRoot, packagesRoot, outputPath })`
27
31
  - `main()`
28
32
 
33
+ ### `scripts/jskit.mjs`
34
+ Exports
35
+ - `isCliEntrypoint(argvPath = process.argv[1])`
36
+ - `main(argv = process.argv.slice(2))`
37
+ - `parseArgs(argv = [])`
38
+ - `usage()`
39
+ Local functions
40
+ - `readCatalog()`
41
+
29
42
  ### `scripts/pattern-assets.mjs`
30
43
  Exports
31
44
  - `PATTERN_DOCUMENT_NAME`
@@ -44,6 +57,33 @@ Local functions
44
57
  - `directoryExists(directoryPath)`
45
58
  - `collectFiles(rootDirectory)`
46
59
 
60
+ ### `scripts/project-packages.mjs`
61
+ Exports
62
+ - `CATALOG_PACKAGE_ID`
63
+ - `CHECK_SCRIPT`
64
+ - `DEPENDENCY_FIELDS`
65
+ - `UPDATE_SCRIPT`
66
+ - `checkProject({ projectRoot = process.cwd(), catalog } = {})`
67
+ - `collectLockInstallations(packageLock = {})`
68
+ - `discoverProjectManifests(projectRoot)`
69
+ - `normalizeCatalog(catalog = {})`
70
+ - `updateProject({ projectRoot = process.cwd(), catalog, install = true, installProject = runNpmInstall } = {})`
71
+ Local functions
72
+ - `toPosixPath(value = "")`
73
+ - `normalizeWorkspacePatterns(value)`
74
+ - `globToRegExp(pattern = "")`
75
+ - `createWorkspaceMatcher(workspaces)`
76
+ - `fileExists(absolutePath)`
77
+ - `readJsonRecord(absolutePath)`
78
+ - `collectNestedPackageJsonPaths(directory, results = [])`
79
+ - `serializePackageJson(value, originalContents = "")`
80
+ - `collectManifestDeclarations(manifests, projectRoot)`
81
+ - `collectLocalPackageNames(manifests)`
82
+ - `resolveLockPackageName(packagePath = "", record = {})`
83
+ - `collectJskitOverridePaths(value, currentPath = "overrides", results = [])`
84
+ - `writeManifestUpdates(updates = [])`
85
+ - `runNpmInstall(projectRoot)`
86
+
47
87
  ### `scripts/verify-packages.mjs`
48
88
  Exports
49
89
  - `main()`
@@ -51,6 +91,7 @@ Exports
51
91
  - `validateMigrations(packageRecord, migrationOwners)`
52
92
  - `validateProviderExport(value, label)`
53
93
  - `validateProviderList(packageRecord, side)`
94
+ - `validateSingletonPeerDependencies(packages)`
54
95
  Local functions
55
96
  - `fileExists(filePath)`
56
97
  - `discoverFrameworkPackages()`
@@ -53,8 +53,12 @@ generic CRUD merely to make the structure look uniform.
53
53
  Use the installed JSKIT pattern index and package metadata to select the
54
54
  smallest complete package set. Plan the top-level dependencies and their
55
55
  ordinary npm closure before changing the lockfile, then install that planned
56
- closure once. Review `package.json` and the lockfile as source changes. There
57
- is no framework synchronization step after npm installation.
56
+ closure once. Review `package.json` and the lockfile as source changes. Adopt
57
+ the supported package-graph scripts and run `npm run jskit:update` before
58
+ changing application source; see the **Upgrade JSKIT** guide in the agent docs.
59
+ The updater aligns root and workspace declarations to one published release
60
+ cohort, installs once at the project root, and verifies the resulting lockfile.
61
+ It does not regenerate or synchronize application source.
58
62
 
59
63
  Model product domains through `defineFeature()` when they own a real capability
60
64
  or operation boundary. A Feature declares stable named `requires`, optional
@@ -78,10 +82,12 @@ still have callers and tests.
78
82
 
79
83
  Audit application `AGENTS.md` files, ordinary documentation, npm scripts, CI,
80
84
  and package metadata as well as executable source. There is no supported
81
- `jskit doctor` command or general JSKIT authoring CLI. Replace stale
82
- instructions to run them with current-state checks owned by runtime startup,
83
- the client build, migration status and disposable rebuilds, the application's
84
- normal verification script, and Playwright.
85
+ `jskit doctor` command or general JSKIT source-authoring CLI. The supported
86
+ `jskit update` and `jskit check` commands own only the installed package graph;
87
+ they do not author, regenerate, or certify application source. Replace stale
88
+ doctor or authoring instructions with current-state checks owned by runtime
89
+ startup, the client build, migration status and disposable rebuilds, the
90
+ application's normal verification script, and Playwright.
85
91
 
86
92
  ## 3. Choose the narrowest server seam that owns each behavior
87
93
 
@@ -15,7 +15,7 @@ A concrete Fastify, Vue, and JSKIT application foundation for products that do n
15
15
 
16
16
  - Id: `app/minimal-foundation`
17
17
  - Keywords: `app`, `fastify`, `foundation`, `minimal`, `server`, `vite`, `vue`
18
- - Owner: `@jskit-ai/agent-docs@0.1.139`
18
+ - Owner: `@jskit-ai/agent-docs@0.1.141`
19
19
  - Read: `node_modules/@jskit-ai/agent-docs/patterns/minimal-foundation/PATTERN.md`
20
20
  - Examples: `node_modules/@jskit-ai/agent-docs/patterns/minimal-foundation/example/`
21
21
  - Requires: `@jskit-ai/http-runtime`, `@jskit-ai/kernel`
@@ -26,7 +26,7 @@ A concrete JSKIT web application foundation with responsive shell navigation, se
26
26
 
27
27
  - Id: `app/shell-foundation`
28
28
  - Keywords: `app`, `foundation`, `material`, `navigation`, `placements`, `shell`, `vite`, `vue`
29
- - Owner: `@jskit-ai/agent-docs@0.1.139`
29
+ - Owner: `@jskit-ai/agent-docs@0.1.141`
30
30
  - Read: `node_modules/@jskit-ai/agent-docs/patterns/shell-foundation/PATTERN.md`
31
31
  - Examples: `node_modules/@jskit-ai/agent-docs/patterns/shell-foundation/example/`
32
32
  - Requires: `@jskit-ai/http-runtime`, `@jskit-ai/kernel`, `@jskit-ai/shell-web`
@@ -37,7 +37,7 @@ Configure an assistant runtime for one application surface and expose its chat a
37
37
 
38
38
  - Id: `assistant/assistant-surface`
39
39
  - Keywords: `ai`, `assistant`, `chat`, `config`, `environment`, `page`, `placement`, `settings`, `surface`
40
- - Owner: `@jskit-ai/assistant-runtime@0.1.138`
40
+ - Owner: `@jskit-ai/assistant-runtime@0.1.140`
41
41
  - Read: `node_modules/@jskit-ai/assistant-runtime/patterns/assistant-surface/PATTERN.md`
42
42
  - Examples: `node_modules/@jskit-ai/assistant-runtime/patterns/assistant-surface/example/`
43
43
  - Requires: `@jskit-ai/assistant-runtime`, `@jskit-ai/shell-web`
@@ -48,7 +48,7 @@ Compose JSKIT authentication routes, views, profile controls, and public surface
48
48
 
49
49
  - Id: `auth/auth-surface`
50
50
  - Keywords: `account`, `auth`, `login`, `logout`, `password`, `placement`, `profile`, `reset`, `surface`
51
- - Owner: `@jskit-ai/auth-web@0.1.167`
51
+ - Owner: `@jskit-ai/auth-web@0.1.169`
52
52
  - Read: `node_modules/@jskit-ai/auth-web/patterns/auth-surface/PATTERN.md`
53
53
  - Examples: `node_modules/@jskit-ai/auth-web/patterns/auth-surface/example/`
54
54
  - Requires: `@jskit-ai/auth-core`, `@jskit-ai/auth-web`, `@jskit-ai/shell-web`
@@ -59,7 +59,7 @@ Add Supabase authentication through normal npm composition, explicit environment
59
59
 
60
60
  - Id: `auth/supabase-auth`
61
61
  - Keywords: `auth`, `authentication`, `oauth`, `sessions`, `supabase`
62
- - Owner: `@jskit-ai/auth-provider-supabase-core@0.1.164`
62
+ - Owner: `@jskit-ai/auth-provider-supabase-core@0.1.166`
63
63
  - Read: `node_modules/@jskit-ai/auth-provider-supabase-core/patterns/supabase-auth/PATTERN.md`
64
64
  - Examples: `node_modules/@jskit-ai/auth-provider-supabase-core/patterns/supabase-auth/example/`
65
65
  - Requires: `@jskit-ai/auth-provider-supabase-core`
@@ -70,7 +70,7 @@ Add a protected administration surface, settings shell, and semantic navigation
70
70
 
71
71
  - Id: `console/console-surface`
72
72
  - Keywords: `admin`, `console`, `navigation`, `owner`, `placement`, `settings`, `surface`
73
- - Owner: `@jskit-ai/console-web@0.1.135`
73
+ - Owner: `@jskit-ai/console-web@0.1.137`
74
74
  - Read: `node_modules/@jskit-ai/console-web/patterns/console-surface/PATTERN.md`
75
75
  - Examples: `node_modules/@jskit-ai/console-web/patterns/console-surface/example/`
76
76
  - Requires: `@jskit-ai/console-core`, `@jskit-ai/console-web`, `@jskit-ai/shell-web`
@@ -81,7 +81,7 @@ Build a routed CRUD user interface as thin application pages over JSKIT's shared
81
81
 
82
82
  - Id: `crud/crud-screen-set`
83
83
  - Keywords: `actions`, `add`, `crud`, `delete`, `edit`, `filters`, `list`, `material`, `routes`, `view`, `vue`
84
- - Owner: `@jskit-ai/http-web@0.1.12`
84
+ - Owner: `@jskit-ai/http-web@0.1.14`
85
85
  - Read: `node_modules/@jskit-ai/http-web/patterns/crud-screen-set/PATTERN.md`
86
86
  - Examples: `node_modules/@jskit-ai/http-web/patterns/crud-screen-set/example/`
87
87
  - Requires: `@jskit-ai/http-web`, `@jskit-ai/resource-crud-core`
@@ -92,7 +92,7 @@ Build a complete application-owned CRUD server package from a migration, resourc
92
92
 
93
93
  - Id: `crud/json-api-resource-package`
94
94
  - Keywords: `actions`, `crud`, `database`, `json-api`, `migration`, `permissions`, `provider`, `repository`, `routes`, `service`
95
- - Owner: `@jskit-ai/crud-core@0.1.178`
95
+ - Owner: `@jskit-ai/crud-core@0.1.180`
96
96
  - Read: `node_modules/@jskit-ai/crud-core/patterns/json-api-resource-package/PATTERN.md`
97
97
  - Examples: `node_modules/@jskit-ai/crud-core/patterns/json-api-resource-package/example/`
98
98
  - Requires: `@jskit-ai/crud-core`, `@jskit-ai/resource-crud-core`
@@ -103,7 +103,7 @@ Define an authenticated application resource whose records belong to the current
103
103
 
104
104
  - Id: `crud/resource-contract`
105
105
  - Keywords: `authenticated`, `crud`, `database`, `owner-scoped`, `resource`, `user`
106
- - Owner: `@jskit-ai/resource-crud-core@0.1.109`
106
+ - Owner: `@jskit-ai/resource-crud-core@0.1.111`
107
107
  - Read: `node_modules/@jskit-ai/resource-crud-core/patterns/resource-contract/PATTERN.md`
108
108
  - Examples: `node_modules/@jskit-ai/resource-crud-core/patterns/resource-contract/example/`
109
109
  - Requires: `@jskit-ai/resource-crud-core`
@@ -114,7 +114,7 @@ Configure a JSKIT application for MySQL with a fixed driver, ordinary environmen
114
114
 
115
115
  - Id: `database/mysql-application`
116
116
  - Keywords: `database`, `knex`, `mariadb`, `migrations`, `mysql`, `mysql2`
117
- - Owner: `@jskit-ai/database-runtime-mysql@0.1.165`
117
+ - Owner: `@jskit-ai/database-runtime-mysql@0.1.167`
118
118
  - Read: `node_modules/@jskit-ai/database-runtime-mysql/patterns/mysql-application/PATTERN.md`
119
119
  - Examples: `node_modules/@jskit-ai/database-runtime-mysql/patterns/mysql-application/example/`
120
120
  - Requires: `@jskit-ai/database-runtime-mysql`
@@ -125,7 +125,7 @@ Configure a JSKIT application for PostgreSQL with a fixed driver, ordinary envir
125
125
 
126
126
  - Id: `database/postgres-application`
127
127
  - Keywords: `database`, `knex`, `migrations`, `pg`, `postgres`, `postgresql`
128
- - Owner: `@jskit-ai/database-runtime-postgres@0.1.164`
128
+ - Owner: `@jskit-ai/database-runtime-postgres@0.1.166`
129
129
  - Read: `node_modules/@jskit-ai/database-runtime-postgres/patterns/postgres-application/PATTERN.md`
130
130
  - Examples: `node_modules/@jskit-ai/database-runtime-postgres/patterns/postgres-application/example/`
131
131
  - Requires: `@jskit-ai/database-runtime-postgres`
@@ -136,7 +136,7 @@ Wrap a JSKIT web application in a Capacitor Android shell using native Capacitor
136
136
 
137
137
  - Id: `mobile/android-application`
138
138
  - Keywords: `android`, `capacitor`, `device`, `mobile`, `native`, `shell`, `webview`
139
- - Owner: `@jskit-ai/mobile-capacitor@0.1.102`
139
+ - Owner: `@jskit-ai/mobile-capacitor@0.1.104`
140
140
  - Read: `node_modules/@jskit-ai/mobile-capacitor/patterns/android-application/PATTERN.md`
141
141
  - Examples: `node_modules/@jskit-ai/mobile-capacitor/patterns/android-application/example/`
142
142
  - Requires: `@capacitor/android`, `@capacitor/app`, `@capacitor/cli`, `@jskit-ai/mobile-capacitor`
@@ -147,7 +147,7 @@ Add JSKIT realtime events with an optional Redis backplane and an explicit shell
147
147
 
148
148
  - Id: `realtime/realtime-application`
149
149
  - Keywords: `realtime`, `redis`, `socket.io`, `sockets`, `status`, `websocket`
150
- - Owner: `@jskit-ai/realtime@0.1.164`
150
+ - Owner: `@jskit-ai/realtime@0.1.166`
151
151
  - Read: `node_modules/@jskit-ai/realtime/patterns/realtime-application/PATTERN.md`
152
152
  - Examples: `node_modules/@jskit-ai/realtime/patterns/realtime-application/example/`
153
153
  - Requires: `@jskit-ai/realtime`, `@jskit-ai/shell-web`
@@ -158,7 +158,7 @@ Define a server feature through explicit capabilities and first-class actions, a
158
158
 
159
159
  - Id: `server/feature-package`
160
160
  - Keywords: `actions`, `feature`, `json-rest`, `knex`, `orchestration`, `package`, `provider`, `repository`, `routes`, `server`
161
- - Owner: `@jskit-ai/agent-docs@0.1.139`
161
+ - Owner: `@jskit-ai/agent-docs@0.1.141`
162
162
  - Read: `node_modules/@jskit-ai/agent-docs/patterns/feature-package/PATTERN.md`
163
163
  - Examples: `node_modules/@jskit-ai/agent-docs/patterns/feature-package/example/`
164
164
  - Requires: `@jskit-ai/kernel`
@@ -169,7 +169,7 @@ Compose the JSKIT responsive shell, semantic placements, settings navigation, an
169
169
 
170
170
  - Id: `shell/application-shell`
171
171
  - Keywords: `adaptive`, `app`, `layout`, `navigation`, `placement`, `responsive`, `settings`, `shell`
172
- - Owner: `@jskit-ai/shell-web@0.1.171`
172
+ - Owner: `@jskit-ai/shell-web@0.1.173`
173
173
  - Read: `node_modules/@jskit-ai/shell-web/patterns/application-shell/PATTERN.md`
174
174
  - Examples: `node_modules/@jskit-ai/shell-web/patterns/application-shell/example/`
175
175
  - Requires: `@jskit-ai/kernel`, `@jskit-ai/shell-web`
@@ -180,7 +180,7 @@ Add product routes and shell extensions through file routing, semantic placement
180
180
 
181
181
  - Id: `ui/page-and-placement`
182
182
  - Keywords: `component`, `navigation`, `outlet`, `page`, `placement`, `routes`, `section`, `shell`, `subpages`, `vue`
183
- - Owner: `@jskit-ai/shell-web@0.1.171`
183
+ - Owner: `@jskit-ai/shell-web@0.1.173`
184
184
  - Read: `node_modules/@jskit-ai/shell-web/patterns/page-and-placement/PATTERN.md`
185
185
  - Examples: `node_modules/@jskit-ai/shell-web/patterns/page-and-placement/example/`
186
186
  - Requires: `@jskit-ai/kernel`, `@jskit-ai/shell-web`
@@ -191,7 +191,7 @@ Compose an account settings route and profile, preference, and notification sect
191
191
 
192
192
  - Id: `users/account-settings`
193
193
  - Keywords: `account`, `notifications`, `preferences`, `profile`, `settings`, `user`, `vue`
194
- - Owner: `@jskit-ai/users-web@0.1.185`
194
+ - Owner: `@jskit-ai/users-web@0.1.187`
195
195
  - Read: `node_modules/@jskit-ai/users-web/patterns/account-settings/PATTERN.md`
196
196
  - Examples: `node_modules/@jskit-ai/users-web/patterns/account-settings/example/`
197
197
  - Requires: `@jskit-ai/shell-web`, `@jskit-ai/users-core`, `@jskit-ai/users-web`
@@ -202,7 +202,7 @@ Expose user administration and workspace-scoped member operations through app-ow
202
202
 
203
203
  - Id: `users/user-administration-server`
204
204
  - Keywords: `account`, `admin`, `member`, `repository`, `resource`, `routes`, `service`, `user`, `workspace`
205
- - Owner: `@jskit-ai/users-core@0.1.180`
205
+ - Owner: `@jskit-ai/users-core@0.1.182`
206
206
  - Read: `node_modules/@jskit-ai/users-core/patterns/user-administration-server/PATTERN.md`
207
207
  - Examples: `node_modules/@jskit-ai/users-core/patterns/user-administration-server/example/`
208
208
  - Requires: `@jskit-ai/crud-core`, `@jskit-ai/users-core`
@@ -213,7 +213,7 @@ Configure roles, workspace access policy, invitations, and app-owned invitation
213
213
 
214
214
  - Id: `workspaces/workspace-server`
215
215
  - Keywords: `access`, `invite`, `membership`, `multitenancy`, `policy`, `role`, `tenancy`, `workspace`
216
- - Owner: `@jskit-ai/workspaces-core@0.1.145`
216
+ - Owner: `@jskit-ai/workspaces-core@0.1.147`
217
217
  - Read: `node_modules/@jskit-ai/workspaces-core/patterns/workspace-server/PATTERN.md`
218
218
  - Examples: `node_modules/@jskit-ai/workspaces-core/patterns/workspace-server/example/`
219
219
  - Requires: `@jskit-ai/users-core`, `@jskit-ai/workspaces-core`
@@ -224,7 +224,7 @@ Compose workspace selection, invitation, member administration, settings, and re
224
224
 
225
225
  - Id: `workspaces/workspace-surfaces`
226
226
  - Keywords: `admin`, `invite`, `member`, `navigation`, `settings`, `surface`, `switcher`, `workspace`
227
- - Owner: `@jskit-ai/workspaces-web@0.1.146`
227
+ - Owner: `@jskit-ai/workspaces-web@0.1.148`
228
228
  - Read: `node_modules/@jskit-ai/workspaces-web/patterns/workspace-surfaces/PATTERN.md`
229
229
  - Examples: `node_modules/@jskit-ai/workspaces-web/patterns/workspace-surfaces/example/`
230
230
  - Requires: `@jskit-ai/shell-web`, `@jskit-ai/workspaces-core`, `@jskit-ai/workspaces-web`