@jskit-ai/agent-docs 0.1.242 → 0.1.244

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (128) hide show
  1. package/guide/agent/app-extras/assistant-conversation.md +4 -2
  2. package/guide/agent/app-extras/assistant.md +3 -1
  3. package/guide/agent/app-extras/realtime.md +12 -3
  4. package/guide/agent/app-setup/database-layer.md +1 -1
  5. package/guide/agent/app-setup/existing-application-migration.md +0 -7
  6. package/guide/agent/framework/application-operations.md +1 -1
  7. package/guide/agent/framework/crud-operations.md +9 -9
  8. package/guide/agent/index.md +2 -0
  9. package/package.json +2 -3
  10. package/patterns/feature-package/example/booking-engine/package.json +1 -1
  11. package/patterns/feature-package/example/booking-engine/src/server/actions.js +0 -2
  12. package/patterns/feature-package/example/variations/AvailabilityEngineProvider.js +1 -1
  13. package/patterns/feature-package/example/variations/InvoiceRollupProvider.js +1 -1
  14. package/patterns/minimal-foundation/example/AGENTS.md +19 -0
  15. package/patterns/minimal-foundation/example/package.json +3 -3
  16. package/patterns/minimal-foundation/example/server/lib/runtimeEnv.js +3 -11
  17. package/patterns/minimal-foundation/example/src/main.js +0 -2
  18. package/patterns/shell-foundation/PATTERN.md +11 -20
  19. package/patterns/shell-foundation/example/AGENTS.md +19 -0
  20. package/patterns/shell-foundation/example/package.json +4 -4
  21. package/patterns/shell-foundation/example/packages/main/package.json +1 -1
  22. package/patterns/shell-foundation/example/server/lib/runtimeEnv.js +3 -11
  23. package/patterns/shell-foundation/example/src/components/ShellLayout.vue +1 -0
  24. package/patterns/shell-foundation/example/src/main.js +0 -2
  25. package/patterns/shell-foundation/example/src/pages/home/settings.vue +2 -2
  26. package/reference/autogen/KERNEL_MAP.md +16 -147
  27. package/reference/autogen/PATTERN_INDEX.md +37 -37
  28. package/reference/autogen/packages/agent-docs.md +1 -9
  29. package/reference/autogen/packages/assistant-core.md +102 -68
  30. package/reference/autogen/packages/assistant-runtime.md +29 -15
  31. package/reference/autogen/packages/assistant-voice-sherpa.md +2 -1
  32. package/reference/autogen/packages/assistant-voice.md +8 -11
  33. package/reference/autogen/packages/auth-core.md +1 -1
  34. package/reference/autogen/packages/auth-provider-local-core.md +1 -1
  35. package/reference/autogen/packages/auth-provider-local-db-core.md +1 -1
  36. package/reference/autogen/packages/auth-provider-oidc-core.md +1 -1
  37. package/reference/autogen/packages/auth-provider-supabase-core.md +1 -1
  38. package/reference/autogen/packages/auth-web.md +1 -2
  39. package/reference/autogen/packages/connector-google-calendar.md +6 -2
  40. package/reference/autogen/packages/connectors-catalog.md +26 -7
  41. package/reference/autogen/packages/connectors-core.md +14 -3
  42. package/reference/autogen/packages/connectors-web.md +6 -1
  43. package/reference/autogen/packages/console-core.md +1 -1
  44. package/reference/autogen/packages/console-web.md +1 -1
  45. package/reference/autogen/packages/crud-core.md +1 -1
  46. package/reference/autogen/packages/database-runtime-mysql.md +1 -1
  47. package/reference/autogen/packages/database-runtime-postgres.md +1 -1
  48. package/reference/autogen/packages/database-runtime.md +2 -86
  49. package/reference/autogen/packages/http-runtime.md +6 -92
  50. package/reference/autogen/packages/http-web.md +29 -49
  51. package/reference/autogen/packages/json-rest-api-core.md +1 -1
  52. package/reference/autogen/packages/kernel.md +108 -405
  53. package/reference/autogen/packages/mobile-capacitor.md +11 -1
  54. package/reference/autogen/packages/oidc-issuer-core.md +1 -1
  55. package/reference/autogen/packages/payments-core.md +12 -4
  56. package/reference/autogen/packages/payments-web.md +1 -1
  57. package/reference/autogen/packages/realtime.md +7 -5
  58. package/reference/autogen/packages/resource-core.md +1 -4
  59. package/reference/autogen/packages/resource-crud-core.md +4 -3
  60. package/reference/autogen/packages/rewarded-core.md +1 -1
  61. package/reference/autogen/packages/rewarded-web.md +1 -1
  62. package/reference/autogen/packages/shell-web.md +114 -49
  63. package/reference/autogen/packages/storage-runtime.md +1 -1
  64. package/reference/autogen/packages/uploads-image-web.md +1 -1
  65. package/reference/autogen/packages/uploads-runtime.md +1 -1
  66. package/reference/autogen/packages/users-core.md +1 -1
  67. package/reference/autogen/packages/users-web.md +1 -2
  68. package/reference/autogen/packages/workspaces-core.md +3 -1
  69. package/reference/autogen/packages/workspaces-web.md +1 -1
  70. package/reference/autogen/tooling/config-eslint.md +1 -1
  71. package/reference/autogen/tooling/jskit-catalog.md +8 -9
  72. package/reference/autogen/tooling/jskit-release.md +3 -4
  73. package/reference/autogen/tooling/testUtils.md +1 -28
  74. package/skills/jskit/SKILL.md +8 -6
  75. package/skills/jskit/references/app-operations.md +1 -1
  76. package/skills/jskit/references/crud-form-actions.md +62 -0
  77. package/skills/jskit/references/crud-operations.md +9 -9
  78. package/skills/jskit/references/existing-application-migration.md +0 -7
  79. package/{patterns → skills/jskit/references/heuristics}/INDEX.md +24 -38
  80. package/{patterns → skills/jskit/references/heuristics}/child-cruds.md +2 -0
  81. package/{patterns → skills/jskit/references/heuristics}/client-requests.md +2 -0
  82. package/{patterns → skills/jskit/references/heuristics}/crud-authoring.md +2 -0
  83. package/{patterns → skills/jskit/references/heuristics}/crud-links.md +2 -0
  84. package/{patterns → skills/jskit/references/heuristics}/crud-repository-mapping.md +3 -1
  85. package/{patterns → skills/jskit/references/heuristics}/filters.md +3 -1
  86. package/{patterns → skills/jskit/references/heuristics}/live-actions.md +2 -0
  87. package/{patterns → skills/jskit/references/heuristics}/page-redirects.md +2 -0
  88. package/{patterns → skills/jskit/references/heuristics}/page-scaffolding.md +5 -3
  89. package/{patterns → skills/jskit/references/heuristics}/placements.md +2 -0
  90. package/{patterns → skills/jskit/references/heuristics}/row-policies.md +2 -0
  91. package/{patterns → skills/jskit/references/heuristics}/server-search.md +2 -0
  92. package/{patterns → skills/jskit/references/heuristics}/surfaces.md +5 -3
  93. package/{patterns → skills/jskit/references/heuristics}/ui-contract.md +3 -1
  94. package/{patterns → skills/jskit/references/heuristics}/ui-testing.md +2 -0
  95. package/skills/jskit/references/pattern-index.md +37 -37
  96. package/skills/jskit/references/patterns/app/minimal-foundation/example/AGENTS.md +19 -0
  97. package/skills/jskit/references/patterns/app/minimal-foundation/example/package.json +3 -3
  98. package/skills/jskit/references/patterns/app/minimal-foundation/example/server/lib/runtimeEnv.js +3 -11
  99. package/skills/jskit/references/patterns/app/minimal-foundation/example/src/main.js +0 -2
  100. package/skills/jskit/references/patterns/app/shell-foundation/PATTERN.md +11 -20
  101. package/skills/jskit/references/patterns/app/shell-foundation/example/AGENTS.md +19 -0
  102. package/skills/jskit/references/patterns/app/shell-foundation/example/package.json +4 -4
  103. package/skills/jskit/references/patterns/app/shell-foundation/example/packages/main/package.json +1 -1
  104. package/skills/jskit/references/patterns/app/shell-foundation/example/server/lib/runtimeEnv.js +3 -11
  105. package/skills/jskit/references/patterns/app/shell-foundation/example/src/components/ShellLayout.vue +1 -0
  106. package/skills/jskit/references/patterns/app/shell-foundation/example/src/main.js +0 -2
  107. package/skills/jskit/references/patterns/app/shell-foundation/example/src/pages/home/settings.vue +2 -2
  108. package/skills/jskit/references/patterns/auth/accounts-hub/example/package.json +2 -2
  109. package/skills/jskit/references/patterns/auth/oidc-sign-in/example/package.json +2 -2
  110. package/skills/jskit/references/patterns/auth/supabase-auth/example/package.json +1 -1
  111. package/skills/jskit/references/patterns/connectors/calendar-cli/example/package.json +4 -4
  112. package/skills/jskit/references/patterns/connectors/oauth-connection/PATTERN.md +27 -610
  113. package/skills/jskit/references/patterns/connectors/paddle-catalogue/example/create-products.js +2 -1
  114. package/skills/jskit/references/patterns/connectors/redshift-queries/PATTERN.md +1 -1
  115. package/skills/jskit/references/patterns/crud/crud-screen-set/PATTERN.md +11 -1
  116. package/skills/jskit/references/patterns/crud/json-api-resource-package/example/packages/books/package.json +2 -2
  117. package/skills/jskit/references/patterns/database/mysql-application/example/package.json +1 -1
  118. package/skills/jskit/references/patterns/database/postgres-application/example/package.json +1 -1
  119. package/skills/jskit/references/patterns/realtime/realtime-application/example/package.json +2 -2
  120. package/skills/jskit/references/patterns/server/feature-package/example/booking-engine/package.json +1 -1
  121. package/skills/jskit/references/patterns/server/feature-package/example/booking-engine/src/server/actions.js +0 -2
  122. package/skills/jskit/references/patterns/server/feature-package/example/variations/AvailabilityEngineProvider.js +1 -1
  123. package/skills/jskit/references/patterns/server/feature-package/example/variations/InvoiceRollupProvider.js +1 -1
  124. package/skills/jskit/references/patterns/shell/application-shell/example/src/pages/home/index.vue +15 -5
  125. package/skills/jskit/references/patterns/shell/application-shell/example/tests/e2e/adaptive-shell.spec.ts +1 -1
  126. package/skills/jskit/references/patterns/users/user-administration-server/example/packages/users/package.json +2 -2
  127. package/skills/jskit/references/patterns/users/user-administration-server/example/packages/users-workspace/package.json +3 -3
  128. package/templates/app/AGENTS.md +0 -38
