@jskit-ai/agent-docs 0.1.149 → 0.1.151

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 (240) hide show
  1. package/guide/agent/app-setup/existing-application-migration.md +8 -6
  2. package/guide/agent/app-setup/initial-scaffolding.md +9 -7
  3. package/guide/agent/app-setup/quickstart.md +9 -6
  4. package/guide/agent/framework/application-operations.md +91 -0
  5. package/guide/agent/framework/crud-operations.md +83 -0
  6. package/guide/agent/framework/material-3.md +113 -0
  7. package/guide/agent/framework/ui-operations.md +79 -0
  8. package/guide/agent/index.md +13 -3
  9. package/package.json +1 -1
  10. package/patterns/feature-package/example/booking-engine/package.json +1 -1
  11. package/patterns/minimal-foundation/PATTERN.md +2 -0
  12. package/patterns/minimal-foundation/example/AGENTS.md +12 -8
  13. package/patterns/minimal-foundation/example/Procfile +0 -1
  14. package/patterns/minimal-foundation/example/package.json +4 -5
  15. package/patterns/minimal-foundation/example/src/pages/home/index.vue +0 -27
  16. package/patterns/minimal-foundation/example/tests/e2e/base-shell.spec.ts +1 -1
  17. package/patterns/page-scaffolding.md +5 -3
  18. package/patterns/shell-foundation/PATTERN.md +2 -0
  19. package/patterns/shell-foundation/example/AGENTS.md +12 -8
  20. package/patterns/shell-foundation/example/Procfile +0 -1
  21. package/patterns/shell-foundation/example/package.json +5 -6
  22. package/patterns/shell-foundation/example/packages/main/package.json +1 -1
  23. package/patterns/shell-foundation/example/src/pages/home/index.vue +5 -31
  24. package/patterns/shell-foundation/example/src/pages/home/settings/general/index.vue +3 -6
  25. package/patterns/shell-foundation/example/src/pages/home/settings.vue +0 -19
  26. package/patterns/shell-foundation/example/tests/e2e/base-shell.spec.ts +1 -1
  27. package/patterns/ui-contract.md +2 -0
  28. package/patterns/ui-testing.md +1 -1
  29. package/reference/autogen/PATTERN_INDEX.md +61 -61
  30. package/skills/jskit/SKILL.md +8 -5
  31. package/skills/jskit/references/app-operations.md +12 -11
  32. package/skills/jskit/references/crud-operations.md +10 -6
  33. package/skills/jskit/references/existing-application-migration.md +9 -12
  34. package/skills/jskit/references/material-3.md +5 -2
  35. package/skills/jskit/references/pattern-index.md +61 -61
  36. package/skills/jskit/references/patterns/app/minimal-foundation/PATTERN.md +107 -0
  37. package/skills/jskit/references/patterns/app/minimal-foundation/example/.nvmrc +1 -0
  38. package/skills/jskit/references/patterns/app/minimal-foundation/example/AGENTS.md +21 -0
  39. package/skills/jskit/references/patterns/app/minimal-foundation/example/Procfile +1 -0
  40. package/skills/jskit/references/patterns/app/minimal-foundation/example/app.json +14 -0
  41. package/skills/jskit/references/patterns/app/minimal-foundation/example/bin/develop.js +71 -0
  42. package/skills/jskit/references/patterns/app/minimal-foundation/example/bin/server.js +8 -0
  43. package/skills/jskit/references/patterns/app/minimal-foundation/example/config/public.js +40 -0
  44. package/skills/jskit/references/patterns/app/minimal-foundation/example/config/server.js +1 -0
  45. package/skills/jskit/references/patterns/app/minimal-foundation/example/config/surfaceAccessPolicies.js +3 -0
  46. package/skills/jskit/references/patterns/app/minimal-foundation/example/eslint.config.mjs +19 -0
  47. package/skills/jskit/references/patterns/app/minimal-foundation/example/favicon.svg +7 -0
  48. package/skills/jskit/references/patterns/app/minimal-foundation/example/gitignore +9 -0
  49. package/skills/jskit/references/patterns/app/minimal-foundation/example/index.html +13 -0
  50. package/skills/jskit/references/patterns/app/minimal-foundation/example/jsconfig.json +8 -0
  51. package/skills/jskit/references/patterns/app/minimal-foundation/example/package.json +62 -0
  52. package/skills/jskit/references/patterns/app/minimal-foundation/example/packages/main/package.json +42 -0
  53. package/skills/jskit/references/patterns/app/minimal-foundation/example/packages/main/src/shared/index.js +10 -0
  54. package/skills/jskit/references/patterns/app/minimal-foundation/example/packages/main/src/shared/schemas/index.js +22 -0
  55. package/skills/jskit/references/patterns/app/minimal-foundation/example/playwright.config.mjs +31 -0
  56. package/skills/jskit/references/patterns/app/minimal-foundation/example/server/lib/runtimeEnv.js +45 -0
  57. package/skills/jskit/references/patterns/app/minimal-foundation/example/server/lib/surfaceRuntime.js +10 -0
  58. package/skills/jskit/references/patterns/app/minimal-foundation/example/server.js +195 -0
  59. package/skills/jskit/references/patterns/app/minimal-foundation/example/src/App.vue +13 -0
  60. package/skills/jskit/references/patterns/app/minimal-foundation/example/src/main.js +85 -0
  61. package/skills/jskit/references/patterns/app/minimal-foundation/example/src/pages/home/index.vue +21 -0
  62. package/skills/jskit/references/patterns/app/minimal-foundation/example/src/pages/home.vue +13 -0
  63. package/skills/jskit/references/patterns/app/minimal-foundation/example/src/views/NotFound.vue +13 -0
  64. package/skills/jskit/references/patterns/app/minimal-foundation/example/tests/client/smoke.vitest.js +7 -0
  65. package/skills/jskit/references/patterns/app/minimal-foundation/example/tests/e2e/base-shell.spec.ts +23 -0
  66. package/skills/jskit/references/patterns/app/minimal-foundation/example/tests/server/smoke.test.js +16 -0
  67. package/skills/jskit/references/patterns/app/minimal-foundation/example/vite.config.mjs +80 -0
  68. package/skills/jskit/references/patterns/app/shell-foundation/PATTERN.md +113 -0
  69. package/skills/jskit/references/patterns/app/shell-foundation/example/.nvmrc +1 -0
  70. package/skills/jskit/references/patterns/app/shell-foundation/example/AGENTS.md +21 -0
  71. package/skills/jskit/references/patterns/app/shell-foundation/example/Procfile +1 -0
  72. package/skills/jskit/references/patterns/app/shell-foundation/example/app.json +14 -0
  73. package/skills/jskit/references/patterns/app/shell-foundation/example/bin/develop.js +71 -0
  74. package/skills/jskit/references/patterns/app/shell-foundation/example/bin/server.js +8 -0
  75. package/skills/jskit/references/patterns/app/shell-foundation/example/config/public.js +40 -0
  76. package/skills/jskit/references/patterns/app/shell-foundation/example/config/server.js +1 -0
  77. package/skills/jskit/references/patterns/app/shell-foundation/example/config/surfaceAccessPolicies.js +3 -0
  78. package/skills/jskit/references/patterns/app/shell-foundation/example/eslint.config.mjs +19 -0
  79. package/skills/jskit/references/patterns/app/shell-foundation/example/favicon.svg +7 -0
  80. package/skills/jskit/references/patterns/app/shell-foundation/example/gitignore +9 -0
  81. package/skills/jskit/references/patterns/app/shell-foundation/example/index.html +13 -0
  82. package/skills/jskit/references/patterns/app/shell-foundation/example/jsconfig.json +8 -0
  83. package/skills/jskit/references/patterns/app/shell-foundation/example/package.json +64 -0
  84. package/skills/jskit/references/patterns/app/shell-foundation/example/packages/main/package.json +56 -0
  85. package/skills/jskit/references/patterns/app/shell-foundation/example/packages/main/src/client/index.js +9 -0
  86. package/skills/jskit/references/patterns/app/shell-foundation/example/packages/main/src/client/providers/MainClientProvider.js +18 -0
  87. package/skills/jskit/references/patterns/app/shell-foundation/example/packages/main/src/shared/index.js +10 -0
  88. package/skills/jskit/references/patterns/app/shell-foundation/example/packages/main/src/shared/schemas/index.js +22 -0
  89. package/skills/jskit/references/patterns/app/shell-foundation/example/playwright.config.mjs +31 -0
  90. package/skills/jskit/references/patterns/app/shell-foundation/example/server/lib/runtimeEnv.js +45 -0
  91. package/skills/jskit/references/patterns/app/shell-foundation/example/server/lib/surfaceRuntime.js +10 -0
  92. package/skills/jskit/references/patterns/app/shell-foundation/example/server.js +195 -0
  93. package/skills/jskit/references/patterns/app/shell-foundation/example/src/App.vue +11 -0
  94. package/skills/jskit/references/patterns/app/shell-foundation/example/src/components/ShellLayout.vue +12 -0
  95. package/skills/jskit/references/patterns/app/shell-foundation/example/src/components/menus/MenuLinkItem.vue +30 -0
  96. package/skills/jskit/references/patterns/app/shell-foundation/example/src/components/menus/SurfaceAwareMenuLinkItem.vue +42 -0
  97. package/skills/jskit/references/patterns/app/shell-foundation/example/src/components/menus/TabLinkItem.vue +42 -0
  98. package/skills/jskit/references/patterns/app/shell-foundation/example/src/error.js +19 -0
  99. package/skills/jskit/references/patterns/app/shell-foundation/example/src/main.js +85 -0
  100. package/skills/jskit/references/patterns/app/shell-foundation/example/src/pages/home/index.vue +90 -0
  101. package/skills/jskit/references/patterns/app/shell-foundation/example/src/pages/home/settings/general/index.vue +37 -0
  102. package/skills/jskit/references/patterns/app/shell-foundation/example/src/pages/home/settings/index.vue +7 -0
  103. package/skills/jskit/references/patterns/app/shell-foundation/example/src/pages/home/settings.vue +90 -0
  104. package/skills/jskit/references/patterns/app/shell-foundation/example/src/pages/home.vue +20 -0
  105. package/skills/jskit/references/patterns/app/shell-foundation/example/src/placement.js +56 -0
  106. package/skills/jskit/references/patterns/app/shell-foundation/example/src/placementTopology.js +149 -0
  107. package/skills/jskit/references/patterns/app/shell-foundation/example/src/views/NotFound.vue +13 -0
  108. package/skills/jskit/references/patterns/app/shell-foundation/example/tests/client/smoke.vitest.js +7 -0
  109. package/skills/jskit/references/patterns/app/shell-foundation/example/tests/e2e/adaptive-shell.spec.ts +10 -0
  110. package/skills/jskit/references/patterns/app/shell-foundation/example/tests/e2e/base-shell.spec.ts +23 -0
  111. package/skills/jskit/references/patterns/app/shell-foundation/example/tests/server/smoke.test.js +16 -0
  112. package/skills/jskit/references/patterns/app/shell-foundation/example/vite.config.mjs +80 -0
  113. package/skills/jskit/references/patterns/assistant/assistant-surface/PATTERN.md +77 -0
  114. package/skills/jskit/references/patterns/assistant/assistant-surface/example/config/public.js +19 -0
  115. package/skills/jskit/references/patterns/assistant/assistant-surface/example/config/server.js +9 -0
  116. package/skills/jskit/references/patterns/assistant/assistant-surface/example/src/pages/admin/assistant/index.vue +7 -0
  117. package/skills/jskit/references/patterns/assistant/assistant-surface/example/src/pages/admin/settings/assistant/index.vue +7 -0
  118. package/skills/jskit/references/patterns/assistant/assistant-surface/example/src/placement.js +38 -0
  119. package/skills/jskit/references/patterns/auth/auth-surface/PATTERN.md +90 -0
  120. package/skills/jskit/references/patterns/auth/auth-surface/example/src/pages/auth/login.vue +17 -0
  121. package/skills/jskit/references/patterns/auth/auth-surface/example/src/pages/auth/reset-password.vue +17 -0
  122. package/skills/jskit/references/patterns/auth/auth-surface/example/src/pages/auth/signout.vue +17 -0
  123. package/skills/jskit/references/patterns/auth/auth-surface/example/src/runtime/authGuardRuntime.js +7 -0
  124. package/skills/jskit/references/patterns/auth/auth-surface/example/src/runtime/authHttpClient.js +1 -0
  125. package/skills/jskit/references/patterns/auth/auth-surface/example/src/runtime/useSignOut.js +1 -0
  126. package/skills/jskit/references/patterns/auth/auth-surface/example/src/views/auth/LoginView.vue +7 -0
  127. package/skills/jskit/references/patterns/auth/auth-surface/example/src/views/auth/ResetPasswordView.vue +7 -0
  128. package/skills/jskit/references/patterns/auth/auth-surface/example/src/views/auth/SignOutView.vue +7 -0
  129. package/skills/jskit/references/patterns/auth/auth-surface/example/tools/preview-identity +5 -0
  130. package/skills/jskit/references/patterns/auth/supabase-auth/PATTERN.md +67 -0
  131. package/skills/jskit/references/patterns/auth/supabase-auth/example/.env.example +4 -0
  132. package/skills/jskit/references/patterns/auth/supabase-auth/example/config/server.js +11 -0
  133. package/skills/jskit/references/patterns/auth/supabase-auth/example/package.json +7 -0
  134. package/skills/jskit/references/patterns/console/console-surface/PATTERN.md +59 -0
  135. package/skills/jskit/references/patterns/console/console-surface/example/src/pages/console/index.vue +43 -0
  136. package/skills/jskit/references/patterns/console/console-surface/example/src/pages/console/settings/index.vue +16 -0
  137. package/skills/jskit/references/patterns/console/console-surface/example/src/pages/console/settings.vue +81 -0
  138. package/skills/jskit/references/patterns/console/console-surface/example/src/pages/console.vue +20 -0
  139. package/skills/jskit/references/patterns/crud/crud-screen-set/PATTERN.md +89 -0
  140. package/skills/jskit/references/patterns/crud/crud-screen-set/example/books/BookEditPage.vue +52 -0
  141. package/skills/jskit/references/patterns/crud/crud-screen-set/example/books/BookFormFields.vue +52 -0
  142. package/skills/jskit/references/patterns/crud/crud-screen-set/example/books/BookListPage.vue +50 -0
  143. package/skills/jskit/references/patterns/crud/crud-screen-set/example/books/BookNewPage.vue +43 -0
  144. package/skills/jskit/references/patterns/crud/crud-screen-set/example/books/BookViewPage.vue +49 -0
  145. package/skills/jskit/references/patterns/crud/crud-screen-set/example/books/formFields.js +31 -0
  146. package/skills/jskit/references/patterns/crud/crud-screen-set/example/books/listExtensions.js +9 -0
  147. package/skills/jskit/references/patterns/crud/json-api-resource-package/PATTERN.md +160 -0
  148. package/skills/jskit/references/patterns/crud/json-api-resource-package/example/migrations/20260815000000_books.cjs +22 -0
  149. package/skills/jskit/references/patterns/crud/json-api-resource-package/example/packages/books/package.json +41 -0
  150. package/skills/jskit/references/patterns/crud/json-api-resource-package/example/packages/books/src/server/BooksFeature.js +13 -0
  151. package/skills/jskit/references/patterns/crud/json-api-resource-package/example/packages/books/src/shared/bookResource.js +83 -0
  152. package/skills/jskit/references/patterns/crud/json-api-resource-package/example/packages/books/src/shared/index.js +1 -0
  153. package/skills/jskit/references/patterns/crud/resource-contract/PATTERN.md +102 -0
  154. package/skills/jskit/references/patterns/crud/resource-contract/example/bookResource.js +87 -0
  155. package/skills/jskit/references/patterns/database/mysql-application/PATTERN.md +80 -0
  156. package/skills/jskit/references/patterns/database/mysql-application/example/.env.example +5 -0
  157. package/skills/jskit/references/patterns/database/mysql-application/example/.github/workflows/verify.yml +39 -0
  158. package/skills/jskit/references/patterns/database/mysql-application/example/knexfile.js +11 -0
  159. package/skills/jskit/references/patterns/database/mysql-application/example/package.json +13 -0
  160. package/skills/jskit/references/patterns/database/mysql-application/example/scripts/prepare-database.js +3 -0
  161. package/skills/jskit/references/patterns/database/postgres-application/PATTERN.md +80 -0
  162. package/skills/jskit/references/patterns/database/postgres-application/example/.env.example +5 -0
  163. package/skills/jskit/references/patterns/database/postgres-application/example/.github/workflows/verify.yml +38 -0
  164. package/skills/jskit/references/patterns/database/postgres-application/example/knexfile.js +11 -0
  165. package/skills/jskit/references/patterns/database/postgres-application/example/package.json +13 -0
  166. package/skills/jskit/references/patterns/database/postgres-application/example/scripts/prepare-database.js +3 -0
  167. package/skills/jskit/references/patterns/mobile/android-application/PATTERN.md +71 -0
  168. package/skills/jskit/references/patterns/mobile/android-application/example/capacitor.config.json +10 -0
  169. package/skills/jskit/references/patterns/realtime/realtime-application/PATTERN.md +69 -0
  170. package/skills/jskit/references/patterns/realtime/realtime-application/example/.env.example +1 -0
  171. package/skills/jskit/references/patterns/realtime/realtime-application/example/package.json +8 -0
  172. package/skills/jskit/references/patterns/realtime/realtime-application/example/src/placement.js +17 -0
  173. package/skills/jskit/references/patterns/server/feature-package/PATTERN.md +108 -0
  174. package/skills/jskit/references/patterns/server/feature-package/example/booking-engine/package.json +48 -0
  175. package/skills/jskit/references/patterns/server/feature-package/example/booking-engine/src/server/BookingEngineProvider.js +33 -0
  176. package/skills/jskit/references/patterns/server/feature-package/example/booking-engine/src/server/actions.js +26 -0
  177. package/skills/jskit/references/patterns/server/feature-package/example/booking-engine/src/server/inputSchemas.js +19 -0
  178. package/skills/jskit/references/patterns/server/feature-package/example/variations/AvailabilityEngineProvider.js +31 -0
  179. package/skills/jskit/references/patterns/server/feature-package/example/variations/InvoiceRollupProvider.js +36 -0
  180. package/skills/jskit/references/patterns/server/feature-package/example/variations/customKnexRepository.js +34 -0
  181. package/skills/jskit/references/patterns/server/feature-package/example/variations/orchestratorService.js +23 -0
  182. package/skills/jskit/references/patterns/shell/application-shell/PATTERN.md +67 -0
  183. package/skills/jskit/references/patterns/shell/application-shell/example/expected-existing/src/App.vue +13 -0
  184. package/skills/jskit/references/patterns/shell/application-shell/example/expected-existing/src/pages/home/index.vue +21 -0
  185. package/skills/jskit/references/patterns/shell/application-shell/example/expected-existing/src/pages/home.vue +13 -0
  186. package/skills/jskit/references/patterns/shell/application-shell/example/src/App.vue +11 -0
  187. package/skills/jskit/references/patterns/shell/application-shell/example/src/components/ShellLayout.vue +13 -0
  188. package/skills/jskit/references/patterns/shell/application-shell/example/src/components/menus/MenuLinkItem.vue +30 -0
  189. package/skills/jskit/references/patterns/shell/application-shell/example/src/components/menus/SurfaceAwareMenuLinkItem.vue +42 -0
  190. package/skills/jskit/references/patterns/shell/application-shell/example/src/components/menus/TabLinkItem.vue +42 -0
  191. package/skills/jskit/references/patterns/shell/application-shell/example/src/error.js +19 -0
  192. package/skills/jskit/references/patterns/shell/application-shell/example/src/pages/home/index.vue +80 -0
  193. package/skills/jskit/references/patterns/shell/application-shell/example/src/pages/home/settings/general/index.vue +37 -0
  194. package/skills/jskit/references/patterns/shell/application-shell/example/src/pages/home/settings/index.vue +7 -0
  195. package/skills/jskit/references/patterns/shell/application-shell/example/src/pages/home/settings.vue +90 -0
  196. package/skills/jskit/references/patterns/shell/application-shell/example/src/pages/home.vue +20 -0
  197. package/skills/jskit/references/patterns/shell/application-shell/example/src/placement.js +56 -0
  198. package/skills/jskit/references/patterns/shell/application-shell/example/src/placementTopology.js +149 -0
  199. package/skills/jskit/references/patterns/shell/application-shell/example/tests/e2e/adaptive-shell.spec.ts +10 -0
  200. package/skills/jskit/references/patterns/ui/page-and-placement/PATTERN.md +77 -0
  201. package/skills/jskit/references/patterns/ui/page-and-placement/example/packages/main/src/client/providers/MainClientProvider.js +14 -0
  202. package/skills/jskit/references/patterns/ui/page-and-placement/example/src/components/SyncStatusElement.vue +16 -0
  203. package/skills/jskit/references/patterns/ui/page-and-placement/example/src/pages/home/reports/activity.vue +7 -0
  204. package/skills/jskit/references/patterns/ui/page-and-placement/example/src/pages/home/reports/index.vue +7 -0
  205. package/skills/jskit/references/patterns/ui/page-and-placement/example/src/pages/home/reports/overview.vue +7 -0
  206. package/skills/jskit/references/patterns/ui/page-and-placement/example/src/pages/home/reports.vue +25 -0
  207. package/skills/jskit/references/patterns/ui/page-and-placement/example/src/placement.js +52 -0
  208. package/skills/jskit/references/patterns/ui/page-and-placement/example/src/placementTopology.js +29 -0
  209. package/skills/jskit/references/patterns/users/account-settings/PATTERN.md +63 -0
  210. package/skills/jskit/references/patterns/users/account-settings/example/src/components/account/settings/AccountSettingsNotificationsSection.vue +67 -0
  211. package/skills/jskit/references/patterns/users/account-settings/example/src/components/account/settings/AccountSettingsPreferencesSection.vue +137 -0
  212. package/skills/jskit/references/patterns/users/account-settings/example/src/components/account/settings/AccountSettingsProfileSection.vue +106 -0
  213. package/skills/jskit/references/patterns/users/account-settings/example/src/pages/account/index.vue +17 -0
  214. package/skills/jskit/references/patterns/users/user-administration-server/PATTERN.md +64 -0
  215. package/skills/jskit/references/patterns/users/user-administration-server/example/packages/users/package.json +42 -0
  216. package/skills/jskit/references/patterns/users/user-administration-server/example/packages/users/src/server/UsersFeature.js +13 -0
  217. package/skills/jskit/references/patterns/users/user-administration-server/example/packages/users/src/shared/index.js +1 -0
  218. package/skills/jskit/references/patterns/users/user-administration-server/example/packages/users/src/shared/userResource.js +69 -0
  219. package/skills/jskit/references/patterns/users/user-administration-server/example/packages/users-workspace/package.json +43 -0
  220. package/skills/jskit/references/patterns/users/user-administration-server/example/packages/users-workspace/src/server/UsersWorkspaceFeature.js +22 -0
  221. package/skills/jskit/references/patterns/users/user-administration-server/example/packages/users-workspace/src/shared/index.js +1 -0
  222. package/skills/jskit/references/patterns/users/user-administration-server/example/packages/users-workspace/src/shared/userResource.js +56 -0
  223. package/skills/jskit/references/patterns/workspaces/workspace-server/PATTERN.md +60 -0
  224. package/skills/jskit/references/patterns/workspaces/workspace-server/example/config/roles.js +27 -0
  225. package/skills/jskit/references/patterns/workspaces/workspace-server/example/packages/main/src/server/email/workspaceInviteEmail.js +23 -0
  226. package/skills/jskit/references/patterns/workspaces/workspace-surfaces/PATTERN.md +65 -0
  227. package/skills/jskit/references/patterns/workspaces/workspace-surfaces/example/packages/main/src/client/components/AccountPendingInvitesCue.vue +106 -0
  228. package/skills/jskit/references/patterns/workspaces/workspace-surfaces/example/packages/main/src/client/components/AccountSettingsInvitesSection.vue +7 -0
  229. package/skills/jskit/references/patterns/workspaces/workspace-surfaces/example/src/components/WorkspaceNotFoundCard.vue +42 -0
  230. package/skills/jskit/references/patterns/workspaces/workspace-surfaces/example/src/composables/useWorkspaceNotFoundState.js +41 -0
  231. package/skills/jskit/references/patterns/workspaces/workspace-surfaces/example/src/pages/admin/members/index.vue +7 -0
  232. package/skills/jskit/references/patterns/workspaces/workspace-surfaces/example/src/pages/admin/workspace/settings/index.vue +15 -0
  233. package/skills/jskit/references/patterns/workspaces/workspace-surfaces/example/src/pages/admin/workspace/settings.vue +81 -0
  234. package/skills/jskit/references/patterns/workspaces/workspace-surfaces/example/src/pages/invite/[token].vue +7 -0
  235. package/skills/jskit/references/patterns/workspaces/workspace-surfaces/example/src/surfaces/admin/index.vue +58 -0
  236. package/skills/jskit/references/patterns/workspaces/workspace-surfaces/example/src/surfaces/admin/root.vue +20 -0
  237. package/skills/jskit/references/patterns/workspaces/workspace-surfaces/example/src/surfaces/app/index.vue +31 -0
  238. package/skills/jskit/references/patterns/workspaces/workspace-surfaces/example/src/surfaces/app/root.vue +20 -0
  239. package/skills/jskit/references/ui-operations.md +7 -4
  240. package/templates/app/AGENTS.md +12 -8
