@jskit-ai/jskit-catalog 0.1.39 → 0.1.40
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/catalog/packages.json +579 -410
- package/package.json +1 -1
package/catalog/packages.json
CHANGED
|
@@ -6,62 +6,74 @@
|
|
|
6
6
|
"packages": [
|
|
7
7
|
{
|
|
8
8
|
"packageId": "@jskit-ai/assistant",
|
|
9
|
-
"version": "0.1.
|
|
9
|
+
"version": "0.1.41",
|
|
10
10
|
"descriptor": {
|
|
11
11
|
"packageVersion": 1,
|
|
12
12
|
"packageId": "@jskit-ai/assistant",
|
|
13
|
-
"version": "0.1.
|
|
13
|
+
"version": "0.1.41",
|
|
14
14
|
"kind": "generator",
|
|
15
|
-
"description": "
|
|
15
|
+
"description": "Install assistant runtime/config for one surface and scaffold assistant pages at explicit target files.",
|
|
16
16
|
"options": {
|
|
17
17
|
"surface": {
|
|
18
18
|
"required": true,
|
|
19
19
|
"inputType": "text",
|
|
20
|
+
"validationType": "enabled-surface-id",
|
|
20
21
|
"defaultFromConfig": "surfaceDefaultId",
|
|
21
22
|
"promptLabel": "Assistant surface",
|
|
22
|
-
"promptHint": "
|
|
23
|
+
"promptHint": "Assistant runtime surface id. Used by setup, or selected assistant surface for settings-page.",
|
|
24
|
+
"helpHint": "For setup, this is the runtime surface receiving assistant wiring. For settings-page, this is the assistant runtime configured by that page."
|
|
23
25
|
},
|
|
24
26
|
"settings-surface": {
|
|
25
27
|
"required": true,
|
|
26
28
|
"inputType": "text",
|
|
29
|
+
"validationType": "enabled-surface-id",
|
|
27
30
|
"defaultValue": "",
|
|
28
31
|
"promptLabel": "Settings surface",
|
|
29
|
-
"promptHint": "Enabled surface id
|
|
30
|
-
|
|
31
|
-
"settings-route-path": {
|
|
32
|
-
"required": false,
|
|
33
|
-
"inputType": "text",
|
|
34
|
-
"defaultValue": "assistant",
|
|
35
|
-
"promptLabel": "Settings route path",
|
|
36
|
-
"promptHint": "Route segment to use for the assistant settings section page."
|
|
32
|
+
"promptHint": "Enabled settings host surface id used by assistant setup.",
|
|
33
|
+
"helpHint": "Surface that hosts the settings UI for the selected assistant runtime."
|
|
37
34
|
},
|
|
38
35
|
"config-scope": {
|
|
39
36
|
"required": true,
|
|
40
37
|
"inputType": "text",
|
|
41
38
|
"defaultValue": "global",
|
|
42
39
|
"promptLabel": "Config scope",
|
|
43
|
-
"promptHint": "global | workspace. Workspace scope requires both
|
|
40
|
+
"promptHint": "global | workspace. Workspace scope requires both setup surfaces to requireWorkspace=true."
|
|
44
41
|
},
|
|
45
|
-
"
|
|
42
|
+
"name": {
|
|
46
43
|
"required": false,
|
|
47
44
|
"inputType": "text",
|
|
48
45
|
"defaultValue": "",
|
|
49
|
-
"promptLabel": "
|
|
50
|
-
"promptHint": "Optional
|
|
46
|
+
"promptLabel": "Page label",
|
|
47
|
+
"promptHint": "Optional page link label override for page and settings-page.",
|
|
48
|
+
"helpLabel": "Display label"
|
|
51
49
|
},
|
|
52
|
-
"
|
|
50
|
+
"force": {
|
|
51
|
+
"required": false,
|
|
52
|
+
"inputType": "flag",
|
|
53
|
+
"defaultValue": "",
|
|
54
|
+
"promptLabel": "Force overwrite",
|
|
55
|
+
"promptHint": "Overwrite the generated page file if it already exists."
|
|
56
|
+
},
|
|
57
|
+
"link-placement": {
|
|
53
58
|
"required": false,
|
|
54
59
|
"inputType": "text",
|
|
55
|
-
"defaultValue": "
|
|
56
|
-
"promptLabel": "
|
|
57
|
-
"promptHint": "
|
|
60
|
+
"defaultValue": "",
|
|
61
|
+
"promptLabel": "Link placement",
|
|
62
|
+
"promptHint": "Optional host:position target for the generated page link placement."
|
|
58
63
|
},
|
|
59
|
-
"
|
|
64
|
+
"link-component-token": {
|
|
60
65
|
"required": false,
|
|
61
66
|
"inputType": "text",
|
|
62
|
-
"defaultValue": "
|
|
63
|
-
"promptLabel": "
|
|
64
|
-
"promptHint": "
|
|
67
|
+
"defaultValue": "",
|
|
68
|
+
"promptLabel": "Link component token",
|
|
69
|
+
"promptHint": "Optional component token override for the generated page link placement."
|
|
70
|
+
},
|
|
71
|
+
"link-to": {
|
|
72
|
+
"required": false,
|
|
73
|
+
"inputType": "text",
|
|
74
|
+
"defaultValue": "",
|
|
75
|
+
"promptLabel": "Link to",
|
|
76
|
+
"promptHint": "Optional explicit props.to value for the generated page link placement."
|
|
65
77
|
},
|
|
66
78
|
"ai-config-prefix": {
|
|
67
79
|
"required": false,
|
|
@@ -115,11 +127,146 @@
|
|
|
115
127
|
}
|
|
116
128
|
},
|
|
117
129
|
"metadata": {
|
|
130
|
+
"generatorPrimarySubcommand": "setup",
|
|
131
|
+
"generatorSubcommands": {
|
|
132
|
+
"setup": {
|
|
133
|
+
"description": "Install assistant runtime/config for one target surface without creating pages.",
|
|
134
|
+
"optionNames": [
|
|
135
|
+
"surface",
|
|
136
|
+
"settings-surface",
|
|
137
|
+
"config-scope",
|
|
138
|
+
"ai-config-prefix",
|
|
139
|
+
"ai-provider",
|
|
140
|
+
"ai-api-key",
|
|
141
|
+
"ai-base-url",
|
|
142
|
+
"ai-timeout-ms"
|
|
143
|
+
],
|
|
144
|
+
"notes": [
|
|
145
|
+
"setup installs runtime/config only. It does not create assistant pages.",
|
|
146
|
+
"--surface selects the assistant runtime surface, and --settings-surface selects the surface that will host its settings UI."
|
|
147
|
+
],
|
|
148
|
+
"examples": [
|
|
149
|
+
{
|
|
150
|
+
"label": "Common usage",
|
|
151
|
+
"lines": [
|
|
152
|
+
"npx jskit generate assistant setup \\",
|
|
153
|
+
" --surface admin \\",
|
|
154
|
+
" --settings-surface admin \\",
|
|
155
|
+
" --config-scope workspace \\",
|
|
156
|
+
" --ai-api-key \"$OPENAI_API_KEY\""
|
|
157
|
+
]
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
"label": "More advanced usage",
|
|
161
|
+
"lines": [
|
|
162
|
+
"npx jskit generate assistant setup \\",
|
|
163
|
+
" --surface console \\",
|
|
164
|
+
" --settings-surface console \\",
|
|
165
|
+
" --config-scope global \\",
|
|
166
|
+
" --ai-config-prefix CONSOLE_ASSISTANT \\",
|
|
167
|
+
" --ai-provider openai \\",
|
|
168
|
+
" --ai-api-key \"$OPENAI_API_KEY\" \\",
|
|
169
|
+
" --ai-base-url \"http://localhost:11434/v1\" \\",
|
|
170
|
+
" --ai-timeout-ms 60000"
|
|
171
|
+
]
|
|
172
|
+
}
|
|
173
|
+
]
|
|
174
|
+
},
|
|
175
|
+
"page": {
|
|
176
|
+
"entrypoint": "src/server/subcommands/page.js",
|
|
177
|
+
"export": "runGeneratorSubcommand",
|
|
178
|
+
"description": "Create an assistant runtime page at an explicit target file relative to src/pages/.",
|
|
179
|
+
"positionalArgs": [
|
|
180
|
+
{
|
|
181
|
+
"name": "target-file",
|
|
182
|
+
"required": true,
|
|
183
|
+
"descriptionKey": "page-target-file"
|
|
184
|
+
}
|
|
185
|
+
],
|
|
186
|
+
"optionNames": [
|
|
187
|
+
"name",
|
|
188
|
+
"link-placement",
|
|
189
|
+
"link-component-token",
|
|
190
|
+
"link-to",
|
|
191
|
+
"force"
|
|
192
|
+
],
|
|
193
|
+
"notes": [
|
|
194
|
+
"The target file decides where the page lives.",
|
|
195
|
+
"Page-link placement follows the same inference rules as ui-generator page.",
|
|
196
|
+
"If the target page file already exists, rerun with --force to overwrite it."
|
|
197
|
+
],
|
|
198
|
+
"examples": [
|
|
199
|
+
{
|
|
200
|
+
"label": "Common usage",
|
|
201
|
+
"lines": [
|
|
202
|
+
"npx jskit generate assistant page \\",
|
|
203
|
+
" admin/assistant/index.vue"
|
|
204
|
+
]
|
|
205
|
+
},
|
|
206
|
+
{
|
|
207
|
+
"label": "More advanced usage",
|
|
208
|
+
"lines": [
|
|
209
|
+
"npx jskit generate assistant page \\",
|
|
210
|
+
" admin/ops/copilot/index.vue \\",
|
|
211
|
+
" --name \"Copilot\" \\",
|
|
212
|
+
" --link-placement shell-layout:top-right"
|
|
213
|
+
]
|
|
214
|
+
}
|
|
215
|
+
]
|
|
216
|
+
},
|
|
217
|
+
"settings-page": {
|
|
218
|
+
"entrypoint": "src/server/subcommands/settingsPage.js",
|
|
219
|
+
"export": "runGeneratorSubcommand",
|
|
220
|
+
"description": "Create an assistant settings page at an explicit target file relative to src/pages/.",
|
|
221
|
+
"positionalArgs": [
|
|
222
|
+
{
|
|
223
|
+
"name": "target-file",
|
|
224
|
+
"required": true,
|
|
225
|
+
"descriptionKey": "page-target-file"
|
|
226
|
+
}
|
|
227
|
+
],
|
|
228
|
+
"optionNames": [
|
|
229
|
+
"surface",
|
|
230
|
+
"name",
|
|
231
|
+
"link-placement",
|
|
232
|
+
"link-component-token",
|
|
233
|
+
"link-to",
|
|
234
|
+
"force"
|
|
235
|
+
],
|
|
236
|
+
"requiredOptionNames": [
|
|
237
|
+
"surface"
|
|
238
|
+
],
|
|
239
|
+
"notes": [
|
|
240
|
+
"The target file decides where the settings page lives.",
|
|
241
|
+
"--surface selects the assistant runtime being configured. It does not place the file.",
|
|
242
|
+
"If the target page file already exists, rerun with --force to overwrite it."
|
|
243
|
+
],
|
|
244
|
+
"examples": [
|
|
245
|
+
{
|
|
246
|
+
"label": "Common usage",
|
|
247
|
+
"lines": [
|
|
248
|
+
"npx jskit generate assistant settings-page \\",
|
|
249
|
+
" admin/settings/index/assistant/index.vue \\",
|
|
250
|
+
" --surface admin"
|
|
251
|
+
]
|
|
252
|
+
},
|
|
253
|
+
{
|
|
254
|
+
"label": "More advanced usage",
|
|
255
|
+
"lines": [
|
|
256
|
+
"npx jskit generate assistant settings-page \\",
|
|
257
|
+
" admin/settings/index/app-assistant/index.vue \\",
|
|
258
|
+
" --surface app \\",
|
|
259
|
+
" --name \"App Assistant\""
|
|
260
|
+
]
|
|
261
|
+
}
|
|
262
|
+
]
|
|
263
|
+
}
|
|
264
|
+
},
|
|
118
265
|
"apiSummary": {
|
|
119
266
|
"surfaces": [
|
|
120
267
|
{
|
|
121
268
|
"subpath": "./server/buildTemplateContext",
|
|
122
|
-
"summary": "Builds deterministic assistant
|
|
269
|
+
"summary": "Builds deterministic assistant setup template context values from app surface metadata."
|
|
123
270
|
}
|
|
124
271
|
],
|
|
125
272
|
"containerTokens": {
|
|
@@ -137,88 +284,15 @@
|
|
|
137
284
|
"scripts": {}
|
|
138
285
|
},
|
|
139
286
|
"procfile": {},
|
|
140
|
-
"files": [
|
|
141
|
-
{
|
|
142
|
-
"from": "templates/src/pages/assistant/index.vue",
|
|
143
|
-
"toSurface": "${option:surface|lower}",
|
|
144
|
-
"toSurfacePath": "assistant/index.vue",
|
|
145
|
-
"reason": "Install generated assistant runtime page.",
|
|
146
|
-
"category": "assistant",
|
|
147
|
-
"id": "assistant-page-runtime",
|
|
148
|
-
"templateContext": {
|
|
149
|
-
"entrypoint": "src/server/buildTemplateContext.js",
|
|
150
|
-
"export": "buildTemplateContext"
|
|
151
|
-
}
|
|
152
|
-
},
|
|
153
|
-
{
|
|
154
|
-
"from": "templates/src/pages/settings/assistant/index.vue",
|
|
155
|
-
"toSurface": "${option:settings-surface|lower}",
|
|
156
|
-
"toSurfacePath": "settings/${option:settings-route-path|path}/index.vue",
|
|
157
|
-
"reason": "Install generated assistant settings section page.",
|
|
158
|
-
"category": "assistant",
|
|
159
|
-
"id": "assistant-page-settings-standard",
|
|
160
|
-
"when": {
|
|
161
|
-
"option": "settings-surface",
|
|
162
|
-
"notEquals": "admin"
|
|
163
|
-
},
|
|
164
|
-
"templateContext": {
|
|
165
|
-
"entrypoint": "src/server/buildTemplateContext.js",
|
|
166
|
-
"export": "buildTemplateContext"
|
|
167
|
-
}
|
|
168
|
-
},
|
|
169
|
-
{
|
|
170
|
-
"from": "templates/src/pages/settings/assistant/index.vue",
|
|
171
|
-
"toSurface": "${option:settings-surface|lower}",
|
|
172
|
-
"toSurfacePath": "workspace/settings/${option:settings-route-path|path}/index.vue",
|
|
173
|
-
"reason": "Install generated assistant settings section page.",
|
|
174
|
-
"category": "assistant",
|
|
175
|
-
"id": "assistant-page-settings-admin",
|
|
176
|
-
"when": {
|
|
177
|
-
"option": "settings-surface",
|
|
178
|
-
"equals": "admin"
|
|
179
|
-
},
|
|
180
|
-
"templateContext": {
|
|
181
|
-
"entrypoint": "src/server/buildTemplateContext.js",
|
|
182
|
-
"export": "buildTemplateContext"
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
],
|
|
287
|
+
"files": [],
|
|
186
288
|
"text": [
|
|
187
|
-
{
|
|
188
|
-
"op": "append-text",
|
|
189
|
-
"file": "src/placement.js",
|
|
190
|
-
"position": "bottom",
|
|
191
|
-
"skipIfContains": "assistant.generated.menu:${option:surface|lower}",
|
|
192
|
-
"value": "\n// assistant.generated.menu:${option:surface|lower}\naddPlacement({\n id: \"assistant.generated.menu.${option:surface|kebab}\",\n host: \"__ASSISTANT_MENU_PLACEMENT_HOST__\",\n position: \"__ASSISTANT_MENU_PLACEMENT_POSITION__\",\n surfaces: [\"${option:surface|lower}\"],\n order: 310,\n componentToken: \"__ASSISTANT_MENU_COMPONENT_TOKEN__\",\n props: {\n label: \"__ASSISTANT_MENU_LABEL__\",\n surface: \"${option:surface|lower}\",\n workspaceSuffix: \"__ASSISTANT_MENU_WORKSPACE_SUFFIX__\",\n nonWorkspaceSuffix: \"__ASSISTANT_MENU_NON_WORKSPACE_SUFFIX__\"\n },\n when: ({ auth }) => Boolean(auth?.authenticated)\n});\n",
|
|
193
|
-
"reason": "Append generated assistant runtime menu placement into app-owned placement registry.",
|
|
194
|
-
"category": "assistant",
|
|
195
|
-
"id": "assistant-placement-menu",
|
|
196
|
-
"templateContext": {
|
|
197
|
-
"entrypoint": "src/server/buildTemplateContext.js",
|
|
198
|
-
"export": "buildTemplateContext"
|
|
199
|
-
}
|
|
200
|
-
},
|
|
201
|
-
{
|
|
202
|
-
"op": "append-text",
|
|
203
|
-
"file": "src/placement.js",
|
|
204
|
-
"position": "bottom",
|
|
205
|
-
"skipIfContains": "assistant.generated.settings.menu:${option:surface|lower}",
|
|
206
|
-
"value": "\n// assistant.generated.settings.menu:${option:surface|lower}\naddPlacement({\n id: \"assistant.generated.settings.menu.${option:surface|kebab}\",\n host: \"__ASSISTANT_SETTINGS_HOST__\",\n position: \"primary-menu\",\n surfaces: [\"${option:settings-surface|lower}\"],\n order: 250,\n componentToken: \"users.web.shell.surface-aware-menu-link-item\",\n props: {\n label: \"__ASSISTANT_SETTINGS_MENU_LABEL__\",\n surface: \"${option:settings-surface|lower}\",\n workspaceSuffix: \"__ASSISTANT_SETTINGS_MENU_WORKSPACE_SUFFIX__\",\n nonWorkspaceSuffix: \"__ASSISTANT_SETTINGS_MENU_NON_WORKSPACE_SUFFIX__\"\n },\n when: ({ auth }) => Boolean(auth?.authenticated)\n});\n",
|
|
207
|
-
"reason": "Append generated assistant settings section menu placement into app-owned settings placements.",
|
|
208
|
-
"category": "assistant",
|
|
209
|
-
"id": "assistant-settings-menu-placement",
|
|
210
|
-
"templateContext": {
|
|
211
|
-
"entrypoint": "src/server/buildTemplateContext.js",
|
|
212
|
-
"export": "buildTemplateContext"
|
|
213
|
-
}
|
|
214
|
-
},
|
|
215
289
|
{
|
|
216
290
|
"op": "append-text",
|
|
217
291
|
"file": "config/public.js",
|
|
218
292
|
"position": "bottom",
|
|
219
293
|
"skipIfContains": "config.assistantSurfaces.${option:surface|lower} = {",
|
|
220
294
|
"value": "\nconfig.assistantSurfaces.${option:surface|lower} = {\n settingsSurfaceId: \"__ASSISTANT_SETTINGS_SURFACE_ID__\",\n configScope: \"__ASSISTANT_CONFIG_SCOPE__\"\n};\n",
|
|
221
|
-
"reason": "Register the
|
|
295
|
+
"reason": "Register the assistant runtime surface in public app config.",
|
|
222
296
|
"category": "assistant",
|
|
223
297
|
"id": "assistant-public-surface-config",
|
|
224
298
|
"templateContext": {
|
|
@@ -232,7 +306,7 @@
|
|
|
232
306
|
"position": "bottom",
|
|
233
307
|
"skipIfContains": "config.assistantServer.${option:surface|lower} = {",
|
|
234
308
|
"value": "\nconfig.assistantServer.${option:surface|lower} = {\n aiConfigPrefix: \"__ASSISTANT_AI_CONFIG_PREFIX__\"\n};\n",
|
|
235
|
-
"reason": "Register
|
|
309
|
+
"reason": "Register assistant server config for the selected runtime surface.",
|
|
236
310
|
"category": "assistant",
|
|
237
311
|
"id": "assistant-server-surface-config",
|
|
238
312
|
"templateContext": {
|
|
@@ -260,11 +334,11 @@
|
|
|
260
334
|
},
|
|
261
335
|
{
|
|
262
336
|
"packageId": "@jskit-ai/assistant-core",
|
|
263
|
-
"version": "0.1.
|
|
337
|
+
"version": "0.1.8",
|
|
264
338
|
"descriptor": {
|
|
265
339
|
"packageVersion": 1,
|
|
266
340
|
"packageId": "@jskit-ai/assistant-core",
|
|
267
|
-
"version": "0.1.
|
|
341
|
+
"version": "0.1.8",
|
|
268
342
|
"kind": "runtime",
|
|
269
343
|
"description": "Reusable assistant client/server/shared primitives without surface-specific routes or settings ownership.",
|
|
270
344
|
"dependsOn": [
|
|
@@ -310,9 +384,9 @@
|
|
|
310
384
|
"mutations": {
|
|
311
385
|
"dependencies": {
|
|
312
386
|
"runtime": {
|
|
313
|
-
"@jskit-ai/http-runtime": "0.1.
|
|
314
|
-
"@jskit-ai/kernel": "0.1.
|
|
315
|
-
"@jskit-ai/users-core": "0.1.
|
|
387
|
+
"@jskit-ai/http-runtime": "0.1.31",
|
|
388
|
+
"@jskit-ai/kernel": "0.1.32",
|
|
389
|
+
"@jskit-ai/users-core": "0.1.42",
|
|
316
390
|
"@tanstack/vue-query": "^5.90.5",
|
|
317
391
|
"dompurify": "^3.3.3",
|
|
318
392
|
"marked": "^17.0.4",
|
|
@@ -333,11 +407,11 @@
|
|
|
333
407
|
},
|
|
334
408
|
{
|
|
335
409
|
"packageId": "@jskit-ai/assistant-runtime",
|
|
336
|
-
"version": "0.1.
|
|
410
|
+
"version": "0.1.3",
|
|
337
411
|
"descriptor": {
|
|
338
412
|
"packageVersion": 1,
|
|
339
413
|
"packageId": "@jskit-ai/assistant-runtime",
|
|
340
|
-
"version": "0.1.
|
|
414
|
+
"version": "0.1.3",
|
|
341
415
|
"kind": "runtime",
|
|
342
416
|
"description": "Shared assistant runtime with per-surface assistant registration.",
|
|
343
417
|
"dependsOn": [
|
|
@@ -412,13 +486,13 @@
|
|
|
412
486
|
"mutations": {
|
|
413
487
|
"dependencies": {
|
|
414
488
|
"runtime": {
|
|
415
|
-
"@jskit-ai/assistant-core": "0.1.
|
|
416
|
-
"@jskit-ai/database-runtime": "0.1.
|
|
417
|
-
"@jskit-ai/http-runtime": "0.1.
|
|
418
|
-
"@jskit-ai/kernel": "0.1.
|
|
419
|
-
"@jskit-ai/shell-web": "0.1.
|
|
420
|
-
"@jskit-ai/users-core": "0.1.
|
|
421
|
-
"@jskit-ai/users-web": "0.1.
|
|
489
|
+
"@jskit-ai/assistant-core": "0.1.8",
|
|
490
|
+
"@jskit-ai/database-runtime": "0.1.32",
|
|
491
|
+
"@jskit-ai/http-runtime": "0.1.31",
|
|
492
|
+
"@jskit-ai/kernel": "0.1.32",
|
|
493
|
+
"@jskit-ai/shell-web": "0.1.31",
|
|
494
|
+
"@jskit-ai/users-core": "0.1.42",
|
|
495
|
+
"@jskit-ai/users-web": "0.1.47",
|
|
422
496
|
"@tanstack/vue-query": "^5.90.5",
|
|
423
497
|
"vuetify": "^4.0.0"
|
|
424
498
|
},
|
|
@@ -475,11 +549,11 @@
|
|
|
475
549
|
},
|
|
476
550
|
{
|
|
477
551
|
"packageId": "@jskit-ai/auth-core",
|
|
478
|
-
"version": "0.1.
|
|
552
|
+
"version": "0.1.31",
|
|
479
553
|
"descriptor": {
|
|
480
554
|
"packageVersion": 1,
|
|
481
555
|
"packageId": "@jskit-ai/auth-core",
|
|
482
|
-
"version": "0.1.
|
|
556
|
+
"version": "0.1.31",
|
|
483
557
|
"kind": "runtime",
|
|
484
558
|
"dependsOn": [
|
|
485
559
|
"@jskit-ai/value-app-config-shared"
|
|
@@ -547,7 +621,7 @@
|
|
|
547
621
|
"mutations": {
|
|
548
622
|
"dependencies": {
|
|
549
623
|
"runtime": {
|
|
550
|
-
"@jskit-ai/kernel": "0.1.
|
|
624
|
+
"@jskit-ai/kernel": "0.1.32",
|
|
551
625
|
"@fastify/cookie": "^11.0.2",
|
|
552
626
|
"@fastify/csrf-protection": "^7.1.0",
|
|
553
627
|
"@fastify/rate-limit": "^10.3.0"
|
|
@@ -565,11 +639,11 @@
|
|
|
565
639
|
},
|
|
566
640
|
{
|
|
567
641
|
"packageId": "@jskit-ai/auth-provider-supabase-core",
|
|
568
|
-
"version": "0.1.
|
|
642
|
+
"version": "0.1.31",
|
|
569
643
|
"descriptor": {
|
|
570
644
|
"packageVersion": 1,
|
|
571
645
|
"packageId": "@jskit-ai/auth-provider-supabase-core",
|
|
572
|
-
"version": "0.1.
|
|
646
|
+
"version": "0.1.31",
|
|
573
647
|
"kind": "runtime",
|
|
574
648
|
"options": {
|
|
575
649
|
"auth-supabase-url": {
|
|
@@ -651,8 +725,8 @@
|
|
|
651
725
|
"mutations": {
|
|
652
726
|
"dependencies": {
|
|
653
727
|
"runtime": {
|
|
654
|
-
"@jskit-ai/auth-core": "0.1.
|
|
655
|
-
"@jskit-ai/kernel": "0.1.
|
|
728
|
+
"@jskit-ai/auth-core": "0.1.31",
|
|
729
|
+
"@jskit-ai/kernel": "0.1.32",
|
|
656
730
|
"dotenv": "^16.4.5",
|
|
657
731
|
"@supabase/supabase-js": "^2.57.4",
|
|
658
732
|
"jose": "^6.1.0"
|
|
@@ -717,11 +791,11 @@
|
|
|
717
791
|
},
|
|
718
792
|
{
|
|
719
793
|
"packageId": "@jskit-ai/auth-web",
|
|
720
|
-
"version": "0.1.
|
|
794
|
+
"version": "0.1.33",
|
|
721
795
|
"descriptor": {
|
|
722
796
|
"packageVersion": 1,
|
|
723
797
|
"packageId": "@jskit-ai/auth-web",
|
|
724
|
-
"version": "0.1.
|
|
798
|
+
"version": "0.1.33",
|
|
725
799
|
"kind": "runtime",
|
|
726
800
|
"description": "Auth web module: Fastify auth routes plus web login/sign-out scaffolds.",
|
|
727
801
|
"dependsOn": [
|
|
@@ -951,10 +1025,10 @@
|
|
|
951
1025
|
"@tanstack/vue-query": "5.92.12",
|
|
952
1026
|
"@mdi/js": "^7.4.47",
|
|
953
1027
|
"@fastify/type-provider-typebox": "^6.1.0",
|
|
954
|
-
"@jskit-ai/auth-core": "0.1.
|
|
955
|
-
"@jskit-ai/http-runtime": "0.1.
|
|
956
|
-
"@jskit-ai/kernel": "0.1.
|
|
957
|
-
"@jskit-ai/shell-web": "0.1.
|
|
1028
|
+
"@jskit-ai/auth-core": "0.1.31",
|
|
1029
|
+
"@jskit-ai/http-runtime": "0.1.31",
|
|
1030
|
+
"@jskit-ai/kernel": "0.1.32",
|
|
1031
|
+
"@jskit-ai/shell-web": "0.1.31",
|
|
958
1032
|
"vuetify": "^4.0.0"
|
|
959
1033
|
},
|
|
960
1034
|
"dev": {}
|
|
@@ -1024,11 +1098,11 @@
|
|
|
1024
1098
|
},
|
|
1025
1099
|
{
|
|
1026
1100
|
"packageId": "@jskit-ai/crud-core",
|
|
1027
|
-
"version": "0.1.
|
|
1101
|
+
"version": "0.1.40",
|
|
1028
1102
|
"descriptor": {
|
|
1029
1103
|
"packageVersion": 1,
|
|
1030
1104
|
"packageId": "@jskit-ai/crud-core",
|
|
1031
|
-
"version": "0.1.
|
|
1105
|
+
"version": "0.1.40",
|
|
1032
1106
|
"kind": "runtime",
|
|
1033
1107
|
"description": "Shared CRUD helpers used by CRUD modules.",
|
|
1034
1108
|
"dependsOn": [
|
|
@@ -1055,7 +1129,7 @@
|
|
|
1055
1129
|
"mutations": {
|
|
1056
1130
|
"dependencies": {
|
|
1057
1131
|
"runtime": {
|
|
1058
|
-
"@jskit-ai/crud-core": "0.1.
|
|
1132
|
+
"@jskit-ai/crud-core": "0.1.40"
|
|
1059
1133
|
},
|
|
1060
1134
|
"dev": {}
|
|
1061
1135
|
},
|
|
@@ -1069,11 +1143,11 @@
|
|
|
1069
1143
|
},
|
|
1070
1144
|
{
|
|
1071
1145
|
"packageId": "@jskit-ai/crud-server-generator",
|
|
1072
|
-
"version": "0.1.
|
|
1146
|
+
"version": "0.1.40",
|
|
1073
1147
|
"descriptor": {
|
|
1074
1148
|
"packageVersion": 1,
|
|
1075
1149
|
"packageId": "@jskit-ai/crud-server-generator",
|
|
1076
|
-
"version": "0.1.
|
|
1150
|
+
"version": "0.1.40",
|
|
1077
1151
|
"kind": "generator",
|
|
1078
1152
|
"description": "CRUD server generator with routes, actions, and persistence scaffolding.",
|
|
1079
1153
|
"options": {
|
|
@@ -1087,6 +1161,7 @@
|
|
|
1087
1161
|
"surface": {
|
|
1088
1162
|
"required": true,
|
|
1089
1163
|
"inputType": "text",
|
|
1164
|
+
"validationType": "enabled-surface-id",
|
|
1090
1165
|
"promptLabel": "Target surface",
|
|
1091
1166
|
"promptHint": "Must match an enabled surface id."
|
|
1092
1167
|
},
|
|
@@ -1117,6 +1192,13 @@
|
|
|
1117
1192
|
"defaultValue": "id",
|
|
1118
1193
|
"promptLabel": "Id column",
|
|
1119
1194
|
"promptHint": "Primary key column used by CRUD endpoints (default: id)."
|
|
1195
|
+
},
|
|
1196
|
+
"force": {
|
|
1197
|
+
"required": false,
|
|
1198
|
+
"inputType": "flag",
|
|
1199
|
+
"defaultValue": "",
|
|
1200
|
+
"promptLabel": "Force overwrite",
|
|
1201
|
+
"promptHint": "Overwrite generated scaffold files if the namespace package directory already exists."
|
|
1120
1202
|
}
|
|
1121
1203
|
},
|
|
1122
1204
|
"optionPolicies": {
|
|
@@ -1164,8 +1246,14 @@
|
|
|
1164
1246
|
"ownership-filter",
|
|
1165
1247
|
"table-name",
|
|
1166
1248
|
"id-column",
|
|
1167
|
-
"directory-prefix"
|
|
1168
|
-
|
|
1249
|
+
"directory-prefix",
|
|
1250
|
+
"force"
|
|
1251
|
+
],
|
|
1252
|
+
"createTarget": {
|
|
1253
|
+
"pathTemplate": "packages/${option:namespace|kebab}",
|
|
1254
|
+
"label": "package directory",
|
|
1255
|
+
"allowExistingEmptyDirectory": false
|
|
1256
|
+
}
|
|
1169
1257
|
},
|
|
1170
1258
|
"scaffold-field": {
|
|
1171
1259
|
"entrypoint": "src/server/subcommands/addField.js",
|
|
@@ -1208,13 +1296,13 @@
|
|
|
1208
1296
|
"mutations": {
|
|
1209
1297
|
"dependencies": {
|
|
1210
1298
|
"runtime": {
|
|
1211
|
-
"@jskit-ai/auth-core": "0.1.
|
|
1212
|
-
"@jskit-ai/crud-core": "0.1.
|
|
1213
|
-
"@jskit-ai/database-runtime": "0.1.
|
|
1214
|
-
"@jskit-ai/http-runtime": "0.1.
|
|
1215
|
-
"@jskit-ai/kernel": "0.1.
|
|
1216
|
-
"@jskit-ai/realtime": "0.1.
|
|
1217
|
-
"@jskit-ai/users-core": "0.1.
|
|
1299
|
+
"@jskit-ai/auth-core": "0.1.31",
|
|
1300
|
+
"@jskit-ai/crud-core": "0.1.40",
|
|
1301
|
+
"@jskit-ai/database-runtime": "0.1.32",
|
|
1302
|
+
"@jskit-ai/http-runtime": "0.1.31",
|
|
1303
|
+
"@jskit-ai/kernel": "0.1.32",
|
|
1304
|
+
"@jskit-ai/realtime": "0.1.31",
|
|
1305
|
+
"@jskit-ai/users-core": "0.1.42",
|
|
1218
1306
|
"@local/${option:namespace|kebab}": "file:packages/${option:namespace|kebab}",
|
|
1219
1307
|
"typebox": "^1.0.81"
|
|
1220
1308
|
},
|
|
@@ -1338,26 +1426,21 @@
|
|
|
1338
1426
|
},
|
|
1339
1427
|
{
|
|
1340
1428
|
"packageId": "@jskit-ai/crud-ui-generator",
|
|
1341
|
-
"version": "0.1.
|
|
1429
|
+
"version": "0.1.15",
|
|
1342
1430
|
"descriptor": {
|
|
1343
1431
|
"packageVersion": 1,
|
|
1344
1432
|
"packageId": "@jskit-ai/crud-ui-generator",
|
|
1345
|
-
"version": "0.1.
|
|
1433
|
+
"version": "0.1.15",
|
|
1346
1434
|
"kind": "generator",
|
|
1347
|
-
"description": "Generate
|
|
1435
|
+
"description": "Generate CRUD route trees from resource validators at an explicit route root relative to src/pages/.",
|
|
1348
1436
|
"options": {
|
|
1349
|
-
"
|
|
1437
|
+
"target-root": {
|
|
1350
1438
|
"required": true,
|
|
1351
1439
|
"inputType": "text",
|
|
1352
1440
|
"defaultValue": "",
|
|
1353
|
-
"
|
|
1354
|
-
"
|
|
1355
|
-
|
|
1356
|
-
"surface": {
|
|
1357
|
-
"required": true,
|
|
1358
|
-
"inputType": "text",
|
|
1359
|
-
"promptLabel": "Target surface",
|
|
1360
|
-
"promptHint": "Must match an enabled surface id."
|
|
1441
|
+
"normalizationType": "pages-relative-target-root",
|
|
1442
|
+
"promptLabel": "Target route root",
|
|
1443
|
+
"promptHint": "Explicit route root relative to src/pages/ (example: admin/catalog/products)."
|
|
1361
1444
|
},
|
|
1362
1445
|
"resource-file": {
|
|
1363
1446
|
"required": true,
|
|
@@ -1367,11 +1450,11 @@
|
|
|
1367
1450
|
"promptHint": "Relative path from app root to the resource module."
|
|
1368
1451
|
},
|
|
1369
1452
|
"operations": {
|
|
1370
|
-
"required":
|
|
1453
|
+
"required": false,
|
|
1371
1454
|
"inputType": "text",
|
|
1372
|
-
"defaultValue": "",
|
|
1455
|
+
"defaultValue": "list,view,new,edit",
|
|
1373
1456
|
"promptLabel": "Operations",
|
|
1374
|
-
"promptHint": "
|
|
1457
|
+
"promptHint": "Optional comma-separated values from: list, view, new, edit. Defaults to all four."
|
|
1375
1458
|
},
|
|
1376
1459
|
"display-fields": {
|
|
1377
1460
|
"required": false,
|
|
@@ -1380,27 +1463,6 @@
|
|
|
1380
1463
|
"promptLabel": "Display fields",
|
|
1381
1464
|
"promptHint": "Optional comma-separated field keys to render (must exist in selected operation schemas)."
|
|
1382
1465
|
},
|
|
1383
|
-
"api-path": {
|
|
1384
|
-
"required": false,
|
|
1385
|
-
"inputType": "text",
|
|
1386
|
-
"defaultFromOptionTemplate": "/${option:namespace|kebab}",
|
|
1387
|
-
"promptLabel": "API path",
|
|
1388
|
-
"promptHint": "Base API path without trailing id (defaults to /<namespace>, example: /contacts)."
|
|
1389
|
-
},
|
|
1390
|
-
"route-path": {
|
|
1391
|
-
"required": false,
|
|
1392
|
-
"inputType": "text",
|
|
1393
|
-
"defaultFromOptionTemplate": "${option:namespace|kebab}",
|
|
1394
|
-
"promptLabel": "Route path",
|
|
1395
|
-
"promptHint": "List route path under the target surface (defaults to <namespace>, example: contacts)."
|
|
1396
|
-
},
|
|
1397
|
-
"container": {
|
|
1398
|
-
"required": false,
|
|
1399
|
-
"inputType": "text",
|
|
1400
|
-
"defaultValue": "",
|
|
1401
|
-
"promptLabel": "Container host",
|
|
1402
|
-
"promptHint": "Optional container host slug (example: practice). Routes are generated under this prefix and list menu placement defaults to <container>:sub-pages."
|
|
1403
|
-
},
|
|
1404
1466
|
"id-param": {
|
|
1405
1467
|
"required": false,
|
|
1406
1468
|
"inputType": "text",
|
|
@@ -1408,33 +1470,26 @@
|
|
|
1408
1470
|
"promptLabel": "Route id param",
|
|
1409
1471
|
"promptHint": "Route param used by view and edit pages (default: recordId)."
|
|
1410
1472
|
},
|
|
1411
|
-
"
|
|
1412
|
-
"required": false,
|
|
1413
|
-
"inputType": "text",
|
|
1414
|
-
"defaultValue": "",
|
|
1415
|
-
"promptLabel": "Page directory prefix",
|
|
1416
|
-
"promptHint": "Optional subpath under the selected surface pages root (example: crm or ops/team-a)."
|
|
1417
|
-
},
|
|
1418
|
-
"placement": {
|
|
1473
|
+
"force": {
|
|
1419
1474
|
"required": false,
|
|
1420
|
-
"inputType": "
|
|
1475
|
+
"inputType": "flag",
|
|
1421
1476
|
"defaultValue": "",
|
|
1422
|
-
"promptLabel": "
|
|
1423
|
-
"promptHint": "
|
|
1477
|
+
"promptLabel": "Force overwrite",
|
|
1478
|
+
"promptHint": "Overwrite generated CRUD files if the target root already exists."
|
|
1424
1479
|
},
|
|
1425
|
-
"placement
|
|
1480
|
+
"link-placement": {
|
|
1426
1481
|
"required": false,
|
|
1427
1482
|
"inputType": "text",
|
|
1428
1483
|
"defaultValue": "",
|
|
1429
|
-
"promptLabel": "
|
|
1430
|
-
"promptHint": "Optional
|
|
1484
|
+
"promptLabel": "Link placement",
|
|
1485
|
+
"promptHint": "Optional host:position override for the generated list-page link placement."
|
|
1431
1486
|
},
|
|
1432
|
-
"
|
|
1487
|
+
"namespace": {
|
|
1433
1488
|
"required": false,
|
|
1434
1489
|
"inputType": "text",
|
|
1435
1490
|
"defaultValue": "",
|
|
1436
|
-
"promptLabel": "
|
|
1437
|
-
"promptHint": "Optional
|
|
1491
|
+
"promptLabel": "Namespace override",
|
|
1492
|
+
"promptHint": "Optional CRUD namespace override when the resource export does not expose resource.resource."
|
|
1438
1493
|
}
|
|
1439
1494
|
},
|
|
1440
1495
|
"dependsOn": [],
|
|
@@ -1455,6 +1510,63 @@
|
|
|
1455
1510
|
"metadata": {
|
|
1456
1511
|
"generatorPrimarySubcommand": "crud",
|
|
1457
1512
|
"generatorSubcommands": {
|
|
1513
|
+
"crud": {
|
|
1514
|
+
"description": "Create CRUD pages at an explicit route root relative to src/pages/.",
|
|
1515
|
+
"longDescription": [
|
|
1516
|
+
"CRUD generation follows the same page-placement model as `ui-generator page`.",
|
|
1517
|
+
"That means the generated list page link uses the same nearest-parent-host inference, tab-link inference, and relative `props.to` inference as a normal generated page. If you want the detailed host behavior, read `jskit generate ui-generator page help`."
|
|
1518
|
+
],
|
|
1519
|
+
"positionalArgs": [
|
|
1520
|
+
{
|
|
1521
|
+
"name": "target-root",
|
|
1522
|
+
"required": true,
|
|
1523
|
+
"descriptionKey": "crud-target-root"
|
|
1524
|
+
}
|
|
1525
|
+
],
|
|
1526
|
+
"optionNames": [
|
|
1527
|
+
"resource-file",
|
|
1528
|
+
"operations",
|
|
1529
|
+
"display-fields",
|
|
1530
|
+
"id-param",
|
|
1531
|
+
"link-placement",
|
|
1532
|
+
"namespace",
|
|
1533
|
+
"force"
|
|
1534
|
+
],
|
|
1535
|
+
"requiredOptionNames": [
|
|
1536
|
+
"resource-file"
|
|
1537
|
+
],
|
|
1538
|
+
"createTarget": {
|
|
1539
|
+
"pathTemplate": "src/pages/${option:target-root|trim}",
|
|
1540
|
+
"label": "target root",
|
|
1541
|
+
"allowExistingEmptyDirectory": true
|
|
1542
|
+
},
|
|
1543
|
+
"notes": [
|
|
1544
|
+
"The target root is the real route root relative to src/pages/.... JSKIT derives the surface and route from that path.",
|
|
1545
|
+
"Operations default to list,view,new,edit. For list-page placement behavior, use the same mental model as ui-generator page.",
|
|
1546
|
+
"If the target root already exists and is not empty, rerun with --force to overwrite generated files."
|
|
1547
|
+
],
|
|
1548
|
+
"examples": [
|
|
1549
|
+
{
|
|
1550
|
+
"label": "Common usage",
|
|
1551
|
+
"lines": [
|
|
1552
|
+
"npx jskit generate crud-ui-generator crud \\",
|
|
1553
|
+
" admin/catalog/index/products \\",
|
|
1554
|
+
" --resource-file packages/products/src/shared/productResource.js"
|
|
1555
|
+
]
|
|
1556
|
+
},
|
|
1557
|
+
{
|
|
1558
|
+
"label": "More advanced usage",
|
|
1559
|
+
"lines": [
|
|
1560
|
+
"npx jskit generate crud-ui-generator crud \\",
|
|
1561
|
+
" admin/customers/[customerId]/index/pets \\",
|
|
1562
|
+
" --resource-file packages/pets/src/shared/petResource.js \\",
|
|
1563
|
+
" --id-param petId \\",
|
|
1564
|
+
" --display-fields name,breedId,sex \\",
|
|
1565
|
+
" --force"
|
|
1566
|
+
]
|
|
1567
|
+
}
|
|
1568
|
+
]
|
|
1569
|
+
},
|
|
1458
1570
|
"field": {
|
|
1459
1571
|
"entrypoint": "src/server/subcommands/addField.js",
|
|
1460
1572
|
"export": "runGeneratorSubcommand"
|
|
@@ -1464,7 +1576,7 @@
|
|
|
1464
1576
|
"surfaces": [
|
|
1465
1577
|
{
|
|
1466
1578
|
"subpath": "./server/buildTemplateContext",
|
|
1467
|
-
"summary": "Builds deterministic template context values from
|
|
1579
|
+
"summary": "Builds deterministic CRUD UI template context values from the explicit route root and resource validators."
|
|
1468
1580
|
}
|
|
1469
1581
|
],
|
|
1470
1582
|
"containerTokens": {
|
|
@@ -1476,7 +1588,7 @@
|
|
|
1476
1588
|
"mutations": {
|
|
1477
1589
|
"dependencies": {
|
|
1478
1590
|
"runtime": {
|
|
1479
|
-
"@jskit-ai/users-web": "0.1.
|
|
1591
|
+
"@jskit-ai/users-web": "0.1.47"
|
|
1480
1592
|
},
|
|
1481
1593
|
"dev": {}
|
|
1482
1594
|
},
|
|
@@ -1487,11 +1599,10 @@
|
|
|
1487
1599
|
"files": [
|
|
1488
1600
|
{
|
|
1489
1601
|
"from": "templates/src/pages/admin/ui-generator/ListElement.vue",
|
|
1490
|
-
"
|
|
1491
|
-
"toSurfacePath": "${option:directory-prefix|pathprefix}${option:container|pathprefix}${option:route-path|path}/index.vue",
|
|
1602
|
+
"to": "src/pages/${option:target-root|trim}/index.vue",
|
|
1492
1603
|
"reason": "Install generated list page.",
|
|
1493
|
-
"category": "ui-generator",
|
|
1494
|
-
"id": "ui-
|
|
1604
|
+
"category": "crud-ui-generator",
|
|
1605
|
+
"id": "crud-ui-page-list-${option:target-root|snake}",
|
|
1495
1606
|
"templateContext": {
|
|
1496
1607
|
"entrypoint": "src/server/buildTemplateContext.js",
|
|
1497
1608
|
"export": "buildUiTemplateContext"
|
|
@@ -1505,11 +1616,10 @@
|
|
|
1505
1616
|
},
|
|
1506
1617
|
{
|
|
1507
1618
|
"from": "templates/src/pages/admin/ui-generator/ViewElement.vue",
|
|
1508
|
-
"
|
|
1509
|
-
"toSurfacePath": "${option:directory-prefix|pathprefix}${option:container|pathprefix}${option:route-path|path}/[${option:id-param|trim}]/index.vue",
|
|
1619
|
+
"to": "src/pages/${option:target-root|trim}/[${option:id-param|trim}]/index.vue",
|
|
1510
1620
|
"reason": "Install generated view page.",
|
|
1511
|
-
"category": "ui-generator",
|
|
1512
|
-
"id": "ui-
|
|
1621
|
+
"category": "crud-ui-generator",
|
|
1622
|
+
"id": "crud-ui-page-view-${option:target-root|snake}",
|
|
1513
1623
|
"templateContext": {
|
|
1514
1624
|
"entrypoint": "src/server/buildTemplateContext.js",
|
|
1515
1625
|
"export": "buildUiTemplateContext"
|
|
@@ -1523,11 +1633,10 @@
|
|
|
1523
1633
|
},
|
|
1524
1634
|
{
|
|
1525
1635
|
"from": "templates/src/pages/admin/ui-generator/NewWrapperElement.vue",
|
|
1526
|
-
"
|
|
1527
|
-
"toSurfacePath": "${option:directory-prefix|pathprefix}${option:container|pathprefix}${option:route-path|path}/new.vue",
|
|
1636
|
+
"to": "src/pages/${option:target-root|trim}/new.vue",
|
|
1528
1637
|
"reason": "Install generated new page.",
|
|
1529
|
-
"category": "ui-generator",
|
|
1530
|
-
"id": "ui-
|
|
1638
|
+
"category": "crud-ui-generator",
|
|
1639
|
+
"id": "crud-ui-page-new-${option:target-root|snake}",
|
|
1531
1640
|
"templateContext": {
|
|
1532
1641
|
"entrypoint": "src/server/buildTemplateContext.js",
|
|
1533
1642
|
"export": "buildUiTemplateContext"
|
|
@@ -1551,11 +1660,10 @@
|
|
|
1551
1660
|
},
|
|
1552
1661
|
{
|
|
1553
1662
|
"from": "templates/src/pages/admin/ui-generator/EditWrapperElement.vue",
|
|
1554
|
-
"
|
|
1555
|
-
"toSurfacePath": "${option:directory-prefix|pathprefix}${option:container|pathprefix}${option:route-path|path}/[${option:id-param|trim}]/edit.vue",
|
|
1663
|
+
"to": "src/pages/${option:target-root|trim}/[${option:id-param|trim}]/edit.vue",
|
|
1556
1664
|
"reason": "Install generated edit page.",
|
|
1557
|
-
"category": "ui-generator",
|
|
1558
|
-
"id": "ui-
|
|
1665
|
+
"category": "crud-ui-generator",
|
|
1666
|
+
"id": "crud-ui-page-edit-${option:target-root|snake}",
|
|
1559
1667
|
"templateContext": {
|
|
1560
1668
|
"entrypoint": "src/server/buildTemplateContext.js",
|
|
1561
1669
|
"export": "buildUiTemplateContext"
|
|
@@ -1579,11 +1687,10 @@
|
|
|
1579
1687
|
},
|
|
1580
1688
|
{
|
|
1581
1689
|
"from": "templates/src/pages/admin/ui-generator/AddEditForm.vue",
|
|
1582
|
-
"
|
|
1583
|
-
"toSurfacePath": "${option:directory-prefix|pathprefix}${option:container|pathprefix}${option:route-path|path}/_components/${option:namespace|singular|pascal|default(Record)}AddEditForm.vue",
|
|
1690
|
+
"to": "src/pages/${option:target-root|trim}/_components/CrudAddEditForm.vue",
|
|
1584
1691
|
"reason": "Install generated shared add/edit form component.",
|
|
1585
|
-
"category": "ui-generator",
|
|
1586
|
-
"id": "ui-
|
|
1692
|
+
"category": "crud-ui-generator",
|
|
1693
|
+
"id": "crud-ui-page-add-edit-form-${option:target-root|snake}",
|
|
1587
1694
|
"templateContext": {
|
|
1588
1695
|
"entrypoint": "src/server/buildTemplateContext.js",
|
|
1589
1696
|
"export": "buildUiTemplateContext"
|
|
@@ -1607,11 +1714,10 @@
|
|
|
1607
1714
|
},
|
|
1608
1715
|
{
|
|
1609
1716
|
"from": "templates/src/pages/admin/ui-generator/AddEditFormFields.js",
|
|
1610
|
-
"
|
|
1611
|
-
"toSurfacePath": "${option:directory-prefix|pathprefix}${option:container|pathprefix}${option:route-path|path}/_components/${option:namespace|singular|pascal|default(Record)}AddEditFormFields.js",
|
|
1717
|
+
"to": "src/pages/${option:target-root|trim}/_components/CrudAddEditFormFields.js",
|
|
1612
1718
|
"reason": "Install generated shared add/edit form field definitions.",
|
|
1613
|
-
"category": "ui-generator",
|
|
1614
|
-
"id": "ui-
|
|
1719
|
+
"category": "crud-ui-generator",
|
|
1720
|
+
"id": "crud-ui-page-add-edit-form-fields-${option:target-root|snake}",
|
|
1615
1721
|
"templateContext": {
|
|
1616
1722
|
"entrypoint": "src/server/buildTemplateContext.js",
|
|
1617
1723
|
"export": "buildUiTemplateContext"
|
|
@@ -1635,11 +1741,10 @@
|
|
|
1635
1741
|
},
|
|
1636
1742
|
{
|
|
1637
1743
|
"from": "templates/src/pages/admin/ui-generator/NewElement.vue",
|
|
1638
|
-
"
|
|
1639
|
-
"toSurfacePath": "${option:directory-prefix|pathprefix}${option:container|pathprefix}${option:route-path|path}/new.vue",
|
|
1744
|
+
"to": "src/pages/${option:target-root|trim}/new.vue",
|
|
1640
1745
|
"reason": "Install generated new page.",
|
|
1641
|
-
"category": "ui-generator",
|
|
1642
|
-
"id": "ui-
|
|
1746
|
+
"category": "crud-ui-generator",
|
|
1747
|
+
"id": "crud-ui-page-new-standalone-${option:target-root|snake}",
|
|
1643
1748
|
"templateContext": {
|
|
1644
1749
|
"entrypoint": "src/server/buildTemplateContext.js",
|
|
1645
1750
|
"export": "buildUiTemplateContext"
|
|
@@ -1663,11 +1768,10 @@
|
|
|
1663
1768
|
},
|
|
1664
1769
|
{
|
|
1665
1770
|
"from": "templates/src/pages/admin/ui-generator/EditElement.vue",
|
|
1666
|
-
"
|
|
1667
|
-
"toSurfacePath": "${option:directory-prefix|pathprefix}${option:container|pathprefix}${option:route-path|path}/[${option:id-param|trim}]/edit.vue",
|
|
1771
|
+
"to": "src/pages/${option:target-root|trim}/[${option:id-param|trim}]/edit.vue",
|
|
1668
1772
|
"reason": "Install generated edit page.",
|
|
1669
|
-
"category": "ui-generator",
|
|
1670
|
-
"id": "ui-
|
|
1773
|
+
"category": "crud-ui-generator",
|
|
1774
|
+
"id": "crud-ui-page-edit-standalone-${option:target-root|snake}",
|
|
1671
1775
|
"templateContext": {
|
|
1672
1776
|
"entrypoint": "src/server/buildTemplateContext.js",
|
|
1673
1777
|
"export": "buildUiTemplateContext"
|
|
@@ -1695,51 +1799,19 @@
|
|
|
1695
1799
|
"op": "append-text",
|
|
1696
1800
|
"file": "src/placement.js",
|
|
1697
1801
|
"position": "bottom",
|
|
1698
|
-
"skipIfContains": "
|
|
1699
|
-
"value": "\n//
|
|
1700
|
-
"reason": "Append generated
|
|
1701
|
-
"category": "ui-generator",
|
|
1702
|
-
"id": "ui-
|
|
1802
|
+
"skipIfContains": "__JSKIT_UI_MENU_MARKER__",
|
|
1803
|
+
"value": "\n// __JSKIT_UI_MENU_MARKER__\n{\n addPlacement({\n id: \"__JSKIT_UI_MENU_PLACEMENT_ID__\",\n host: \"__JSKIT_UI_MENU_PLACEMENT_HOST__\",\n position: \"__JSKIT_UI_MENU_PLACEMENT_POSITION__\",\n surfaces: [\"__JSKIT_UI_SURFACE_ID__\"],\n order: 155,\n componentToken: \"__JSKIT_UI_MENU_COMPONENT_TOKEN__\",\n props: {\n label: \"__JSKIT_UI_MENU_LABEL__\",\n surface: \"__JSKIT_UI_SURFACE_ID__\",\n workspaceSuffix: \"__JSKIT_UI_MENU_WORKSPACE_SUFFIX__\",\n nonWorkspaceSuffix: \"__JSKIT_UI_MENU_NON_WORKSPACE_SUFFIX__\",\n__JSKIT_UI_MENU_TO_PROP_LINE__ },\n when: ({ auth }) => Boolean(auth?.authenticated)\n });\n}\n",
|
|
1804
|
+
"reason": "Append generated CRUD list-page placement.",
|
|
1805
|
+
"category": "crud-ui-generator",
|
|
1806
|
+
"id": "crud-ui-placement-menu",
|
|
1703
1807
|
"templateContext": {
|
|
1704
1808
|
"entrypoint": "src/server/buildTemplateContext.js",
|
|
1705
1809
|
"export": "buildUiTemplateContext"
|
|
1706
1810
|
},
|
|
1707
1811
|
"when": {
|
|
1708
|
-
"
|
|
1709
|
-
|
|
1710
|
-
|
|
1711
|
-
"in": [
|
|
1712
|
-
"list"
|
|
1713
|
-
]
|
|
1714
|
-
},
|
|
1715
|
-
{
|
|
1716
|
-
"any": [
|
|
1717
|
-
{
|
|
1718
|
-
"all": [
|
|
1719
|
-
{
|
|
1720
|
-
"option": "route-path",
|
|
1721
|
-
"notContains": "["
|
|
1722
|
-
},
|
|
1723
|
-
{
|
|
1724
|
-
"option": "directory-prefix",
|
|
1725
|
-
"notContains": "["
|
|
1726
|
-
}
|
|
1727
|
-
]
|
|
1728
|
-
},
|
|
1729
|
-
{
|
|
1730
|
-
"all": [
|
|
1731
|
-
{
|
|
1732
|
-
"option": "placement",
|
|
1733
|
-
"contains": ":"
|
|
1734
|
-
},
|
|
1735
|
-
{
|
|
1736
|
-
"option": "placement-to",
|
|
1737
|
-
"notEquals": ""
|
|
1738
|
-
}
|
|
1739
|
-
]
|
|
1740
|
-
}
|
|
1741
|
-
]
|
|
1742
|
-
}
|
|
1812
|
+
"option": "operations",
|
|
1813
|
+
"in": [
|
|
1814
|
+
"list"
|
|
1743
1815
|
]
|
|
1744
1816
|
}
|
|
1745
1817
|
}
|
|
@@ -1749,11 +1821,11 @@
|
|
|
1749
1821
|
},
|
|
1750
1822
|
{
|
|
1751
1823
|
"packageId": "@jskit-ai/database-runtime",
|
|
1752
|
-
"version": "0.1.
|
|
1824
|
+
"version": "0.1.32",
|
|
1753
1825
|
"descriptor": {
|
|
1754
1826
|
"packageVersion": 1,
|
|
1755
1827
|
"packageId": "@jskit-ai/database-runtime",
|
|
1756
|
-
"version": "0.1.
|
|
1828
|
+
"version": "0.1.32",
|
|
1757
1829
|
"kind": "runtime",
|
|
1758
1830
|
"dependsOn": [
|
|
1759
1831
|
"@jskit-ai/kernel"
|
|
@@ -1810,7 +1882,7 @@
|
|
|
1810
1882
|
"mutations": {
|
|
1811
1883
|
"dependencies": {
|
|
1812
1884
|
"runtime": {
|
|
1813
|
-
"@jskit-ai/kernel": "0.1.
|
|
1885
|
+
"@jskit-ai/kernel": "0.1.32",
|
|
1814
1886
|
"dotenv": "^16.4.5",
|
|
1815
1887
|
"knex": "^3.1.0"
|
|
1816
1888
|
},
|
|
@@ -1845,11 +1917,11 @@
|
|
|
1845
1917
|
},
|
|
1846
1918
|
{
|
|
1847
1919
|
"packageId": "@jskit-ai/database-runtime-mysql",
|
|
1848
|
-
"version": "0.1.
|
|
1920
|
+
"version": "0.1.31",
|
|
1849
1921
|
"descriptor": {
|
|
1850
1922
|
"packageVersion": 1,
|
|
1851
1923
|
"packageId": "@jskit-ai/database-runtime-mysql",
|
|
1852
|
-
"version": "0.1.
|
|
1924
|
+
"version": "0.1.31",
|
|
1853
1925
|
"kind": "runtime",
|
|
1854
1926
|
"options": {
|
|
1855
1927
|
"db-host": {
|
|
@@ -1939,7 +2011,7 @@
|
|
|
1939
2011
|
"mutations": {
|
|
1940
2012
|
"dependencies": {
|
|
1941
2013
|
"runtime": {
|
|
1942
|
-
"@jskit-ai/database-runtime": "0.1.
|
|
2014
|
+
"@jskit-ai/database-runtime": "0.1.32",
|
|
1943
2015
|
"mysql2": "^3.11.2"
|
|
1944
2016
|
},
|
|
1945
2017
|
"dev": {}
|
|
@@ -2010,11 +2082,11 @@
|
|
|
2010
2082
|
},
|
|
2011
2083
|
{
|
|
2012
2084
|
"packageId": "@jskit-ai/database-runtime-postgres",
|
|
2013
|
-
"version": "0.1.
|
|
2085
|
+
"version": "0.1.31",
|
|
2014
2086
|
"descriptor": {
|
|
2015
2087
|
"packageVersion": 1,
|
|
2016
2088
|
"packageId": "@jskit-ai/database-runtime-postgres",
|
|
2017
|
-
"version": "0.1.
|
|
2089
|
+
"version": "0.1.31",
|
|
2018
2090
|
"kind": "runtime",
|
|
2019
2091
|
"options": {
|
|
2020
2092
|
"db-host": {
|
|
@@ -2104,7 +2176,7 @@
|
|
|
2104
2176
|
"mutations": {
|
|
2105
2177
|
"dependencies": {
|
|
2106
2178
|
"runtime": {
|
|
2107
|
-
"@jskit-ai/database-runtime": "0.1.
|
|
2179
|
+
"@jskit-ai/database-runtime": "0.1.32",
|
|
2108
2180
|
"pg": "^8.13.1"
|
|
2109
2181
|
},
|
|
2110
2182
|
"dev": {}
|
|
@@ -2175,11 +2247,11 @@
|
|
|
2175
2247
|
},
|
|
2176
2248
|
{
|
|
2177
2249
|
"packageId": "@jskit-ai/http-runtime",
|
|
2178
|
-
"version": "0.1.
|
|
2250
|
+
"version": "0.1.31",
|
|
2179
2251
|
"descriptor": {
|
|
2180
2252
|
"packageVersion": 1,
|
|
2181
2253
|
"packageId": "@jskit-ai/http-runtime",
|
|
2182
|
-
"version": "0.1.
|
|
2254
|
+
"version": "0.1.31",
|
|
2183
2255
|
"kind": "runtime",
|
|
2184
2256
|
"dependsOn": [],
|
|
2185
2257
|
"capabilities": {
|
|
@@ -2245,7 +2317,7 @@
|
|
|
2245
2317
|
"mutations": {
|
|
2246
2318
|
"dependencies": {
|
|
2247
2319
|
"runtime": {
|
|
2248
|
-
"@jskit-ai/kernel": "0.1.
|
|
2320
|
+
"@jskit-ai/kernel": "0.1.32",
|
|
2249
2321
|
"@fastify/type-provider-typebox": "^6.1.0",
|
|
2250
2322
|
"typebox": "^1.0.81"
|
|
2251
2323
|
},
|
|
@@ -2261,11 +2333,11 @@
|
|
|
2261
2333
|
},
|
|
2262
2334
|
{
|
|
2263
2335
|
"packageId": "@jskit-ai/realtime",
|
|
2264
|
-
"version": "0.1.
|
|
2336
|
+
"version": "0.1.31",
|
|
2265
2337
|
"descriptor": {
|
|
2266
2338
|
"packageVersion": 1,
|
|
2267
2339
|
"packageId": "@jskit-ai/realtime",
|
|
2268
|
-
"version": "0.1.
|
|
2340
|
+
"version": "0.1.31",
|
|
2269
2341
|
"kind": "runtime",
|
|
2270
2342
|
"description": "Thin, generic realtime runtime wrappers for socket.io server and client.",
|
|
2271
2343
|
"options": {
|
|
@@ -2361,7 +2433,7 @@
|
|
|
2361
2433
|
"mutations": {
|
|
2362
2434
|
"dependencies": {
|
|
2363
2435
|
"runtime": {
|
|
2364
|
-
"@jskit-ai/kernel": "0.1.
|
|
2436
|
+
"@jskit-ai/kernel": "0.1.32",
|
|
2365
2437
|
"@socket.io/redis-adapter": "^8.3.0",
|
|
2366
2438
|
"redis": "^5.8.2",
|
|
2367
2439
|
"socket.io": "^4.8.3",
|
|
@@ -2410,11 +2482,11 @@
|
|
|
2410
2482
|
},
|
|
2411
2483
|
{
|
|
2412
2484
|
"packageId": "@jskit-ai/shell-web",
|
|
2413
|
-
"version": "0.1.
|
|
2485
|
+
"version": "0.1.31",
|
|
2414
2486
|
"descriptor": {
|
|
2415
2487
|
"packageVersion": 1,
|
|
2416
2488
|
"packageId": "@jskit-ai/shell-web",
|
|
2417
|
-
"version": "0.1.
|
|
2489
|
+
"version": "0.1.31",
|
|
2418
2490
|
"kind": "runtime",
|
|
2419
2491
|
"description": "Web shell layout runtime with outlet-based placement contributions.",
|
|
2420
2492
|
"dependsOn": [],
|
|
@@ -2516,7 +2588,7 @@
|
|
|
2516
2588
|
"dependencies": {
|
|
2517
2589
|
"runtime": {
|
|
2518
2590
|
"@tanstack/vue-query": "^5.90.5",
|
|
2519
|
-
"@jskit-ai/kernel": "0.1.
|
|
2591
|
+
"@jskit-ai/kernel": "0.1.32",
|
|
2520
2592
|
"vuetify": "^4.0.0"
|
|
2521
2593
|
},
|
|
2522
2594
|
"dev": {}
|
|
@@ -2613,11 +2685,11 @@
|
|
|
2613
2685
|
},
|
|
2614
2686
|
{
|
|
2615
2687
|
"packageId": "@jskit-ai/storage-runtime",
|
|
2616
|
-
"version": "0.1.
|
|
2688
|
+
"version": "0.1.31",
|
|
2617
2689
|
"descriptor": {
|
|
2618
2690
|
"packageVersion": 1,
|
|
2619
2691
|
"packageId": "@jskit-ai/storage-runtime",
|
|
2620
|
-
"version": "0.1.
|
|
2692
|
+
"version": "0.1.31",
|
|
2621
2693
|
"kind": "runtime",
|
|
2622
2694
|
"dependsOn": [
|
|
2623
2695
|
"@jskit-ai/kernel"
|
|
@@ -2666,7 +2738,7 @@
|
|
|
2666
2738
|
"mutations": {
|
|
2667
2739
|
"dependencies": {
|
|
2668
2740
|
"runtime": {
|
|
2669
|
-
"@jskit-ai/kernel": "0.1.
|
|
2741
|
+
"@jskit-ai/kernel": "0.1.32",
|
|
2670
2742
|
"unstorage": "^1.17.3"
|
|
2671
2743
|
},
|
|
2672
2744
|
"dev": {}
|
|
@@ -2682,97 +2754,91 @@
|
|
|
2682
2754
|
},
|
|
2683
2755
|
{
|
|
2684
2756
|
"packageId": "@jskit-ai/ui-generator",
|
|
2685
|
-
"version": "0.1.
|
|
2757
|
+
"version": "0.1.15",
|
|
2686
2758
|
"descriptor": {
|
|
2687
2759
|
"packageVersion": 1,
|
|
2688
2760
|
"packageId": "@jskit-ai/ui-generator",
|
|
2689
|
-
"version": "0.1.
|
|
2761
|
+
"version": "0.1.15",
|
|
2690
2762
|
"kind": "generator",
|
|
2691
|
-
"description": "
|
|
2763
|
+
"description": "Create non-CRUD pages, reusable UI elements, and subpage hosts.",
|
|
2692
2764
|
"options": {
|
|
2693
2765
|
"name": {
|
|
2694
|
-
"required":
|
|
2766
|
+
"required": false,
|
|
2695
2767
|
"inputType": "text",
|
|
2696
2768
|
"defaultValue": "",
|
|
2697
|
-
"promptLabel": "
|
|
2698
|
-
"promptHint": "Display
|
|
2769
|
+
"promptLabel": "Display label",
|
|
2770
|
+
"promptHint": "Display label used for generated page links and named UI elements. For page, if omitted, it is derived from the target file path."
|
|
2699
2771
|
},
|
|
2700
2772
|
"surface": {
|
|
2701
|
-
"required":
|
|
2773
|
+
"required": false,
|
|
2702
2774
|
"inputType": "text",
|
|
2775
|
+
"validationType": "enabled-surface-id",
|
|
2703
2776
|
"defaultFromConfig": "surfaceDefaultId",
|
|
2704
2777
|
"promptLabel": "Target surface",
|
|
2705
|
-
"promptHint": "
|
|
2778
|
+
"promptHint": "Used by the placed-element subcommand. Must match an enabled surface id."
|
|
2706
2779
|
},
|
|
2707
2780
|
"path": {
|
|
2708
2781
|
"required": false,
|
|
2709
2782
|
"inputType": "text",
|
|
2710
2783
|
"defaultValue": "src/components",
|
|
2711
2784
|
"promptLabel": "Component path",
|
|
2712
|
-
"promptHint": "Component directory relative to app root (used by element
|
|
2785
|
+
"promptHint": "Component directory relative to app root (used by placed-element and add-subpages support scaffold)."
|
|
2713
2786
|
},
|
|
2714
|
-
"
|
|
2787
|
+
"force": {
|
|
2715
2788
|
"required": false,
|
|
2716
|
-
"inputType": "
|
|
2717
|
-
"defaultValue": "",
|
|
2718
|
-
"promptLabel": "Page directory prefix",
|
|
2719
|
-
"promptHint": "Optional subpath under the selected surface pages root (example: crm or ops/team-a)."
|
|
2720
|
-
},
|
|
2721
|
-
"route-path": {
|
|
2722
|
-
"required": false,
|
|
2723
|
-
"inputType": "text",
|
|
2789
|
+
"inputType": "flag",
|
|
2724
2790
|
"defaultValue": "",
|
|
2725
|
-
"promptLabel": "
|
|
2726
|
-
"promptHint": "
|
|
2791
|
+
"promptLabel": "Force overwrite",
|
|
2792
|
+
"promptHint": "Overwrite the generated file if it already exists."
|
|
2727
2793
|
},
|
|
2728
2794
|
"placement": {
|
|
2729
2795
|
"required": false,
|
|
2730
2796
|
"inputType": "text",
|
|
2731
2797
|
"defaultValue": "",
|
|
2732
2798
|
"promptLabel": "Placement target",
|
|
2733
|
-
"promptHint": "Optional host:position target (defaults to
|
|
2799
|
+
"promptHint": "Optional host:position target for placed-element placement (defaults to shell-layout:top-right)."
|
|
2734
2800
|
},
|
|
2735
|
-
"placement
|
|
2801
|
+
"link-placement": {
|
|
2736
2802
|
"required": false,
|
|
2737
2803
|
"inputType": "text",
|
|
2738
2804
|
"defaultValue": "",
|
|
2739
|
-
"promptLabel": "
|
|
2740
|
-
"promptHint": "Optional
|
|
2805
|
+
"promptLabel": "Link placement",
|
|
2806
|
+
"promptHint": "Optional host:position target for the generated page link placement."
|
|
2741
2807
|
},
|
|
2742
|
-
"
|
|
2808
|
+
"link-component-token": {
|
|
2743
2809
|
"required": false,
|
|
2744
2810
|
"inputType": "text",
|
|
2745
2811
|
"defaultValue": "",
|
|
2746
|
-
"promptLabel": "
|
|
2747
|
-
"promptHint": "Optional
|
|
2812
|
+
"promptLabel": "Link component token",
|
|
2813
|
+
"promptHint": "Optional component token override for the generated page link placement (example: local.main.ui.tab-link-item)."
|
|
2748
2814
|
},
|
|
2749
|
-
"
|
|
2815
|
+
"link-to": {
|
|
2750
2816
|
"required": false,
|
|
2751
2817
|
"inputType": "text",
|
|
2752
2818
|
"defaultValue": "",
|
|
2753
|
-
"promptLabel": "
|
|
2754
|
-
"promptHint": "
|
|
2819
|
+
"promptLabel": "Link to",
|
|
2820
|
+
"promptHint": "Optional explicit props.to value for the generated page link placement (example: ./notes). If omitted for pages under a detected parent subpages host, it is inferred from the page path."
|
|
2755
2821
|
},
|
|
2756
|
-
"
|
|
2822
|
+
"target": {
|
|
2757
2823
|
"required": false,
|
|
2758
2824
|
"inputType": "text",
|
|
2759
2825
|
"defaultValue": "",
|
|
2760
|
-
"promptLabel": "Outlet
|
|
2761
|
-
"promptHint": "
|
|
2826
|
+
"promptLabel": "Outlet target",
|
|
2827
|
+
"promptHint": "Used by add-subpages and outlet. Accepts host or host:position. If only host is given, position defaults to sub-pages."
|
|
2762
2828
|
},
|
|
2763
|
-
"
|
|
2829
|
+
"title": {
|
|
2764
2830
|
"required": false,
|
|
2765
2831
|
"inputType": "text",
|
|
2766
|
-
"defaultValue": "
|
|
2767
|
-
"promptLabel": "
|
|
2768
|
-
"promptHint": "
|
|
2832
|
+
"defaultValue": "",
|
|
2833
|
+
"promptLabel": "Section title",
|
|
2834
|
+
"promptHint": "Optional SectionContainerShell title override for add-subpages."
|
|
2769
2835
|
},
|
|
2770
|
-
"
|
|
2836
|
+
"subtitle": {
|
|
2771
2837
|
"required": false,
|
|
2772
2838
|
"inputType": "text",
|
|
2773
|
-
"defaultValue": "
|
|
2774
|
-
"promptLabel": "
|
|
2775
|
-
"promptHint": "
|
|
2839
|
+
"defaultValue": "",
|
|
2840
|
+
"promptLabel": "Section subtitle",
|
|
2841
|
+
"promptHint": "Optional SectionContainerShell subtitle override for add-subpages."
|
|
2776
2842
|
}
|
|
2777
2843
|
},
|
|
2778
2844
|
"dependsOn": [],
|
|
@@ -2794,53 +2860,180 @@
|
|
|
2794
2860
|
"generatorPrimarySubcommand": "page",
|
|
2795
2861
|
"generatorSubcommands": {
|
|
2796
2862
|
"page": {
|
|
2797
|
-
"
|
|
2863
|
+
"entrypoint": "src/server/subcommands/page.js",
|
|
2864
|
+
"export": "runGeneratorSubcommand",
|
|
2865
|
+
"description": "Create a route page at an explicit target file and add a link placement entry for it.",
|
|
2866
|
+
"longDescription": [
|
|
2867
|
+
"This command always creates one route page file. By default, its page link is placed from the page path itself.",
|
|
2868
|
+
"If an ancestor page has already been enhanced with sub-pages, JSKIT treats that ancestor as the real host. In that case the new page is linked into the nearest parent sub-pages outlet instead of the shell menu.",
|
|
2869
|
+
"That means the generated link normally becomes a tab or child-page link under that ancestor host, and `props.to` is inferred relative to that host. If the host page is `index.vue`, child pages belong under `index/...` so the router keeps the parent page visible while the child route renders underneath it."
|
|
2870
|
+
],
|
|
2871
|
+
"positionalArgs": [
|
|
2872
|
+
{
|
|
2873
|
+
"name": "target-file",
|
|
2874
|
+
"required": true,
|
|
2875
|
+
"descriptionKey": "page-target-file"
|
|
2876
|
+
}
|
|
2877
|
+
],
|
|
2798
2878
|
"optionNames": [
|
|
2799
2879
|
"name",
|
|
2800
|
-
"
|
|
2801
|
-
"
|
|
2802
|
-
"
|
|
2803
|
-
"
|
|
2804
|
-
|
|
2880
|
+
"link-placement",
|
|
2881
|
+
"link-component-token",
|
|
2882
|
+
"link-to",
|
|
2883
|
+
"force"
|
|
2884
|
+
],
|
|
2885
|
+
"notes": [
|
|
2886
|
+
"If a nearest parent subpages host is found, placement, link component token, and props.to are inferred automatically.",
|
|
2887
|
+
"If the parent host page is index.vue, child pages belong under index/...",
|
|
2888
|
+
"If the target page file already exists, rerun with --force to overwrite it."
|
|
2889
|
+
],
|
|
2890
|
+
"examples": [
|
|
2891
|
+
{
|
|
2892
|
+
"label": "Common usage",
|
|
2893
|
+
"lines": [
|
|
2894
|
+
"npx jskit generate ui-generator page \\",
|
|
2895
|
+
" admin/reports/index.vue \\",
|
|
2896
|
+
" --name \"Reports\""
|
|
2897
|
+
]
|
|
2898
|
+
},
|
|
2899
|
+
{
|
|
2900
|
+
"label": "More advanced usage",
|
|
2901
|
+
"lines": [
|
|
2902
|
+
"npx jskit generate ui-generator page \\",
|
|
2903
|
+
" admin/customers/[customerId]/index/notes/index.vue \\",
|
|
2904
|
+
" --name \"Notes\" \\",
|
|
2905
|
+
" --force"
|
|
2906
|
+
]
|
|
2907
|
+
}
|
|
2805
2908
|
]
|
|
2806
2909
|
},
|
|
2807
|
-
"element": {
|
|
2910
|
+
"placed-element": {
|
|
2808
2911
|
"entrypoint": "src/server/subcommands/element.js",
|
|
2809
2912
|
"export": "runGeneratorSubcommand",
|
|
2810
|
-
"description": "
|
|
2913
|
+
"description": "Create a Vue component file under the chosen component directory (default: src/components) and add a placement entry that renders it.",
|
|
2811
2914
|
"optionNames": [
|
|
2812
2915
|
"name",
|
|
2813
2916
|
"surface",
|
|
2814
2917
|
"path",
|
|
2815
|
-
"placement"
|
|
2918
|
+
"placement",
|
|
2919
|
+
"force"
|
|
2920
|
+
],
|
|
2921
|
+
"requiredOptionNames": [
|
|
2922
|
+
"name",
|
|
2923
|
+
"surface"
|
|
2924
|
+
],
|
|
2925
|
+
"notes": [
|
|
2926
|
+
"If --placement is omitted, the placed element is added at shell-layout:top-right.",
|
|
2927
|
+
"If the component file already exists, rerun with --force to overwrite it."
|
|
2928
|
+
],
|
|
2929
|
+
"examples": [
|
|
2930
|
+
{
|
|
2931
|
+
"label": "Common usage",
|
|
2932
|
+
"lines": [
|
|
2933
|
+
"npx jskit generate ui-generator placed-element \\",
|
|
2934
|
+
" --name \"Alerts Widget\" \\",
|
|
2935
|
+
" --surface admin"
|
|
2936
|
+
]
|
|
2937
|
+
},
|
|
2938
|
+
{
|
|
2939
|
+
"label": "More advanced usage",
|
|
2940
|
+
"lines": [
|
|
2941
|
+
"npx jskit generate ui-generator placed-element \\",
|
|
2942
|
+
" --name \"Ops Panel\" \\",
|
|
2943
|
+
" --surface admin \\",
|
|
2944
|
+
" --path src/widgets \\",
|
|
2945
|
+
" --placement shell-layout:top-right \\",
|
|
2946
|
+
" --force"
|
|
2947
|
+
]
|
|
2948
|
+
}
|
|
2816
2949
|
]
|
|
2817
2950
|
},
|
|
2818
|
-
"
|
|
2819
|
-
"entrypoint": "src/server/subcommands/
|
|
2951
|
+
"add-subpages": {
|
|
2952
|
+
"entrypoint": "src/server/subcommands/addSubpages.js",
|
|
2820
2953
|
"export": "runGeneratorSubcommand",
|
|
2821
|
-
"description": "
|
|
2954
|
+
"description": "Upgrade an existing page into a routed subpage host with SectionContainerShell, ShellOutlet, and RouterView.",
|
|
2955
|
+
"positionalArgs": [
|
|
2956
|
+
{
|
|
2957
|
+
"name": "target-file",
|
|
2958
|
+
"required": true,
|
|
2959
|
+
"descriptionKey": "existing-page-target-file"
|
|
2960
|
+
}
|
|
2961
|
+
],
|
|
2822
2962
|
"optionNames": [
|
|
2823
|
-
"
|
|
2824
|
-
"surface",
|
|
2825
|
-
"directory-prefix",
|
|
2826
|
-
"route-path",
|
|
2963
|
+
"target",
|
|
2827
2964
|
"path",
|
|
2828
|
-
"
|
|
2965
|
+
"title",
|
|
2966
|
+
"subtitle"
|
|
2967
|
+
],
|
|
2968
|
+
"notes": [
|
|
2969
|
+
"Use this when the page should render shared content plus child routes below it.",
|
|
2970
|
+
"If the host page is index.vue, create child pages under index/..."
|
|
2971
|
+
],
|
|
2972
|
+
"examples": [
|
|
2973
|
+
{
|
|
2974
|
+
"label": "Common usage",
|
|
2975
|
+
"lines": [
|
|
2976
|
+
"npx jskit generate ui-generator add-subpages \\",
|
|
2977
|
+
" admin/customers/[customerId]/index.vue \\",
|
|
2978
|
+
" --title \"Customer\" \\",
|
|
2979
|
+
" --subtitle \"View and manage this customer.\""
|
|
2980
|
+
]
|
|
2981
|
+
},
|
|
2982
|
+
{
|
|
2983
|
+
"label": "More advanced usage",
|
|
2984
|
+
"lines": [
|
|
2985
|
+
"npx jskit generate ui-generator add-subpages \\",
|
|
2986
|
+
" admin/contacts/[contactId]/index.vue \\",
|
|
2987
|
+
" --target contact-view:summary-tabs \\",
|
|
2988
|
+
" --path src/components/admin \\",
|
|
2989
|
+
" --title \"Contact\" \\",
|
|
2990
|
+
" --subtitle \"Manage contact modules.\""
|
|
2991
|
+
]
|
|
2992
|
+
}
|
|
2829
2993
|
]
|
|
2830
2994
|
},
|
|
2831
2995
|
"outlet": {
|
|
2832
2996
|
"entrypoint": "src/server/subcommands/outlet.js",
|
|
2833
2997
|
"export": "runGeneratorSubcommand",
|
|
2834
|
-
"description": "Inject a ShellOutlet block into an existing Vue page/component.",
|
|
2998
|
+
"description": "Inject a generic ShellOutlet block into an existing Vue page/component.",
|
|
2999
|
+
"longDescription": [
|
|
3000
|
+
"A ShellOutlet creates a named placement target inside a Vue file. That target is what other parts of JSKIT render into later.",
|
|
3001
|
+
"After an outlet exists, `jskit list-placements` will discover it and show it as `host:position`. That makes the target visible to humans and to generators that need a placement destination.",
|
|
3002
|
+
"Commands that create placed UI, such as `ui-generator placed-element`, and commands that add page links can then target that outlet by writing placement entries that point at the same `host:position`."
|
|
3003
|
+
],
|
|
3004
|
+
"positionalArgs": [
|
|
3005
|
+
{
|
|
3006
|
+
"name": "target-file",
|
|
3007
|
+
"required": true,
|
|
3008
|
+
"descriptionKey": "existing-vue-sfc-target-file"
|
|
3009
|
+
}
|
|
3010
|
+
],
|
|
2835
3011
|
"optionNames": [
|
|
2836
|
-
"
|
|
2837
|
-
"host",
|
|
2838
|
-
"position",
|
|
2839
|
-
"mode"
|
|
3012
|
+
"target"
|
|
2840
3013
|
],
|
|
2841
3014
|
"requiredOptionNames": [
|
|
2842
|
-
"
|
|
2843
|
-
|
|
3015
|
+
"target"
|
|
3016
|
+
],
|
|
3017
|
+
"notes": [
|
|
3018
|
+
"Use --target host or --target host:position. If only host is given, position defaults to sub-pages."
|
|
3019
|
+
],
|
|
3020
|
+
"examples": [
|
|
3021
|
+
{
|
|
3022
|
+
"label": "Common usage",
|
|
3023
|
+
"lines": [
|
|
3024
|
+
"npx jskit generate ui-generator outlet \\",
|
|
3025
|
+
" src/components/ContactSummaryCard.vue \\",
|
|
3026
|
+
" --target contact-view"
|
|
3027
|
+
]
|
|
3028
|
+
},
|
|
3029
|
+
{
|
|
3030
|
+
"label": "More advanced usage",
|
|
3031
|
+
"lines": [
|
|
3032
|
+
"npx jskit generate ui-generator outlet \\",
|
|
3033
|
+
" src/pages/admin/customers/[customerId]/index.vue \\",
|
|
3034
|
+
" --target customer-view:summary-actions"
|
|
3035
|
+
]
|
|
3036
|
+
}
|
|
2844
3037
|
]
|
|
2845
3038
|
}
|
|
2846
3039
|
},
|
|
@@ -2860,7 +3053,7 @@
|
|
|
2860
3053
|
"mutations": {
|
|
2861
3054
|
"dependencies": {
|
|
2862
3055
|
"runtime": {
|
|
2863
|
-
"@jskit-ai/users-web": "0.1.
|
|
3056
|
+
"@jskit-ai/users-web": "0.1.47"
|
|
2864
3057
|
},
|
|
2865
3058
|
"dev": {}
|
|
2866
3059
|
},
|
|
@@ -2868,42 +3061,18 @@
|
|
|
2868
3061
|
"scripts": {}
|
|
2869
3062
|
},
|
|
2870
3063
|
"procfile": {},
|
|
2871
|
-
"files": [
|
|
2872
|
-
|
|
2873
|
-
"from": "templates/src/pages/admin/ui-generator/Page.vue",
|
|
2874
|
-
"toSurface": "${option:surface|lower}",
|
|
2875
|
-
"toSurfacePath": "${option:directory-prefix|pathprefix}${option:name|path}/index.vue",
|
|
2876
|
-
"reason": "Install generated UI page scaffold.",
|
|
2877
|
-
"category": "ui-generator",
|
|
2878
|
-
"id": "ui-generator-page-${option:name|snake}"
|
|
2879
|
-
}
|
|
2880
|
-
],
|
|
2881
|
-
"text": [
|
|
2882
|
-
{
|
|
2883
|
-
"op": "append-text",
|
|
2884
|
-
"file": "src/placement.js",
|
|
2885
|
-
"position": "bottom",
|
|
2886
|
-
"skipIfContains": "jskit:ui-generator.page.menu:${option:surface|lower}:${option:directory-prefix|path}:${option:name|path}",
|
|
2887
|
-
"value": "\n// jskit:ui-generator.page.menu:${option:surface|lower}:${option:directory-prefix|path}:${option:name|path}\n{\n addPlacement({\n id: \"__JSKIT_UI_MENU_PLACEMENT_ID__\",\n host: \"__JSKIT_UI_MENU_PLACEMENT_HOST__\",\n position: \"__JSKIT_UI_MENU_PLACEMENT_POSITION__\",\n surfaces: [\"${option:surface|lower}\"],\n order: 155,\n componentToken: \"__JSKIT_UI_MENU_COMPONENT_TOKEN__\",\n props: {\n label: \"${option:name|trim}\",\n surface: \"${option:surface|lower}\",\n workspaceSuffix: \"__JSKIT_UI_MENU_WORKSPACE_SUFFIX__\",\n nonWorkspaceSuffix: \"__JSKIT_UI_MENU_NON_WORKSPACE_SUFFIX__\",\n__JSKIT_UI_MENU_TO_PROP_LINE__ },\n when: ({ auth }) => Boolean(auth?.authenticated)\n });\n}\n",
|
|
2888
|
-
"reason": "Append generated UI page menu placement.",
|
|
2889
|
-
"category": "ui-generator",
|
|
2890
|
-
"id": "ui-generator-page-placement-menu-${option:name|snake}",
|
|
2891
|
-
"templateContext": {
|
|
2892
|
-
"entrypoint": "src/server/buildTemplateContext.js",
|
|
2893
|
-
"export": "buildUiPageTemplateContext"
|
|
2894
|
-
}
|
|
2895
|
-
}
|
|
2896
|
-
]
|
|
3064
|
+
"files": [],
|
|
3065
|
+
"text": []
|
|
2897
3066
|
}
|
|
2898
3067
|
}
|
|
2899
3068
|
},
|
|
2900
3069
|
{
|
|
2901
3070
|
"packageId": "@jskit-ai/uploads-image-web",
|
|
2902
|
-
"version": "0.1.
|
|
3071
|
+
"version": "0.1.10",
|
|
2903
3072
|
"descriptor": {
|
|
2904
3073
|
"packageVersion": 1,
|
|
2905
3074
|
"packageId": "@jskit-ai/uploads-image-web",
|
|
2906
|
-
"version": "0.1.
|
|
3075
|
+
"version": "0.1.10",
|
|
2907
3076
|
"kind": "runtime",
|
|
2908
3077
|
"description": "Reusable client-side image upload runtime with pre-upload image editing.",
|
|
2909
3078
|
"dependsOn": [
|
|
@@ -2967,7 +3136,7 @@
|
|
|
2967
3136
|
"mutations": {
|
|
2968
3137
|
"dependencies": {
|
|
2969
3138
|
"runtime": {
|
|
2970
|
-
"@jskit-ai/uploads-runtime": "0.1.
|
|
3139
|
+
"@jskit-ai/uploads-runtime": "0.1.10",
|
|
2971
3140
|
"@uppy/compressor": "^3.1.0",
|
|
2972
3141
|
"@uppy/core": "^5.2.0",
|
|
2973
3142
|
"@uppy/dashboard": "^5.1.1",
|
|
@@ -2987,11 +3156,11 @@
|
|
|
2987
3156
|
},
|
|
2988
3157
|
{
|
|
2989
3158
|
"packageId": "@jskit-ai/uploads-runtime",
|
|
2990
|
-
"version": "0.1.
|
|
3159
|
+
"version": "0.1.10",
|
|
2991
3160
|
"descriptor": {
|
|
2992
3161
|
"packageVersion": 1,
|
|
2993
3162
|
"packageId": "@jskit-ai/uploads-runtime",
|
|
2994
|
-
"version": "0.1.
|
|
3163
|
+
"version": "0.1.10",
|
|
2995
3164
|
"kind": "runtime",
|
|
2996
3165
|
"description": "Reusable upload runtime primitives for multipart parsing, policy validation, and blob storage.",
|
|
2997
3166
|
"dependsOn": [
|
|
@@ -3061,7 +3230,7 @@
|
|
|
3061
3230
|
"dependencies": {
|
|
3062
3231
|
"runtime": {
|
|
3063
3232
|
"@fastify/multipart": "^9.4.0",
|
|
3064
|
-
"@jskit-ai/kernel": "0.1.
|
|
3233
|
+
"@jskit-ai/kernel": "0.1.32"
|
|
3065
3234
|
},
|
|
3066
3235
|
"dev": {}
|
|
3067
3236
|
},
|
|
@@ -3076,11 +3245,11 @@
|
|
|
3076
3245
|
},
|
|
3077
3246
|
{
|
|
3078
3247
|
"packageId": "@jskit-ai/users-core",
|
|
3079
|
-
"version": "0.1.
|
|
3248
|
+
"version": "0.1.42",
|
|
3080
3249
|
"descriptor": {
|
|
3081
3250
|
"packageVersion": 1,
|
|
3082
3251
|
"packageId": "@jskit-ai/users-core",
|
|
3083
|
-
"version": "0.1.
|
|
3252
|
+
"version": "0.1.42",
|
|
3084
3253
|
"kind": "runtime",
|
|
3085
3254
|
"description": "Users/account runtime plus HTTP routes for account and console features.",
|
|
3086
3255
|
"dependsOn": [
|
|
@@ -3216,11 +3385,11 @@
|
|
|
3216
3385
|
"mutations": {
|
|
3217
3386
|
"dependencies": {
|
|
3218
3387
|
"runtime": {
|
|
3219
|
-
"@jskit-ai/auth-core": "0.1.
|
|
3220
|
-
"@jskit-ai/database-runtime": "0.1.
|
|
3221
|
-
"@jskit-ai/http-runtime": "0.1.
|
|
3222
|
-
"@jskit-ai/kernel": "0.1.
|
|
3223
|
-
"@jskit-ai/uploads-runtime": "0.1.
|
|
3388
|
+
"@jskit-ai/auth-core": "0.1.31",
|
|
3389
|
+
"@jskit-ai/database-runtime": "0.1.32",
|
|
3390
|
+
"@jskit-ai/http-runtime": "0.1.31",
|
|
3391
|
+
"@jskit-ai/kernel": "0.1.32",
|
|
3392
|
+
"@jskit-ai/uploads-runtime": "0.1.10",
|
|
3224
3393
|
"@fastify/type-provider-typebox": "^6.1.0",
|
|
3225
3394
|
"typebox": "^1.0.81"
|
|
3226
3395
|
},
|
|
@@ -3331,11 +3500,11 @@
|
|
|
3331
3500
|
},
|
|
3332
3501
|
{
|
|
3333
3502
|
"packageId": "@jskit-ai/users-web",
|
|
3334
|
-
"version": "0.1.
|
|
3503
|
+
"version": "0.1.47",
|
|
3335
3504
|
"descriptor": {
|
|
3336
3505
|
"packageVersion": 1,
|
|
3337
3506
|
"packageId": "@jskit-ai/users-web",
|
|
3338
|
-
"version": "0.1.
|
|
3507
|
+
"version": "0.1.47",
|
|
3339
3508
|
"kind": "runtime",
|
|
3340
3509
|
"description": "Users web module: account/profile UI plus shared shell link components.",
|
|
3341
3510
|
"dependsOn": [
|
|
@@ -3495,12 +3664,12 @@
|
|
|
3495
3664
|
"runtime": {
|
|
3496
3665
|
"@tanstack/vue-query": "5.92.12",
|
|
3497
3666
|
"@mdi/js": "^7.4.47",
|
|
3498
|
-
"@jskit-ai/http-runtime": "0.1.
|
|
3499
|
-
"@jskit-ai/realtime": "0.1.
|
|
3500
|
-
"@jskit-ai/kernel": "0.1.
|
|
3501
|
-
"@jskit-ai/shell-web": "0.1.
|
|
3502
|
-
"@jskit-ai/uploads-image-web": "0.1.
|
|
3503
|
-
"@jskit-ai/users-core": "0.1.
|
|
3667
|
+
"@jskit-ai/http-runtime": "0.1.31",
|
|
3668
|
+
"@jskit-ai/realtime": "0.1.31",
|
|
3669
|
+
"@jskit-ai/kernel": "0.1.32",
|
|
3670
|
+
"@jskit-ai/shell-web": "0.1.31",
|
|
3671
|
+
"@jskit-ai/uploads-image-web": "0.1.10",
|
|
3672
|
+
"@jskit-ai/users-core": "0.1.42",
|
|
3504
3673
|
"vuetify": "^4.0.0"
|
|
3505
3674
|
},
|
|
3506
3675
|
"dev": {}
|
|
@@ -3620,11 +3789,11 @@
|
|
|
3620
3789
|
},
|
|
3621
3790
|
{
|
|
3622
3791
|
"packageId": "@jskit-ai/workspaces-core",
|
|
3623
|
-
"version": "0.1.
|
|
3792
|
+
"version": "0.1.8",
|
|
3624
3793
|
"descriptor": {
|
|
3625
3794
|
"packageVersion": 1,
|
|
3626
3795
|
"packageId": "@jskit-ai/workspaces-core",
|
|
3627
|
-
"version": "0.1.
|
|
3796
|
+
"version": "0.1.8",
|
|
3628
3797
|
"kind": "runtime",
|
|
3629
3798
|
"description": "Workspace tenancy runtime plus HTTP routes, role catalog, and workspace config scaffolding.",
|
|
3630
3799
|
"dependsOn": [
|
|
@@ -3733,7 +3902,7 @@
|
|
|
3733
3902
|
"mutations": {
|
|
3734
3903
|
"dependencies": {
|
|
3735
3904
|
"runtime": {
|
|
3736
|
-
"@jskit-ai/users-core": "0.1.
|
|
3905
|
+
"@jskit-ai/users-core": "0.1.42"
|
|
3737
3906
|
},
|
|
3738
3907
|
"dev": {}
|
|
3739
3908
|
},
|
|
@@ -3923,11 +4092,11 @@
|
|
|
3923
4092
|
},
|
|
3924
4093
|
{
|
|
3925
4094
|
"packageId": "@jskit-ai/workspaces-web",
|
|
3926
|
-
"version": "0.1.
|
|
4095
|
+
"version": "0.1.8",
|
|
3927
4096
|
"descriptor": {
|
|
3928
4097
|
"packageVersion": 1,
|
|
3929
4098
|
"packageId": "@jskit-ai/workspaces-web",
|
|
3930
|
-
"version": "0.1.
|
|
4099
|
+
"version": "0.1.8",
|
|
3931
4100
|
"kind": "runtime",
|
|
3932
4101
|
"description": "Workspace web module: workspace selector, tools widget, workspace surfaces, and members/settings UI.",
|
|
3933
4102
|
"dependsOn": [
|
|
@@ -4064,8 +4233,8 @@
|
|
|
4064
4233
|
"mutations": {
|
|
4065
4234
|
"dependencies": {
|
|
4066
4235
|
"runtime": {
|
|
4067
|
-
"@jskit-ai/workspaces-core": "0.1.
|
|
4068
|
-
"@jskit-ai/users-web": "0.1.
|
|
4236
|
+
"@jskit-ai/workspaces-core": "0.1.8",
|
|
4237
|
+
"@jskit-ai/users-web": "0.1.47"
|
|
4069
4238
|
},
|
|
4070
4239
|
"dev": {}
|
|
4071
4240
|
},
|