@@ -8,7 +8,7 @@ Use this on demand; do not load the full index at startup.
8
8
 
9
9
  ## Scope
10
10
  - Source: `tooling/config-eslint/**/*{.js,.mjs,.cjs,.vue}`
11
- - Excludes: `test/`, `tests/`, `__tests__/`, `*.test.*`, `*.spec.*`, `*.vitest.*`, `node_modules/`, `dist/`, `coverage/`, `docs/`, `.vitepress/cache/`, `.vitepress/dist/`
11
+ - Excludes: `.build/`, `.git/`, `.jscpd/`, `.jskit/`, `coverage/`, `dist/`, `docs/`, `node_modules/`, `test/`, `tests/`, `__tests__/`, `.vitepress/cache/`, `.vitepress/dist/`, `skills/jskit/references/patterns/`, `*.test.*`, `*.spec.*`, `*.vitest.*`
12
12
 
13
13
  ## Sections
14
14
 
@@ -8,7 +8,7 @@ Use this on demand; do not load the full index at startup.
8
8
 
9
9
  ## Scope
10
10
  - Source: `tooling/jskit-catalog/**/*{.js,.mjs,.cjs,.vue}`
11
- - Excludes: `test/`, `tests/`, `__tests__/`, `*.test.*`, `*.spec.*`, `*.vitest.*`, `node_modules/`, `dist/`, `coverage/`, `docs/`, `.vitepress/cache/`, `.vitepress/dist/`
11
+ - Excludes: `.build/`, `.git/`, `.jscpd/`, `.jskit/`, `coverage/`, `dist/`, `docs/`, `node_modules/`, `test/`, `tests/`, `__tests__/`, `.vitepress/cache/`, `.vitepress/dist/`, `skills/jskit/references/patterns/`, `*.test.*`, `*.spec.*`, `*.vitest.*`
12
12
 
