@vc-shell/vc-app-skill 2.0.0-alpha.33 → 2.0.0-alpha.34

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 (195) hide show
  1. package/CHANGELOG.md +78 -54
  2. package/README.md +42 -12
  3. package/package.json +4 -4
  4. package/runtime/VERSION +1 -1
  5. package/runtime/agents/api-analyzer.md +31 -16
  6. package/runtime/agents/blade-enhancer.md +15 -9
  7. package/runtime/agents/details-blade-generator.md +47 -31
  8. package/runtime/agents/list-blade-generator.md +21 -37
  9. package/runtime/agents/locales-generator.md +3 -0
  10. package/runtime/agents/migration-agent.md +18 -7
  11. package/runtime/agents/module-analyzer.md +2 -0
  12. package/runtime/agents/module-assembler.md +15 -0
  13. package/runtime/agents/promote-agent.md +15 -4
  14. package/runtime/agents/type-checker.md +11 -0
  15. package/runtime/knowledge/docs/_BUILD_HASH.md +1 -1
  16. package/runtime/knowledge/docs/core/api/platform.docs.md +30 -30
  17. package/runtime/knowledge/docs/core/blade-navigation/blade-nav-composables.docs.md +41 -41
  18. package/runtime/knowledge/docs/core/composables/bladeContext/index.docs.md +12 -10
  19. package/runtime/knowledge/docs/core/composables/useApiClient/useApiClient.docs.md +11 -14
  20. package/runtime/knowledge/docs/core/composables/useAppBarMobileButtons/useAppBarMobileButtons.docs.md +35 -35
  21. package/runtime/knowledge/docs/core/composables/useAppBarWidget/useAppBarWidget.docs.md +35 -35
  22. package/runtime/knowledge/docs/core/composables/useAppInsights/useAppInsights.docs.md +15 -15
  23. package/runtime/knowledge/docs/core/composables/useAssets/useAssets.docs.md +21 -18
  24. package/runtime/knowledge/docs/core/composables/useAssetsManager/useAssetsManager.docs.md +28 -24
  25. package/runtime/knowledge/docs/core/composables/useAsync/useAsync.docs.md +90 -61
  26. package/runtime/knowledge/docs/core/composables/useBeforeUnload/useBeforeUnload.docs.md +19 -18
  27. package/runtime/knowledge/docs/core/composables/useBlade/useBlade.docs.md +89 -68
  28. package/runtime/knowledge/docs/core/composables/useBladeForm/useBladeForm.docs.md +27 -25
  29. package/runtime/knowledge/docs/core/composables/useBladeRegistry/useBladeRegistry.docs.md +15 -15
  30. package/runtime/knowledge/docs/core/composables/useBladeWidgets/index.docs.md +43 -47
  31. package/runtime/knowledge/docs/core/composables/useBreadcrumbs/useBreadcrumbs.docs.md +11 -11
  32. package/runtime/knowledge/docs/core/composables/useConnectionStatus/useConnectionStatus.docs.md +27 -15
  33. package/runtime/knowledge/docs/core/composables/useDashboard/useDashboard.docs.md +30 -30
  34. package/runtime/knowledge/docs/core/composables/useDynamicProperties/useDynamicProperties.docs.md +34 -36
  35. package/runtime/knowledge/docs/core/composables/useErrorHandler/useErrorHandler.docs.md +44 -23
  36. package/runtime/knowledge/docs/core/composables/useFunctions/useFunctions.docs.md +14 -11
  37. package/runtime/knowledge/docs/core/composables/useKeyboardNavigation/useKeyboardNavigation.docs.md +47 -38
  38. package/runtime/knowledge/docs/core/composables/useLanguages/useLanguages.docs.md +37 -28
  39. package/runtime/knowledge/docs/core/composables/useLoading/useLoading.docs.md +23 -17
  40. package/runtime/knowledge/docs/core/composables/useMenuExpanded/index.docs.md +9 -9
  41. package/runtime/knowledge/docs/core/composables/useMenuService/useMenuService.docs.md +42 -42
  42. package/runtime/knowledge/docs/core/composables/useModificationTracker/useModificationTracker.docs.md +22 -12
  43. package/runtime/knowledge/docs/core/composables/useNotifications/useNotifications.docs.md +33 -41
  44. package/runtime/knowledge/docs/core/composables/usePermissions/usePermissions.docs.md +16 -16
  45. package/runtime/knowledge/docs/core/composables/usePlatformLocaleSync/usePlatformLocaleSync.docs.md +28 -0
  46. package/runtime/knowledge/docs/core/composables/usePopup/usePopup.docs.md +32 -24
  47. package/runtime/knowledge/docs/core/composables/useResponsive/useResponsive.docs.md +32 -11
  48. package/runtime/knowledge/docs/core/composables/useSettings/useSettings.docs.md +22 -13
  49. package/runtime/knowledge/docs/core/composables/useSettingsMenu/useSettingsMenu.docs.md +7 -7
  50. package/runtime/knowledge/docs/core/composables/useSidebarState/useSidebarState.docs.md +32 -24
  51. package/runtime/knowledge/docs/core/composables/useSlowNetworkDetection/useSlowNetworkDetection.docs.md +21 -17
  52. package/runtime/knowledge/docs/core/composables/useTheme/useTheme.docs.md +24 -24
  53. package/runtime/knowledge/docs/core/composables/useToolbar/useToolbar.docs.md +28 -31
  54. package/runtime/knowledge/docs/core/composables/useUser/useUser.docs.md +43 -24
  55. package/runtime/knowledge/docs/core/composables/useUserManagement/useUserManagement.docs.md +68 -48
  56. package/runtime/knowledge/docs/core/composables/useWebVitals/useWebVitals.docs.md +19 -19
  57. package/runtime/knowledge/docs/core/composables/useWidgets/useWidgets.docs.md +42 -47
  58. package/runtime/knowledge/docs/core/directives/autofocus/autofocus.docs.md +10 -4
  59. package/runtime/knowledge/docs/core/directives/loading/loading.docs.md +35 -20
  60. package/runtime/knowledge/docs/core/notifications/notifications.docs.md +36 -35
  61. package/runtime/knowledge/docs/core/plugins/ai-agent/ai-agent.docs.md +38 -38
  62. package/runtime/knowledge/docs/core/plugins/extension-points/extension-points.docs.md +79 -62
  63. package/runtime/knowledge/docs/core/plugins/global-error-handler/global-error-handler.docs.md +10 -10
  64. package/runtime/knowledge/docs/core/plugins/i18n/i18n.docs.md +21 -23
  65. package/runtime/knowledge/docs/core/plugins/modularity/modularity.docs.md +91 -83
  66. package/runtime/knowledge/docs/core/plugins/permissions/permissions.docs.md +10 -16
  67. package/runtime/knowledge/docs/core/plugins/signalR/signalR.docs.md +9 -9
  68. package/runtime/knowledge/docs/core/plugins/validation/validation.docs.md +65 -22
  69. package/runtime/knowledge/docs/core/services/services.docs.md +19 -22
  70. package/runtime/knowledge/docs/core/types/types.docs.md +40 -40
  71. package/runtime/knowledge/docs/core/utilities/date/date-utilities.docs.md +27 -27
  72. package/runtime/knowledge/docs/core/utilities/shared-utilities.docs.md +23 -23
  73. package/runtime/knowledge/docs/core/utilities/thumbnail/thumbnail.docs.md +22 -25
  74. package/runtime/knowledge/docs/core/utilities/utilities.docs.md +64 -64
  75. package/runtime/knowledge/docs/injection-keys.docs.md +52 -51
  76. package/runtime/knowledge/docs/modules/assets-manager/assets-manager.docs.md +9 -9
  77. package/runtime/knowledge/docs/shell/_internal/popup/common/popup-common.docs.md +23 -43
  78. package/runtime/knowledge/docs/shell/auth/ChangePasswordPage/change-password-page.docs.md +5 -5
  79. package/runtime/knowledge/docs/shell/auth/ForgotPasswordPage/forgot-password-page.docs.md +5 -5
  80. package/runtime/knowledge/docs/shell/auth/InvitePage/invite-page.docs.md +8 -7
  81. package/runtime/knowledge/docs/shell/auth/LoginPage/login-page.docs.md +7 -7
  82. package/runtime/knowledge/docs/shell/auth/ResetPasswordPage/reset-password-page.docs.md +8 -7
  83. package/runtime/knowledge/docs/shell/auth/sign-in/sign-in.docs.md +29 -13
  84. package/runtime/knowledge/docs/shell/components/change-password/change-password.docs.md +13 -16
  85. package/runtime/knowledge/docs/shell/components/change-password-button/change-password-button.docs.md +1 -7
  86. package/runtime/knowledge/docs/shell/components/error-interceptor/error-interceptor.docs.md +5 -5
  87. package/runtime/knowledge/docs/shell/components/language-selector/language-selector.docs.md +1 -1
  88. package/runtime/knowledge/docs/shell/components/logout-button/logout-button.docs.md +1 -1
  89. package/runtime/knowledge/docs/shell/components/notification-template/notification-template.docs.md +17 -9
  90. package/runtime/knowledge/docs/shell/components/settings-menu/settings-menu.docs.md +11 -17
  91. package/runtime/knowledge/docs/shell/components/settings-menu-item/settings-menu-item.docs.md +34 -65
  92. package/runtime/knowledge/docs/shell/components/sidebar/sidebar.docs.md +16 -26
  93. package/runtime/knowledge/docs/shell/components/theme-selector/theme-selector.docs.md +2 -2
  94. package/runtime/knowledge/docs/shell/components/user-dropdown-button/user-dropdown-button.docs.md +7 -9
  95. package/runtime/knowledge/docs/shell/dashboard/dashboard-charts/dashboard-charts.docs.md +30 -40
  96. package/runtime/knowledge/docs/shell/dashboard/dashboard-widget-card/dashboard-widget-card.docs.md +26 -19
  97. package/runtime/knowledge/docs/shell/dashboard/draggable-dashboard/draggable-dashboard.docs.md +15 -12
  98. package/runtime/knowledge/docs/ui/components/atoms/vc-badge/vc-badge.docs.md +15 -26
  99. package/runtime/knowledge/docs/ui/components/atoms/vc-banner/vc-banner.docs.md +21 -19
  100. package/runtime/knowledge/docs/ui/components/atoms/vc-button/vc-button.docs.md +83 -67
  101. package/runtime/knowledge/docs/ui/components/atoms/vc-card/vc-card.docs.md +100 -59
  102. package/runtime/knowledge/docs/ui/components/atoms/vc-col/vc-col.docs.md +28 -11
  103. package/runtime/knowledge/docs/ui/components/atoms/vc-container/vc-container.docs.md +20 -17
  104. package/runtime/knowledge/docs/ui/components/atoms/vc-hint/vc-hint.docs.md +26 -17
  105. package/runtime/knowledge/docs/ui/components/atoms/vc-icon/vc-icon.docs.md +30 -32
  106. package/runtime/knowledge/docs/ui/components/atoms/vc-image/vc-image.docs.md +25 -48
  107. package/runtime/knowledge/docs/ui/components/atoms/vc-label/vc-label.docs.md +29 -24
  108. package/runtime/knowledge/docs/ui/components/atoms/vc-link/vc-link.docs.md +23 -15
  109. package/runtime/knowledge/docs/ui/components/atoms/vc-loading/vc-loading.docs.md +22 -13
  110. package/runtime/knowledge/docs/ui/components/atoms/vc-progress/vc-progress.docs.md +33 -18
  111. package/runtime/knowledge/docs/ui/components/atoms/vc-row/vc-row.docs.md +56 -15
  112. package/runtime/knowledge/docs/ui/components/atoms/vc-scrollable-container/vc-scrollable-container.docs.md +28 -15
  113. package/runtime/knowledge/docs/ui/components/atoms/vc-skeleton/vc-skeleton.docs.md +40 -20
  114. package/runtime/knowledge/docs/ui/components/atoms/vc-status/vc-status.docs.md +25 -14
  115. package/runtime/knowledge/docs/ui/components/atoms/vc-status-icon/vc-status-icon.docs.md +40 -14
  116. package/runtime/knowledge/docs/ui/components/atoms/vc-tooltip/vc-tooltip.docs.md +54 -42
  117. package/runtime/knowledge/docs/ui/components/atoms/vc-video/vc-video.docs.md +17 -17
  118. package/runtime/knowledge/docs/ui/components/atoms/vc-widget/vc-widget.docs.md +21 -21
  119. package/runtime/knowledge/docs/ui/components/molecules/multilanguage-selector/multilanguage-selector.docs.md +23 -10
  120. package/runtime/knowledge/docs/ui/components/molecules/vc-accordion/vc-accordion.docs.md +55 -44
  121. package/runtime/knowledge/docs/ui/components/molecules/vc-breadcrumbs/vc-breadcrumbs.docs.md +23 -20
  122. package/runtime/knowledge/docs/ui/components/molecules/vc-checkbox/vc-checkbox.docs.md +92 -65
  123. package/runtime/knowledge/docs/ui/components/molecules/vc-checkbox-group/vc-checkbox-group.docs.md +22 -36
  124. package/runtime/knowledge/docs/ui/components/molecules/vc-color-input/vc-color-input.docs.md +65 -23
  125. package/runtime/knowledge/docs/ui/components/molecules/vc-date-picker/vc-date-picker.docs.md +52 -73
  126. package/runtime/knowledge/docs/ui/components/molecules/vc-dropdown/vc-dropdown.docs.md +91 -85
  127. package/runtime/knowledge/docs/ui/components/molecules/vc-dropdown-panel/vc-dropdown-panel.docs.md +38 -42
  128. package/runtime/knowledge/docs/ui/components/molecules/vc-editor/vc-editor.docs.md +56 -73
  129. package/runtime/knowledge/docs/ui/components/molecules/vc-field/vc-field.docs.md +61 -27
  130. package/runtime/knowledge/docs/ui/components/molecules/vc-file-upload/vc-file-upload.docs.md +42 -50
  131. package/runtime/knowledge/docs/ui/components/molecules/vc-form/vc-form.docs.md +35 -64
  132. package/runtime/knowledge/docs/ui/components/molecules/vc-image-tile/vc-image-tile.docs.md +38 -41
  133. package/runtime/knowledge/docs/ui/components/molecules/vc-input/vc-input.docs.md +109 -131
  134. package/runtime/knowledge/docs/ui/components/molecules/vc-input-currency/vc-input-currency.docs.md +47 -88
  135. package/runtime/knowledge/docs/ui/components/molecules/vc-input-dropdown/vc-input-dropdown.docs.md +50 -64
  136. package/runtime/knowledge/docs/ui/components/molecules/vc-input-group/vc-input-group.docs.md +29 -24
  137. package/runtime/knowledge/docs/ui/components/molecules/vc-menu/vc-menu.docs.md +32 -28
  138. package/runtime/knowledge/docs/ui/components/molecules/vc-multivalue/vc-multivalue.docs.md +57 -65
  139. package/runtime/knowledge/docs/ui/components/molecules/vc-pagination/vc-pagination.docs.md +28 -26
  140. package/runtime/knowledge/docs/ui/components/molecules/vc-radio-button/vc-radio-button.docs.md +55 -20
  141. package/runtime/knowledge/docs/ui/components/molecules/vc-radio-group/vc-radio-group.docs.md +21 -35
  142. package/runtime/knowledge/docs/ui/components/molecules/vc-rating/vc-rating.docs.md +38 -33
  143. package/runtime/knowledge/docs/ui/components/molecules/vc-select/vc-select.docs.md +72 -83
  144. package/runtime/knowledge/docs/ui/components/molecules/vc-slider/vc-slider.docs.md +21 -16
  145. package/runtime/knowledge/docs/ui/components/molecules/vc-switch/vc-switch.docs.md +55 -64
  146. package/runtime/knowledge/docs/ui/components/molecules/vc-textarea/vc-textarea.docs.md +51 -70
  147. package/runtime/knowledge/docs/ui/components/molecules/vc-toast/vc-toast.docs.md +58 -57
  148. package/runtime/knowledge/docs/ui/components/organisms/vc-app/vc-app.docs.md +49 -26
  149. package/runtime/knowledge/docs/ui/components/organisms/vc-auth-layout/vc-auth-layout.docs.md +82 -28
  150. package/runtime/knowledge/docs/ui/components/organisms/vc-blade/vc-blade.docs.md +90 -75
  151. package/runtime/knowledge/docs/ui/components/organisms/vc-data-table/composables/table-composables.docs.md +99 -48
  152. package/runtime/knowledge/docs/ui/components/organisms/vc-data-table/vc-data-table.docs.md +548 -367
  153. package/runtime/knowledge/docs/ui/components/organisms/vc-dynamic-property/vc-dynamic-property.docs.md +35 -52
  154. package/runtime/knowledge/docs/ui/components/organisms/vc-gallery/vc-gallery.docs.md +33 -62
  155. package/runtime/knowledge/docs/ui/components/organisms/vc-image-upload/vc-image-upload.docs.md +17 -23
  156. package/runtime/knowledge/docs/ui/components/organisms/vc-popup/vc-popup.docs.md +109 -68
  157. package/runtime/knowledge/docs/ui/components/organisms/vc-sidebar/vc-sidebar.docs.md +82 -44
  158. package/runtime/knowledge/docs/ui/composables/ui-composables.docs.md +8 -8
  159. package/runtime/knowledge/docs/ui/composables/useDataTablePagination.docs.md +164 -0
  160. package/runtime/knowledge/docs/ui/composables/useDataTableSort.docs.md +34 -26
  161. package/runtime/knowledge/docs/ui/composables/useTableSelection.docs.md +48 -40
  162. package/runtime/knowledge/docs/ui/composables/useTableSort.docs.md +30 -17
  163. package/runtime/knowledge/docs/ui/types/ui-types.docs.md +40 -29
  164. package/runtime/knowledge/examples/offers-module.md +15 -13
  165. package/runtime/knowledge/examples/team-module.md +82 -119
  166. package/runtime/knowledge/examples/videos-module.md +44 -17
  167. package/runtime/knowledge/index.md +22 -0
  168. package/runtime/knowledge/migration-prompts/blade-form-migration.md +17 -8
  169. package/runtime/knowledge/migration-prompts/blade-props-migration.md +1 -2
  170. package/runtime/knowledge/migration-prompts/datatable-migration.md +801 -0
  171. package/runtime/knowledge/migration-prompts/icon-migration.md +97 -0
  172. package/runtime/knowledge/migration-prompts/manual-migration-audit.md +117 -0
  173. package/runtime/knowledge/migration-prompts/notifications-migration.md +8 -3
  174. package/runtime/knowledge/migration-prompts/nswag-migration.md +25 -29
  175. package/runtime/knowledge/migration-prompts/use-assets-migration.md +164 -0
  176. package/runtime/knowledge/migration-prompts/use-data-table-pagination-migration.md +176 -0
  177. package/runtime/knowledge/migration-prompts/widgets-migration.md +48 -27
  178. package/runtime/knowledge/patterns/assets-management.md +20 -20
  179. package/runtime/knowledge/patterns/blade-navigation.md +7 -14
  180. package/runtime/knowledge/patterns/blade-widget.md +19 -17
  181. package/runtime/knowledge/patterns/child-blade-flow.md +19 -7
  182. package/runtime/knowledge/patterns/composable-details.md +20 -50
  183. package/runtime/knowledge/patterns/composable-list.md +43 -31
  184. package/runtime/knowledge/patterns/dashboard-widget.md +14 -16
  185. package/runtime/knowledge/patterns/datatable-pattern.md +521 -0
  186. package/runtime/knowledge/patterns/details-blade-pattern.md +78 -116
  187. package/runtime/knowledge/patterns/extension-points-usage.md +53 -44
  188. package/runtime/knowledge/patterns/form-validation.md +28 -64
  189. package/runtime/knowledge/patterns/list-blade-pattern.md +33 -21
  190. package/runtime/knowledge/patterns/module-structure.md +7 -1
  191. package/runtime/knowledge/patterns/multilanguage-fields.md +8 -14
  192. package/runtime/knowledge/patterns/notification-template.md +21 -14
  193. package/runtime/knowledge/patterns/signalr-notifications.md +30 -32
  194. package/runtime/knowledge/patterns/toolbar-pattern.md +18 -20
  195. package/runtime/vc-app.md +241 -62