@@ -0,0 +1,29 @@
1
+ const placements = [];
2
+
3
+ function addPlacementTopology(value = {}) {
4
+ placements.push(value);
5
+ }
6
+
7
+ addPlacementTopology({
8
+ id: "page.section-nav",
9
+ owner: "reports",
10
+ description: "Navigation between report pages.",
11
+ surfaces: ["home"],
12
+ variants: {
13
+ compact: {
14
+ outlet: "reports:section-nav",
15
+ renderers: { link: "local.main.ui.tab-link-item" }
16
+ },
17
+ medium: {
18
+ outlet: "reports:section-nav",
19
+ renderers: { link: "local.main.ui.tab-link-item" }
20
+ },
21
+ expanded: {
22
+ outlet: "reports:section-nav",
23
+ renderers: { link: "local.main.ui.tab-link-item" }
24
+ }
25
+ }
26
+ });
27
+
28
+ export { addPlacementTopology };
29
+ export default { placements };
@@ -0,0 +1,63 @@
1
+ ---
2
+ id: users/account-settings
3
+ title: Account settings surface
4
+ summary: Compose an account settings route and profile, preference, and notification sections from JSKIT user web components.
5
+ keywords: account, notifications, preferences, profile, settings, user, vue
6
+ requires: @jskit-ai/users-core, @jskit-ai/users-web, @jskit-ai/shell-web
7
+ ---
8
+
9
+ # Account settings surface
10
+
11
+ ## Use when
12
+
13
+ Use this pattern when authenticated users need to manage their own profile and
14
+ account preferences.
15
+
16
+ ## Do not use when
17
+
18
+ Do not use this pattern for administrator-managed users, authentication
19
+ credential storage, or anonymous profile editing.
20
+
21
+ ## Product decisions
22
+
23
+ Choose editable profile fields, preference vocabulary, notification options,
24
+ section order, and which account operations require reauthentication.
25
+
26
+ ## Framework APIs
27
+
28
+ Use account settings elements and composables from `@jskit-ai/users-web`,
29
+ ordinary `useCommand()` mutation behavior, and JSKIT shell placements.
30
+
31
+ ## Invariants
32
+
33
+ - Sections use JSKIT account settings APIs rather than direct HTTP helpers.
34
+ - Settings pages and sections do not add headers or standalone headings by
35
+ default.
36
+ - Cached resource data hydrates local writable fields immediately.
37
+ - Mutation errors use the standard toast and do not push the form down.
38
+ - Loading uses layout-stable skeletons, never an indeterminate spinner.
39
+ - Pending controls keep stable labels and prevent duplicate submission.
40
+ - The route and placement owner agree.
41
+
42
+ ## Example files
43
+
44
+ `example/` contains an account route and three concrete settings sections.
45
+ Adapt their fields and copy while retaining the shared account runtime.
46
+
47
+ ## Variation points
48
+
49
+ Change sections, fields, copy, order, permissions, preference choices, and
50
+ notification vocabulary while keeping server-owned validation authoritative.
51
+
52
+ ## Verification
53
+
54
+ Navigate away and back with warm cache, exercise browser back/forward, save and
55
+ clear fields, verify toast errors, inspect skeleton geometry, and test keyboard
56
+ operation at compact and expanded widths.
57
+
58
+ ## Avoid
59
+
60
+ - page-local request clients
61
+ - inline mutation alerts that shift content
62
+ - lazy non-immediate watchers for initial hydration
63
+ - copied user repositories or generator source markers
@@ -0,0 +1,67 @@
1
+ <script setup>
2
+ const props = defineProps({
3
+ runtime: {
4
+ type: Object,
5
+ required: true
6
+ }
7
+ });
8
+
9
+ const notifications = props.runtime.notifications;
10
+ </script>
11
+
12
+ <template>
13
+ <v-sheet rounded="lg" border class="account-settings-section">
14
+ <div class="account-settings-section__body">
15
+ <v-form @submit.prevent="notifications.submit" novalidate>
16
+ <v-switch
17
+ v-model="notifications.form.productUpdates"
18
+ label="Product updates"
19
+ color="primary"
20
+ hide-details
21
+ :disabled="notifications.isSaving.value || notifications.isRefreshing.value"
22
+ class="mb-2"
23
+ />
24
+ <v-switch
25
+ v-model="notifications.form.accountActivity"
26
+ label="Account activity alerts"
27
+ color="primary"
28
+ hide-details
29
+ :disabled="notifications.isSaving.value || notifications.isRefreshing.value"
30
+ class="mb-2"
31
+ />
32
+ <v-switch
33
+ v-model="notifications.form.securityAlerts"
34
+ label="Security alerts (required)"
35
+ color="primary"
36
+ hide-details
37
+ disabled
38
+ class="mb-4"
39
+ />
40
+ <v-btn
41
+ type="submit"
42
+ color="primary"
43
+ :loading="notifications.isSaving.value"
44
+ :disabled="notifications.isRefreshing.value"
45
+ >
46
+ Save notification settings
47
+ </v-btn>
48
+ </v-form>
49
+ </div>
50
+ </v-sheet>
51
+ </template>
52
+
53
+ <style scoped>
54
+ .account-settings-section {
55
+ overflow: hidden;
56
+ }
57
+
58
+ .account-settings-section__body {
59
+ padding: 1rem;
60
+ }
61
+
62
+ @media (max-width: 640px) {
63
+ .account-settings-section__body :deep(.v-btn) {
64
+ min-height: 48px;
65
+ }
66
+ }
67
+ </style>
@@ -0,0 +1,137 @@
1
+ <script setup>
2
+ const props = defineProps({
3
+ runtime: {
4
+ type: Object,
5
+ required: true
6
+ }
7
+ });
8
+
9
+ const preferences = props.runtime.preferences;
10
+ </script>
11
+
12
+ <template>
13
+ <v-sheet rounded="lg" border class="account-settings-section">
14
+ <div class="account-settings-section__body">
15
+ <v-form @submit.prevent="preferences.submit" novalidate>
16
+ <v-row>
17
+ <v-col cols="12" md="4">
18
+ <v-select
19
+ v-model="preferences.form.theme"
20
+ label="Theme"
21
+ :items="preferences.options.theme"
22
+ item-title="title"
23
+ item-value="value"
24
+ variant="outlined"
25
+ density="comfortable"
26
+ :disabled="preferences.isSaving.value || preferences.isRefreshing.value"
27
+ :error-messages="preferences.fieldErrors.theme ? [preferences.fieldErrors.theme] : []"
28
+ />
29
+ </v-col>
30
+
31
+ <v-col cols="12" md="4">
32
+ <v-select
33
+ v-model="preferences.form.locale"
34
+ label="Language / locale"
35
+ :items="preferences.options.locale"
36
+ item-title="title"
37
+ item-value="value"
38
+ variant="outlined"
39
+ density="comfortable"
40
+ :disabled="preferences.isSaving.value || preferences.isRefreshing.value"
41
+ :error-messages="preferences.fieldErrors.locale ? [preferences.fieldErrors.locale] : []"
42
+ />
43
+ </v-col>
44
+
45
+ <v-col cols="12" md="4">
46
+ <v-select
47
+ v-model="preferences.form.timeZone"
48
+ label="Time zone"
49
+ :items="preferences.options.timeZone"
50
+ variant="outlined"
51
+ density="comfortable"
52
+ :disabled="preferences.isSaving.value || preferences.isRefreshing.value"
53
+ :error-messages="preferences.fieldErrors.timeZone ? [preferences.fieldErrors.timeZone] : []"
54
+ />
55
+ </v-col>
56
+
57
+ <v-col cols="12" md="4">
58
+ <v-select
59
+ v-model="preferences.form.dateFormat"
60
+ label="Date format"
61
+ :items="preferences.options.dateFormat"
62
+ item-title="title"
63
+ item-value="value"
64
+ variant="outlined"
65
+ density="comfortable"
66
+ :disabled="preferences.isSaving.value || preferences.isRefreshing.value"
67
+ :error-messages="preferences.fieldErrors.dateFormat ? [preferences.fieldErrors.dateFormat] : []"
68
+ />
69
+ </v-col>
70
+
71
+ <v-col cols="12" md="4">
72
+ <v-select
73
+ v-model="preferences.form.numberFormat"
74
+ label="Number format"
75
+ :items="preferences.options.numberFormat"
76
+ item-title="title"
77
+ item-value="value"
78
+ variant="outlined"
79
+ density="comfortable"
80
+ :disabled="preferences.isSaving.value || preferences.isRefreshing.value"
81
+ :error-messages="preferences.fieldErrors.numberFormat ? [preferences.fieldErrors.numberFormat] : []"
82
+ />
83
+ </v-col>
84
+
85
+ <v-col cols="12" md="4">
86
+ <v-select
87
+ v-model="preferences.form.currencyCode"
88
+ label="Currency"
89
+ :items="preferences.options.currency"
90
+ variant="outlined"
91
+ density="comfortable"
92
+ :disabled="preferences.isSaving.value || preferences.isRefreshing.value"
93
+ :error-messages="preferences.fieldErrors.currencyCode ? [preferences.fieldErrors.currencyCode] : []"
94
+ />
95
+ </v-col>
96
+
97
+ <v-col cols="12" md="3">
98
+ <v-select
99
+ v-model.number="preferences.form.avatarSize"
100
+ label="Avatar size"
101
+ :items="preferences.options.avatarSize"
102
+ variant="outlined"
103
+ density="comfortable"
104
+ :disabled="preferences.isSaving.value || preferences.isRefreshing.value"
105
+ :error-messages="preferences.fieldErrors.avatarSize ? [preferences.fieldErrors.avatarSize] : []"
106
+ />
107
+ </v-col>
108
+ </v-row>
109
+
110
+ <v-btn
111
+ type="submit"
112
+ color="primary"
113
+ :loading="preferences.isSaving.value"
114
+ :disabled="preferences.isRefreshing.value"
115
+ >
116
+ Save preferences
117
+ </v-btn>
118
+ </v-form>
119
+ </div>
120
+ </v-sheet>
121
+ </template>
122
+
123
+ <style scoped>
124
+ .account-settings-section {
125
+ overflow: hidden;
126
+ }
127
+
128
+ .account-settings-section__body {
129
+ padding: 1rem;
130
+ }
131
+
132
+ @media (max-width: 640px) {
133
+ .account-settings-section__body :deep(.v-btn) {
134
+ min-height: 48px;
135
+ }
136
+ }
137
+ </style>
@@ -0,0 +1,106 @@
1
+ <script setup>
2
+ const props = defineProps({
3
+ runtime: {
4
+ type: Object,
5
+ required: true
6
+ }
7
+ });
8
+
9
+ const profile = props.runtime.profile;
10
+ </script>
11
+
12
+ <template>
13
+ <v-sheet rounded="lg" border class="account-settings-section">
14
+ <div class="account-settings-section__body">
15
+ <v-form @submit.prevent="profile.submit" novalidate>
16
+ <v-row class="mb-2">
17
+ <v-col cols="12" md="4" class="d-flex flex-column align-center justify-center">
18
+ <v-avatar :size="profile.avatar.size" color="surface-variant" rounded="circle" class="mb-3">
19
+ <v-img v-if="profile.avatar.effectiveUrl" :src="profile.avatar.effectiveUrl" cover />
20
+ <span v-else class="text-h6">{{ profile.initials.value }}</span>
21
+ </v-avatar>
22
+ <div class="text-caption text-medium-emphasis">Preview size: {{ profile.avatar.size }} px</div>
23
+ </v-col>
24
+
25
+ <v-col cols="12" md="8">
26
+ <div class="d-flex flex-wrap ga-2 mb-2">
27
+ <v-btn
28
+ variant="tonal"
29
+ color="secondary"
30
+ :disabled="profile.isSaving.value || profile.isDeletingAvatar.value || profile.isRefreshing.value"
31
+ @click="profile.openAvatarEditor"
32
+ >
33
+ Replace avatar
34
+ </v-btn>
35
+ <v-btn
36
+ v-if="profile.avatar.hasUploadedAvatar"
37
+ variant="text"
38
+ color="error"
39
+ :loading="profile.isDeletingAvatar.value"
40
+ :disabled="profile.isSaving.value || profile.isRefreshing.value"
41
+ @click="profile.removeAvatar"
42
+ >
43
+ Remove avatar
44
+ </v-btn>
45
+ </div>
46
+
47
+ <div v-if="profile.selectedAvatarFileName.value" class="text-caption text-medium-emphasis mb-2">
48
+ Selected file: {{ profile.selectedAvatarFileName.value }}
49
+ </div>
50
+ </v-col>
51
+ </v-row>
52
+
53
+ <v-row>
54
+ <v-col cols="12" md="6">
55
+ <v-text-field
56
+ v-model="profile.form.displayName"
57
+ label="Display name"
58
+ variant="outlined"
59
+ density="comfortable"
60
+ autocomplete="nickname"
61
+ :readonly="profile.isSaving.value || profile.isRefreshing.value"
62
+ :error-messages="profile.fieldErrors.displayName ? [profile.fieldErrors.displayName] : []"
63
+ />
64
+ </v-col>
65
+
66
+ <v-col cols="12" md="6">
67
+ <v-text-field
68
+ v-model="profile.form.email"
69
+ label="Email"
70
+ variant="outlined"
71
+ density="comfortable"
72
+ readonly
73
+ hint="Managed by your sign-in account"
74
+ persistent-hint
75
+ />
76
+ </v-col>
77
+ </v-row>
78
+
79
+ <v-btn
80
+ type="submit"
81
+ color="primary"
82
+ :loading="profile.isSaving.value"
83
+ :disabled="profile.isDeletingAvatar.value || profile.isRefreshing.value"
84
+ >
85
+ Save profile
86
+ </v-btn>
87
+ </v-form>
88
+ </div>
89
+ </v-sheet>
90
+ </template>
91
+
92
+ <style scoped>
93
+ .account-settings-section {
94
+ overflow: hidden;
95
+ }
96
+
97
+ .account-settings-section__body {
98
+ padding: 1rem;
99
+ }
100
+
101
+ @media (max-width: 640px) {
102
+ .account-settings-section__body :deep(.v-btn) {
103
+ min-height: 48px;
104
+ }
105
+ }
106
+ </style>
@@ -0,0 +1,17 @@
1
+ <route lang="json">
2
+ {
3
+ "meta": {
4
+ "guard": {
5
+ "policy": "authenticated"
6
+ }
7
+ }
8
+ }
9
+ </route>
10
+
11
+ <template>
12
+ <AccountSettingsClientElement />
13
+ </template>
14
+
15
+ <script setup>
16
+ import AccountSettingsClientElement from "@jskit-ai/users-web/client/components/AccountSettingsClientElement";
17
+ </script>
@@ -0,0 +1,64 @@
1
+ ---
2
+ id: users/user-administration-server
3
+ title: User administration server package
4
+ summary: Expose user administration and workspace-scoped member operations through app-owned packages backed by JSKIT users runtime APIs.
5
+ keywords: account, admin, member, repository, resource, routes, service, user, workspace
6
+ requires: @jskit-ai/users-core, @jskit-ai/crud-core
7
+ ---
8
+
9
+ # User administration server package
10
+
11
+ ## Use when
12
+
13
+ Use this pattern when an application needs app-specific administration of user
14
+ profiles or workspace members beyond the built-in account runtime.
15
+
16
+ ## Do not use when
17
+
18
+ Do not use this pattern for self-service account settings, authentication
19
+ credentials, or an application that needs no administrative user listing.
20
+
21
+ ## Product decisions
22
+
23
+ Choose global versus workspace scope, visible and editable fields, permission
24
+ policy, route surface, filters, and whether account deletion is part of the
25
+ product. Do not expose password/session data through the resource.
26
+
27
+ ## Framework APIs
28
+
29
+ Use `@jskit-ai/users-core` for profile persistence and policies,
30
+ `defineCrudJsonApiFeature()` from `@jskit-ai/crud-core` for standard mechanics,
31
+ and the resource contracts from `@jskit-ai/resource-crud-core`.
32
+
33
+ ## Invariants
34
+
35
+ - The public user id is the resource identity.
36
+ - Workspace operations are scoped before repository access.
37
+ - Permission checks happen before records or record existence are disclosed.
38
+ - Shared profile persistence remains owned by `@jskit-ai/users-core`.
39
+ - The resource is the field contract; the feature projects its repository,
40
+ service, actions, and routes without app-local ceremony.
41
+
42
+ ## Example files
43
+
44
+ `example/packages/users/` is a global administration package.
45
+ `example/packages/users-workspace/` demonstrates the workspace route/action
46
+ boundary while reusing the same service contract. Copy only the composition
47
+ that matches the product and adapt it as ordinary application source.
48
+
49
+ ## Variation points
50
+
51
+ Change scope, route surface, visible fields, filters, sorting, permission
52
+ policy, and user-facing language. Retain the core user identity contract.
53
+
54
+ ## Verification
55
+
56
+ Test authorized and forbidden list/view/update operations, cross-workspace
57
+ isolation, missing records, null/cleared fields, filtering, and pagination.
58
+
59
+ ## Avoid
60
+
61
+ - copying authentication credential tables into the user resource
62
+ - trusting route scope without repository scope
63
+ - adding app-local mechanics already provided by `defineCrudJsonApiFeature()`
64
+ - generator metadata or field questionnaires
@@ -0,0 +1,42 @@
1
+ {
2
+ "name": "@app/users",
3
+ "version": "0.0.0",
4
+ "description": "App-local read-only user administration feature.",
5
+ "private": true,
6
+ "type": "module",
7
+ "exports": {
8
+ "./server/UsersFeature": "./src/server/UsersFeature.js",
9
+ "./shared": "./src/shared/index.js"
10
+ },
11
+ "dependencies": {
12
+ "@jskit-ai/crud-core": "0.1.190",
13
+ "@jskit-ai/resource-crud-core": "0.1.121"
14
+ },
15
+ "jskit": {
16
+ "kind": "runtime",
17
+ "capabilities": {
18
+ "provides": [
19
+ "app.users"
20
+ ],
21
+ "requires": [
22
+ "runtime.http",
23
+ "runtime.json-rest-api",
24
+ "runtime.actions",
25
+ "runtime.database"
26
+ ]
27
+ },
28
+ "runtime": {
29
+ "server": {
30
+ "providers": [
31
+ {
32
+ "entrypoint": "src/server/UsersFeature.js",
33
+ "export": "UsersFeature"
34
+ }
35
+ ]
36
+ },
37
+ "client": {
38
+ "providers": []
39
+ }
40
+ }
41
+ }
42
+ }
@@ -0,0 +1,13 @@
1
+ import { defineCrudJsonApiFeature } from "@jskit-ai/crud-core/server/defineCrudJsonApiFeature";
2
+ import { resource } from "../shared/userResource.js";
3
+
4
+ const UsersFeature = defineCrudJsonApiFeature({
5
+ resource,
6
+ id: "app.users",
7
+ capability: "app.users",
8
+ surface: "home",
9
+ ownershipFilter: "public",
10
+ relativePath: "/users"
11
+ });
12
+
13
+ export { UsersFeature };
@@ -0,0 +1,69 @@
1
+ import { defineCrudResource } from "@jskit-ai/resource-crud-core/shared/crudResource";
2
+
3
+ const resource = defineCrudResource({
4
+ namespace: "users",
5
+ tableName: "users",
6
+ crudOperations: ["list", "view"],
7
+ schema: {
8
+ name: {
9
+ type: "string",
10
+ required: true,
11
+ minLength: 1,
12
+ maxLength: 160,
13
+ actualField: "display_name",
14
+ search: true,
15
+ operations: {
16
+ output: { required: false }
17
+ }
18
+ },
19
+ email: {
20
+ type: "string",
21
+ required: true,
22
+ search: true,
23
+ operations: {
24
+ output: { required: false }
25
+ }
26
+ },
27
+ username: {
28
+ type: "string",
29
+ required: true,
30
+ search: true,
31
+ operations: {
32
+ output: { required: false }
33
+ }
34
+ },
35
+ createdAt: {
36
+ type: "dateTime",
37
+ required: true,
38
+ storage: { writeSerializer: "datetime-utc" },
39
+ operations: {
40
+ output: { required: true }
41
+ }
42
+ },
43
+ updatedAt: {
44
+ type: "dateTime",
45
+ required: true,
46
+ storage: { writeSerializer: "datetime-utc" },
47
+ operations: {
48
+ output: { required: true }
49
+ }
50
+ }
51
+ },
52
+ searchSchema: {
53
+ id: {
54
+ type: "id",
55
+ actualField: "id"
56
+ },
57
+ q: {
58
+ type: "string",
59
+ oneOf: ["name", "email", "username"],
60
+ filterOperator: "like",
61
+ splitBy: " ",
62
+ matchAll: true
63
+ }
64
+ },
65
+ defaultSort: ["name", "email"],
66
+ autofilter: "public"
67
+ });
68
+
69
+ export { resource };
@@ -0,0 +1,43 @@
1
+ {
2
+ "name": "@app/users-workspace",
3
+ "version": "0.0.0",
4
+ "description": "App-local workspace-scoped read-only user administration feature.",
5
+ "private": true,
6
+ "type": "module",
7
+ "exports": {
8
+ "./server/UsersWorkspaceFeature": "./src/server/UsersWorkspaceFeature.js",
9
+ "./shared": "./src/shared/index.js"
10
+ },
11
+ "dependencies": {
12
+ "@jskit-ai/crud-core": "0.1.190",
13
+ "@jskit-ai/resource-crud-core": "0.1.121",
14
+ "@jskit-ai/workspaces-core": "0.1.157"
15
+ },
16
+ "jskit": {
17
+ "kind": "runtime",
18
+ "capabilities": {
19
+ "provides": [
20
+ "app.users-workspace"
21
+ ],
22
+ "requires": [
23
+ "runtime.http",
24
+ "runtime.json-rest-api",
25
+ "runtime.actions",
26
+ "runtime.database"
27
+ ]
28
+ },
29
+ "runtime": {
30
+ "server": {
31
+ "providers": [
32
+ {
33
+ "entrypoint": "src/server/UsersWorkspaceFeature.js",
34
+ "export": "UsersWorkspaceFeature"
35
+ }
36
+ ]
37
+ },
38
+ "client": {
39
+ "providers": []
40
+ }
41
+ }
42
+ }
43
+ }
@@ -0,0 +1,22 @@
1
+ import { defineCrudJsonApiFeature } from "@jskit-ai/crud-core/server/defineCrudJsonApiFeature";
2
+ import { buildWorkspaceInputFromRouteParams } from "@jskit-ai/workspaces-core/server/support/workspaceRouteInput";
3
+ import { workspaceSlugParamsValidator } from "@jskit-ai/workspaces-core/server/validators/routeParamsValidator";
4
+ import { resource } from "../shared/userResource.js";
5
+
6
+ const UsersWorkspaceFeature = defineCrudJsonApiFeature({
7
+ resource,
8
+ id: "app.users-workspace",
9
+ capability: "app.users-workspace",
10
+ surface: "admin",
11
+ ownershipFilter: "workspace",
12
+ relativePath: "/users",
13
+ scope: {
14
+ routeBase: "/w/:workspaceSlug",
15
+ actionInputValidator: workspaceSlugParamsValidator,
16
+ routeParamsValidator: workspaceSlugParamsValidator,
17
+ inputKeys: ["workspaceSlug"],
18
+ input: (request) => buildWorkspaceInputFromRouteParams(request.input.params)
19
+ }
20
+ });
21
+
22
+ export { UsersWorkspaceFeature };