13
13
  ## Sections
14
14
 
@@ -19,17 +19,17 @@ Exports
19
19
  - None
20
20
  Local functions
21
21
  - `parseInlineArg(name)`
22
- - `toSortedUniqueStrings(values)`
23
- - `fileExists(absolutePath)`
24
- - `collectPackageRoots(packagesRoot)`
25
- - `normalizeWorkspacePatterns(value)`
26
- - `createWorkspaceSegmentPattern(segment = "")`
27
- - `expandWorkspacePattern(repoRoot, workspacePattern = "")`
28
22
  - `collectReleasePackageVersions(repoRoot)`
29
- - `readJson(absolutePath)`
30
23
  - `buildCatalog({ repoRoot, packagesRoot, outputPath })`
31
24
  - `main()`
32
25
 
26
+ ### `scripts/framework-packages.mjs`
27
+ Exports
28
+ - `collectSingletonPackageIds(packageJsons)`
29
+ - `discoverFrameworkPackages(packagesRoot)`
30
+ Local functions
31
+ - `fileExists(filePath)`
32
+
33
33
  ### `scripts/jskit.mjs`
34
34
  Exports
35
35
  - `isCliEntrypoint(argvPath = process.argv[1])`
@@ -102,7 +102,6 @@ Exports
102
102
  - `validateSingletonPeerDependencies(packages)`
103
103
  Local functions
104
104
  - `fileExists(filePath)`
105
- - `discoverFrameworkPackages()`
106
105
  - `requireStringArray(value, label)`
107
106
  - `requireArchitectureId(value, label)`
108
107
  - `validateCapabilityMap(value, label)`
@@ -8,7 +8,7 @@ Use this on demand; do not load the full index at startup.
8
8
 
9
9
  ## Scope
10
10
  - Source: `tooling/jskit-release/**/*{.js,.mjs,.cjs,.vue}`
11
- - Excludes: `test/`, `tests/`, `__tests__/`, `*.test.*`, `*.spec.*`, `*.vitest.*`, `node_modules/`, `dist/`, `coverage/`, `docs/`, `.vitepress/cache/`, `.vitepress/dist/`
11
+ - Excludes: `.build/`, `.git/`, `.jscpd/`, `.jskit/`, `coverage/`, `dist/`, `docs/`, `node_modules/`, `test/`, `tests/`, `__tests__/`, `.vitepress/cache/`, `.vitepress/dist/`, `skills/jskit/references/patterns/`, `*.test.*`, `*.spec.*`, `*.vitest.*`
12
12
 
13
13
  ## Sections
14
14
 
@@ -44,7 +44,7 @@ Exports
44
44
  - `updatePatternPackageJsonContents(contents, versions)`
45
45
  - `validateReleaseState(records, repoRoot)`
46
46
  Local functions
47
- - `normalizeRegistryUrl(value = DEFAULT_REGISTRY)`
47
+ - `normalizeRegistryUrl(value)`
48
48
  - `fileExists(absolutePath)`
49
49
  - `readJsonFile(absolutePath)`
50
50
  - `serializeJson(value)`
@@ -52,7 +52,6 @@ Local functions
52
52
  - `followVersion(declared, version)`
53
53
  - `expandWorkspacePattern(repoRoot, pattern)`
54
54
  - `releaseConfig(repoRoot)`
55
- - `hydrateLocalDependencies(records)`
56
55
  - `currentVersionMap(records)`
57
56
  - `prepareManifests(records, versions, repoRoot, config)`
58
57
  - `versionFilePaths(record)`