@@ -0,0 +1,97 @@
1
+ ---
2
+ name: icon-migration
3
+ description: AI transformation rules for migrating non-lucide icons to lucide equivalents.
4
+ ---
5
+
6
+ # Icon Migration: material-/bi-/fa- → lucide-
7
+
8
+ All icons in the v2 framework must use the `lucide-` prefix. Replace all `material-*`, `bi-*`, and `fa-*` icons with their lucide equivalents.
9
+
10
+ ## RULE 1: Replace Icon Strings
11
+
12
+ Scan ALL `.vue` and `.ts` files in the affected module for icon strings. For each non-lucide icon, choose the closest semantic match from the lucide icon set (https://lucide.dev/icons).
13
+
14
+ When choosing a replacement:
15
+
16
+ - Match by **meaning**, not by visual similarity — e.g., `material-delete` → `lucide-trash-2` (both mean "delete")
17
+ - Use the most specific icon available — e.g., `material-person_add` → `lucide-user-plus` (not just `lucide-user`)
18
+ - When no perfect match exists, pick the closest conceptual equivalent and note it in the report
19
+
20
+ **BEFORE:**
21
+
22
+ ```typescript
23
+ const bladeToolbar = computed((): IBladeToolbar[] => [
24
+ {
25
+ id: "refresh",
26
+ icon: "material-refresh",
27
+ title: t("...REFRESH"),
28
+ clickHandler: reload,
29
+ },
30
+ {
31
+ id: "add",
32
+ icon: "material-add",
33
+ title: t("...ADD"),
34
+ clickHandler: addItem,
35
+ },
36
+ {
37
+ id: "delete",
38
+ icon: "material-delete",
39
+ title: t("...DELETE"),
40
+ clickHandler: deleteItems,
41
+ },
42
+ ]);
43
+ ```
44
+
45
+ **AFTER:**
46
+
47
+ ```typescript
48
+ const bladeToolbar = computed((): IBladeToolbar[] => [
49
+ {
50
+ id: "refresh",
51
+ icon: "lucide-refresh-cw",
52
+ title: t("...REFRESH"),
53
+ clickHandler: reload,
54
+ },
55
+ {
56
+ id: "add",
57
+ icon: "lucide-plus",
58
+ title: t("...ADD"),
59
+ clickHandler: addItem,
60
+ },
61
+ {
62
+ id: "delete",
63
+ icon: "lucide-trash-2",
64
+ title: t("...DELETE"),
65
+ clickHandler: deleteItems,
66
+ },
67
+ ]);
68
+ ```
69
+
70
+ ## RULE 2: Where Icons Appear
71
+
72
+ Icons appear in these contexts — check ALL of them:
73
+
74
+ 1. **Toolbar items:** `icon: "material-*"` in `IBladeToolbar[]`
75
+ 2. **Menu items in defineBlade:** `icon: "material-*"` in `menuItem` config
76
+ 3. **VcIcon components:** `<VcIcon icon="material-*" />`
77
+ 4. **Widget declarations:** `icon: "material-*"` in `useBladeWidgets()` config
78
+ 5. **Action builders / row actions:** `icon: "material-*"` in action definitions
79
+ 6. **Empty state configs:** `icon: "material-*"` in `:empty-state` or `:not-found-state`
80
+ 7. **Any other string literal** containing `material-`, `bi-`, or `fa-` prefixes
81
+
82
+ ## RULE 3: Perform Replacements In-Place
83
+
84
+ This is a **mechanical replacement** — do not restructure code. For each icon string found:
85
+
86
+ 1. Identify the icon name (e.g., `material-edit_square`)
87
+ 2. Determine the semantic meaning (e.g., "edit with square indicator")
88
+ 3. Find the best lucide match (e.g., `lucide-square-pen`)
89
+ 4. Replace the string in-place
90
+
91
+ ## Verification
92
+
93
+ After migration:
94
+
95
+ 1. Search for remaining non-lucide icons: `grep -rn '"material-\|"bi-\|fa-' src/modules/`
96
+ 2. Verify no results (all icons should be `lucide-*`)
97
+ 3. Run the app and visually confirm icons render correctly
@@ -0,0 +1,117 @@
1
+ ---
2
+ name: manual-migration-audit
3
+ description: AI transformation rules for findings emitted by manual-migration-audit transform.
4
+ ---
5
+
6
+ # Manual Migration Audit Fixes
7
+
8
+ Apply targeted refactors for diagnostics emitted by `manual-migration-audit`.
9
+
10
+ ## RULE 1: `useExternalWidgets` is removed
11
+
12
+ Replace `useExternalWidgets(...)` with module-level widget composables based on `useBladeWidgets()`.
13
+
14
+ **BEFORE:**
15
+
16
+ ```typescript
17
+ import { useExternalWidgets } from "@vc-shell/framework";
18
+
19
+ useExternalWidgets({ bladeId, item });
20
+ ```
21
+
22
+ **AFTER:**
23
+
24
+ ```typescript
25
+ import { useEntityWidgets } from "../widgets";
26
+
27
+ useEntityWidgets({
28
+ item,
29
+ isVisible: computed(() => !!param.value),
30
+ disabled,
31
+ });
32
+ ```
33
+
34
+ If widget migration is not yet done, perform it first (`widgets-migration` topic).
35
+
36
+ ## RULE 2: Replace `moment` usage with framework date utilities
37
+
38
+ **BEFORE:**
39
+
40
+ ```typescript
41
+ import moment from "moment";
42
+
43
+ const formatted = moment(item.value.createdDate).format("L LT");
44
+ ```
45
+
46
+ **AFTER:**
47
+
48
+ ```typescript
49
+ import { formatDateWithPattern } from "@vc-shell/framework";
50
+
51
+ const formatted = formatDateWithPattern(item.value.createdDate, "L LT", currentLocale.value);
52
+ ```
53
+
54
+ For relative dates, use `formatDateRelative` from `@vc-shell/framework`.
55
+
56
+ ## RULE 3: Replace `useFunctions().debounce` with `useDebounceFn`
57
+
58
+ **BEFORE:**
59
+
60
+ ```typescript
61
+ import { useFunctions } from "@vc-shell/framework";
62
+
63
+ const { debounce } = useFunctions();
64
+ const debouncedSearch = debounce(runSearch, 300);
65
+ ```
66
+
67
+ **AFTER:**
68
+
69
+ ```typescript
70
+ import { useDebounceFn } from "@vueuse/core";
71
+
72
+ const debouncedSearch = useDebounceFn(runSearch, 300);
73
+ ```
74
+
75
+ ## RULE 4: Replace `closeBlade()` with `closeSelf()` from `useBlade()`
76
+
77
+ **BEFORE:**
78
+
79
+ ```typescript
80
+ const { closeBlade } = useBlade();
81
+ await closeBlade();
82
+ ```
83
+
84
+ **AFTER:**
85
+
86
+ ```typescript
87
+ const { closeSelf } = useBlade();
88
+ await closeSelf();
89
+ ```
90
+
91
+ If `closeBlade(index)` was used to close by index, refactor to close current blade only (or use explicit navigation logic) — do not keep index-based close calls.
92
+
93
+ ## RULE 5: Consolidate multiple `useBlade()` calls per file
94
+
95
+ Use one `useBlade()` destructuring per component/composable unless there is a strong technical reason.
96
+
97
+ **BEFORE:**
98
+
99
+ ```typescript
100
+ const { openBlade } = useBlade();
101
+ const { closeSelf } = useBlade();
102
+ ```
103
+
104
+ **AFTER:**
105
+
106
+ ```typescript
107
+ const { openBlade, closeSelf, callParent, param } = useBlade();
108
+ ```
109
+
110
+ ## Verification
111
+
112
+ After migration:
113
+
114
+ 1. Search and remove stale APIs: `useExternalWidgets`, `import moment`, `useFunctions(`, `closeBlade(`.
115
+ 2. Search for duplicate `useBlade()` calls in the same file and consolidate.
116
+ 3. Run `npx vue-tsc --noEmit`.
117
+ 4. Run `yarn build`.
@@ -146,6 +146,7 @@ export default defineAppModule({
146
146
  ```
147
147
 
148
148
  Toast options:
149
+
149
150
  - `mode`: `"auto"` (show and auto-dismiss), `"progress"` (show with progress bar), `"silent"` (no toast)
150
151
  - `severity`: `"info"` (default), `"warning"`, `"error"`, `"critical"`
151
152
 
@@ -174,9 +175,13 @@ setNotificationHandler((message) => {
174
175
  });
175
176
 
176
177
  // or watch pattern:
177
- watch(moduleNotifications, (newVal) => {
178
- // manual toast management
179
- }, { deep: true });
178
+ watch(
179
+ moduleNotifications,
180
+ (newVal) => {
181
+ // manual toast management
182
+ },
183
+ { deep: true },
184
+ );
180
185
  ```
181
186
 
182
187
  **AFTER:**
@@ -8,6 +8,7 @@ description: AI transformation rules for NSwag class→interface DTO migration.
8
8
  You are tasked with fixing TypeScript errors caused by migrating NSwag-generated API clients from class-based to interface-based data models.
9
9
 
10
10
  **Context:**
11
+
11
12
  - API Client CLASSES (e.g., `*Client` classes) remain unchanged — they still have constructors
12
13
  - DATA MODEL types (DTOs, Commands, Queries, etc.) are now INTERFACES instead of classes
13
14
  - Interfaces cannot be instantiated with `new` — use object literals with type assertions instead
@@ -120,24 +121,14 @@ When a framework function expects a constructor function (callable with `new`),
120
121
 
121
122
  ```typescript
122
123
  // BEFORE — Framework expects constructor
123
- const { loadItems } = useFrameworkHook<Type1, Type2>(
124
- fetchFunction,
125
- ItemClass,
126
- OtherClass,
127
- );
124
+ const { loadItems } = useFrameworkHook<Type1, Type2>(fetchFunction, ItemClass, OtherClass);
128
125
 
129
126
  // AFTER — Create factory functions
130
- const createItem = (data?: Partial<ItemType>): ItemType =>
131
- ({ ...data } as ItemType);
127
+ const createItem = (data?: Partial<ItemType>): ItemType => ({ ...data }) as ItemType;
132
128
 
133
- const createOther = (data?: Partial<OtherType>): OtherType =>
134
- ({ ...data } as OtherType);
129
+ const createOther = (data?: Partial<OtherType>): OtherType => ({ ...data }) as OtherType;
135
130
 
136
- const { loadItems } = useFrameworkHook<Type1, Type2>(
137
- fetchFunction,
138
- createItem,
139
- createOther,
140
- );
131
+ const { loadItems } = useFrameworkHook<Type1, Type2>(fetchFunction, createItem, createOther);
141
132
  ```
142
133
 
143
134
  ## RULE 4: Image Import Conflict with Global DOM Type
@@ -165,14 +156,14 @@ import { Image as ApiImage, Entity } from "@your-api-package";
165
156
 
166
157
  ```typescript
167
158
  // BEFORE
168
- items.map((x) => x.id)
169
- items.filter((item) => item.active)
170
- data.forEach((d) => process(d))
159
+ items.map((x) => x.id);
160
+ items.filter((item) => item.active);
161
+ data.forEach((d) => process(d));
171
162
 
172
163
  // AFTER
173
- items.map((x: ItemType) => x.id)
174
- items.filter((item: ItemType) => item.active)
175
- data.forEach((d: DataType) => process(d))
164
+ items.map((x: ItemType) => x.id);
165
+ items.filter((item: ItemType) => item.active);
166
+ data.forEach((d: DataType) => process(d));
176
167
  ```
177
168
 
178
169
  ## RULE 6: Type Mismatch in Function Arguments
@@ -183,25 +174,28 @@ Check if the function signature expects a different type (often an ID instead of
183
174
 
184
175
  ```typescript
185
176
  // BEFORE
186
- someFunction(asset) // asset is full object
177
+ someFunction(asset); // asset is full object
187
178
 
188
179
  // AFTER
189
- someFunction(asset.id) // pass the id property
180
+ someFunction(asset.id); // pass the id property
190
181
  ```
191
182
 
192
183
  ## Important Notes
193
184
 
194
185
  1. **API Client Classes are NOT affected** — Do NOT modify client classes like `*Client`. They remain classes with constructors:
186
+
195
187
  ```typescript
196
188
  const { getApiClient } = useApiClient(MyApiClient); // No change needed
197
189
  ```
198
190
 
199
191
  2. **Spread operators work with interfaces:**
192
+
200
193
  ```typescript
201
194
  const updated = { ...existingItem, name: "New Name" }; // Works fine
202
195
  ```
203
196
 
204
197
  3. **Required properties must be provided** when using type assertions:
198
+
205
199
  ```typescript
206
200
  const details: ItemDetails = {
207
201
  sku: item.sku || "",
@@ -210,6 +204,7 @@ someFunction(asset.id) // pass the id property
210
204
  ```
211
205
 
212
206
  4. **Generic type parameters need updating too:**
207
+
213
208
  ```typescript
214
209
  // BEFORE
215
210
  const { action } = useAsync<ISearchQuery>(...)
@@ -219,6 +214,7 @@ someFunction(asset.id) // pass the id property
219
214
  ```
220
215
 
221
216
  5. **Interfaces with all optional properties** can use empty object:
217
+
222
218
  ```typescript
223
219
  const query: SearchQuery = {}; // OK if all properties are optional
224
220
  ```
@@ -230,13 +226,13 @@ someFunction(asset.id) // pass the id property
230
226
 
231
227
  ## Quick Reference Table
232
228
 
233
- | Error Code | Pattern | Fix |
234
- |------------|---------|-----|
235
- | TS2724 | `IXxx` not found | Remove "I" prefix from import |
236
- | TS2693 | Type used as value | Replace `new Type({})` with `{} as Type` |
237
- | TS2866 | Import conflicts with global | Use `type` import or rename |
238
- | TS7006 | Implicit any | Add explicit type annotation |
239
- | TS2345 | Type not assignable | Check if property (like `.id`) should be passed |
229
+ | Error Code | Pattern | Fix |
230
+ | ---------- | ---------------------------- | ----------------------------------------------- |
231
+ | TS2724 | `IXxx` not found | Remove "I" prefix from import |
232
+ | TS2693 | Type used as value | Replace `new Type({})` with `{} as Type` |
233
+ | TS2866 | Import conflicts with global | Use `type` import or rename |
234
+ | TS7006 | Implicit any | Add explicit type annotation |
235
+ | TS2345 | Type not assignable | Check if property (like `.id`) should be passed |
240
236
 
241
237
  ## Verification
242
238
 
@@ -0,0 +1,164 @@
1
+ ---
2
+ name: use-assets-migration
3
+ description: AI transformation rules for useAssets()/AssetsHandler migration to useAssetsManager().
4
+ ---
5
+
6
+ # Assets Migration: useAssets -> useAssetsManager
7
+
8
+ Migrate legacy assets handling (`useAssets`, `AssetsHandler`, ad-hoc upload/remove/edit callbacks) to `useAssetsManager`.
9
+
10
+ ## RULE 1: Replace `useAssets()` with `useAssetsManager()`
11
+
12
+ **BEFORE:**
13
+
14
+ ```typescript
15
+ import { useAssets } from "@vc-shell/framework";
16
+
17
+ const { upload, remove, edit, loading } = useAssets(imagesRef, uploadPath);
18
+ ```
19
+
20
+ **AFTER:**
21
+
22
+ ```typescript
23
+ import { useAssetsManager } from "@vc-shell/framework";
24
+
25
+ const assetsManager = useAssetsManager(imagesRef, {
26
+ uploadPath: () => uploadPath.value,
27
+ confirmRemove: () => showConfirmation(t("MY_MODULE.ALERTS.DELETE_CONFIRMATION")),
28
+ });
29
+
30
+ // assetsManager.items, assetsManager.upload, assetsManager.remove,
31
+ // assetsManager.removeMany, assetsManager.reorder, assetsManager.updateItem, assetsManager.loading
32
+ ```
33
+
34
+ Notes:
35
+
36
+ - `uploadPath` must be a function (`() => string`), not a static string.
37
+ - If no confirmation is needed, omit `confirmRemove`.
38
+
39
+ ## RULE 2: Replace `ICommonAsset` with `AssetLike`
40
+
41
+ **BEFORE:**
42
+
43
+ ```typescript
44
+ import type { ICommonAsset } from "@vc-shell/framework";
45
+ ```
46
+
47
+ **AFTER:**
48
+
49
+ ```typescript
50
+ import type { AssetLike } from "@vc-shell/framework";
51
+ ```
52
+
53
+ Also update all type annotations in the file.
54
+
55
+ ## RULE 3: Single-image fields must be wrapped in writable computed array
56
+
57
+ For fields like `iconUrl`, `logo`, `photo`, convert single value <-> array bridge.
58
+
59
+ **BEFORE:**
60
+
61
+ ```typescript
62
+ const { upload, remove } = useAssets(photoRef, () => `users/${item.value?.id}`);
63
+ ```
64
+
65
+ **AFTER:**
66
+
67
+ ```typescript
68
+ const photoAssets = computed({
69
+ get: () => (item.value?.iconUrl ? [{ url: item.value.iconUrl }] : []),
70
+ set: (val) => {
71
+ if (item.value) item.value.iconUrl = val[0]?.url;
72
+ },
73
+ });
74
+
75
+ const photoManager = useAssetsManager(photoAssets, {
76
+ uploadPath: () => `users/${item.value?.id ?? "new"}`,
77
+ });
78
+ ```
79
+
80
+ ## RULE 4: `AssetsHandler` and raw handler props -> manager object
81
+
82
+ If the component receives or creates handler bundles (`assetsUploadHandler`, `assetsEditHandler`, `assetsRemoveHandler`, `AssetsHandler<T>`), replace with a manager instance.
83
+
84
+ **BEFORE:**
85
+
86
+ ```typescript
87
+ interface Props {
88
+ imageHandlers?: AssetsHandler<MyImage>;
89
+ }
90
+
91
+ const defaultHandlers = { upload, remove, edit, loading };
92
+ const handlers = props.imageHandlers ?? defaultHandlers;
93
+ ```
94
+
95
+ **AFTER:**
96
+
97
+ ```typescript
98
+ interface Props {
99
+ manager?: ReturnType<typeof useAssetsManager>;
100
+ }
101
+
102
+ const defaultManager = useAssetsManager(imagesRef, {
103
+ uploadPath: () => `products/${item.value?.id}`,
104
+ });
105
+
106
+ const manager = computed(() => props.manager ?? defaultManager);
107
+ ```
108
+
109
+ ## RULE 5: `openBlade("AssetsManager")` must pass `manager: markRaw(...)`
110
+
111
+ **BEFORE:**
112
+
113
+ ```typescript
114
+ openBlade({
115
+ name: "AssetsManager",
116
+ options: {
117
+ assets: item.value?.assets,
118
+ assetsUploadHandler: upload,
119
+ assetsEditHandler: edit,
120
+ assetsRemoveHandler: remove,
121
+ loading,
122
+ },
123
+ });
124
+ ```
125
+
126
+ **AFTER:**
127
+
128
+ ```typescript
129
+ import { markRaw } from "vue";
130
+
131
+ openBlade({
132
+ name: "AssetsManager",
133
+ options: {
134
+ manager: markRaw(assetsManager),
135
+ disabled: disabled.value,
136
+ },
137
+ });
138
+ ```
139
+
140
+ If `manager` is already passed but not wrapped, add `markRaw()`.
141
+
142
+ ## RULE 6: Keep `AssetsDetails` callbacks wired to manager methods
143
+
144
+ If opening `AssetsDetails`, connect handlers to manager methods (`updateItem`, `remove`) and keep asset type as `AssetLike`.
145
+
146
+ ```typescript
147
+ openBlade({
148
+ name: "AssetsDetails",
149
+ options: {
150
+ asset,
151
+ assetEditHandler: (updated: AssetLike) => assetsManager.updateItem(updated),
152
+ assetRemoveHandler: (toRemove: AssetLike) => assetsManager.remove(toRemove),
153
+ },
154
+ });
155
+ ```
156
+
157
+ ## Verification
158
+
159
+ After migration:
160
+
161
+ 1. Search for stale API: `useAssets(`, `AssetsHandler`, `ICommonAsset`, `assetsUploadHandler`, `assetsEditHandler`, `assetsRemoveHandler`.
162
+ 2. Confirm `AssetsManager` blade calls pass `manager: markRaw(...)`.
163
+ 3. Run `npx vue-tsc --noEmit`.
164
+ 4. Validate runtime flow: upload, remove, reorder, edit metadata.
@@ -0,0 +1,176 @@
1
+ # useDataTablePagination Migration
2
+
3
+ Replace the manual `totalCount` / `pages` / `currentPage` computed triple plus hand-written `onPaginationClick` handler with a single `useDataTablePagination()` call.
4
+
5
+ ## Rule 1: Update the data composable
6
+
7
+ For each list composable file:
8
+
9
+ ### 1a. Add import
10
+
11
+ Add to the `@vc-shell/framework` import (merge, don't duplicate):
12
+
13
+ ```ts
14
+ import { useDataTablePagination, type UseDataTablePaginationReturn } from "@vc-shell/framework";
15
+ ```
16
+
17
+ ### 1b. Create `pagination` before the return
18
+
19
+ Declare, before the return block:
20
+
21
+ ```ts
22
+ const pagination = useDataTablePagination({
23
+ pageSize,
24
+ totalCount: computed(() => searchResult.value?.totalCount ?? 0),
25
+ onPageChange: ({ skip }) => loadItems({ ...searchQuery.value, skip }),
26
+ });
27
+ ```
28
+
29
+ - Use the same `pageSize` the composable already accepts as option (default 20).
30
+ - Pass `totalCount` as a computed (not a plain number).
31
+ - Use the composable's own loader name for `onPageChange` (`loadItems`, `loadMessages`, `searchXxx` — whatever already exists).
32
+
33
+ ### 1c. Replace the three computed in the return
34
+
35
+ **Before:**
36
+
37
+ ```ts
38
+ return {
39
+ totalCount: computed(() => searchResult.value?.totalCount || 0),
40
+ pages: computed(() => Math.ceil((searchResult.value?.totalCount || 1) / pageSize)),
41
+ currentPage: computed(() => Math.ceil((searchQuery.value?.skip || 0) / pageSize + 1)),
42
+ // ...other returns
43
+ };
44
+ ```
45
+
46
+ **After:**
47
+
48
+ ```ts
49
+ return {
50
+ pagination,
51
+ // ...other returns (unchanged)
52
+ };
53
+ ```
54
+
55
+ ### 1d. Update the return type interface (if present)
56
+
57
+ **Before:**
58
+
59
+ ```ts
60
+ export interface IUseList {
61
+ totalCount: ComputedRef<number>;
62
+ pages: ComputedRef<number>;
63
+ currentPage: ComputedRef<number>;
64
+ // ...
65
+ }
66
+ ```
67
+
68
+ **After:**
69
+
70
+ ```ts
71
+ export interface IUseList {
72
+ pagination: UseDataTablePaginationReturn;
73
+ // ...
74
+ }
75
+ ```
76
+
77
+ ## Rule 2: Update the blade page template
78
+
79
+ ### 2a. Replace VcDataTable pagination bindings
80
+
81
+ **Before:**
82
+
83
+ ```vue
84
+ <VcDataTable :total-count="totalCount" :pagination="{ currentPage, pages }" @pagination-click="onPaginationClick" />
85
+ ```
86
+
87
+ **After:**
88
+
89
+ ```vue
90
+ <VcDataTable :total-count="pagination.totalCount" :pagination="pagination" @pagination-click="pagination.goToPage" />
91
+ ```
92
+
93
+ ### 2b. Update the composable destructure
94
+
95
+ **Before:**
96
+
97
+ ```ts
98
+ const { items, totalCount, pages, currentPage, searchQuery, loadItems } = useList();
99
+ ```
100
+
101
+ **After:**
102
+
103
+ ```ts
104
+ const { items, pagination, searchQuery, loadItems } = useList();
105
+ ```
106
+
107
+ ### 2c. Delete the manual `onPaginationClick` handler
108
+
109
+ Remove the entire function — it's redundant; `pagination.goToPage` fires the composable's `onPageChange`.
110
+
111
+ **Delete:**
112
+
113
+ ```ts
114
+ async function onPaginationClick(page: number) {
115
+ await loadItems({
116
+ ...searchQuery.value,
117
+ skip: (page - 1) * (searchQuery.value.take ?? 20),
118
+ });
119
+ }
120
+ ```
121
+
122
+ ### 2d. Rewrite `reload()` helper (if present)
123
+
124
+ If the blade has a `reload()` helper that recomputes skip from currentPage, use `pagination.skip`:
125
+
126
+ **Before:**
127
+
128
+ ```ts
129
+ const reload = async () => {
130
+ await loadItems({
131
+ ...searchQuery.value,
132
+ skip: (currentPage.value - 1) * (searchQuery.value.take ?? 10),
133
+ sort: sortExpression.value,
134
+ });
135
+ };
136
+ ```
137
+
138
+ **After:**
139
+
140
+ ```ts
141
+ const reload = async () => {
142
+ await loadItems({
143
+ ...searchQuery.value,
144
+ skip: pagination.skip,
145
+ sort: sortExpression.value,
146
+ });
147
+ };
148
+ ```
149
+
150
+ ## Rule 3: VcTable / VcTableAdapter — skip that file (not the whole topic)
151
+
152
+ Per-file check. If a specific blade page still uses `<VcTable>` (legacy adapter, with `:pages` + `:current-page` scalar props), SKIP that file — migrating pagination against a different table API would break the bindings. But:
153
+
154
+ - **Still migrate the composable** if other callers (pages with `<VcDataTable>`) exist — the composable change is independent of any single consumer.
155
+ - **Still migrate other pages** in the same `affectedFiles` list that DO use `<VcDataTable>`.
156
+ - In your report, mark the skipped file(s) as `needs vctable-audit first` so the user knows why.
157
+
158
+ Do not skip the entire topic just because one file is out of scope.
159
+
160
+ ## Rule 4: Infinite-scroll tables — skip that file
161
+
162
+ If a specific VcDataTable uses `:infinite-scroll="true"`, pagination is not used — skip that file. Same per-file rule as Rule 3.
163
+
164
+ ## Behavioral notes
165
+
166
+ - `pagination` is a `reactive()` object — access properties directly (`pagination.totalCount`), never `.value`.
167
+ - Do NOT destructure `pagination` — destructuring loses reactivity.
168
+ - `pagination.reset()` sets currentPage to 1 silently (no onPageChange fire). Use when resetting filters.
169
+
170
+ ## Self-check after migration
171
+
172
+ - [ ] `totalCount`, `pages`, `currentPage` no longer appear in the composable's return.
173
+ - [ ] `onPaginationClick` function is deleted from the blade page.
174
+ - [ ] Template uses `pagination.goToPage` not a handwritten callback.
175
+ - [ ] No `.value` access on `pagination.*` properties.
176
+ - [ ] `useDataTablePagination` import is present in the composable.