@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.
- package/CHANGELOG.md +78 -54
- package/README.md +42 -12
- package/package.json +4 -4
- package/runtime/VERSION +1 -1
- package/runtime/agents/api-analyzer.md +31 -16
- package/runtime/agents/blade-enhancer.md +15 -9
- package/runtime/agents/details-blade-generator.md +47 -31
- package/runtime/agents/list-blade-generator.md +21 -37
- package/runtime/agents/locales-generator.md +3 -0
- package/runtime/agents/migration-agent.md +18 -7
- package/runtime/agents/module-analyzer.md +2 -0
- package/runtime/agents/module-assembler.md +15 -0
- package/runtime/agents/promote-agent.md +15 -4
- package/runtime/agents/type-checker.md +11 -0
- package/runtime/knowledge/docs/_BUILD_HASH.md +1 -1
- package/runtime/knowledge/docs/core/api/platform.docs.md +30 -30
- package/runtime/knowledge/docs/core/blade-navigation/blade-nav-composables.docs.md +41 -41
- package/runtime/knowledge/docs/core/composables/bladeContext/index.docs.md +12 -10
- package/runtime/knowledge/docs/core/composables/useApiClient/useApiClient.docs.md +11 -14
- package/runtime/knowledge/docs/core/composables/useAppBarMobileButtons/useAppBarMobileButtons.docs.md +35 -35
- package/runtime/knowledge/docs/core/composables/useAppBarWidget/useAppBarWidget.docs.md +35 -35
- package/runtime/knowledge/docs/core/composables/useAppInsights/useAppInsights.docs.md +15 -15
- package/runtime/knowledge/docs/core/composables/useAssets/useAssets.docs.md +21 -18
- package/runtime/knowledge/docs/core/composables/useAssetsManager/useAssetsManager.docs.md +28 -24
- package/runtime/knowledge/docs/core/composables/useAsync/useAsync.docs.md +90 -61
- package/runtime/knowledge/docs/core/composables/useBeforeUnload/useBeforeUnload.docs.md +19 -18
- package/runtime/knowledge/docs/core/composables/useBlade/useBlade.docs.md +89 -68
- package/runtime/knowledge/docs/core/composables/useBladeForm/useBladeForm.docs.md +27 -25
- package/runtime/knowledge/docs/core/composables/useBladeRegistry/useBladeRegistry.docs.md +15 -15
- package/runtime/knowledge/docs/core/composables/useBladeWidgets/index.docs.md +43 -47
- package/runtime/knowledge/docs/core/composables/useBreadcrumbs/useBreadcrumbs.docs.md +11 -11
- package/runtime/knowledge/docs/core/composables/useConnectionStatus/useConnectionStatus.docs.md +27 -15
- package/runtime/knowledge/docs/core/composables/useDashboard/useDashboard.docs.md +30 -30
- package/runtime/knowledge/docs/core/composables/useDynamicProperties/useDynamicProperties.docs.md +34 -36
- package/runtime/knowledge/docs/core/composables/useErrorHandler/useErrorHandler.docs.md +44 -23
- package/runtime/knowledge/docs/core/composables/useFunctions/useFunctions.docs.md +14 -11
- package/runtime/knowledge/docs/core/composables/useKeyboardNavigation/useKeyboardNavigation.docs.md +47 -38
- package/runtime/knowledge/docs/core/composables/useLanguages/useLanguages.docs.md +37 -28
- package/runtime/knowledge/docs/core/composables/useLoading/useLoading.docs.md +23 -17
- package/runtime/knowledge/docs/core/composables/useMenuExpanded/index.docs.md +9 -9
- package/runtime/knowledge/docs/core/composables/useMenuService/useMenuService.docs.md +42 -42
- package/runtime/knowledge/docs/core/composables/useModificationTracker/useModificationTracker.docs.md +22 -12
- package/runtime/knowledge/docs/core/composables/useNotifications/useNotifications.docs.md +33 -41
- package/runtime/knowledge/docs/core/composables/usePermissions/usePermissions.docs.md +16 -16
- package/runtime/knowledge/docs/core/composables/usePlatformLocaleSync/usePlatformLocaleSync.docs.md +28 -0
- package/runtime/knowledge/docs/core/composables/usePopup/usePopup.docs.md +32 -24
- package/runtime/knowledge/docs/core/composables/useResponsive/useResponsive.docs.md +32 -11
- package/runtime/knowledge/docs/core/composables/useSettings/useSettings.docs.md +22 -13
- package/runtime/knowledge/docs/core/composables/useSettingsMenu/useSettingsMenu.docs.md +7 -7
- package/runtime/knowledge/docs/core/composables/useSidebarState/useSidebarState.docs.md +32 -24
- package/runtime/knowledge/docs/core/composables/useSlowNetworkDetection/useSlowNetworkDetection.docs.md +21 -17
- package/runtime/knowledge/docs/core/composables/useTheme/useTheme.docs.md +24 -24
- package/runtime/knowledge/docs/core/composables/useToolbar/useToolbar.docs.md +28 -31
- package/runtime/knowledge/docs/core/composables/useUser/useUser.docs.md +43 -24
- package/runtime/knowledge/docs/core/composables/useUserManagement/useUserManagement.docs.md +68 -48
- package/runtime/knowledge/docs/core/composables/useWebVitals/useWebVitals.docs.md +19 -19
- package/runtime/knowledge/docs/core/composables/useWidgets/useWidgets.docs.md +42 -47
- package/runtime/knowledge/docs/core/directives/autofocus/autofocus.docs.md +10 -4
- package/runtime/knowledge/docs/core/directives/loading/loading.docs.md +35 -20
- package/runtime/knowledge/docs/core/notifications/notifications.docs.md +36 -35
- package/runtime/knowledge/docs/core/plugins/ai-agent/ai-agent.docs.md +38 -38
- package/runtime/knowledge/docs/core/plugins/extension-points/extension-points.docs.md +79 -62
- package/runtime/knowledge/docs/core/plugins/global-error-handler/global-error-handler.docs.md +10 -10
- package/runtime/knowledge/docs/core/plugins/i18n/i18n.docs.md +21 -23
- package/runtime/knowledge/docs/core/plugins/modularity/modularity.docs.md +91 -83
- package/runtime/knowledge/docs/core/plugins/permissions/permissions.docs.md +10 -16
- package/runtime/knowledge/docs/core/plugins/signalR/signalR.docs.md +9 -9
- package/runtime/knowledge/docs/core/plugins/validation/validation.docs.md +65 -22
- package/runtime/knowledge/docs/core/services/services.docs.md +19 -22
- package/runtime/knowledge/docs/core/types/types.docs.md +40 -40
- package/runtime/knowledge/docs/core/utilities/date/date-utilities.docs.md +27 -27
- package/runtime/knowledge/docs/core/utilities/shared-utilities.docs.md +23 -23
- package/runtime/knowledge/docs/core/utilities/thumbnail/thumbnail.docs.md +22 -25
- package/runtime/knowledge/docs/core/utilities/utilities.docs.md +64 -64
- package/runtime/knowledge/docs/injection-keys.docs.md +52 -51
- package/runtime/knowledge/docs/modules/assets-manager/assets-manager.docs.md +9 -9
- package/runtime/knowledge/docs/shell/_internal/popup/common/popup-common.docs.md +23 -43
- package/runtime/knowledge/docs/shell/auth/ChangePasswordPage/change-password-page.docs.md +5 -5
- package/runtime/knowledge/docs/shell/auth/ForgotPasswordPage/forgot-password-page.docs.md +5 -5
- package/runtime/knowledge/docs/shell/auth/InvitePage/invite-page.docs.md +8 -7
- package/runtime/knowledge/docs/shell/auth/LoginPage/login-page.docs.md +7 -7
- package/runtime/knowledge/docs/shell/auth/ResetPasswordPage/reset-password-page.docs.md +8 -7
- package/runtime/knowledge/docs/shell/auth/sign-in/sign-in.docs.md +29 -13
- package/runtime/knowledge/docs/shell/components/change-password/change-password.docs.md +13 -16
- package/runtime/knowledge/docs/shell/components/change-password-button/change-password-button.docs.md +1 -7
- package/runtime/knowledge/docs/shell/components/error-interceptor/error-interceptor.docs.md +5 -5
- package/runtime/knowledge/docs/shell/components/language-selector/language-selector.docs.md +1 -1
- package/runtime/knowledge/docs/shell/components/logout-button/logout-button.docs.md +1 -1
- package/runtime/knowledge/docs/shell/components/notification-template/notification-template.docs.md +17 -9
- package/runtime/knowledge/docs/shell/components/settings-menu/settings-menu.docs.md +11 -17
- package/runtime/knowledge/docs/shell/components/settings-menu-item/settings-menu-item.docs.md +34 -65
- package/runtime/knowledge/docs/shell/components/sidebar/sidebar.docs.md +16 -26
- package/runtime/knowledge/docs/shell/components/theme-selector/theme-selector.docs.md +2 -2
- package/runtime/knowledge/docs/shell/components/user-dropdown-button/user-dropdown-button.docs.md +7 -9
- package/runtime/knowledge/docs/shell/dashboard/dashboard-charts/dashboard-charts.docs.md +30 -40
- package/runtime/knowledge/docs/shell/dashboard/dashboard-widget-card/dashboard-widget-card.docs.md +26 -19
- package/runtime/knowledge/docs/shell/dashboard/draggable-dashboard/draggable-dashboard.docs.md +15 -12
- package/runtime/knowledge/docs/ui/components/atoms/vc-badge/vc-badge.docs.md +15 -26
- package/runtime/knowledge/docs/ui/components/atoms/vc-banner/vc-banner.docs.md +21 -19
- package/runtime/knowledge/docs/ui/components/atoms/vc-button/vc-button.docs.md +83 -67
- package/runtime/knowledge/docs/ui/components/atoms/vc-card/vc-card.docs.md +100 -59
- package/runtime/knowledge/docs/ui/components/atoms/vc-col/vc-col.docs.md +28 -11
- package/runtime/knowledge/docs/ui/components/atoms/vc-container/vc-container.docs.md +20 -17
- package/runtime/knowledge/docs/ui/components/atoms/vc-hint/vc-hint.docs.md +26 -17
- package/runtime/knowledge/docs/ui/components/atoms/vc-icon/vc-icon.docs.md +30 -32
- package/runtime/knowledge/docs/ui/components/atoms/vc-image/vc-image.docs.md +25 -48
- package/runtime/knowledge/docs/ui/components/atoms/vc-label/vc-label.docs.md +29 -24
- package/runtime/knowledge/docs/ui/components/atoms/vc-link/vc-link.docs.md +23 -15
- package/runtime/knowledge/docs/ui/components/atoms/vc-loading/vc-loading.docs.md +22 -13
- package/runtime/knowledge/docs/ui/components/atoms/vc-progress/vc-progress.docs.md +33 -18
- package/runtime/knowledge/docs/ui/components/atoms/vc-row/vc-row.docs.md +56 -15
- package/runtime/knowledge/docs/ui/components/atoms/vc-scrollable-container/vc-scrollable-container.docs.md +28 -15
- package/runtime/knowledge/docs/ui/components/atoms/vc-skeleton/vc-skeleton.docs.md +40 -20
- package/runtime/knowledge/docs/ui/components/atoms/vc-status/vc-status.docs.md +25 -14
- package/runtime/knowledge/docs/ui/components/atoms/vc-status-icon/vc-status-icon.docs.md +40 -14
- package/runtime/knowledge/docs/ui/components/atoms/vc-tooltip/vc-tooltip.docs.md +54 -42
- package/runtime/knowledge/docs/ui/components/atoms/vc-video/vc-video.docs.md +17 -17
- package/runtime/knowledge/docs/ui/components/atoms/vc-widget/vc-widget.docs.md +21 -21
- package/runtime/knowledge/docs/ui/components/molecules/multilanguage-selector/multilanguage-selector.docs.md +23 -10
- package/runtime/knowledge/docs/ui/components/molecules/vc-accordion/vc-accordion.docs.md +55 -44
- package/runtime/knowledge/docs/ui/components/molecules/vc-breadcrumbs/vc-breadcrumbs.docs.md +23 -20
- package/runtime/knowledge/docs/ui/components/molecules/vc-checkbox/vc-checkbox.docs.md +92 -65
- package/runtime/knowledge/docs/ui/components/molecules/vc-checkbox-group/vc-checkbox-group.docs.md +22 -36
- package/runtime/knowledge/docs/ui/components/molecules/vc-color-input/vc-color-input.docs.md +65 -23
- package/runtime/knowledge/docs/ui/components/molecules/vc-date-picker/vc-date-picker.docs.md +52 -73
- package/runtime/knowledge/docs/ui/components/molecules/vc-dropdown/vc-dropdown.docs.md +91 -85
- package/runtime/knowledge/docs/ui/components/molecules/vc-dropdown-panel/vc-dropdown-panel.docs.md +38 -42
- package/runtime/knowledge/docs/ui/components/molecules/vc-editor/vc-editor.docs.md +56 -73
- package/runtime/knowledge/docs/ui/components/molecules/vc-field/vc-field.docs.md +61 -27
- package/runtime/knowledge/docs/ui/components/molecules/vc-file-upload/vc-file-upload.docs.md +42 -50
- package/runtime/knowledge/docs/ui/components/molecules/vc-form/vc-form.docs.md +35 -64
- package/runtime/knowledge/docs/ui/components/molecules/vc-image-tile/vc-image-tile.docs.md +38 -41
- package/runtime/knowledge/docs/ui/components/molecules/vc-input/vc-input.docs.md +109 -131
- package/runtime/knowledge/docs/ui/components/molecules/vc-input-currency/vc-input-currency.docs.md +47 -88
- package/runtime/knowledge/docs/ui/components/molecules/vc-input-dropdown/vc-input-dropdown.docs.md +50 -64
- package/runtime/knowledge/docs/ui/components/molecules/vc-input-group/vc-input-group.docs.md +29 -24
- package/runtime/knowledge/docs/ui/components/molecules/vc-menu/vc-menu.docs.md +32 -28
- package/runtime/knowledge/docs/ui/components/molecules/vc-multivalue/vc-multivalue.docs.md +57 -65
- package/runtime/knowledge/docs/ui/components/molecules/vc-pagination/vc-pagination.docs.md +28 -26
- package/runtime/knowledge/docs/ui/components/molecules/vc-radio-button/vc-radio-button.docs.md +55 -20
- package/runtime/knowledge/docs/ui/components/molecules/vc-radio-group/vc-radio-group.docs.md +21 -35
- package/runtime/knowledge/docs/ui/components/molecules/vc-rating/vc-rating.docs.md +38 -33
- package/runtime/knowledge/docs/ui/components/molecules/vc-select/vc-select.docs.md +72 -83
- package/runtime/knowledge/docs/ui/components/molecules/vc-slider/vc-slider.docs.md +21 -16
- package/runtime/knowledge/docs/ui/components/molecules/vc-switch/vc-switch.docs.md +55 -64
- package/runtime/knowledge/docs/ui/components/molecules/vc-textarea/vc-textarea.docs.md +51 -70
- package/runtime/knowledge/docs/ui/components/molecules/vc-toast/vc-toast.docs.md +58 -57
- package/runtime/knowledge/docs/ui/components/organisms/vc-app/vc-app.docs.md +49 -26
- package/runtime/knowledge/docs/ui/components/organisms/vc-auth-layout/vc-auth-layout.docs.md +82 -28
- package/runtime/knowledge/docs/ui/components/organisms/vc-blade/vc-blade.docs.md +90 -75
- package/runtime/knowledge/docs/ui/components/organisms/vc-data-table/composables/table-composables.docs.md +99 -48
- package/runtime/knowledge/docs/ui/components/organisms/vc-data-table/vc-data-table.docs.md +548 -367
- package/runtime/knowledge/docs/ui/components/organisms/vc-dynamic-property/vc-dynamic-property.docs.md +35 -52
- package/runtime/knowledge/docs/ui/components/organisms/vc-gallery/vc-gallery.docs.md +33 -62
- package/runtime/knowledge/docs/ui/components/organisms/vc-image-upload/vc-image-upload.docs.md +17 -23
- package/runtime/knowledge/docs/ui/components/organisms/vc-popup/vc-popup.docs.md +109 -68
- package/runtime/knowledge/docs/ui/components/organisms/vc-sidebar/vc-sidebar.docs.md +82 -44
- package/runtime/knowledge/docs/ui/composables/ui-composables.docs.md +8 -8
- package/runtime/knowledge/docs/ui/composables/useDataTablePagination.docs.md +164 -0
- package/runtime/knowledge/docs/ui/composables/useDataTableSort.docs.md +34 -26
- package/runtime/knowledge/docs/ui/composables/useTableSelection.docs.md +48 -40
- package/runtime/knowledge/docs/ui/composables/useTableSort.docs.md +30 -17
- package/runtime/knowledge/docs/ui/types/ui-types.docs.md +40 -29
- package/runtime/knowledge/examples/offers-module.md +15 -13
- package/runtime/knowledge/examples/team-module.md +82 -119
- package/runtime/knowledge/examples/videos-module.md +44 -17
- package/runtime/knowledge/index.md +22 -0
- package/runtime/knowledge/migration-prompts/blade-form-migration.md +17 -8
- package/runtime/knowledge/migration-prompts/blade-props-migration.md +1 -2
- package/runtime/knowledge/migration-prompts/datatable-migration.md +801 -0
- package/runtime/knowledge/migration-prompts/icon-migration.md +97 -0
- package/runtime/knowledge/migration-prompts/manual-migration-audit.md +117 -0
- package/runtime/knowledge/migration-prompts/notifications-migration.md +8 -3
- package/runtime/knowledge/migration-prompts/nswag-migration.md +25 -29
- package/runtime/knowledge/migration-prompts/use-assets-migration.md +164 -0
- package/runtime/knowledge/migration-prompts/use-data-table-pagination-migration.md +176 -0
- package/runtime/knowledge/migration-prompts/widgets-migration.md +48 -27
- package/runtime/knowledge/patterns/assets-management.md +20 -20
- package/runtime/knowledge/patterns/blade-navigation.md +7 -14
- package/runtime/knowledge/patterns/blade-widget.md +19 -17
- package/runtime/knowledge/patterns/child-blade-flow.md +19 -7
- package/runtime/knowledge/patterns/composable-details.md +20 -50
- package/runtime/knowledge/patterns/composable-list.md +43 -31
- package/runtime/knowledge/patterns/dashboard-widget.md +14 -16
- package/runtime/knowledge/patterns/datatable-pattern.md +521 -0
- package/runtime/knowledge/patterns/details-blade-pattern.md +78 -116
- package/runtime/knowledge/patterns/extension-points-usage.md +53 -44
- package/runtime/knowledge/patterns/form-validation.md +28 -64
- package/runtime/knowledge/patterns/list-blade-pattern.md +33 -21
- package/runtime/knowledge/patterns/module-structure.md +7 -1
- package/runtime/knowledge/patterns/multilanguage-fields.md +8 -14
- package/runtime/knowledge/patterns/notification-template.md +21 -14
- package/runtime/knowledge/patterns/signalr-notifications.md +30 -32
- package/runtime/knowledge/patterns/toolbar-pattern.md +18 -20
- package/runtime/vc-app.md +241 -62
package/runtime/vc-app.md
CHANGED
|
@@ -45,16 +45,16 @@ Store `DOCS_ROOT` for passing to subagents.
|
|
|
45
45
|
|
|
46
46
|
Parse `$ARGUMENTS` to determine the subcommand:
|
|
47
47
|
|
|
48
|
-
| Arguments pattern
|
|
49
|
-
|
|
50
|
-
| `create ...`
|
|
51
|
-
| `connect ...`
|
|
52
|
-
| `add-module <name>`
|
|
53
|
-
| `generate ...`
|
|
54
|
-
| `promote <moduleName>`
|
|
55
|
-
| `design ...` | Section: `/vc-app design`
|
|
56
|
-
| `migrate`
|
|
57
|
-
| empty / `help` / `--help` | Section: Help
|
|
48
|
+
| Arguments pattern | Route to |
|
|
49
|
+
| ------------------------- | ----------------------------- |
|
|
50
|
+
| `create ...` | Section: `/vc-app create` |
|
|
51
|
+
| `connect ...` | Section: `/vc-app connect` |
|
|
52
|
+
| `add-module <name>` | Section: `/vc-app add-module` |
|
|
53
|
+
| `generate ...` | Section: `/vc-app generate` |
|
|
54
|
+
| `promote <moduleName>` | Section: `/vc-app promote` |
|
|
55
|
+
| `design ...` | Section: `/vc-app design` |
|
|
56
|
+
| `migrate` | Section: `/vc-app migrate` |
|
|
57
|
+
| empty / `help` / `--help` | Section: Help |
|
|
58
58
|
|
|
59
59
|
If no arguments match, show the help section.
|
|
60
60
|
|
|
@@ -161,7 +161,7 @@ Interactive platform connection dialog. This configures environment variables an
|
|
|
161
161
|
### Dialog
|
|
162
162
|
|
|
163
163
|
1. **Ask the user:** What is the platform URL? (e.g., `https://admin.example.com` or `https://localhost:5001`)
|
|
164
|
-
2. **Ask the user:** Which platform modules do you need API clients for? (comma-separated, e.g., `VirtoCommerce.Orders,VirtoCommerce.Catalog,VirtoCommerce.
|
|
164
|
+
2. **Ask the user:** Which platform modules do you need API clients for? (comma-separated, e.g., `VirtoCommerce.Orders,VirtoCommerce.Catalog,VirtoCommerce.MyModule`)
|
|
165
165
|
|
|
166
166
|
### Execution
|
|
167
167
|
|
|
@@ -196,16 +196,19 @@ cat package.json | grep -q "generate-api-client"
|
|
|
196
196
|
```
|
|
197
197
|
|
|
198
198
|
If yes, run:
|
|
199
|
+
|
|
199
200
|
```bash
|
|
200
201
|
yarn generate-api-client
|
|
201
202
|
```
|
|
202
203
|
|
|
203
204
|
If no, run:
|
|
205
|
+
|
|
204
206
|
```bash
|
|
205
207
|
npx @vc-shell/api-client-generator
|
|
206
208
|
```
|
|
207
209
|
|
|
208
210
|
If the command fails, show stderr and suggest:
|
|
211
|
+
|
|
209
212
|
- Check that the platform URL is reachable
|
|
210
213
|
- Check that the module names are correct
|
|
211
214
|
- Try running with `--verbose` for more details
|
|
@@ -219,6 +222,7 @@ npx vue-tsc --noEmit
|
|
|
219
222
|
```
|
|
220
223
|
|
|
221
224
|
If `vue-tsc` is not available, fall back to:
|
|
225
|
+
|
|
222
226
|
```bash
|
|
223
227
|
npx tsc --noEmit
|
|
224
228
|
```
|
|
@@ -308,6 +312,7 @@ Full intent-driven module generation. This is the main power feature — it walk
|
|
|
308
312
|
- Menu priority? (default: 100)
|
|
309
313
|
|
|
310
314
|
Store all collected values:
|
|
315
|
+
|
|
311
316
|
```
|
|
312
317
|
INTENT = {
|
|
313
318
|
description: string,
|
|
@@ -334,10 +339,12 @@ After collecting `INTENT.moduleName`, check if `src/modules/<moduleName>/` alrea
|
|
|
334
339
|
### Phase 2: Data Source (Interactive Dialog)
|
|
335
340
|
|
|
336
341
|
**Auto-detect no-API mode:** Before asking, check whether an API client directory exists:
|
|
342
|
+
|
|
337
343
|
- Check `src/api_client/` relative to project root
|
|
338
344
|
- Check the value of `APP_API_CLIENT_DIRECTORY` from `.env`
|
|
339
345
|
|
|
340
346
|
If neither exists and `APP_API_CLIENT_DIRECTORY` is not set, skip the "Should this module use an API client?" question — go directly to mock mode (Phase 3 with empty data source). Show a note to the user:
|
|
347
|
+
|
|
341
348
|
```
|
|
342
349
|
No API client found — generating with mock data.
|
|
343
350
|
```
|
|
@@ -357,6 +364,7 @@ If an API client directory does exist, proceed with the interactive dialog:
|
|
|
357
364
|
> Read the file `{SKILL_DIR}/agents/api-analyzer.md` for your full instructions.
|
|
358
365
|
>
|
|
359
366
|
> Execute with these parameters:
|
|
367
|
+
>
|
|
360
368
|
> ```json
|
|
361
369
|
> {
|
|
362
370
|
> "apiClientDir": "<resolved api_client directory absolute path>",
|
|
@@ -367,10 +375,11 @@ If an API client directory does exist, proceed with the interactive dialog:
|
|
|
367
375
|
> Return the structured JSON result.
|
|
368
376
|
|
|
369
377
|
3. **Present discovered entities to the user.** Show a numbered list:
|
|
378
|
+
|
|
370
379
|
```
|
|
371
380
|
Discovered API entities:
|
|
372
|
-
1.
|
|
373
|
-
2. TeamMember (
|
|
381
|
+
1. User (UserSecurityClient) — search, get, create, update, delete
|
|
382
|
+
2. TeamMember (UserSecurityClient) — search, get, update
|
|
374
383
|
...
|
|
375
384
|
Select an entity (number):
|
|
376
385
|
```
|
|
@@ -378,8 +387,9 @@ If an API client directory does exist, proceed with the interactive dialog:
|
|
|
378
387
|
4. **Ask the user:** Which entity to use? (number from list)
|
|
379
388
|
|
|
380
389
|
5. **Read the entity's type file** to discover available fields. Use Grep to find the entity class definition and extract its properties. Present them to the user:
|
|
390
|
+
|
|
381
391
|
```
|
|
382
|
-
Fields on
|
|
392
|
+
Fields on User:
|
|
383
393
|
1. id (string)
|
|
384
394
|
2. userName (string)
|
|
385
395
|
3. email (string)
|
|
@@ -400,15 +410,16 @@ If an API client directory does exist, proceed with the interactive dialog:
|
|
|
400
410
|
- Default: all available operations checked
|
|
401
411
|
```
|
|
402
412
|
Available CRUD methods:
|
|
403
|
-
[x] search (
|
|
404
|
-
[x] get (
|
|
405
|
-
[x] create (
|
|
406
|
-
[x] update (
|
|
407
|
-
[x] delete (
|
|
413
|
+
[x] search (searchUsers)
|
|
414
|
+
[x] get (getUser)
|
|
415
|
+
[x] create (createUser)
|
|
416
|
+
[x] update (updateUser)
|
|
417
|
+
[x] delete (deleteUsers)
|
|
408
418
|
Uncheck any you don't need (comma-separated numbers to toggle, or Enter to accept all):
|
|
409
419
|
```
|
|
410
420
|
|
|
411
421
|
Store all collected values:
|
|
422
|
+
|
|
412
423
|
```
|
|
413
424
|
DATA_SOURCE = {
|
|
414
425
|
clientClass: string,
|
|
@@ -428,11 +439,13 @@ DATA_SOURCE = {
|
|
|
428
439
|
### Phase 3: Generation (Dispatch Subagents)
|
|
429
440
|
|
|
430
441
|
Determine the target directory for the module:
|
|
442
|
+
|
|
431
443
|
```
|
|
432
444
|
TARGET_DIR = <project root>/src/modules/{INTENT.moduleName}
|
|
433
445
|
```
|
|
434
446
|
|
|
435
447
|
Create the directory if it doesn't exist:
|
|
448
|
+
|
|
436
449
|
```bash
|
|
437
450
|
mkdir -p {TARGET_DIR}/pages {TARGET_DIR}/composables {TARGET_DIR}/locales
|
|
438
451
|
```
|
|
@@ -448,6 +461,7 @@ Dispatch the `list-blade-generator` agent:
|
|
|
448
461
|
> Read the file `{SKILL_DIR}/agents/list-blade-generator.md` for your full instructions.
|
|
449
462
|
>
|
|
450
463
|
> Execute with these parameters:
|
|
464
|
+
>
|
|
451
465
|
> ```json
|
|
452
466
|
> {
|
|
453
467
|
> "moduleName": "{INTENT.moduleName}",
|
|
@@ -474,6 +488,7 @@ Dispatch the `details-blade-generator` agent:
|
|
|
474
488
|
> Read the file `{SKILL_DIR}/agents/details-blade-generator.md` for your full instructions.
|
|
475
489
|
>
|
|
476
490
|
> Execute with these parameters:
|
|
491
|
+
>
|
|
477
492
|
> ```json
|
|
478
493
|
> {
|
|
479
494
|
> "moduleName": "{INTENT.moduleName}",
|
|
@@ -507,6 +522,7 @@ After blade generators complete (wait for both if parallel), dispatch the `local
|
|
|
507
522
|
> Read the file `{SKILL_DIR}/agents/locales-generator.md` for your full instructions.
|
|
508
523
|
>
|
|
509
524
|
> Execute with these parameters:
|
|
525
|
+
>
|
|
510
526
|
> ```json
|
|
511
527
|
> {
|
|
512
528
|
> "moduleName": "{INTENT.moduleName}",
|
|
@@ -526,6 +542,7 @@ After locales are generated, dispatch the `module-assembler` agent:
|
|
|
526
542
|
> Read the file `{SKILL_DIR}/agents/module-assembler.md` for your full instructions.
|
|
527
543
|
>
|
|
528
544
|
> Execute with these parameters:
|
|
545
|
+
>
|
|
529
546
|
> ```json
|
|
530
547
|
> {
|
|
531
548
|
> "moduleName": "{INTENT.moduleName}",
|
|
@@ -577,6 +594,7 @@ Populate `mockFields.columns` from the column definitions used to dispatch the l
|
|
|
577
594
|
3. Add `.vc-app-prototype.json` to `GENERATED_FILES`.
|
|
578
595
|
|
|
579
596
|
4. Append to the Phase 4 summary output:
|
|
597
|
+
|
|
580
598
|
```
|
|
581
599
|
Module generated with mock data.
|
|
582
600
|
When your API is ready, run: /vc-app connect && /vc-app promote <moduleName>
|
|
@@ -591,6 +609,7 @@ After all generation is complete, dispatch the `type-checker` agent:
|
|
|
591
609
|
> Read the file `{SKILL_DIR}/agents/type-checker.md` for your full instructions.
|
|
592
610
|
>
|
|
593
611
|
> Execute with these parameters:
|
|
612
|
+
>
|
|
594
613
|
> ```json
|
|
595
614
|
> {
|
|
596
615
|
> "projectRoot": "<project root absolute path>",
|
|
@@ -642,6 +661,7 @@ Dispatch `module-analyzer` agent:
|
|
|
642
661
|
> Read the file `{SKILL_DIR}/agents/module-analyzer.md` for your full instructions.
|
|
643
662
|
>
|
|
644
663
|
> Execute with these parameters:
|
|
664
|
+
>
|
|
645
665
|
> ```json
|
|
646
666
|
> {
|
|
647
667
|
> "targetDir": "<absolute path to module directory>"
|
|
@@ -651,6 +671,7 @@ Dispatch `module-analyzer` agent:
|
|
|
651
671
|
Store the result as `MODULE_ANALYSIS`.
|
|
652
672
|
|
|
653
673
|
Present the module summary to the user:
|
|
674
|
+
|
|
654
675
|
```
|
|
655
676
|
Module "<moduleName>" analysis:
|
|
656
677
|
Blades: <list blade names and types>
|
|
@@ -664,6 +685,7 @@ Ask: **"What would you like to change? (describe in free text)"**
|
|
|
664
685
|
#### Phase E2: Intent Parsing
|
|
665
686
|
|
|
666
687
|
Parse the user's free-text description into an action plan. Map to action types:
|
|
688
|
+
|
|
667
689
|
- Mentions of "column", "add to list/table" → `add-column`
|
|
668
690
|
- Mentions of "field", "input", "form" → `add-field`
|
|
669
691
|
- Mentions of "logic", "validation", "computed", "watcher" → `add-logic`
|
|
@@ -672,6 +694,7 @@ Parse the user's free-text description into an action plan. Map to action types:
|
|
|
672
694
|
- Mentions of "new blade", "new list", "new details" → new blade creation (uses existing generators)
|
|
673
695
|
|
|
674
696
|
Present the parsed action plan to the user for confirmation:
|
|
697
|
+
|
|
675
698
|
```
|
|
676
699
|
Proposed changes:
|
|
677
700
|
1. [add-column] Add "email" column to team-list after "name"
|
|
@@ -692,6 +715,7 @@ Confirm? (y to proceed, or describe corrections)
|
|
|
692
715
|
For each action in the confirmed plan:
|
|
693
716
|
|
|
694
717
|
**New blades** → dispatch `list-blade-generator` or `details-blade-generator` with `existingModule` context:
|
|
718
|
+
|
|
695
719
|
- `existingModule.blades` = blade names from `MODULE_ANALYSIS.blades`
|
|
696
720
|
- `existingModule.localePrefix` = derive from existing locale keys
|
|
697
721
|
- `existingModule.indexPath` = path to module's `index.ts`
|
|
@@ -706,6 +730,7 @@ Then dispatch `module-assembler` with `mode: "append"`.
|
|
|
706
730
|
> Read the file `{SKILL_DIR}/agents/blade-enhancer.md` for your full instructions.
|
|
707
731
|
>
|
|
708
732
|
> Execute with these parameters:
|
|
733
|
+
>
|
|
709
734
|
> ```json
|
|
710
735
|
> {
|
|
711
736
|
> "targetDir": "<absolute path to module>",
|
|
@@ -718,6 +743,7 @@ Then dispatch `module-assembler` with `mode: "append"`.
|
|
|
718
743
|
> ```
|
|
719
744
|
|
|
720
745
|
Handle agent status:
|
|
746
|
+
|
|
721
747
|
- `DONE` → proceed to Phase E5
|
|
722
748
|
- `DONE_WITH_CONCERNS` → show concerns to user, proceed to Phase E5
|
|
723
749
|
- `BLOCKED` → show error, stop
|
|
@@ -727,6 +753,7 @@ Handle agent status:
|
|
|
727
753
|
Dispatch `type-checker` agent to verify TypeScript compiles.
|
|
728
754
|
|
|
729
755
|
Present summary of all changes:
|
|
756
|
+
|
|
730
757
|
```
|
|
731
758
|
Module "<moduleName>" enhanced:
|
|
732
759
|
|
|
@@ -751,10 +778,13 @@ Transition a prototype module from mock data to a real API client. This command
|
|
|
751
778
|
1. **Parse arguments.** Extract the module name from `$ARGUMENTS`. Format: `promote <moduleName>`. If no name provided, ask the user.
|
|
752
779
|
|
|
753
780
|
2. **Read prototype metadata.** Look for `.vc-app-prototype.json` in `src/modules/<moduleName>/`:
|
|
781
|
+
|
|
754
782
|
```bash
|
|
755
783
|
cat src/modules/<moduleName>/.vc-app-prototype.json
|
|
756
784
|
```
|
|
785
|
+
|
|
757
786
|
If the file does not exist, stop with an error:
|
|
787
|
+
|
|
758
788
|
```
|
|
759
789
|
Error: Module '<moduleName>' is not a prototype. Only modules generated without an API client can be promoted.
|
|
760
790
|
Run /vc-app generate with an API client to create a production module directly.
|
|
@@ -771,6 +801,7 @@ Transition a prototype module from mock data to a real API client. This command
|
|
|
771
801
|
```
|
|
772
802
|
|
|
773
803
|
Store:
|
|
804
|
+
|
|
774
805
|
```
|
|
775
806
|
MODULE_DIR = <project root>/src/modules/<moduleName>
|
|
776
807
|
PROTOTYPE = <parsed .vc-app-prototype.json>
|
|
@@ -782,6 +813,7 @@ API_CLIENT_DIR = <resolved api_client directory>
|
|
|
782
813
|
Follow the same interactive dialog flow as `/vc-app generate` Phase 2 — dispatch the `api-analyzer` agent, present entities to the user, let them select an entity, discover fields, select columns/form fields, and choose CRUD methods.
|
|
783
814
|
|
|
784
815
|
Key differences from generate:
|
|
816
|
+
|
|
785
817
|
- Only collect **columns** if `PROTOTYPE.intent.bladeTypes` includes `"list"`.
|
|
786
818
|
- Only collect **form fields** if `PROTOTYPE.intent.bladeTypes` includes `"details"`.
|
|
787
819
|
|
|
@@ -797,6 +829,7 @@ Map prototype mock fields to real API entity fields.
|
|
|
797
829
|
- **Unmatched**: no reasonable API counterpart found
|
|
798
830
|
|
|
799
831
|
2. **Present mapping table** to the user for confirmation:
|
|
832
|
+
|
|
800
833
|
```
|
|
801
834
|
Field Mapping (mock → API):
|
|
802
835
|
name → displayName (semantic match)
|
|
@@ -836,6 +869,7 @@ Dispatch the `promote-agent` to rewrite module files:
|
|
|
836
869
|
> Read the file `{SKILL_DIR}/agents/promote-agent.md` for your full instructions.
|
|
837
870
|
>
|
|
838
871
|
> Execute with these parameters:
|
|
872
|
+
>
|
|
839
873
|
> ```json
|
|
840
874
|
> {
|
|
841
875
|
> "targetDir": "<absolute path to module directory>",
|
|
@@ -848,6 +882,7 @@ Dispatch the `promote-agent` to rewrite module files:
|
|
|
848
882
|
> ```
|
|
849
883
|
|
|
850
884
|
Handle agent status:
|
|
885
|
+
|
|
851
886
|
- **DONE** — Proceed to Phase 5.
|
|
852
887
|
- **DONE_WITH_CONCERNS** — Show concerns to the user, then proceed to Phase 5.
|
|
853
888
|
- **BLOCKED** — Show the error to the user. Do NOT proceed. Suggest fixing the issue and re-running `/vc-app promote <moduleName>`.
|
|
@@ -861,6 +896,7 @@ Handle agent status:
|
|
|
861
896
|
> Read the file `{SKILL_DIR}/agents/type-checker.md` for your full instructions.
|
|
862
897
|
>
|
|
863
898
|
> Execute with these parameters:
|
|
899
|
+
>
|
|
864
900
|
> ```json
|
|
865
901
|
> {
|
|
866
902
|
> "projectRoot": "<project root absolute path>",
|
|
@@ -930,10 +966,12 @@ After acquiring the prompt, ask the user for the platform address:
|
|
|
930
966
|
- **If the user skips** (says "skip", "no", "none", empty, "later", etc.) → set `PLATFORM_URL = null`
|
|
931
967
|
|
|
932
968
|
This URL is needed for:
|
|
969
|
+
|
|
933
970
|
- Writing `.env.local` with `APP_PLATFORM_URL` so the app can authenticate against the platform
|
|
934
971
|
- Enabling API client generation (via `/vc-app connect` flow) during or after design
|
|
935
972
|
|
|
936
973
|
If the prompt is very short (under 20 words) or too abstract (no concrete entities/data mentioned), ask for clarification:
|
|
974
|
+
|
|
937
975
|
```
|
|
938
976
|
Your description is quite abstract. To generate modules, I need to know what entities/data the app manages.
|
|
939
977
|
|
|
@@ -948,43 +986,47 @@ Could you describe:
|
|
|
948
986
|
Parse `DESIGN_PROMPT` into a structured application plan. Apply these parsing rules:
|
|
949
987
|
|
|
950
988
|
**Entity extraction:**
|
|
989
|
+
|
|
951
990
|
- Nouns that represent manageable data objects → modules (e.g., "tenants", "subscriptions", "agents")
|
|
952
991
|
- Module names: always kebab-case english, derived from entity names, regardless of prompt language
|
|
953
992
|
|
|
954
993
|
**Field extraction:**
|
|
994
|
+
|
|
955
995
|
- Concrete field mentions ("subscription token key", "trial period", "email") → columns or formFields with inferred types
|
|
956
996
|
- Type inference — use the most specific type possible:
|
|
957
997
|
|
|
958
|
-
| Signal in prompt
|
|
959
|
-
|
|
960
|
-
| date, deadline, birthday, created, expires
|
|
961
|
-
| is*, has*, can
|
|
962
|
-
| price, cost, amount, total, salary, budget, fee | `currency`
|
|
963
|
-
| count, quantity, age, priority (numeric)
|
|
964
|
-
| description, notes, comment, bio, summary
|
|
965
|
-
| body, content, html, article, template
|
|
966
|
-
| status, state, type, category (from fixed set)
|
|
967
|
-
| tags, labels, categories, roles, permissions
|
|
968
|
-
| avatar, logo, photo, thumbnail, banner
|
|
969
|
-
| photos, images, screenshots, gallery
|
|
970
|
-
| file, attachment, document, contract
|
|
971
|
-
| rating, score, stars
|
|
972
|
-
| color, colour, brandColor
|
|
973
|
-
| discount, opacity, percentage, progress
|
|
974
|
-
| email
|
|
975
|
-
| phone, tel
|
|
976
|
-
| url, website, link
|
|
977
|
-
| everything else
|
|
998
|
+
| Signal in prompt | Field type | Component (details) | Column type (list) |
|
|
999
|
+
| ----------------------------------------------- | -------------- | ---------------------------- | ------------------ |
|
|
1000
|
+
| date, deadline, birthday, created, expires | `date-time` | `VcDatePicker` | `date-ago` |
|
|
1001
|
+
| is*, has*, can\*, enabled, active, published | `boolean` | `VcSwitch` | `status-icon` |
|
|
1002
|
+
| price, cost, amount, total, salary, budget, fee | `currency` | `VcInputCurrency` | `money` |
|
|
1003
|
+
| count, quantity, age, priority (numeric) | `number` | `VcInput type="number"` | `number` |
|
|
1004
|
+
| description, notes, comment, bio, summary | `text` | `VcTextarea` | — (not in list) |
|
|
1005
|
+
| body, content, html, article, template | `rich-text` | `VcEditor` | — (not in list) |
|
|
1006
|
+
| status, state, type, category (from fixed set) | `enum` | `VcSelect` or `VcRadioGroup` | `status` |
|
|
1007
|
+
| tags, labels, categories, roles, permissions | `multi-select` | `VcMultivalue` | — (not in list) |
|
|
1008
|
+
| avatar, logo, photo, thumbnail, banner | `image` | `VcImageUpload` | `image` |
|
|
1009
|
+
| photos, images, screenshots, gallery | `gallery` | `VcGallery` | — (not in list) |
|
|
1010
|
+
| file, attachment, document, contract | `file` | `VcFileUpload` | — (not in list) |
|
|
1011
|
+
| rating, score, stars | `rating` | `VcRating` | — (custom slot) |
|
|
1012
|
+
| color, colour, brandColor | `color` | `VcColorInput` | — (custom slot) |
|
|
1013
|
+
| discount, opacity, percentage, progress | `range` | `VcSlider` | — (custom slot) |
|
|
1014
|
+
| email | `string` | `VcInput` (rules="email") | plain text |
|
|
1015
|
+
| phone, tel | `string` | `VcInput` (type="tel") | plain text |
|
|
1016
|
+
| url, website, link | `string` | `VcInput` (type="url") | plain text |
|
|
1017
|
+
| everything else | `string` | `VcInput` | plain text |
|
|
978
1018
|
|
|
979
1019
|
- If a field clearly belongs to a list view (searchable, sortable characteristic) → column
|
|
980
1020
|
- If a field clearly belongs to a form (editable, configurable) → formField
|
|
981
1021
|
- If unclear → put in both columns and formFields
|
|
982
1022
|
|
|
983
1023
|
**Action extraction:**
|
|
1024
|
+
|
|
984
1025
|
- Concrete actions ("start trial", "upgrade plan", "approve") → toolbarActions with action name derived from the verb
|
|
985
1026
|
- Navigation mentions ("from tenant to subscription", "drill into details") → connections
|
|
986
1027
|
|
|
987
1028
|
**Abstract requirement extraction:**
|
|
1029
|
+
|
|
988
1030
|
- Anything that cannot be mapped to a concrete field/action/connection → todos
|
|
989
1031
|
- Quote the original text from the prompt
|
|
990
1032
|
- Examples: "plan limits will be identified later", "integration with external billing TBD"
|
|
@@ -1018,11 +1060,13 @@ DESIGN_PLAN = {
|
|
|
1018
1060
|
```
|
|
1019
1061
|
|
|
1020
1062
|
**Scaffold detection:** Check if the current directory is a vc-shell project:
|
|
1063
|
+
|
|
1021
1064
|
- Look for `package.json` with `@vc-shell/framework` in dependencies or devDependencies
|
|
1022
1065
|
- If not found → set `needsScaffold: true`
|
|
1023
1066
|
- If found → set `needsScaffold: false`
|
|
1024
1067
|
|
|
1025
1068
|
**Blade type inference:**
|
|
1069
|
+
|
|
1026
1070
|
- Entity with both list-worthy columns AND editable fields → `"list+details"`
|
|
1027
1071
|
- Entity that is mainly a collection/catalog with no edit form → `"list-only"`
|
|
1028
1072
|
- Entity that is a singleton/settings with no list → `"details-only"`
|
|
@@ -1030,10 +1074,12 @@ DESIGN_PLAN = {
|
|
|
1030
1074
|
- Default to `"list+details"` when unclear
|
|
1031
1075
|
|
|
1032
1076
|
**Details blade mode inference:**
|
|
1077
|
+
|
|
1033
1078
|
- If the entity is view-only (order, transaction, audit log, payment) → set `readOnly: true` on the module — the details generator will use `VcField` for display instead of `VcInput`
|
|
1034
1079
|
- If the entity has mixed editable + read-only fields → default `readOnly: false`, individual fields marked as `readOnly` in `formFields`
|
|
1035
1080
|
|
|
1036
1081
|
**Feature inference (enrich modules based on prompt signals):**
|
|
1082
|
+
|
|
1037
1083
|
- If entity mentions "related" sub-entities (e.g., "product has offers and videos") → add `widgets: ["sub-entity-name"]` — generates blade sidebar widgets with `useBladeWidgets()`
|
|
1038
1084
|
- If entity is a "primary" concept that would benefit from a dashboard summary → add `dashboard: true` — generates a `DashboardWidgetCard` with stats
|
|
1039
1085
|
- If entity mentions "notifications" or "events" or "alerts" → add `notifications: ["EventName"]` — generates notification template components
|
|
@@ -1071,6 +1117,7 @@ Confirm? (y to proceed, or describe corrections)
|
|
|
1071
1117
|
**Confirmation loop:**
|
|
1072
1118
|
|
|
1073
1119
|
Wait for the user's response:
|
|
1120
|
+
|
|
1074
1121
|
- **"y" / "yes" / confirmation** → proceed to Phase 4
|
|
1075
1122
|
- **Free-text corrections** → re-parse the corrections, update `DESIGN_PLAN`, show the updated plan again. Examples of corrections the user might give:
|
|
1076
1123
|
- "remove the agent-catalog module"
|
|
@@ -1080,6 +1127,7 @@ Wait for the user's response:
|
|
|
1080
1127
|
- **No iteration limit** — keep looping until the user confirms or cancels
|
|
1081
1128
|
|
|
1082
1129
|
**Large plan warning:** If the plan has 10 or more modules, show a suggestion before the confirmation prompt:
|
|
1130
|
+
|
|
1083
1131
|
```
|
|
1084
1132
|
This is a large application ({count} modules). Consider generating in batches:
|
|
1085
1133
|
- Generate first {N} modules now, the rest later?
|
|
@@ -1100,6 +1148,7 @@ After the user confirms the plan:
|
|
|
1100
1148
|
> Read the file `{SKILL_DIR}/agents/api-analyzer.md` for your full instructions.
|
|
1101
1149
|
>
|
|
1102
1150
|
> Execute with these parameters:
|
|
1151
|
+
>
|
|
1103
1152
|
> ```json
|
|
1104
1153
|
> {
|
|
1105
1154
|
> "apiClientDir": "<resolved api_client directory absolute path>",
|
|
@@ -1115,6 +1164,7 @@ After the user confirms the plan:
|
|
|
1115
1164
|
- No match → module stays in mock mode
|
|
1116
1165
|
|
|
1117
1166
|
Update the plan display with data source info:
|
|
1167
|
+
|
|
1118
1168
|
```
|
|
1119
1169
|
1. tenants (list+details) — Data: API (TenantEntity matched)
|
|
1120
1170
|
2. subscriptions (details-only) — Data: API (SubscriptionEntity matched)
|
|
@@ -1124,11 +1174,13 @@ After the user confirms the plan:
|
|
|
1124
1174
|
Show the updated plan to the user for final confirmation before execution.
|
|
1125
1175
|
|
|
1126
1176
|
3. **If no API client AND `DESIGN_PLAN.platformUrl` is set** → the user provided a platform URL but hasn't generated API clients yet. Ask:
|
|
1177
|
+
|
|
1127
1178
|
```
|
|
1128
1179
|
Platform URL is set ({DESIGN_PLAN.platformUrl}) but no API client found.
|
|
1129
1180
|
Would you like to connect to the platform and generate API clients now? (y/n)
|
|
1130
1181
|
- If yes: which platform modules? (comma-separated, e.g., VirtoCommerce.Orders,VirtoCommerce.Catalog)
|
|
1131
1182
|
```
|
|
1183
|
+
|
|
1132
1184
|
If the user says yes and provides module names → run the `/vc-app connect` execution steps (Steps 1-4 from the connect section) using `DESIGN_PLAN.platformUrl` and the provided module list. After connect completes, re-run API Detection (step 1-2 above) to match entities.
|
|
1133
1185
|
|
|
1134
1186
|
If the user declines → proceed with mock mode for all modules.
|
|
@@ -1144,6 +1196,7 @@ After the user confirms the plan:
|
|
|
1144
1196
|
#### Step 1: Scaffold (if `needsScaffold: true`)
|
|
1145
1197
|
|
|
1146
1198
|
If `DESIGN_PLAN.needsScaffold` is true, run the `/vc-app create` flow:
|
|
1199
|
+
|
|
1147
1200
|
- Use `DESIGN_PLAN.appName` as the project name
|
|
1148
1201
|
- Enable default options (no dashboard, no tenant-routes, no ai-agent, no mocks)
|
|
1149
1202
|
- After scaffold completes, `cd` into the new project directory
|
|
@@ -1156,9 +1209,11 @@ If scaffold is not needed, skip to the `.env.local` step below.
|
|
|
1156
1209
|
If `DESIGN_PLAN.platformUrl` is not null:
|
|
1157
1210
|
|
|
1158
1211
|
1. Write or update `.env.local` in the project root:
|
|
1212
|
+
|
|
1159
1213
|
```env
|
|
1160
1214
|
APP_PLATFORM_URL=<DESIGN_PLAN.platformUrl>
|
|
1161
1215
|
```
|
|
1216
|
+
|
|
1162
1217
|
If `.env.local` already exists, read it first and only update/add the `APP_PLATFORM_URL` line. Do NOT remove other variables.
|
|
1163
1218
|
|
|
1164
1219
|
2. This enables the app to authenticate against the platform on first launch (`yarn serve`).
|
|
@@ -1172,6 +1227,7 @@ Process each module in `DESIGN_PLAN.modules` in order:
|
|
|
1172
1227
|
For module at index `i`:
|
|
1173
1228
|
|
|
1174
1229
|
**2a: Build INTENT**
|
|
1230
|
+
|
|
1175
1231
|
```json
|
|
1176
1232
|
INTENT = {
|
|
1177
1233
|
"description": "{module.description}",
|
|
@@ -1185,6 +1241,7 @@ INTENT = {
|
|
|
1185
1241
|
"isWorkspace": true
|
|
1186
1242
|
}
|
|
1187
1243
|
```
|
|
1244
|
+
|
|
1188
1245
|
Where `I18N_PREFIX` = SCREAMING_SNAKE_CASE of `module.name`.
|
|
1189
1246
|
|
|
1190
1247
|
**2b: Build DATA_SOURCE**
|
|
@@ -1198,9 +1255,11 @@ Where `I18N_PREFIX` = SCREAMING_SNAKE_CASE of `module.name`.
|
|
|
1198
1255
|
Follow the same Phase 3 generation flow as `/vc-app generate`:
|
|
1199
1256
|
|
|
1200
1257
|
1. Create target directory:
|
|
1258
|
+
|
|
1201
1259
|
```bash
|
|
1202
1260
|
mkdir -p {TARGET_DIR}/pages {TARGET_DIR}/composables {TARGET_DIR}/locales
|
|
1203
1261
|
```
|
|
1262
|
+
|
|
1204
1263
|
Where `TARGET_DIR = <project root>/src/modules/{module.name}`
|
|
1205
1264
|
|
|
1206
1265
|
2. Initialize `GENERATED_FILES = []`
|
|
@@ -1219,6 +1278,7 @@ Follow the same Phase 3 generation flow as `/vc-app generate`:
|
|
|
1219
1278
|
**2d: Pass context for connections**
|
|
1220
1279
|
|
|
1221
1280
|
For modules after the first, if `DESIGN_PLAN.connections` references a connection FROM an already-generated blade TO the current module's blade, pass `existingModule` context to the blade generator:
|
|
1281
|
+
|
|
1222
1282
|
```json
|
|
1223
1283
|
"existingModule": {
|
|
1224
1284
|
"blades": ["<list of already-generated blade names>"],
|
|
@@ -1241,6 +1301,7 @@ After all modules are generated, for each connection in `DESIGN_PLAN.connections
|
|
|
1241
1301
|
> Read the file `{SKILL_DIR}/agents/blade-enhancer.md` for your full instructions.
|
|
1242
1302
|
>
|
|
1243
1303
|
> Execute with these parameters:
|
|
1304
|
+
>
|
|
1244
1305
|
> ```json
|
|
1245
1306
|
> {
|
|
1246
1307
|
> "targetDir": "<absolute path to source module directory>",
|
|
@@ -1278,6 +1339,7 @@ After all modules are generated and TODOs injected, dispatch the `type-checker`
|
|
|
1278
1339
|
> Read the file `{SKILL_DIR}/agents/type-checker.md` for your full instructions.
|
|
1279
1340
|
>
|
|
1280
1341
|
> Execute with these parameters:
|
|
1342
|
+
>
|
|
1281
1343
|
> ```json
|
|
1282
1344
|
> {
|
|
1283
1345
|
> "projectRoot": "<project root absolute path>",
|
|
@@ -1312,6 +1374,7 @@ TypeScript: {✓ no errors / ✗ N errors (see above)}
|
|
|
1312
1374
|
```
|
|
1313
1375
|
|
|
1314
1376
|
If all modules used mock data, append:
|
|
1377
|
+
|
|
1315
1378
|
```
|
|
1316
1379
|
Next steps:
|
|
1317
1380
|
/vc-app connect — connect to platform API
|
|
@@ -1319,6 +1382,7 @@ Next steps:
|
|
|
1319
1382
|
```
|
|
1320
1383
|
|
|
1321
1384
|
If some modules matched API and some didn't, append:
|
|
1385
|
+
|
|
1322
1386
|
```
|
|
1323
1387
|
Next steps:
|
|
1324
1388
|
/vc-app promote <name> — transition mock modules to real API when ready
|
|
@@ -1331,53 +1395,71 @@ Next steps:
|
|
|
1331
1395
|
Apply these rules throughout all sections:
|
|
1332
1396
|
|
|
1333
1397
|
### CLI command fails
|
|
1398
|
+
|
|
1334
1399
|
If any `npx` or `yarn` command exits with non-zero status:
|
|
1400
|
+
|
|
1335
1401
|
- Show the stderr/stdout output to the user
|
|
1336
1402
|
- Suggest a manual fix or alternative command
|
|
1337
1403
|
- Do NOT proceed to subsequent steps that depend on the failed step
|
|
1338
1404
|
|
|
1339
1405
|
### `vue-tsc` / `tsc` fails during connect
|
|
1406
|
+
|
|
1340
1407
|
If type checking fails after API client generation:
|
|
1408
|
+
|
|
1341
1409
|
- Dispatch the `type-checker` agent with the generated files in `src/api_client/`
|
|
1342
1410
|
- Show the type-checker's report to the user
|
|
1343
1411
|
|
|
1344
1412
|
### User cancels mid-dialog
|
|
1413
|
+
|
|
1345
1414
|
If the user indicates they want to cancel (says "cancel", "stop", "nevermind", etc.) at any dialog step:
|
|
1415
|
+
|
|
1346
1416
|
- Stop immediately
|
|
1347
1417
|
- Do NOT write any partial files
|
|
1348
1418
|
- Confirm cancellation: "Generation cancelled. No files were created."
|
|
1349
1419
|
|
|
1350
1420
|
### Agent returns error
|
|
1421
|
+
|
|
1351
1422
|
If any subagent reports an error or fails to complete:
|
|
1423
|
+
|
|
1352
1424
|
- Show the error details to the user
|
|
1353
1425
|
- Suggest retrying: "You can retry with `/vc-app generate` — your previous answers will need to be re-entered."
|
|
1354
1426
|
- Do NOT proceed to subsequent phases that depend on the failed agent
|
|
1355
1427
|
|
|
1356
1428
|
### Missing API client directory
|
|
1429
|
+
|
|
1357
1430
|
If `src/api_client/` does not exist and the user wants API-backed generation:
|
|
1431
|
+
|
|
1358
1432
|
- Suggest running `/vc-app connect` first
|
|
1359
1433
|
- Do NOT proceed with generation
|
|
1360
1434
|
|
|
1361
1435
|
### Prompt too abstract (design)
|
|
1436
|
+
|
|
1362
1437
|
If the prompt contains no identifiable entities, data objects, or concrete fields (e.g., "make me an app", "something cool"):
|
|
1438
|
+
|
|
1363
1439
|
- Ask the user to clarify: "Describe what entities/data the app manages, what actions users perform, and how objects relate."
|
|
1364
1440
|
- Do NOT attempt to parse an empty/abstract prompt into modules.
|
|
1365
1441
|
|
|
1366
1442
|
### Large design plan (10+ modules)
|
|
1443
|
+
|
|
1367
1444
|
If prompt analysis produces 10 or more modules:
|
|
1445
|
+
|
|
1368
1446
|
- Show the full plan for review
|
|
1369
1447
|
- Suggest batching: "Generate first N now, rest later?"
|
|
1370
1448
|
- If user agrees to split, truncate modules list and note the remainder
|
|
1371
1449
|
|
|
1372
1450
|
### One module fails in design loop
|
|
1451
|
+
|
|
1373
1452
|
If a single module's generation fails during the design execution loop:
|
|
1453
|
+
|
|
1374
1454
|
- Show the error for that module
|
|
1375
1455
|
- Continue generating remaining modules
|
|
1376
1456
|
- In the final summary, list the failed module under "Skipped (errors):" with the error message
|
|
1377
1457
|
- Suggest: "Re-run /vc-app generate for the skipped module after fixing the issue."
|
|
1378
1458
|
|
|
1379
1459
|
### Prompt in non-English (design)
|
|
1460
|
+
|
|
1380
1461
|
The prompt may be in any language. This is fine — parse entities and intent from any language, but:
|
|
1462
|
+
|
|
1381
1463
|
- Module names → always kebab-case english
|
|
1382
1464
|
- Field names → always camelCase english
|
|
1383
1465
|
- If you cannot confidently translate an entity name, ask the user to confirm the english name
|
|
@@ -1388,17 +1470,17 @@ The prompt may be in any language. This is fine — parse entities and intent fr
|
|
|
1388
1470
|
|
|
1389
1471
|
All agents live at `{SKILL_DIR}/agents/`. Each agent file contains its own Input Contract, Knowledge Loading, Generation Rules, Output Contract, and Self-Check.
|
|
1390
1472
|
|
|
1391
|
-
| Agent
|
|
1392
|
-
|
|
1393
|
-
| api-analyzer
|
|
1394
|
-
| list-blade-generator
|
|
1395
|
-
| details-blade-generator | `agents/details-blade-generator.md` | Generates details blade + singular composable
|
|
1396
|
-
| locales-generator
|
|
1397
|
-
| module-assembler
|
|
1398
|
-
| type-checker
|
|
1399
|
-
| promote-agent
|
|
1400
|
-
| module-analyzer
|
|
1401
|
-
| blade-enhancer
|
|
1473
|
+
| Agent | File | Purpose | Writes files? |
|
|
1474
|
+
| ----------------------- | ----------------------------------- | ----------------------------------------------------------------- | ----------------- |
|
|
1475
|
+
| api-analyzer | `agents/api-analyzer.md` | Discovers entities/methods in API client files | No (returns JSON) |
|
|
1476
|
+
| list-blade-generator | `agents/list-blade-generator.md` | Generates list blade + plural composable | Yes |
|
|
1477
|
+
| details-blade-generator | `agents/details-blade-generator.md` | Generates details blade + singular composable | Yes |
|
|
1478
|
+
| locales-generator | `agents/locales-generator.md` | Scans generated files for i18n keys, writes en.json | Yes |
|
|
1479
|
+
| module-assembler | `agents/module-assembler.md` | Creates barrel files, registers module | Yes |
|
|
1480
|
+
| type-checker | `agents/type-checker.md` | Runs vue-tsc, fixes type errors iteratively | Yes (fixes only) |
|
|
1481
|
+
| promote-agent | `agents/promote-agent.md` | Transforms mock composables/blades/locales to use real API | Yes (edits only) |
|
|
1482
|
+
| module-analyzer | `agents/module-analyzer.md` | Analyzes existing module structure (blades, composables, locales) | No (returns JSON) |
|
|
1483
|
+
| blade-enhancer | `agents/blade-enhancer.md` | Surgical edits to existing blades/composables/locales | Yes (edits only) |
|
|
1402
1484
|
|
|
1403
1485
|
### How to dispatch an agent
|
|
1404
1486
|
|
|
@@ -1445,6 +1527,7 @@ fi
|
|
|
1445
1527
|
```
|
|
1446
1528
|
|
|
1447
1529
|
Priority:
|
|
1530
|
+
|
|
1448
1531
|
1. **Env override:** `VC_SHELL_MIGRATE_CLI` env var
|
|
1449
1532
|
2. **Project node_modules:** `./node_modules/@vc-shell/migrate/dist/cli.js`
|
|
1450
1533
|
3. **npx fallback:** `npx @vc-shell/migrate`
|
|
@@ -1455,8 +1538,50 @@ Run:
|
|
|
1455
1538
|
{resolved_migrate_command} --update-deps
|
|
1456
1539
|
```
|
|
1457
1540
|
|
|
1541
|
+
`--update-deps` bumps all `@vc-shell/*` dependencies to the target framework version **and** aligns peer-dep versions (ESLint, Vite, TypeScript, VueUse, `vue-router`, etc.) with the curated set at `configs/peer-versions.json` in the framework repo. Intersection-only — nothing is added or removed from the user's `package.json`.
|
|
1542
|
+
|
|
1458
1543
|
Display the output to the user. If the command fails, stop and show the error.
|
|
1459
1544
|
|
|
1545
|
+
### Step 2.5: Regenerate API clients with Interface style
|
|
1546
|
+
|
|
1547
|
+
1. **Detect config location:**
|
|
1548
|
+
- Read `package.json`. If the `generate-api-client` script contains `--APP_PLATFORM_MODULES`, configuration is inline in package.json.
|
|
1549
|
+
- Otherwise, read `.env`. If it contains `APP_PLATFORM_MODULES`, configuration is in the .env file.
|
|
1550
|
+
|
|
1551
|
+
2. **Add `APP_TYPE_STYLE=Interface`:**
|
|
1552
|
+
- If inline in package.json: append `--APP_TYPE_STYLE=Interface` to the `generate-api-client` script arguments.
|
|
1553
|
+
- If in `.env`: add or update the line `APP_TYPE_STYLE=Interface`.
|
|
1554
|
+
|
|
1555
|
+
3. **Hard gate — verify platform accessibility:**
|
|
1556
|
+
- Check for `APP_PLATFORM_URL` in `.env.local` or `.env`.
|
|
1557
|
+
- If not found, **STOP** with this error:
|
|
1558
|
+
|
|
1559
|
+
```
|
|
1560
|
+
Error: Platform URL not configured.
|
|
1561
|
+
|
|
1562
|
+
API clients must be regenerated with Interface style before migration can continue.
|
|
1563
|
+
|
|
1564
|
+
1. Create .env.local with: APP_PLATFORM_URL=https://your-platform-url
|
|
1565
|
+
2. Ensure the platform is running and accessible
|
|
1566
|
+
3. Re-run /vc-app migrate
|
|
1567
|
+
```
|
|
1568
|
+
|
|
1569
|
+
- If found, run:
|
|
1570
|
+
```bash
|
|
1571
|
+
yarn generate-api-client
|
|
1572
|
+
```
|
|
1573
|
+
- If the generator fails (platform unreachable), **STOP** with the same error.
|
|
1574
|
+
|
|
1575
|
+
4. **Verify generated types compile:**
|
|
1576
|
+
|
|
1577
|
+
```bash
|
|
1578
|
+
npx vue-tsc --noEmit 2>&1 | head -20
|
|
1579
|
+
```
|
|
1580
|
+
|
|
1581
|
+
If there are errors in `src/api_client/` files, the generator produced invalid output — **STOP** and ask the user to check the platform API and re-run.
|
|
1582
|
+
|
|
1583
|
+
5. On success, continue to Step 3.
|
|
1584
|
+
|
|
1460
1585
|
### Step 3: Install dependencies
|
|
1461
1586
|
|
|
1462
1587
|
Run:
|
|
@@ -1475,18 +1600,38 @@ Parse the "Manual Migration Required" section. Extract each topic heading and th
|
|
|
1475
1600
|
|
|
1476
1601
|
Map topic headings to migration prompt files and pattern files:
|
|
1477
1602
|
|
|
1478
|
-
| Report Heading contains | Migration Prompt
|
|
1479
|
-
|
|
1480
|
-
| Widget | `{KNOWLEDGE_BASE}/migration-prompts/widgets-migration.md`
|
|
1481
|
-
| Form Management / useBladeForm | `{KNOWLEDGE_BASE}/migration-prompts/blade-form-migration.md`
|
|
1482
|
-
| Injection Key | `{KNOWLEDGE_BASE}/migration-prompts/blade-props-migration.md`
|
|
1483
|
-
| NSwag / DTO / Clone-then-mutate | `{KNOWLEDGE_BASE}/migration-prompts/nswag-migration.md`
|
|
1484
|
-
| Reusable Blade Components | `{KNOWLEDGE_BASE}/migration-prompts/blade-props-migration.md`
|
|
1485
|
-
| Notification | `{KNOWLEDGE_BASE}/migration-prompts/notifications-migration.md`
|
|
1603
|
+
| Report Heading contains (or equals transform name) | Canonical topic name | Migration Prompt | Pattern |
|
|
1604
|
+
| -------------------------------------------------------------------------------------------- | --------------------------------- | --------------------------------------------------------------------------- | ---------------------------------------------------- |
|
|
1605
|
+
| Widget / widgets-migration | `widgets-migration` | `{KNOWLEDGE_BASE}/migration-prompts/widgets-migration.md` | `{KNOWLEDGE_BASE}/patterns/blade-widget.md` |
|
|
1606
|
+
| Form Management / useBladeForm / use-blade-form | `use-blade-form` | `{KNOWLEDGE_BASE}/migration-prompts/blade-form-migration.md` | `{KNOWLEDGE_BASE}/patterns/form-validation.md` |
|
|
1607
|
+
| Injection Key / remove-deprecated-aliases | `remove-deprecated-aliases` | `{KNOWLEDGE_BASE}/migration-prompts/blade-props-migration.md` | `{KNOWLEDGE_BASE}/patterns/blade-navigation.md` |
|
|
1608
|
+
| NSwag / DTO / Clone-then-mutate / nswag-class-to-interface | `nswag-class-to-interface` | `{KNOWLEDGE_BASE}/migration-prompts/nswag-migration.md` | — |
|
|
1609
|
+
| Reusable Blade Components / blade-props-simplification | `blade-props-simplification` | `{KNOWLEDGE_BASE}/migration-prompts/blade-props-migration.md` | `{KNOWLEDGE_BASE}/patterns/child-blade-flow.md` |
|
|
1610
|
+
| Notification / notification-migration | `notification-migration` | `{KNOWLEDGE_BASE}/migration-prompts/notifications-migration.md` | `{KNOWLEDGE_BASE}/patterns/signalr-notifications.md` |
|
|
1611
|
+
| VcTable / DataTable / vctable-audit | `vctable-audit` | `{KNOWLEDGE_BASE}/migration-prompts/datatable-migration.md` | `{KNOWLEDGE_BASE}/patterns/datatable-pattern.md` |
|
|
1612
|
+
| Icon / material- / bi- / fa- / icon-audit | `icon-audit` | `{KNOWLEDGE_BASE}/migration-prompts/icon-migration.md` | — |
|
|
1613
|
+
| Assets API / useAssets / useAssetsManager / use-assets-migration | `use-assets-migration` | `{KNOWLEDGE_BASE}/migration-prompts/use-assets-migration.md` | `{KNOWLEDGE_BASE}/patterns/assets-management.md` |
|
|
1614
|
+
| Manual Migration Audit / useExternalWidgets / moment / useFunctions / manual-migration-audit | `manual-migration-audit` | `{KNOWLEDGE_BASE}/migration-prompts/manual-migration-audit.md` | — |
|
|
1615
|
+
| Pagination / useDataTablePagination / use-data-table-pagination-audit | `use-data-table-pagination-audit` | `{KNOWLEDGE_BASE}/migration-prompts/use-data-table-pagination-migration.md` | — |
|
|
1486
1616
|
|
|
1487
|
-
Build the `topics` array for the migration-agent
|
|
1617
|
+
Build the `topics` array for the migration-agent using the canonical topic names above.
|
|
1488
1618
|
|
|
1489
|
-
|
|
1619
|
+
Hard gate:
|
|
1620
|
+
|
|
1621
|
+
1. If a heading from "Manual Migration Required" does not match any row, add it to `unmappedTopics`.
|
|
1622
|
+
2. If a mapped row references a missing migration prompt file, add it to `missingPrompts`.
|
|
1623
|
+
3. If `unmappedTopics` or `missingPrompts` is non-empty, **STOP** and print both lists. Do not silently skip actionable topics.
|
|
1624
|
+
|
|
1625
|
+
### Step 5: Dispatch migration-agent (with partial recovery)
|
|
1626
|
+
|
|
1627
|
+
**Before dispatching, check for partial completion** from a previous run:
|
|
1628
|
+
|
|
1629
|
+
1. Parse `MIGRATION_REPORT.md` and collect topics already marked as completed (`### ✅ ...` headings).
|
|
1630
|
+
2. If `.vc-app-migrate-state.json` exists, load completed topics from it.
|
|
1631
|
+
3. Union both sources into `alreadyCompletedTopics`.
|
|
1632
|
+
4. Run `npx vue-tsc --noEmit`. If it fails, do **not** infer completion from file diffs.
|
|
1633
|
+
5. Use `git diff --name-only` only as a weak signal for "in-progress" topics, not as completion proof.
|
|
1634
|
+
6. Dispatch only topics not in `alreadyCompletedTopics`.
|
|
1490
1635
|
|
|
1491
1636
|
If there are topics to process, dispatch the migration-agent subagent:
|
|
1492
1637
|
|
|
@@ -1509,24 +1654,58 @@ If there are topics to process, dispatch the migration-agent subagent:
|
|
|
1509
1654
|
}
|
|
1510
1655
|
```
|
|
1511
1656
|
|
|
1512
|
-
### Step 6: Type-check verification
|
|
1657
|
+
### Step 6: Type-check and build verification
|
|
1513
1658
|
|
|
1514
|
-
After migration-agent completes, run:
|
|
1659
|
+
After migration-agent completes, run type-check:
|
|
1515
1660
|
|
|
1516
1661
|
```bash
|
|
1517
1662
|
npx vue-tsc --noEmit
|
|
1518
1663
|
```
|
|
1519
1664
|
|
|
1520
1665
|
If there are remaining TypeScript errors:
|
|
1666
|
+
|
|
1521
1667
|
1. Show the errors to the user
|
|
1522
1668
|
2. Attempt to fix iteratively — read each error, fix the file, re-check (max 3 rounds)
|
|
1523
1669
|
|
|
1670
|
+
After type-check passes, run a full build:
|
|
1671
|
+
|
|
1672
|
+
```bash
|
|
1673
|
+
yarn build
|
|
1674
|
+
```
|
|
1675
|
+
|
|
1676
|
+
If the build fails (Vite resolve errors, missing assets, etc.):
|
|
1677
|
+
|
|
1678
|
+
1. Show the error to the user
|
|
1679
|
+
2. Attempt to fix iteratively (max 2 rounds) — common issues: missing imports, deleted files still referenced, CSS import paths
|
|
1680
|
+
3. If still failing after 2 rounds, **STOP** and mark migration as incomplete (do not print "Migration complete")
|
|
1681
|
+
|
|
1682
|
+
### Step 6.5: Run Prettier across the project
|
|
1683
|
+
|
|
1684
|
+
After type-check/build are green, run formatting:
|
|
1685
|
+
|
|
1686
|
+
1. If `package.json` has a `prettier` script:
|
|
1687
|
+
```bash
|
|
1688
|
+
yarn prettier --write .
|
|
1689
|
+
```
|
|
1690
|
+
2. Otherwise run:
|
|
1691
|
+
```bash
|
|
1692
|
+
npx prettier --write .
|
|
1693
|
+
```
|
|
1694
|
+
|
|
1695
|
+
If Prettier fails, stop and show the error.
|
|
1696
|
+
|
|
1524
1697
|
### Step 7: Update report and summarize
|
|
1525
1698
|
|
|
1526
1699
|
Update `MIGRATION_REPORT.md`:
|
|
1700
|
+
|
|
1527
1701
|
- For each topic the agent successfully completed, add ✅ to the heading
|
|
1528
1702
|
- Add a "Completed by AI" section listing what was done
|
|
1529
1703
|
|
|
1704
|
+
Write `.vc-app-migrate-state.json` in project root:
|
|
1705
|
+
|
|
1706
|
+
- Store per-topic status (`completed`/`failed`), affected files, and timestamp
|
|
1707
|
+
- This state is used by Step 5 for automatic resume on the next `/vc-app migrate` run
|
|
1708
|
+
|
|
1530
1709
|
Print summary to user:
|
|
1531
1710
|
|
|
1532
1711
|
```
|