@@ -66,7 +65,7 @@ Local functions
66
65
  - `createNpmUserConfig(registry, directory, records = [])`
67
66
  - `git(repoRoot, args)`
68
67
  - `releaseCommitMessage(entries)`
69
- - `publishRelease(records, { cwd: repoRoot, dryRun, registry })`
68
+ - `publishRelease(records, { cwd: repoRoot, registry })`
70
69
  - `publishCommand(options)`
71
70
  - `forgetPinnedLockEntries(repoRoot, names)`
72
71
  - `installReleasedPins(repoRoot, { attempts = 20, delayMs = Number(process.env.JSKIT_RELEASE_RETRY_DELAY_MS || 30_000) } = {})`
@@ -8,7 +8,7 @@ Use this on demand; do not load the full index at startup.
8
8
 
9
9
  ## Scope
10
10
  - Source: `tooling/testUtils/**/*{.js,.mjs,.cjs,.vue}`
11
- - Excludes: `test/`, `tests/`, `__tests__/`, `*.test.*`, `*.spec.*`, `*.vitest.*`, `node_modules/`, `dist/`, `coverage/`, `docs/`, `.vitepress/cache/`, `.vitepress/dist/`
11
+ - Excludes: `.build/`, `.git/`, `.jscpd/`, `.jskit/`, `coverage/`, `dist/`, `docs/`, `node_modules/`, `test/`, `tests/`, `__tests__/`, `.vitepress/cache/`, `.vitepress/dist/`, `skills/jskit/references/patterns/`, `*.test.*`, `*.spec.*`, `*.vitest.*`
12
12
 
13
13
  ## Sections
14
14
 
@@ -22,33 +22,6 @@ Exports
22
22
  - `startViteFixture({ fixtureRoot, configFile = "vite.config.mjs", env = {}, port: requestedPort } = {})`
23
23
  - `stopProcess(runtime)`
24
24
 
25
- ### `currentJskitWorkspaces.mjs`
26
- Exports
27
- - `CURRENT_JSKIT_WORKSPACE_NPM_ENV`
28
- - `restoreCurrentJskitDependencyVersions(appRoot, packages)`
29
- - `stageCurrentJskitWorkspaces(appRoot)`
30
- Local functions
31
- - `readJson(filePath)`
32
- - `collectCurrentJskitPackages()`
33
-
34
25
  ### `fakeFastify.mjs`
35
26
  Exports
36
27
  - `createFakeFastifyPolicyRuntime({ csrfHandler, autoRunPlugin = null } = {})`
37
-
38
- ### `jskitPackage.mjs`
39
- Exports
40
- - `writeJskitConfig(packageRoot, jskitOrSource)`
41
- Local functions
42
- - `resolveJskitConfig(jskitOrSource)`
43
-
44
- ### `patternApp.mjs`
45
- Exports
46
- - `copyFoundationPattern({ cwd, name, pattern = "shell-foundation" } = {})`
47
-
48
- ### `runCli.js`
49
- Exports
50
- - `createCliRunner(cliPath)`
51
-
52
- ### `tempDir.mjs`
53
- Exports
54
- - `withTempDir(run, { prefix = "jskit-test-" } = {})`
@@ -27,7 +27,7 @@ options, routing, package discovery, transport, or lifecycle behaviour before
27
27
  trying the documented API. Inspect implementation source only for a concrete
28
28
  failure or an API question the guide and example cannot answer. Name that
29
29
  failure or question first, inspect only its relevant owner, then return to
30
- implementation and verification. Do not tour a dependency tree for confidence.
30
+ implementation and verification.
31
31
 
32
32
  Do not write or consult receipts, provenance, completion ledgers, or other
33
33
  durable bookkeeping for pattern or authoring-tool runs. Current source,
@@ -42,11 +42,13 @@ manifests, migrations, tests, and runtime behaviour are the evidence.
42
42
  own a second project brain or prescribe a particular agent orchestrator.
43
43
  4. Load only relevant references:
44
44
  - [port guide](references/existing-application-migration.md) for existing apps.
45
- - [Workspace invitations](references/multi-homing.md).
45
+ - [heuristics index](references/heuristics/INDEX.md) for recurring traps.
46
+ - [multi-homing](references/multi-homing.md) for workspaces or invitations.
46
47
  - For creation, foundation patterns, or package selection, read
47
48
  [application operations](references/app-operations.md).
48
49
  - Before database, schema, CRUD, repository, or persistence work, read
49
- [CRUD operations](references/crud-operations.md) completely.
50
+ [CRUD operations](references/crud-operations.md) completely; for custom
51
+ form actions, also [form actions](references/crud-form-actions.md).
50
52
  - For routes, placements, user-facing UI, or browser verification, read
51
53
  [UI operations](references/ui-operations.md).
52
54
  - For every Vue/Vuetify UI creation, modification, review, or deslop task,
@@ -75,9 +77,9 @@ example. Before inspecting an unfamiliar package, use `rg --files` on its
75
77
  observed directory and select the relevant files from that inventory; do not
76
78
  try guessed source directories. Import subpaths are `exports` aliases, not
77
79
  physical paths: resolve them through installed `package.json#exports` or
78
- `import.meta.resolve()` when following an import. This rule applies to every
79
- package and task, not only CRUDs. Use the documented option when the guide or
80
- pattern already explains the behaviour instead of inspecting internals.
80
+ `import.meta.resolve()` when following an import. Use the documented option
81
+ when the guide or pattern already explains the behaviour instead of inspecting
82
+ internals.
81
83
 
