@jskit-ai/jskit-catalog 0.1.29 → 0.1.31

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/catalog/packages.json +423 -100
  2. package/package.json +1 -1
@@ -6,11 +6,11 @@
6
6
  "packages": [
7
7
  {
8
8
  "packageId": "@jskit-ai/assistant",
9
- "version": "0.1.29",
9
+ "version": "0.1.31",
10
10
  "descriptor": {
11
11
  "packageVersion": 1,
12
12
  "packageId": "@jskit-ai/assistant",
13
- "version": "0.1.29",
13
+ "version": "0.1.31",
14
14
  "kind": "runtime",
15
15
  "description": "Unified assistant module with streaming chat, transcript persistence, service-aware tool execution, and workspace UI.",
16
16
  "options": {
@@ -121,14 +121,14 @@
121
121
  "mutations": {
122
122
  "dependencies": {
123
123
  "runtime": {
124
- "@jskit-ai/assistant": "0.1.29",
125
- "@jskit-ai/auth-core": "0.1.20",
126
- "@jskit-ai/database-runtime": "0.1.21",
127
- "@jskit-ai/http-runtime": "0.1.20",
128
- "@jskit-ai/kernel": "0.1.21",
129
- "@jskit-ai/realtime": "0.1.20",
130
- "@jskit-ai/users-core": "0.1.30",
131
- "@jskit-ai/users-web": "0.1.35",
124
+ "@jskit-ai/assistant": "0.1.31",
125
+ "@jskit-ai/auth-core": "0.1.22",
126
+ "@jskit-ai/database-runtime": "0.1.23",
127
+ "@jskit-ai/http-runtime": "0.1.22",
128
+ "@jskit-ai/kernel": "0.1.23",
129
+ "@jskit-ai/realtime": "0.1.22",
130
+ "@jskit-ai/users-core": "0.1.32",
131
+ "@jskit-ai/users-web": "0.1.37",
132
132
  "@tanstack/vue-query": "^5.90.5",
133
133
  "dompurify": "^3.3.3",
134
134
  "marked": "^17.0.4",
@@ -301,11 +301,11 @@
301
301
  },
302
302
  {
303
303
  "packageId": "@jskit-ai/auth-core",
304
- "version": "0.1.20",
304
+ "version": "0.1.22",
305
305
  "descriptor": {
306
306
  "packageVersion": 1,
307
307
  "packageId": "@jskit-ai/auth-core",
308
- "version": "0.1.20",
308
+ "version": "0.1.22",
309
309
  "kind": "runtime",
310
310
  "dependsOn": [
311
311
  "@jskit-ai/value-app-config-shared"
@@ -373,7 +373,7 @@
373
373
  "mutations": {
374
374
  "dependencies": {
375
375
  "runtime": {
376
- "@jskit-ai/kernel": "0.1.21",
376
+ "@jskit-ai/kernel": "0.1.23",
377
377
  "@fastify/cookie": "^11.0.2",
378
378
  "@fastify/csrf-protection": "^7.1.0",
379
379
  "@fastify/rate-limit": "^10.3.0"
@@ -391,11 +391,11 @@
391
391
  },
392
392
  {
393
393
  "packageId": "@jskit-ai/auth-provider-supabase-core",
394
- "version": "0.1.20",
394
+ "version": "0.1.22",
395
395
  "descriptor": {
396
396
  "packageVersion": 1,
397
397
  "packageId": "@jskit-ai/auth-provider-supabase-core",
398
- "version": "0.1.20",
398
+ "version": "0.1.22",
399
399
  "kind": "runtime",
400
400
  "options": {
401
401
  "auth-supabase-url": {
@@ -477,8 +477,8 @@
477
477
  "mutations": {
478
478
  "dependencies": {
479
479
  "runtime": {
480
- "@jskit-ai/auth-core": "0.1.20",
481
- "@jskit-ai/kernel": "0.1.21",
480
+ "@jskit-ai/auth-core": "0.1.22",
481
+ "@jskit-ai/kernel": "0.1.23",
482
482
  "dotenv": "^16.4.5",
483
483
  "@supabase/supabase-js": "^2.57.4",
484
484
  "jose": "^6.1.0"
@@ -543,11 +543,11 @@
543
543
  },
544
544
  {
545
545
  "packageId": "@jskit-ai/auth-web",
546
- "version": "0.1.22",
546
+ "version": "0.1.24",
547
547
  "descriptor": {
548
548
  "packageVersion": 1,
549
549
  "packageId": "@jskit-ai/auth-web",
550
- "version": "0.1.22",
550
+ "version": "0.1.24",
551
551
  "kind": "runtime",
552
552
  "description": "Auth web module: Fastify auth routes plus web login/sign-out scaffolds.",
553
553
  "dependsOn": [
@@ -777,10 +777,10 @@
777
777
  "@tanstack/vue-query": "5.92.12",
778
778
  "@mdi/js": "^7.4.47",
779
779
  "@fastify/type-provider-typebox": "^6.1.0",
780
- "@jskit-ai/auth-core": "0.1.20",
781
- "@jskit-ai/http-runtime": "0.1.20",
782
- "@jskit-ai/kernel": "0.1.21",
783
- "@jskit-ai/shell-web": "0.1.20",
780
+ "@jskit-ai/auth-core": "0.1.22",
781
+ "@jskit-ai/http-runtime": "0.1.22",
782
+ "@jskit-ai/kernel": "0.1.23",
783
+ "@jskit-ai/shell-web": "0.1.22",
784
784
  "vuetify": "^4.0.0"
785
785
  },
786
786
  "dev": {}
@@ -850,11 +850,11 @@
850
850
  },
851
851
  {
852
852
  "packageId": "@jskit-ai/crud-core",
853
- "version": "0.1.29",
853
+ "version": "0.1.31",
854
854
  "descriptor": {
855
855
  "packageVersion": 1,
856
856
  "packageId": "@jskit-ai/crud-core",
857
- "version": "0.1.29",
857
+ "version": "0.1.31",
858
858
  "kind": "runtime",
859
859
  "description": "Shared CRUD helpers used by CRUD modules.",
860
860
  "dependsOn": [
@@ -881,7 +881,7 @@
881
881
  "mutations": {
882
882
  "dependencies": {
883
883
  "runtime": {
884
- "@jskit-ai/crud-core": "0.1.29"
884
+ "@jskit-ai/crud-core": "0.1.31"
885
885
  },
886
886
  "dev": {}
887
887
  },
@@ -895,11 +895,11 @@
895
895
  },
896
896
  {
897
897
  "packageId": "@jskit-ai/crud-server-generator",
898
- "version": "0.1.29",
898
+ "version": "0.1.31",
899
899
  "descriptor": {
900
900
  "packageVersion": 1,
901
901
  "packageId": "@jskit-ai/crud-server-generator",
902
- "version": "0.1.29",
902
+ "version": "0.1.31",
903
903
  "kind": "generator",
904
904
  "description": "CRUD server generator with routes, actions, and persistence scaffolding.",
905
905
  "options": {
@@ -980,10 +980,39 @@
980
980
  }
981
981
  },
982
982
  "metadata": {
983
+ "generatorPrimarySubcommand": "scaffold",
983
984
  "generatorSubcommands": {
984
- "add-field": {
985
+ "scaffold": {
986
+ "description": "Scaffold a CRUD resource package for a table (same behavior as running generate with no subcommand).",
987
+ "optionNames": [
988
+ "namespace",
989
+ "surface",
990
+ "ownership-filter",
991
+ "table-name",
992
+ "id-column",
993
+ "directory-prefix"
994
+ ]
995
+ },
996
+ "scaffold-field": {
985
997
  "entrypoint": "src/server/subcommands/addField.js",
986
- "export": "runGeneratorSubcommand"
998
+ "export": "runGeneratorSubcommand",
999
+ "description": "Patch one writable field into an existing generated CRUD resource module.",
1000
+ "positionalArgs": [
1001
+ {
1002
+ "name": "<fieldKey>",
1003
+ "required": true,
1004
+ "description": "Resource field key (camelCase) resolved from the DB snapshot."
1005
+ },
1006
+ {
1007
+ "name": "<targetFile>",
1008
+ "required": true,
1009
+ "description": "Path to the generated CRUD resource file relative to app root."
1010
+ }
1011
+ ],
1012
+ "optionNames": [
1013
+ "table-name",
1014
+ "id-column"
1015
+ ]
987
1016
  }
988
1017
  },
989
1018
  "apiSummary": {
@@ -1005,13 +1034,13 @@
1005
1034
  "mutations": {
1006
1035
  "dependencies": {
1007
1036
  "runtime": {
1008
- "@jskit-ai/auth-core": "0.1.20",
1009
- "@jskit-ai/crud-core": "0.1.29",
1010
- "@jskit-ai/database-runtime": "0.1.21",
1011
- "@jskit-ai/http-runtime": "0.1.20",
1012
- "@jskit-ai/kernel": "0.1.21",
1013
- "@jskit-ai/realtime": "0.1.20",
1014
- "@jskit-ai/users-core": "0.1.30",
1037
+ "@jskit-ai/auth-core": "0.1.22",
1038
+ "@jskit-ai/crud-core": "0.1.31",
1039
+ "@jskit-ai/database-runtime": "0.1.23",
1040
+ "@jskit-ai/http-runtime": "0.1.22",
1041
+ "@jskit-ai/kernel": "0.1.23",
1042
+ "@jskit-ai/realtime": "0.1.22",
1043
+ "@jskit-ai/users-core": "0.1.32",
1015
1044
  "@local/${option:namespace|kebab}": "file:packages/${option:namespace|kebab}",
1016
1045
  "typebox": "^1.0.81"
1017
1046
  },
@@ -1124,11 +1153,11 @@
1124
1153
  },
1125
1154
  {
1126
1155
  "packageId": "@jskit-ai/crud-ui-generator",
1127
- "version": "0.1.4",
1156
+ "version": "0.1.6",
1128
1157
  "descriptor": {
1129
1158
  "packageVersion": 1,
1130
1159
  "packageId": "@jskit-ai/crud-ui-generator",
1131
- "version": "0.1.4",
1160
+ "version": "0.1.6",
1132
1161
  "kind": "generator",
1133
1162
  "description": "Generate app-local CRUD UI scaffolds from resource validators.",
1134
1163
  "options": {
@@ -1207,6 +1236,20 @@
1207
1236
  "defaultValue": "",
1208
1237
  "promptLabel": "Menu placement",
1209
1238
  "promptHint": "Optional host:position target (defaults to ShellLayout default outlet)."
1239
+ },
1240
+ "placement-component-token": {
1241
+ "required": false,
1242
+ "inputType": "text",
1243
+ "defaultValue": "",
1244
+ "promptLabel": "Placement component token",
1245
+ "promptHint": "Optional component token override for generated menu placement. Use local.main.ui.tab-link-item for routed tab links (auto-provisions src/components/TabLinkItem.vue + MainClientProvider registration)."
1246
+ },
1247
+ "placement-to": {
1248
+ "required": false,
1249
+ "inputType": "text",
1250
+ "defaultValue": "",
1251
+ "promptLabel": "Placement to",
1252
+ "promptHint": "Optional explicit props.to value for generated menu placement (example: ./pets). Required when adding placement for dynamic directory-prefix/route-path values."
1210
1253
  }
1211
1254
  },
1212
1255
  "dependsOn": [],
@@ -1248,7 +1291,7 @@
1248
1291
  "mutations": {
1249
1292
  "dependencies": {
1250
1293
  "runtime": {
1251
- "@jskit-ai/users-web": "0.1.35"
1294
+ "@jskit-ai/users-web": "0.1.37"
1252
1295
  },
1253
1296
  "dev": {}
1254
1297
  },
@@ -1336,7 +1379,7 @@
1336
1379
  "file": "src/placement.js",
1337
1380
  "position": "bottom",
1338
1381
  "skipIfContains": "jskit:ui-generator.menu:${option:namespace|kebab}:${option:directory-prefix|path}:${option:container|path}:${option:route-path|path}",
1339
- "value": "\n// jskit:ui-generator.menu:${option:namespace|kebab}:${option:directory-prefix|path}:${option:container|path}:${option:route-path|path}\n{\n addPlacement({\n id: \"ui-generator.${option:namespace|kebab}.menu\",\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:namespace|plural|pascal}\",\n surface: \"${option:surface|lower}\",\n workspaceSuffix: \"/${option:directory-prefix|pathprefix}${option:container|pathprefix}${option:route-path|path}\",\n nonWorkspaceSuffix: \"/${option:directory-prefix|pathprefix}${option:container|pathprefix}${option:route-path|path}\"\n },\n when: ({ auth }) => Boolean(auth?.authenticated)\n });\n}\n",
1382
+ "value": "\n// jskit:ui-generator.menu:${option:namespace|kebab}:${option:directory-prefix|path}:${option:container|path}:${option:route-path|path}\n{\n addPlacement({\n id: \"ui-generator.${option:namespace|kebab}.menu\",\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:namespace|plural|pascal}\",\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",
1340
1383
  "reason": "Append generated UI menu placement.",
1341
1384
  "category": "ui-generator",
1342
1385
  "id": "ui-generator-placement-menu",
@@ -1353,8 +1396,32 @@
1353
1396
  ]
1354
1397
  },
1355
1398
  {
1356
- "option": "route-path",
1357
- "notContains": "["
1399
+ "any": [
1400
+ {
1401
+ "all": [
1402
+ {
1403
+ "option": "route-path",
1404
+ "notContains": "["
1405
+ },
1406
+ {
1407
+ "option": "directory-prefix",
1408
+ "notContains": "["
1409
+ }
1410
+ ]
1411
+ },
1412
+ {
1413
+ "all": [
1414
+ {
1415
+ "option": "placement",
1416
+ "contains": ":"
1417
+ },
1418
+ {
1419
+ "option": "placement-to",
1420
+ "notEquals": ""
1421
+ }
1422
+ ]
1423
+ }
1424
+ ]
1358
1425
  }
1359
1426
  ]
1360
1427
  }
@@ -1365,11 +1432,11 @@
1365
1432
  },
1366
1433
  {
1367
1434
  "packageId": "@jskit-ai/database-runtime",
1368
- "version": "0.1.21",
1435
+ "version": "0.1.23",
1369
1436
  "descriptor": {
1370
1437
  "packageVersion": 1,
1371
1438
  "packageId": "@jskit-ai/database-runtime",
1372
- "version": "0.1.21",
1439
+ "version": "0.1.23",
1373
1440
  "kind": "runtime",
1374
1441
  "dependsOn": [
1375
1442
  "@jskit-ai/kernel"
@@ -1426,7 +1493,7 @@
1426
1493
  "mutations": {
1427
1494
  "dependencies": {
1428
1495
  "runtime": {
1429
- "@jskit-ai/kernel": "0.1.21",
1496
+ "@jskit-ai/kernel": "0.1.23",
1430
1497
  "dotenv": "^16.4.5",
1431
1498
  "knex": "^3.1.0"
1432
1499
  },
@@ -1461,11 +1528,11 @@
1461
1528
  },
1462
1529
  {
1463
1530
  "packageId": "@jskit-ai/database-runtime-mysql",
1464
- "version": "0.1.20",
1531
+ "version": "0.1.22",
1465
1532
  "descriptor": {
1466
1533
  "packageVersion": 1,
1467
1534
  "packageId": "@jskit-ai/database-runtime-mysql",
1468
- "version": "0.1.20",
1535
+ "version": "0.1.22",
1469
1536
  "kind": "runtime",
1470
1537
  "options": {
1471
1538
  "db-host": {
@@ -1555,7 +1622,7 @@
1555
1622
  "mutations": {
1556
1623
  "dependencies": {
1557
1624
  "runtime": {
1558
- "@jskit-ai/database-runtime": "0.1.21",
1625
+ "@jskit-ai/database-runtime": "0.1.23",
1559
1626
  "mysql2": "^3.11.2"
1560
1627
  },
1561
1628
  "dev": {}
@@ -1626,11 +1693,11 @@
1626
1693
  },
1627
1694
  {
1628
1695
  "packageId": "@jskit-ai/database-runtime-postgres",
1629
- "version": "0.1.20",
1696
+ "version": "0.1.22",
1630
1697
  "descriptor": {
1631
1698
  "packageVersion": 1,
1632
1699
  "packageId": "@jskit-ai/database-runtime-postgres",
1633
- "version": "0.1.20",
1700
+ "version": "0.1.22",
1634
1701
  "kind": "runtime",
1635
1702
  "options": {
1636
1703
  "db-host": {
@@ -1720,7 +1787,7 @@
1720
1787
  "mutations": {
1721
1788
  "dependencies": {
1722
1789
  "runtime": {
1723
- "@jskit-ai/database-runtime": "0.1.21",
1790
+ "@jskit-ai/database-runtime": "0.1.23",
1724
1791
  "pg": "^8.13.1"
1725
1792
  },
1726
1793
  "dev": {}
@@ -1791,11 +1858,11 @@
1791
1858
  },
1792
1859
  {
1793
1860
  "packageId": "@jskit-ai/http-runtime",
1794
- "version": "0.1.20",
1861
+ "version": "0.1.22",
1795
1862
  "descriptor": {
1796
1863
  "packageVersion": 1,
1797
1864
  "packageId": "@jskit-ai/http-runtime",
1798
- "version": "0.1.20",
1865
+ "version": "0.1.22",
1799
1866
  "kind": "runtime",
1800
1867
  "dependsOn": [],
1801
1868
  "capabilities": {
@@ -1861,7 +1928,7 @@
1861
1928
  "mutations": {
1862
1929
  "dependencies": {
1863
1930
  "runtime": {
1864
- "@jskit-ai/kernel": "0.1.21",
1931
+ "@jskit-ai/kernel": "0.1.23",
1865
1932
  "@fastify/type-provider-typebox": "^6.1.0",
1866
1933
  "typebox": "^1.0.81"
1867
1934
  },
@@ -1877,11 +1944,11 @@
1877
1944
  },
1878
1945
  {
1879
1946
  "packageId": "@jskit-ai/realtime",
1880
- "version": "0.1.20",
1947
+ "version": "0.1.22",
1881
1948
  "descriptor": {
1882
1949
  "packageVersion": 1,
1883
1950
  "packageId": "@jskit-ai/realtime",
1884
- "version": "0.1.20",
1951
+ "version": "0.1.22",
1885
1952
  "kind": "runtime",
1886
1953
  "description": "Thin, generic realtime runtime wrappers for socket.io server and client.",
1887
1954
  "options": {
@@ -1977,7 +2044,7 @@
1977
2044
  "mutations": {
1978
2045
  "dependencies": {
1979
2046
  "runtime": {
1980
- "@jskit-ai/kernel": "0.1.21",
2047
+ "@jskit-ai/kernel": "0.1.23",
1981
2048
  "@socket.io/redis-adapter": "^8.3.0",
1982
2049
  "redis": "^5.8.2",
1983
2050
  "socket.io": "^4.8.3",
@@ -2026,11 +2093,11 @@
2026
2093
  },
2027
2094
  {
2028
2095
  "packageId": "@jskit-ai/shell-web",
2029
- "version": "0.1.20",
2096
+ "version": "0.1.22",
2030
2097
  "descriptor": {
2031
2098
  "packageVersion": 1,
2032
2099
  "packageId": "@jskit-ai/shell-web",
2033
- "version": "0.1.20",
2100
+ "version": "0.1.22",
2034
2101
  "kind": "runtime",
2035
2102
  "description": "Web shell layout runtime with outlet-based placement contributions.",
2036
2103
  "dependsOn": [],
@@ -2124,7 +2191,7 @@
2124
2191
  "dependencies": {
2125
2192
  "runtime": {
2126
2193
  "@tanstack/vue-query": "^5.90.5",
2127
- "@jskit-ai/kernel": "0.1.21",
2194
+ "@jskit-ai/kernel": "0.1.23",
2128
2195
  "vuetify": "^4.0.0"
2129
2196
  },
2130
2197
  "dev": {}
@@ -2205,11 +2272,11 @@
2205
2272
  },
2206
2273
  {
2207
2274
  "packageId": "@jskit-ai/storage-runtime",
2208
- "version": "0.1.20",
2275
+ "version": "0.1.22",
2209
2276
  "descriptor": {
2210
2277
  "packageVersion": 1,
2211
2278
  "packageId": "@jskit-ai/storage-runtime",
2212
- "version": "0.1.20",
2279
+ "version": "0.1.22",
2213
2280
  "kind": "runtime",
2214
2281
  "dependsOn": [
2215
2282
  "@jskit-ai/kernel"
@@ -2258,7 +2325,7 @@
2258
2325
  "mutations": {
2259
2326
  "dependencies": {
2260
2327
  "runtime": {
2261
- "@jskit-ai/kernel": "0.1.21",
2328
+ "@jskit-ai/kernel": "0.1.23",
2262
2329
  "unstorage": "^1.17.3"
2263
2330
  },
2264
2331
  "dev": {}
@@ -2274,11 +2341,11 @@
2274
2341
  },
2275
2342
  {
2276
2343
  "packageId": "@jskit-ai/ui-generator",
2277
- "version": "0.1.4",
2344
+ "version": "0.1.6",
2278
2345
  "descriptor": {
2279
2346
  "packageVersion": 1,
2280
2347
  "packageId": "@jskit-ai/ui-generator",
2281
- "version": "0.1.4",
2348
+ "version": "0.1.6",
2282
2349
  "kind": "generator",
2283
2350
  "description": "Generate app-local non-CRUD UI pages and outlet elements.",
2284
2351
  "options": {
@@ -2310,12 +2377,61 @@
2310
2377
  "promptLabel": "Page directory prefix",
2311
2378
  "promptHint": "Optional subpath under the selected surface pages root (example: crm or ops/team-a)."
2312
2379
  },
2380
+ "route-path": {
2381
+ "required": false,
2382
+ "inputType": "text",
2383
+ "defaultValue": "",
2384
+ "promptLabel": "Route path",
2385
+ "promptHint": "Optional explicit container route path (example: contact-tools or contacts/[contactId]). Defaults to --name."
2386
+ },
2313
2387
  "placement": {
2314
2388
  "required": false,
2315
2389
  "inputType": "text",
2316
2390
  "defaultValue": "",
2317
2391
  "promptLabel": "Placement target",
2318
2392
  "promptHint": "Optional host:position target (defaults to app ShellOutlet default target)."
2393
+ },
2394
+ "placement-component-token": {
2395
+ "required": false,
2396
+ "inputType": "text",
2397
+ "defaultValue": "",
2398
+ "promptLabel": "Placement component token",
2399
+ "promptHint": "Optional component token override for generated menu placement (example: local.main.ui.tab-link-item)."
2400
+ },
2401
+ "placement-to": {
2402
+ "required": false,
2403
+ "inputType": "text",
2404
+ "defaultValue": "",
2405
+ "promptLabel": "Placement to",
2406
+ "promptHint": "Optional explicit props.to value for generated menu placement (example: ./notes). If omitted and directory-prefix includes a nestedChildren route group, defaults to ./<page-slug>."
2407
+ },
2408
+ "file": {
2409
+ "required": false,
2410
+ "inputType": "text",
2411
+ "defaultValue": "",
2412
+ "promptLabel": "Target Vue file",
2413
+ "promptHint": "Vue SFC path relative to app root (used by outlet subcommand)."
2414
+ },
2415
+ "host": {
2416
+ "required": false,
2417
+ "inputType": "text",
2418
+ "defaultValue": "",
2419
+ "promptLabel": "Outlet host",
2420
+ "promptHint": "ShellOutlet host value to inject into target file."
2421
+ },
2422
+ "position": {
2423
+ "required": false,
2424
+ "inputType": "text",
2425
+ "defaultValue": "sub-pages",
2426
+ "promptLabel": "Outlet position",
2427
+ "promptHint": "ShellOutlet position value to inject into target file."
2428
+ },
2429
+ "mode": {
2430
+ "required": false,
2431
+ "inputType": "text",
2432
+ "defaultValue": "routed",
2433
+ "promptLabel": "Outlet mode",
2434
+ "promptHint": "routed | outlet-only (routed injects RouterView when missing)."
2319
2435
  }
2320
2436
  },
2321
2437
  "dependsOn": [],
@@ -2336,13 +2452,55 @@
2336
2452
  "metadata": {
2337
2453
  "generatorPrimarySubcommand": "page",
2338
2454
  "generatorSubcommands": {
2455
+ "page": {
2456
+ "description": "Scaffold a non-CRUD page and add a menu placement entry.",
2457
+ "optionNames": [
2458
+ "name",
2459
+ "surface",
2460
+ "directory-prefix",
2461
+ "placement",
2462
+ "placement-component-token",
2463
+ "placement-to"
2464
+ ]
2465
+ },
2339
2466
  "element": {
2340
2467
  "entrypoint": "src/server/subcommands/element.js",
2341
- "export": "runGeneratorSubcommand"
2468
+ "export": "runGeneratorSubcommand",
2469
+ "description": "Scaffold a reusable UI element component and register a placement.",
2470
+ "optionNames": [
2471
+ "name",
2472
+ "surface",
2473
+ "path",
2474
+ "placement"
2475
+ ]
2342
2476
  },
2343
2477
  "container": {
2344
2478
  "entrypoint": "src/server/subcommands/container.js",
2345
- "export": "runGeneratorSubcommand"
2479
+ "export": "runGeneratorSubcommand",
2480
+ "description": "Scaffold a routed section container page with a tab outlet. Adds a menu entry only when --placement is passed.",
2481
+ "optionNames": [
2482
+ "name",
2483
+ "surface",
2484
+ "directory-prefix",
2485
+ "route-path",
2486
+ "path",
2487
+ "placement"
2488
+ ]
2489
+ },
2490
+ "outlet": {
2491
+ "entrypoint": "src/server/subcommands/outlet.js",
2492
+ "export": "runGeneratorSubcommand",
2493
+ "description": "Inject a ShellOutlet block into an existing Vue page/component.",
2494
+ "optionNames": [
2495
+ "file",
2496
+ "host",
2497
+ "position",
2498
+ "mode"
2499
+ ],
2500
+ "requiredOptionNames": [
2501
+ "file",
2502
+ "host"
2503
+ ]
2346
2504
  }
2347
2505
  },
2348
2506
  "apiSummary": {
@@ -2361,7 +2519,7 @@
2361
2519
  "mutations": {
2362
2520
  "dependencies": {
2363
2521
  "runtime": {
2364
- "@jskit-ai/users-web": "0.1.35"
2522
+ "@jskit-ai/users-web": "0.1.37"
2365
2523
  },
2366
2524
  "dev": {}
2367
2525
  },
@@ -2385,7 +2543,7 @@
2385
2543
  "file": "src/placement.js",
2386
2544
  "position": "bottom",
2387
2545
  "skipIfContains": "jskit:ui-generator.page.menu:${option:surface|lower}:${option:directory-prefix|path}:${option:name|path}",
2388
- "value": "\n// jskit:ui-generator.page.menu:${option:surface|lower}:${option:directory-prefix|path}:${option:name|path}\n{\n addPlacement({\n id: \"ui-generator.page.${option:name|kebab}.menu\",\n host: \"__JSKIT_UI_MENU_PLACEMENT_HOST__\",\n position: \"__JSKIT_UI_MENU_PLACEMENT_POSITION__\",\n surfaces: [\"${option:surface|lower}\"],\n order: 155,\n componentToken: \"users.web.shell.surface-aware-menu-link-item\",\n props: {\n label: \"${option:name|trim}\",\n surface: \"${option:surface|lower}\",\n workspaceSuffix: \"/${option:directory-prefix|pathprefix}${option:name|path}\",\n nonWorkspaceSuffix: \"/${option:directory-prefix|pathprefix}${option:name|path}\"\n },\n when: ({ auth }) => Boolean(auth?.authenticated)\n });\n}\n",
2546
+ "value": "\n// jskit:ui-generator.page.menu:${option:surface|lower}:${option:directory-prefix|path}:${option:name|path}\n{\n addPlacement({\n id: \"ui-generator.page.${option:name|kebab}.menu\",\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",
2389
2547
  "reason": "Append generated UI page menu placement.",
2390
2548
  "category": "ui-generator",
2391
2549
  "id": "ui-generator-page-placement-menu-${option:name|snake}",
@@ -2398,19 +2556,197 @@
2398
2556
  }
2399
2557
  }
2400
2558
  },
2559
+ {
2560
+ "packageId": "@jskit-ai/uploads-image-web",
2561
+ "version": "0.1.1",
2562
+ "descriptor": {
2563
+ "packageVersion": 1,
2564
+ "packageId": "@jskit-ai/uploads-image-web",
2565
+ "version": "0.1.1",
2566
+ "kind": "runtime",
2567
+ "description": "Reusable client-side image upload runtime with pre-upload image editing.",
2568
+ "dependsOn": [
2569
+ "@jskit-ai/uploads-runtime"
2570
+ ],
2571
+ "capabilities": {
2572
+ "provides": [
2573
+ "runtime.uploads.image-web"
2574
+ ],
2575
+ "requires": []
2576
+ },
2577
+ "runtime": {
2578
+ "server": {
2579
+ "providers": []
2580
+ },
2581
+ "client": {
2582
+ "providers": []
2583
+ }
2584
+ },
2585
+ "metadata": {
2586
+ "client": {
2587
+ "optimizeDeps": {
2588
+ "include": [
2589
+ "@uppy/core",
2590
+ "@uppy/dashboard",
2591
+ "@uppy/image-editor",
2592
+ "@uppy/compressor",
2593
+ "@uppy/xhr-upload"
2594
+ ]
2595
+ }
2596
+ },
2597
+ "apiSummary": {
2598
+ "surfaces": [
2599
+ {
2600
+ "subpath": "./client",
2601
+ "summary": "Exports reusable image upload client runtime helpers."
2602
+ },
2603
+ {
2604
+ "subpath": "./client/composables/createImageUploadRuntime",
2605
+ "summary": "Exports the reusable image upload runtime factory."
2606
+ },
2607
+ {
2608
+ "subpath": "./client/styles",
2609
+ "summary": "Exports Uppy CSS side effects for image upload UIs."
2610
+ },
2611
+ {
2612
+ "subpath": "./shared",
2613
+ "summary": "Exports shared image upload defaults."
2614
+ }
2615
+ ],
2616
+ "containerTokens": {
2617
+ "server": [],
2618
+ "client": []
2619
+ }
2620
+ }
2621
+ },
2622
+ "mutations": {
2623
+ "dependencies": {
2624
+ "runtime": {
2625
+ "@jskit-ai/uploads-runtime": "0.1.1",
2626
+ "@uppy/compressor": "^3.1.0",
2627
+ "@uppy/core": "^5.2.0",
2628
+ "@uppy/dashboard": "^5.1.1",
2629
+ "@uppy/image-editor": "^4.2.0",
2630
+ "@uppy/xhr-upload": "^5.1.1"
2631
+ },
2632
+ "dev": {}
2633
+ },
2634
+ "packageJson": {
2635
+ "scripts": {}
2636
+ },
2637
+ "procfile": {},
2638
+ "files": [],
2639
+ "text": []
2640
+ }
2641
+ }
2642
+ },
2643
+ {
2644
+ "packageId": "@jskit-ai/uploads-runtime",
2645
+ "version": "0.1.1",
2646
+ "descriptor": {
2647
+ "packageVersion": 1,
2648
+ "packageId": "@jskit-ai/uploads-runtime",
2649
+ "version": "0.1.1",
2650
+ "kind": "runtime",
2651
+ "description": "Reusable upload runtime primitives for multipart parsing, policy validation, and blob storage.",
2652
+ "dependsOn": [
2653
+ "@jskit-ai/kernel"
2654
+ ],
2655
+ "capabilities": {
2656
+ "provides": [
2657
+ "runtime.uploads"
2658
+ ],
2659
+ "requires": []
2660
+ },
2661
+ "runtime": {
2662
+ "server": {
2663
+ "providerEntrypoint": "src/server/providers/UploadsRuntimeServiceProvider.js",
2664
+ "providers": [
2665
+ {
2666
+ "entrypoint": "src/server/providers/UploadsRuntimeServiceProvider.js",
2667
+ "export": "UploadsRuntimeServiceProvider"
2668
+ }
2669
+ ]
2670
+ },
2671
+ "client": {
2672
+ "providers": []
2673
+ }
2674
+ },
2675
+ "metadata": {
2676
+ "apiSummary": {
2677
+ "surfaces": [
2678
+ {
2679
+ "subpath": "./server/providers/UploadsRuntimeServiceProvider",
2680
+ "summary": "Exports uploads runtime server provider."
2681
+ },
2682
+ {
2683
+ "subpath": "./server/multipart/registerMultipartSupport",
2684
+ "summary": "Exports Fastify multipart registration helper."
2685
+ },
2686
+ {
2687
+ "subpath": "./server/multipart/readMultipartFiles",
2688
+ "summary": "Exports normalized multipart file parsing helpers."
2689
+ },
2690
+ {
2691
+ "subpath": "./server/multipart/readSingleMultipartFile",
2692
+ "summary": "Exports a convenience helper for single-file multipart uploads."
2693
+ },
2694
+ {
2695
+ "subpath": "./server/policy/uploadPolicy",
2696
+ "summary": "Exports upload policy normalization and stream validation helpers."
2697
+ },
2698
+ {
2699
+ "subpath": "./server/storage/createUploadStorageService",
2700
+ "summary": "Exports raw upload storage helpers backed by jskit.storage."
2701
+ },
2702
+ {
2703
+ "subpath": "./shared",
2704
+ "summary": "Exports shared upload policy defaults and normalization helpers."
2705
+ },
2706
+ {
2707
+ "subpath": "./client",
2708
+ "summary": "Exports no client runtime API today (reserved client entrypoint)."
2709
+ }
2710
+ ],
2711
+ "containerTokens": {
2712
+ "server": [
2713
+ "runtime.uploads"
2714
+ ],
2715
+ "client": []
2716
+ }
2717
+ }
2718
+ },
2719
+ "mutations": {
2720
+ "dependencies": {
2721
+ "runtime": {
2722
+ "@fastify/multipart": "^9.4.0",
2723
+ "@jskit-ai/kernel": "0.1.23"
2724
+ },
2725
+ "dev": {}
2726
+ },
2727
+ "packageJson": {
2728
+ "scripts": {}
2729
+ },
2730
+ "procfile": {},
2731
+ "files": [],
2732
+ "text": []
2733
+ }
2734
+ }
2735
+ },
2401
2736
  {
2402
2737
  "packageId": "@jskit-ai/users-core",
2403
- "version": "0.1.30",
2738
+ "version": "0.1.32",
2404
2739
  "descriptor": {
2405
2740
  "packageVersion": 1,
2406
2741
  "packageId": "@jskit-ai/users-core",
2407
- "version": "0.1.30",
2742
+ "version": "0.1.32",
2408
2743
  "kind": "runtime",
2409
2744
  "description": "Users/workspace domain runtime plus HTTP routes for workspace, account, and console features.",
2410
2745
  "dependsOn": [
2411
2746
  "@jskit-ai/auth-core",
2412
2747
  "@jskit-ai/database-runtime",
2413
2748
  "@jskit-ai/http-runtime",
2749
+ "@jskit-ai/uploads-runtime",
2414
2750
  "@jskit-ai/storage-runtime"
2415
2751
  ],
2416
2752
  "capabilities": {
@@ -2422,6 +2758,7 @@
2422
2758
  "runtime.actions",
2423
2759
  "runtime.database",
2424
2760
  "runtime.storage",
2761
+ "runtime.uploads",
2425
2762
  "auth.provider",
2426
2763
  "auth.policy"
2427
2764
  ]
@@ -2598,11 +2935,11 @@
2598
2935
  "mutations": {
2599
2936
  "dependencies": {
2600
2937
  "runtime": {
2601
- "@jskit-ai/auth-core": "0.1.20",
2602
- "@jskit-ai/database-runtime": "0.1.21",
2603
- "@jskit-ai/http-runtime": "0.1.20",
2604
- "@jskit-ai/kernel": "0.1.21",
2605
- "@fastify/multipart": "^9.4.0",
2938
+ "@jskit-ai/auth-core": "0.1.22",
2939
+ "@jskit-ai/database-runtime": "0.1.23",
2940
+ "@jskit-ai/http-runtime": "0.1.22",
2941
+ "@jskit-ai/kernel": "0.1.23",
2942
+ "@jskit-ai/uploads-runtime": "0.1.1",
2606
2943
  "@fastify/type-provider-typebox": "^6.1.0",
2607
2944
  "typebox": "^1.0.81"
2608
2945
  },
@@ -2881,16 +3218,17 @@
2881
3218
  },
2882
3219
  {
2883
3220
  "packageId": "@jskit-ai/users-web",
2884
- "version": "0.1.35",
3221
+ "version": "0.1.37",
2885
3222
  "descriptor": {
2886
3223
  "packageVersion": 1,
2887
3224
  "packageId": "@jskit-ai/users-web",
2888
- "version": "0.1.35",
3225
+ "version": "0.1.37",
2889
3226
  "kind": "runtime",
2890
3227
  "description": "Users web module: workspace selector shell element plus workspace/profile/members UI elements.",
2891
3228
  "dependsOn": [
2892
3229
  "@jskit-ai/http-runtime",
2893
3230
  "@jskit-ai/shell-web",
3231
+ "@jskit-ai/uploads-image-web",
2894
3232
  "@jskit-ai/users-core"
2895
3233
  ],
2896
3234
  "capabilities": {
@@ -2916,17 +3254,6 @@
2916
3254
  }
2917
3255
  },
2918
3256
  "metadata": {
2919
- "client": {
2920
- "optimizeDeps": {
2921
- "include": [
2922
- "@uppy/core",
2923
- "@uppy/dashboard",
2924
- "@uppy/image-editor",
2925
- "@uppy/compressor",
2926
- "@uppy/xhr-upload"
2927
- ]
2928
- }
2929
- },
2930
3257
  "apiSummary": {
2931
3258
  "surfaces": [
2932
3259
  {
@@ -3149,16 +3476,12 @@
3149
3476
  "runtime": {
3150
3477
  "@tanstack/vue-query": "5.92.12",
3151
3478
  "@mdi/js": "^7.4.47",
3152
- "@uppy/compressor": "^3.1.0",
3153
- "@uppy/core": "^5.2.0",
3154
- "@uppy/dashboard": "^5.1.1",
3155
- "@uppy/image-editor": "^4.2.0",
3156
- "@uppy/xhr-upload": "^5.1.1",
3157
- "@jskit-ai/http-runtime": "0.1.20",
3158
- "@jskit-ai/realtime": "0.1.20",
3159
- "@jskit-ai/kernel": "0.1.21",
3160
- "@jskit-ai/shell-web": "0.1.20",
3161
- "@jskit-ai/users-core": "0.1.30",
3479
+ "@jskit-ai/http-runtime": "0.1.22",
3480
+ "@jskit-ai/realtime": "0.1.22",
3481
+ "@jskit-ai/kernel": "0.1.23",
3482
+ "@jskit-ai/shell-web": "0.1.22",
3483
+ "@jskit-ai/uploads-image-web": "0.1.1",
3484
+ "@jskit-ai/users-core": "0.1.32",
3162
3485
  "vuetify": "^4.0.0"
3163
3486
  },
3164
3487
  "dev": {}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jskit-ai/jskit-catalog",
3
- "version": "0.1.29",
3
+ "version": "0.1.31",
4
4
  "description": "Published metadata catalog for JSKIT package descriptors.",
5
5
  "type": "module",
6
6
  "files": [