@jskit-ai/agent-docs 0.1.241 → 0.1.243
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.
- package/guide/agent/app-extras/assistant-conversation.md +4 -2
- package/guide/agent/app-extras/assistant.md +3 -1
- package/guide/agent/app-extras/realtime.md +12 -3
- package/guide/agent/app-setup/database-layer.md +1 -1
- package/guide/agent/app-setup/existing-application-migration.md +0 -7
- package/guide/agent/framework/application-operations.md +1 -1
- package/guide/agent/framework/crud-operations.md +9 -9
- package/guide/agent/framework/ui-operations.md +6 -30
- package/guide/agent/index.md +2 -0
- package/package.json +2 -3
- package/patterns/feature-package/example/booking-engine/package.json +1 -1
- package/patterns/feature-package/example/booking-engine/src/server/actions.js +0 -2
- package/patterns/feature-package/example/variations/AvailabilityEngineProvider.js +1 -1
- package/patterns/feature-package/example/variations/InvoiceRollupProvider.js +1 -1
- package/patterns/minimal-foundation/example/AGENTS.md +19 -0
- package/patterns/minimal-foundation/example/package.json +3 -3
- package/patterns/minimal-foundation/example/server/lib/runtimeEnv.js +3 -11
- package/patterns/minimal-foundation/example/src/main.js +0 -2
- package/patterns/shell-foundation/PATTERN.md +11 -20
- package/patterns/shell-foundation/example/AGENTS.md +19 -0
- package/patterns/shell-foundation/example/package.json +4 -4
- package/patterns/shell-foundation/example/packages/main/package.json +1 -1
- package/patterns/shell-foundation/example/server/lib/runtimeEnv.js +3 -11
- package/patterns/shell-foundation/example/src/components/ShellLayout.vue +1 -0
- package/patterns/shell-foundation/example/src/main.js +0 -2
- package/patterns/shell-foundation/example/src/pages/home/settings.vue +2 -2
- package/reference/autogen/KERNEL_MAP.md +16 -147
- package/reference/autogen/PATTERN_INDEX.md +37 -37
- package/reference/autogen/packages/agent-docs.md +1 -9
- package/reference/autogen/packages/assistant-core.md +102 -68
- package/reference/autogen/packages/assistant-runtime.md +29 -15
- package/reference/autogen/packages/assistant-voice-sherpa.md +2 -1
- package/reference/autogen/packages/assistant-voice.md +8 -11
- package/reference/autogen/packages/auth-core.md +1 -1
- package/reference/autogen/packages/auth-provider-local-core.md +1 -1
- package/reference/autogen/packages/auth-provider-local-db-core.md +1 -1
- package/reference/autogen/packages/auth-provider-oidc-core.md +1 -1
- package/reference/autogen/packages/auth-provider-supabase-core.md +1 -1
- package/reference/autogen/packages/auth-web.md +1 -2
- package/reference/autogen/packages/connector-google-calendar.md +6 -2
- package/reference/autogen/packages/connectors-catalog.md +26 -7
- package/reference/autogen/packages/connectors-core.md +14 -3
- package/reference/autogen/packages/connectors-web.md +6 -1
- package/reference/autogen/packages/console-core.md +1 -1
- package/reference/autogen/packages/console-web.md +1 -1
- package/reference/autogen/packages/crud-core.md +1 -1
- package/reference/autogen/packages/database-runtime-mysql.md +1 -1
- package/reference/autogen/packages/database-runtime-postgres.md +1 -1
- package/reference/autogen/packages/database-runtime.md +2 -86
- package/reference/autogen/packages/http-runtime.md +6 -92
- package/reference/autogen/packages/http-web.md +29 -49
- package/reference/autogen/packages/json-rest-api-core.md +1 -1
- package/reference/autogen/packages/kernel.md +108 -405
- package/reference/autogen/packages/mobile-capacitor.md +11 -1
- package/reference/autogen/packages/oidc-issuer-core.md +1 -1
- package/reference/autogen/packages/payments-core.md +12 -4
- package/reference/autogen/packages/payments-web.md +1 -1
- package/reference/autogen/packages/realtime.md +7 -5
- package/reference/autogen/packages/resource-core.md +1 -4
- package/reference/autogen/packages/resource-crud-core.md +4 -3
- package/reference/autogen/packages/rewarded-core.md +1 -1
- package/reference/autogen/packages/rewarded-web.md +1 -1
- package/reference/autogen/packages/shell-web.md +114 -49
- package/reference/autogen/packages/storage-runtime.md +1 -1
- package/reference/autogen/packages/uploads-image-web.md +1 -1
- package/reference/autogen/packages/uploads-runtime.md +1 -1
- package/reference/autogen/packages/users-core.md +1 -1
- package/reference/autogen/packages/users-web.md +1 -2
- package/reference/autogen/packages/workspaces-core.md +3 -1
- package/reference/autogen/packages/workspaces-web.md +1 -1
- package/reference/autogen/tooling/config-eslint.md +1 -1
- package/reference/autogen/tooling/jskit-catalog.md +8 -9
- package/reference/autogen/tooling/jskit-release.md +3 -4
- package/reference/autogen/tooling/testUtils.md +1 -28
- package/skills/jskit/SKILL.md +8 -6
- package/skills/jskit/references/app-operations.md +1 -1
- package/skills/jskit/references/crud-form-actions.md +62 -0
- package/skills/jskit/references/crud-operations.md +9 -9
- package/skills/jskit/references/existing-application-migration.md +0 -7
- package/{patterns → skills/jskit/references/heuristics}/INDEX.md +24 -38
- package/{patterns → skills/jskit/references/heuristics}/child-cruds.md +2 -0
- package/{patterns → skills/jskit/references/heuristics}/client-requests.md +2 -0
- package/{patterns → skills/jskit/references/heuristics}/crud-authoring.md +2 -0
- package/{patterns → skills/jskit/references/heuristics}/crud-links.md +2 -0
- package/{patterns → skills/jskit/references/heuristics}/crud-repository-mapping.md +3 -1
- package/{patterns → skills/jskit/references/heuristics}/filters.md +3 -1
- package/{patterns → skills/jskit/references/heuristics}/live-actions.md +2 -0
- package/{patterns → skills/jskit/references/heuristics}/page-redirects.md +2 -0
- package/{patterns → skills/jskit/references/heuristics}/page-scaffolding.md +5 -3
- package/{patterns → skills/jskit/references/heuristics}/placements.md +2 -0
- package/{patterns → skills/jskit/references/heuristics}/row-policies.md +2 -0
- package/{patterns → skills/jskit/references/heuristics}/server-search.md +2 -0
- package/{patterns → skills/jskit/references/heuristics}/surfaces.md +5 -3
- package/{patterns → skills/jskit/references/heuristics}/ui-contract.md +3 -1
- package/{patterns → skills/jskit/references/heuristics}/ui-testing.md +2 -0
- package/skills/jskit/references/pattern-index.md +37 -37
- package/skills/jskit/references/patterns/app/minimal-foundation/example/AGENTS.md +19 -0
- package/skills/jskit/references/patterns/app/minimal-foundation/example/package.json +3 -3
- package/skills/jskit/references/patterns/app/minimal-foundation/example/server/lib/runtimeEnv.js +3 -11
- package/skills/jskit/references/patterns/app/minimal-foundation/example/src/main.js +0 -2
- package/skills/jskit/references/patterns/app/shell-foundation/PATTERN.md +11 -20
- package/skills/jskit/references/patterns/app/shell-foundation/example/AGENTS.md +19 -0
- package/skills/jskit/references/patterns/app/shell-foundation/example/package.json +4 -4
- package/skills/jskit/references/patterns/app/shell-foundation/example/packages/main/package.json +1 -1
- package/skills/jskit/references/patterns/app/shell-foundation/example/server/lib/runtimeEnv.js +3 -11
- package/skills/jskit/references/patterns/app/shell-foundation/example/src/components/ShellLayout.vue +1 -0
- package/skills/jskit/references/patterns/app/shell-foundation/example/src/main.js +0 -2
- package/skills/jskit/references/patterns/app/shell-foundation/example/src/pages/home/settings.vue +2 -2
- package/skills/jskit/references/patterns/auth/accounts-hub/example/package.json +2 -2
- package/skills/jskit/references/patterns/auth/oidc-sign-in/example/package.json +2 -2
- package/skills/jskit/references/patterns/auth/supabase-auth/example/package.json +1 -1
- package/skills/jskit/references/patterns/connectors/calendar-cli/example/package.json +4 -4
- package/skills/jskit/references/patterns/connectors/oauth-connection/PATTERN.md +27 -610
- package/skills/jskit/references/patterns/connectors/paddle-catalogue/example/create-products.js +2 -1
- package/skills/jskit/references/patterns/connectors/redshift-queries/PATTERN.md +1 -1
- package/skills/jskit/references/patterns/crud/crud-screen-set/PATTERN.md +11 -1
- package/skills/jskit/references/patterns/crud/json-api-resource-package/example/packages/books/package.json +2 -2
- package/skills/jskit/references/patterns/database/mysql-application/example/package.json +1 -1
- package/skills/jskit/references/patterns/database/postgres-application/example/package.json +1 -1
- package/skills/jskit/references/patterns/realtime/realtime-application/example/package.json +2 -2
- package/skills/jskit/references/patterns/server/feature-package/example/booking-engine/package.json +1 -1
- package/skills/jskit/references/patterns/server/feature-package/example/booking-engine/src/server/actions.js +0 -2
- package/skills/jskit/references/patterns/server/feature-package/example/variations/AvailabilityEngineProvider.js +1 -1
- package/skills/jskit/references/patterns/server/feature-package/example/variations/InvoiceRollupProvider.js +1 -1
- package/skills/jskit/references/patterns/shell/application-shell/PATTERN.md +18 -4
- package/skills/jskit/references/patterns/shell/application-shell/example/src/pages/home/index.vue +15 -5
- package/skills/jskit/references/patterns/shell/application-shell/example/tests/e2e/adaptive-shell.spec.ts +1 -1
- package/skills/jskit/references/patterns/users/user-administration-server/example/packages/users/package.json +2 -2
- package/skills/jskit/references/patterns/users/user-administration-server/example/packages/users-workspace/package.json +3 -3
- package/skills/jskit/references/ui-operations.md +6 -30
- 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:
|
|
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:
|
|
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:
|
|
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
|
|
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,
|
|
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:
|
|
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-" } = {})`
|
package/skills/jskit/SKILL.md
CHANGED
|
@@ -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.
|
|
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
|
-
- [
|
|
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.
|
|
79
|
-
|
|
80
|
-
|
|
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.
|
|
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
|
|
148
|
-
|
|
149
|
-
|
|
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
|
-
|
|
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
|
|
311
|
-
|
|
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](
|
|
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
|
-
|
|
1
|
+
<!-- Generated from `packages/agent-docs/heuristics/INDEX.md` by `npm run agent-docs:build`. -->
|
|
2
2
|
|
|
3
|
-
|
|
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
|
|
9
|
-
- Use
|
|
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
|
-
-
|
|
18
|
+
- [placements.md](./placements.md)
|
|
15
19
|
- surfaces, app/admin/home/console, "which surface", route ownership, placement visibility
|
|
16
|
-
-
|
|
20
|
+
- [surfaces.md](./surfaces.md)
|
|
17
21
|
- page, route page, placeholder page, screen stub, menu-linked page, placements
|
|
18
|
-
-
|
|
22
|
+
- [page-scaffolding.md](./page-scaffolding.md)
|
|
19
23
|
- child crud, nested crud, embedded list, subroute, separate page, parent/child layout
|
|
20
|
-
-
|
|
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
|
-
-
|
|
26
|
+
- [crud-authoring.md](./crud-authoring.md)
|
|
23
27
|
- CRUD links, record placeholders, `paths.page()`, `resolveViewUrl`, `resolveEditUrl`, `resolveParams`
|
|
24
|
-
-
|
|
28
|
+
- [crud-links.md](./crud-links.md)
|
|
25
29
|
- `definePage`, redirect, child redirect, settings landing, `redirectToChild`
|
|
26
|
-
-
|
|
30
|
+
- [page-redirects.md](./page-redirects.md)
|
|
27
31
|
- live actions, checkbox, toggle, patch button, delete confirmation, destructive action, inline action, `useCommand()`, `useCrudDeleteAction()`
|
|
28
|
-
-
|
|
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
|
-
-
|
|
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
|
-
-
|
|
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
|
-
-
|
|
38
|
+
- [ui-contract.md](./ui-contract.md)
|
|
35
39
|
- filter, filters, search facets, chips, date range, enum filter, lookup filter, `useCrudListFilters`, `createCrudListFilters`
|
|
36
|
-
-
|
|
40
|
+
- [filters.md](./filters.md)
|
|
37
41
|
- `searchSchema`, `search: true`, `applyFilter`, server search, query validators, backend filters, internal JSON REST filters
|
|
38
|
-
-
|
|
39
|
-
- `actualField`, `storage.writeSerializer`, `storage.virtual`, computed field, virtual field, projection, `createCrudResourceRuntime`,
|
|
40
|
-
-
|
|
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
|
-
-
|
|
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,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
|
|
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
|
|
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/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
|
|
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
|
|
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
|
|
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,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
|
-
-
|
|
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
|
|
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
|
|
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](../
|
|
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
|