82
84
  ## Implement a change
83
85
 
@@ -8,7 +8,7 @@ Adopt the foundation's accessible HTML skeleton, inline styles, Reload link and
8
8
  startup-error message; package updates do not rewrite existing app HTML. Follow
9
9
  its cold-browser proof at compact, medium and expanded widths: delay JavaScript,
10
10
  check loading feedback, then release it and check app mount, including production
11
- builds. Compression belongs to hosting, not Genesis.
11
+ builds. Response compression belongs to hosting.
12
12
 
13
13
  ## Establish a new application
14
14
 
@@ -0,0 +1,62 @@
1
+ <!-- Generated from `packages/agent-docs/site/guide/framework/crud-form-actions.md` by `npm run agent-docs:build`. -->
2
+
3
+ # Record form actions and validation
4
+
5
+ `CrudAddEditScreen` provides an optional `actions` slot with Cancel and Save as
6
+ its default content. The slot exposes `screen`, `mode`, `formRuntime`,
7
+ `formState`, `addEdit`, `saveLabel`, the resolved
8
+ `cancelTo` route target, and `submit`. Custom actions call `submit()` and bind
9
+ their disabled state to `addEdit.isSubmitDisabled`. Keyboard submission uses
10
+ the same runtime. `addEdit.isSaving` stays true through the request and
11
+ asynchronous `onSaveSuccess` callback; duplicate
12
+ submissions remain blocked during both.
13
+
14
+ `useAddEdit()` and the `addEdit` runtime exposed by `useCrudAddEdit()` and
15
+ `useCrudAddEditScreen()` provide:
16
+
17
+ - `validationAttempted`: initially `false`; becomes `true` when a permitted
18
+ submission reaches local validation, including a valid attempt.
19
+ - `validationErrors`: a field-to-message object, empty before an attempt or
20
+ after reset. After an attempt, it revalidates the current payload against the
21
+ configured input schema as reactive field values change. It contains only
22
+ local validation errors. `fieldErrors` holds the last submission's field
23
+ errors, including server errors, independently of live validation.
24
+ - `resetValidation()`: clears the attempt flag and field-error bag. It does not
25
+ change the form model. Route changes also reset validation
26
+ unless `clearOnRouteChange: false` is configured.
27
+
28
+ For guidance beside a custom button, set `addEditOptions.validationFeedback`
29
+ to `false` on `useCrudAddEditScreen()` or `useCrudAddEdit()`. With `useAddEdit()`,
30
+ pass `validationFeedback: false` directly. The default is `true`. Setting it to
31
+ `false` suppresses only local validation feedback; invalid saves remain blocked.
32
+ Permissions, network and server failures, and success feedback behave normally.
33
+
34
+ Inside `CrudAddEditScreen`, alongside the existing `fields` slot:
35
+
36
+ ```vue
37
+ <template #actions="{ addEdit, submit, saveLabel, cancelTo }">
38
+ <v-btn v-if="cancelTo" variant="outlined" :to="cancelTo">Cancel</v-btn>
39
+ <div>
40
+ <v-btn :disabled="addEdit.isSubmitDisabled" @click="submit">
41
+ {{ addEdit.isSaving ? "Saving…" : saveLabel }}
42
+ </v-btn>
43
+ <p v-if="addEdit.validationAttempted" aria-live="polite">
44
+ {{ Object.values(addEdit.validationErrors).join(" ") }}
45
+ </p>
46
+ </div>
47
+ </template>
48
+ ```
49
+
50
+ For Save and add another, keep the selected action in local application state
51
+ and call the same `submit()`. Use `addEditOptions.onSaveSuccess(payload, context)`
52
+ to clear the successfully saved model, call `screen.addEdit.resetValidation()`,
53
+ and prepare the next entry. This callback replaces default success navigation
54
+ and invalidation; perform those there when needed. Clear the model only in
55
+ `onSaveSuccess`: `submit()` also resolves after invalid or failed submissions.
56
+ Guard action selection with `isSubmitDisabled` and restore the default action
57
+ after each attempt so keyboard submission uses normal Save. Track the clicked
58
+ button separately to keep guidance beside it while fields are corrected.
59
+
60
+ Payload builders used by live validation (`buildPayload` or `buildRawPayload`)
61
+ must be safe to call repeatedly as reactive values change. Keep them free of
62
+ requests, navigation, and other side effects.
@@ -144,16 +144,15 @@ need cross-owner denial tests.
144
144
  `useCrudAddEditScreen()` accepts `saveSuccess` at the top level. After saving,
145
145
  the default behaviour invalidates `saveSuccess.invalidateQueryKey`, navigates
146
146
  to a configured record-view URL when one resolves, and otherwise falls back to
147
- the list URL. For a create-and-list app, use `navigateToView: false` and the
148
- configured `listUrlTemplate`, as in the public example above. The list URL may
149
- also come from `addEditOptions.listUrlTemplate`.
147
+ the list URL. For a create-and-list app, use `navigateToView: false` and
148
+ `saveSuccess.listUrlTemplate`, the only list URL save navigation reads, as in the
149
+ public example above.
150
150
 
151
151
  To keep the saved form open, set both `saveSuccess.navigateToView` and
152
152
  `saveSuccess.navigateToList` to `false`. `addEditOptions.onSaveSuccess` replaces
153
153
  the default success handling, including query invalidation and navigation;
154
154
  reserve it for custom success behaviour. Returning to the list needs only the
155
- documented `saveSuccess` options, not a custom router callback or inspection of
156
- the shared form implementation.
155
+ `saveSuccess` options, not a router callback.
157
156
 
158
157
  ## Browser routes and responsive lists
159
158
 
@@ -301,17 +300,18 @@ this raw test encoding into page code.
301
300
  Deletion requires an explicit shared `DELETE` operation and confirmation
302
301
  decision. Use `CrudDeleteAction` and `useCrudDeleteAction()` through the view
303
302
  actions slot; do not rebuild their confirmation, request, invalidation, and
304
- navigation flow.
303
+ navigation flow. After a delete it returns to the list before invalidating the
304
+ resource's queries, so the deleted record never refetches as "Record not found."
305
305
 
306
306
  The delete action resolves its HTTP client from the resource's `apiAccess`, just
307
307
  like the list, view and form helpers. For `apiAccess: "public"`, DELETE requests
308
308
  skip session CSRF discovery; no `/api/session` endpoint or page-local client
309
309
  wiring is required. Authenticated resources retain the configured client's CSRF
310
- behavior. An explicit `client` override is supported and receives the same
311
- resource-aware public request options. This does not change server authorization.
310
+ behavior. An explicit `client` override receives the same request options.
311
+ Server authorization is unchanged.
312
312
 
313
313
  For custom form actions, see
314
- [record form actions](https://mobily-enterprises.github.io/jskit-ai/guide/framework/crud-form-actions).
314
+ [record form actions](./crud-form-actions.md).
315
315
 
316
316
  ## Strict temporal values
317
317
 
@@ -292,13 +292,6 @@ ACL, and restrictive umask. Setup must fail if it cannot establish that
292
292
  contract. Do not make package installation, Git, agents, or preview startup run
293
293
  recursive ownership or mode repair afterward.
294
294
 
295
- For Vibe64-managed workspaces, the concrete contract is group `vibe64`,
296
- directory mode `2770`, access and inherited default group ACL `vibe64:rwx`, no
297
- access for other users, and process umask `0007`. The enabled human user and
298
- `v64d_<workspace>` identity both belong to the group. Other hosts may use
299
- different concrete identities, but they must provide the same creation-time
300
- guarantee.
301
-
302
295
  Do not conflate these identities:
303
296
 
304
297
  - The filesystem identity controls who may create and replace source files.
@@ -1,60 +1,46 @@
1
- # JSKIT Patterns Index
1
+ <!-- Generated from `packages/agent-docs/heuristics/INDEX.md` by `npm run agent-docs:build`. -->
2
2
 
3
- Use this index as the first stop for recurring JSKIT implementation heuristics and workflow traps.
3
+ # JSKIT Heuristics Index
4
+
5
+ Use this index for recurring JSKIT implementation heuristics and workflow traps.
6
+ Source patterns with complete example trees are listed separately in the source
7
+ pattern index.
4
8
 
5
9
  How to use it:
6
10
 
7
11
  - Match the user request against the keywords below.
8
- - Open only the relevant pattern files.
9
- - Use patterns as implementation guidance, not as permission to skip normal scoping or user clarification.
12
+ - Open only the relevant heuristic files.
13
+ - Use heuristics as implementation guidance, not as permission to skip normal scoping or user clarification.
10
14
 
11
15
  ## Keyword Map
12
16
 
13
17
  - tabs, menu items, icons, shell links, profile links, subpage tabs, placements
14
- - `placements.md`
18
+ - [placements.md](./placements.md)
15
19
  - surfaces, app/admin/home/console, "which surface", route ownership, placement visibility
16
- - `surfaces.md`
20
+ - [surfaces.md](./surfaces.md)
17
21
  - page, route page, placeholder page, screen stub, menu-linked page, placements
18
- - `page-scaffolding.md`
22
+ - [page-scaffolding.md](./page-scaffolding.md)
19
23
  - child crud, nested crud, embedded list, subroute, separate page, parent/child layout
20
- - `child-cruds.md`
24
+ - [child-cruds.md](./child-cruds.md)
21
25
  - crud, crud server, crud ui, resource contract, table creation, migrations, ownership, JSON API, standard screens
22
- - `crud-authoring.md`
26
+ - [crud-authoring.md](./crud-authoring.md)
23
27
  - CRUD links, record placeholders, `paths.page()`, `resolveViewUrl`, `resolveEditUrl`, `resolveParams`
24
- - `crud-links.md`
28
+ - [crud-links.md](./crud-links.md)
25
29
  - `definePage`, redirect, child redirect, settings landing, `redirectToChild`
26
- - `page-redirects.md`
30
+ - [page-redirects.md](./page-redirects.md)
27
31
  - live actions, checkbox, toggle, patch button, delete confirmation, destructive action, inline action, `useCommand()`, `useCrudDeleteAction()`
28
- - `live-actions.md`
32
+ - [live-actions.md](./live-actions.md)
29
33
  - ajax, fetch, API call, request, endpoint, HTTP client, `useCrudListScreen()`, `useCrudViewScreen()`, `useCrudAddEditScreen()`, `useList()`, `useView()`, `useAddEdit()`, `useEndpointResource()`, `httpWebClient`
30
- - `client-requests.md`
34
+ - [client-requests.md](./client-requests.md)
31
35
  - playwright, browser test, e2e, ui verification, baseline test, authenticated ui test, test auth, dev login as, dev auth bypass
32
- - `ui-testing.md`
36
+ - [ui-testing.md](./ui-testing.md)
33
37
  - UI contract, design contract, navigation roles, Back button, previous page, history, hardcoded destination, Deslop, density, placeholder copy, card shells, shared CRUD screens, row actions, synthetic rows, detail slots
34
- - `ui-contract.md`
38
+ - [ui-contract.md](./ui-contract.md)
35
39
  - filter, filters, search facets, chips, date range, enum filter, lookup filter, `useCrudListFilters`, `createCrudListFilters`
36
- - `filters.md`
40
+ - [filters.md](./filters.md)
37
41
  - `searchSchema`, `search: true`, `applyFilter`, server search, query validators, backend filters, internal JSON REST filters
38
- - `server-search.md`
39
- - `actualField`, `storage.writeSerializer`, `storage.virtual`, computed field, virtual field, projection, `createCrudResourceRuntime`, `remainingBatchWeight`, datetime write serialization, temporalPrecision, json-rest-schema dates
40
- - `crud-repository-mapping.md`
42
+ - [server-search.md](./server-search.md)
43
+ - `actualField`, `storage.writeSerializer`, `storage.virtual`, computed field, virtual field, projection, `createCrudResourceRuntime`, datetime write serialization, temporalPrecision, json-rest-schema dates
44
+ - [crud-repository-mapping.md](./crud-repository-mapping.md)
41
45
  - row policy, permission filtering, visibility before pagination, recursive CTE, descendants, package cycle, `RowPolicyPlugin`
42
- - `row-policies.md`
43
-
44
- ## Current Patterns
45
-
46
- - [placements.md](./placements.md)
47
- - [surfaces.md](./surfaces.md)
48
- - [page-scaffolding.md](./page-scaffolding.md)
49
- - [child-cruds.md](./child-cruds.md)
50
- - [crud-authoring.md](./crud-authoring.md)
51
- - [crud-links.md](./crud-links.md)
52
- - [page-redirects.md](./page-redirects.md)
53
- - [live-actions.md](./live-actions.md)
54
- - [client-requests.md](./client-requests.md)
55
- - [ui-testing.md](./ui-testing.md)
56
- - [ui-contract.md](./ui-contract.md)
57
- - [filters.md](./filters.md)
58
- - [server-search.md](./server-search.md)
59
- - [crud-repository-mapping.md](./crud-repository-mapping.md)
60
- - [row-policies.md](./row-policies.md)
46
+ - [row-policies.md](./row-policies.md)
@@ -1,3 +1,5 @@
1
+ <!-- Generated from `packages/agent-docs/heuristics/child-cruds.md` by `npm run agent-docs:build`. -->
2
+
1
3
  # Child CRUD Layout Patterns
2
4
 
3
5
  Use when:
@@ -1,3 +1,5 @@
1
+ <!-- Generated from `packages/agent-docs/heuristics/client-requests.md` by `npm run agent-docs:build`. -->
2
+
1
3
  # Client Request Patterns
2
4
 
3
5
  Use when:
@@ -1,3 +1,5 @@
1
+ <!-- Generated from `packages/agent-docs/heuristics/crud-authoring.md` by `npm run agent-docs:build`. -->
2
+
1
3
  # CRUD authoring
2
4
 
3
5
  Use this file for normal persisted entities, resource contracts, migrations,
@@ -1,3 +1,5 @@
1
+ <!-- Generated from `packages/agent-docs/heuristics/crud-links.md` by `npm run agent-docs:build`. -->
2
+
1
3
  # CRUD Link Resolution Patterns
2
4
 
3
5
  Use when:
@@ -1,9 +1,11 @@
1
+ <!-- Generated from `packages/agent-docs/heuristics/crud-repository-mapping.md` by `npm run agent-docs:build`. -->
2
+
1
3
  # CRUD Repository Mapping
2
4
 
3
5
  Use when:
4
6
  - a CRUD resource needs explicit DB column mapping
5
7
  - a field should exist in API output but is not a real DB column
6
- - the user mentions computed fields, projections, or `remainingBatchWeight`
8
+ - the user mentions computed fields or projections
7
9
 
8
10
  Default JSKIT pattern:
9
11
  1. Treat the schema as the API contract only.
@@ -1,3 +1,5 @@
1
+ <!-- Generated from `packages/agent-docs/heuristics/filters.md` by `npm run agent-docs:build`. -->
2
+
1
3
  # Structured Filters
2
4
 
3
5
  Use when:
@@ -6,7 +8,7 @@ Use when:
6
8
  - a screen mixes free-text search with structured facets
7
9
 
8
10
  Server-side note:
9
- - for the current CRUD server contract on the JSON REST path, see `server-search.md`
11
+ - for the current CRUD server contract on the JSON REST path, see [server search](./server-search.md)
10
12
  - this file is about the shared structured-filter runtime used by CRUD list pages and explicit list-filter modules
11
13
 
12
14
  Ask first:
@@ -1,3 +1,5 @@
1
+ <!-- Generated from `packages/agent-docs/heuristics/live-actions.md` by `npm run agent-docs:build`. -->
2
+
1
3
  # Live Action Patterns
2
4
 
3
5
  Use when:
@@ -1,3 +1,5 @@
1
+ <!-- Generated from `packages/agent-docs/heuristics/page-redirects.md` by `npm run agent-docs:build`. -->
2
+
1
3
  # Page Redirect Patterns
2
4
 
3
5
  Use when:
@@ -1,3 +1,5 @@
1
+ <!-- Generated from `packages/agent-docs/heuristics/page-scaffolding.md` by `npm run agent-docs:build`. -->
2
+
1
3
  # Page Scaffolding Patterns
2
4
 
3
5
  Use when:
@@ -9,7 +11,7 @@ Use when:
9
11
 
10
12
  Check first:
11
13
 
12
- - the app blueprint route family and chosen surface
14
+ - the project's product documentation, existing routes, and chosen surface
13
15
  - the page-and-placement source pattern
14
16
  - the current placement declarations and topology
15
17
  - the nearest existing routed host under `src/pages`
@@ -27,7 +29,7 @@ Rules:
27
29
  a semantic slot. Target concrete outlets only for deliberate infrastructure.
28
30
  - If the page sits under an existing routed host, reuse its `page.section-nav`
29
31
  ownership rather than creating a parallel navigation structure.
30
- - For a small placeholder route inside an existing route family, keep the change scoped unless the durable route or surface plan in the app blueprint changed.
32
+ - For a small placeholder route inside an existing route family, keep the change scoped unless the project's documented route or surface plan changed.
31
33
  - Live pages must be usable screens, not instructional scaffolds. Do not ship copy such as "replace this", "use this area", or "this page is ready".
32
34
  - Never add a page header, title block, welcome heading, or standalone heading copy by default. Start with the useful content and actions; add a heading only when the user explicitly asks for one.
33
35
  - Prefer a direct `v-sheet` working region when the content needs a surface. Do not wrap every page in a generic `v-card`.
@@ -50,6 +52,6 @@ Avoid:
50
52
 
51
53
  - inventing a page and placement shape without checking the existing pattern and neighboring routes
52
54
  - adding a route-name heading, welcome heading, or other page title the user did not request
53
- - treating a small page stub as permission to rewrite marketing copy, route architecture, or app blueprint scope
55
+ - treating a small page stub as permission to rewrite marketing copy, route architecture, or documented product scope
54
56
  - adding cards inside cards
55
57
  - treating Vuetify component defaults as the product architecture
@@ -1,3 +1,5 @@
1
+ <!-- Generated from `packages/agent-docs/heuristics/placements.md` by `npm run agent-docs:build`. -->
2
+
1
3
  # Placement Patterns
2
4
 
3
5
  Use when:
@@ -1,3 +1,5 @@
1
+ <!-- Generated from `packages/agent-docs/heuristics/row-policies.md` by `npm run agent-docs:build`. -->
2
+
1
3
  # Row Policies
2
4
 
3
5
  Use when:
@@ -1,3 +1,5 @@
1
+ <!-- Generated from `packages/agent-docs/heuristics/server-search.md` by `npm run agent-docs:build`. -->
2
+
1
3
  # Server Search
2
4
 
3
5
  Use when:
@@ -1,21 +1,23 @@
1
+ <!-- Generated from `packages/agent-docs/heuristics/surfaces.md` by `npm run agent-docs:build`. -->
2
+
1
3
  # Surface Patterns
2
4
 
3
5
  Use when:
4
6
 
5
7
  - adding a new screen or feature
6
- - generating pages
8
+ - adding pages
7
9
  - adding menu entries or widgets
8
10
  - deciding whether something belongs in `home`, `app`, `admin`, `console`, or another surface
9
11
 
10
12
  Check first:
11
13
 
12
- - the app blueprint surface plan
14
+ - the project's product documentation and existing routes
13
15
  - existing route roots under `src/pages`
14
16
  - placement visibility by `surfaces`
15
17
 
16
18
  Rules:
17
19
 
18
- - Always ask which surface the feature belongs to before generating routes, placements, or related UI.
20
+ - Always ask which surface the feature belongs to before adding routes, placements, or related UI.
19
21
  - Do not silently default new functionality to `app`.
20
22
  - Surface choice is architectural, not cosmetic. It controls routes, access, placement visibility, and often data ownership expectations.
21
23
  - When a link or widget should only appear on certain surfaces, use placement `surfaces` first and keep runtime `when` conditions for behavior-specific gating.
@@ -1,3 +1,5 @@
1
+ <!-- Generated from `packages/agent-docs/heuristics/ui-contract.md` by `npm run agent-docs:build`. -->
2
+
1
3
  # JSKIT UI contract
2
4
 
3
5
  Use this contract when creating or reviewing JSKIT shell, page, CRUD, settings,
@@ -14,7 +16,7 @@ and action UI.
14
16
  - Check every page for Back to the previous page unless returning makes no
15
17
  product sense. Use the existing navigation owner; fixed destinations are
16
18
  deliberate, explicitly labelled exceptions. Follow the
17
- [Back navigation contract](../guide/agent/framework/ui-operations.md#back-navigation)
19
+ [Back navigation contract](../ui-operations.md#back-navigation)
18
20
  for history, direct-entry fallback, retained context, and consistent placement.
19
21
  - Pages do not stack decorative cards inside structural cards.
20
22
  - Pages do not include a header, title block, welcome heading, or standalone
@@ -1,3 +1,5 @@
1
+ <!-- Generated from `packages/agent-docs/heuristics/ui-testing.md` by `npm run agent-docs:build`. -->
2
+
1
3
  # UI Testing Pattern
2
4
 
3
5
  Use when: