@shanyucoder/flowgrid 0.1.0
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/README.md +194 -0
- package/adapters/dotnet-integration/codegen/runners/IntegrationGen/IntegrationContext.cs +56 -0
- package/adapters/dotnet-integration/codegen/runners/IntegrationGen/IntegrationGen.csproj +16 -0
- package/adapters/dotnet-integration/codegen/runners/IntegrationGen/NameUtil.cs +18 -0
- package/adapters/dotnet-integration/codegen/runners/IntegrationGen/Program.cs +265 -0
- package/adapters/dotnet-integration/codegen/runners/IntegrationGen/Templates/application_service.cs.scriban +27 -0
- package/adapters/dotnet-integration/codegen/runners/IntegrationGen/Templates/handoff.md.scriban +15 -0
- package/adapters/dotnet-integration/codegen/runners/IntegrationGen/Templates/infrastructure_mock.cs.scriban +20 -0
- package/adapters/dotnet-integration/codegen/runners/IntegrationGen/Templates/presenter.cs.scriban +41 -0
- package/adapters/dotnet-integration/codegen/runners/IntegrationGen/Templates/service_test.cs.scriban +17 -0
- package/adapters/dotnet-integration/codegen/runners/IntegrationGen/YamlMap.cs +49 -0
- package/adapters/dotnet-integration/registries/dotnet-integration.codegen.registry.json +8 -0
- package/adapters/dotnet-line/codegen/runners/LineGen/LineContext.cs +43 -0
- package/adapters/dotnet-line/codegen/runners/LineGen/LineGen.csproj +16 -0
- package/adapters/dotnet-line/codegen/runners/LineGen/NameUtil.cs +12 -0
- package/adapters/dotnet-line/codegen/runners/LineGen/Program.cs +201 -0
- package/adapters/dotnet-line/codegen/runners/LineGen/TemplateRenderer.cs +22 -0
- package/adapters/dotnet-line/codegen/runners/LineGen/Templates/handoff.md.scriban +15 -0
- package/adapters/dotnet-line/codegen/runners/LineGen/Templates/service.cs.scriban +21 -0
- package/adapters/dotnet-line/codegen/runners/LineGen/Templates/service_interface.cs.scriban +20 -0
- package/adapters/dotnet-line/codegen/runners/LineGen/Templates/view_model.cs.scriban +28 -0
- package/adapters/dotnet-line/codegen/runners/LineGen/Templates/view_model_test.cs.scriban +22 -0
- package/adapters/dotnet-line/codegen/runners/LineGen/YamlMap.cs +49 -0
- package/adapters/dotnet-line/registries/dotnet-line.codegen.registry.json +8 -0
- package/adapters/fastapi/codegen/runners/fast_gen/__init__.py +1 -0
- package/adapters/fastapi/codegen/runners/fast_gen/__main__.py +3 -0
- package/adapters/fastapi/codegen/runners/fast_gen/cli.py +175 -0
- package/adapters/fastapi/codegen/runners/fast_gen/plan.py +285 -0
- package/adapters/fastapi/codegen/runners/fast_gen/read_spec.py +34 -0
- package/adapters/fastapi/codegen/runners/fast_gen/registry.py +9 -0
- package/adapters/fastapi/codegen/runners/fast_gen/wire.py +28 -0
- package/adapters/fastapi/codegen/runners/fast_gen/write_files.py +232 -0
- package/adapters/fastapi/codegen/runners/generate +5 -0
- package/adapters/fastapi/codegen/runners/validate-registry.mjs +54 -0
- package/adapters/fastapi/codegen/templates/presenter.py.j2 +11 -0
- package/adapters/fastapi/codegen/templates/router.py.j2 +69 -0
- package/adapters/fastapi/codegen/templates/schemas_request.py.j2 +26 -0
- package/adapters/fastapi/codegen/templates/schemas_response.py.j2 +7 -0
- package/adapters/fastapi/codegen/templates/service_create.py.j2 +10 -0
- package/adapters/fastapi/codegen/templates/service_delete.py.j2 +10 -0
- package/adapters/fastapi/codegen/templates/service_search.py.j2 +9 -0
- package/adapters/fastapi/codegen/templates/service_update.py.j2 +11 -0
- package/adapters/fastapi/codegen/templates/store.py.j2 +1 -0
- package/adapters/fastapi/codegen/templates/test_router.py.j2 +13 -0
- package/adapters/fastapi/registries/codegen.registry.json +47 -0
- package/adapters/fastapi/registries/common.registry.json +23 -0
- package/adapters/fastapi/registries/unit-test.registry.json +12 -0
- package/adapters/fastapi/unitgen/runners/fast_unit_gen/__init__.py +1 -0
- package/adapters/fastapi/unitgen/runners/fast_unit_gen/cli.py +188 -0
- package/adapters/fastapi/unitgen/runners/generate +5 -0
- package/adapters/fastapi/unitgen/runners/validate-registry.mjs +48 -0
- package/adapters/fastapi/unitgen/templates/test_service.py.j2 +12 -0
- package/adapters/laravel/codegen/runners/README.md +45 -0
- package/adapters/laravel/codegen/runners/generate.mjs +296 -0
- package/adapters/laravel/codegen/runners/lib/codegen-registry.mjs +60 -0
- package/adapters/laravel/codegen/runners/lib/detect-existing.mjs +84 -0
- package/adapters/laravel/codegen/runners/lib/exec-artisan.mjs +86 -0
- package/adapters/laravel/codegen/runners/lib/parse-tags.mjs +49 -0
- package/adapters/laravel/codegen/runners/lib/plan.mjs +122 -0
- package/adapters/laravel/codegen/runners/lib/read-spec.mjs +30 -0
- package/adapters/laravel/codegen/runners/lib/resolve-commands.mjs +234 -0
- package/adapters/laravel/codegen/runners/lib/stub-services.mjs +91 -0
- package/adapters/laravel/codegen/runners/lib/tag-plan.mjs +155 -0
- package/adapters/laravel/codegen/runners/lib/validate.mjs +77 -0
- package/adapters/laravel/codegen/runners/lib/workspace-analysis.mjs +202 -0
- package/adapters/laravel/codegen/runners/lib/write-handoff.mjs +149 -0
- package/adapters/laravel/codegen/runners/lib/write-manifest.mjs +81 -0
- package/adapters/laravel/codegen/runners/validate-registry.mjs +52 -0
- package/adapters/laravel/php/README.md +26 -0
- package/adapters/laravel/php/bin/unit-gen.php +307 -0
- package/adapters/laravel/php/bin/validate-registry.php +61 -0
- package/adapters/laravel/php/composer.json +16 -0
- package/adapters/laravel/php/src/ArtisanRunner.php +56 -0
- package/adapters/laravel/php/src/Autoload.php +15 -0
- package/adapters/laravel/php/src/CodegenManifest.php +28 -0
- package/adapters/laravel/php/src/ParseTags.php +62 -0
- package/adapters/laravel/php/src/ProjectResolver.php +100 -0
- package/adapters/laravel/php/src/SpecExtract.php +193 -0
- package/adapters/laravel/php/src/SpecReader.php +57 -0
- package/adapters/laravel/php/src/TemplateRenderer.php +134 -0
- package/adapters/laravel/php/src/UnitPlanner.php +396 -0
- package/adapters/laravel/php/src/UnitRegistry.php +100 -0
- package/adapters/laravel/php/src/WhenEval.php +111 -0
- package/adapters/laravel/php/src/WorkspaceInspector.php +240 -0
- package/adapters/laravel/php/src/WriteFiles.php +194 -0
- package/adapters/laravel/php/templates/actions/relationship-sync.behavior.test.php.stub +50 -0
- package/adapters/laravel/php/templates/controllers/controller-invoke.test.php.stub +34 -0
- package/adapters/laravel/php/templates/queries/chain-scope.behavior.test.php.stub +34 -0
- package/adapters/laravel/php/templates/requests/default-per-page.behavior.test.php.stub +19 -0
- package/adapters/laravel/php/templates/requests/request-enriched.test.php.stub +66 -0
- package/adapters/laravel/php/templates/requests/rules-keys.behavior.test.php.stub +19 -0
- package/adapters/laravel/php/templates/resources/nested-relations.behavior.test.php.stub +25 -0
- package/adapters/laravel/php/templates/resources/openapi-shape.behavior.test.php.stub +28 -0
- package/adapters/laravel/php/templates/support/ModuleTestSupport.php.stub +32 -0
- package/adapters/laravel/registries/codegen.registry.json +190 -0
- package/adapters/laravel/registries/unit-test.registry.json +179 -0
- package/adapters/laravel/shared/project.mjs +62 -0
- package/adapters/nestjs/README.md +16 -0
- package/adapters/nestjs/nest-unitgen/runners/README.md +17 -0
- package/adapters/nestjs/nest-unitgen/runners/generate.mjs +113 -0
- package/adapters/nestjs/nest-unitgen/runners/lib/render.mjs +14 -0
- package/adapters/nestjs/nest-unitgen/runners/lib/write-files.mjs +40 -0
- package/adapters/nestjs/nest-unitgen/runners/validate-registry.mjs +35 -0
- package/adapters/nestjs/nest-unitgen/templates/commands/create.handler.spec.ts.hbs +32 -0
- package/adapters/nestjs/nest-unitgen/templates/commands/delete.handler.spec.ts.hbs +32 -0
- package/adapters/nestjs/nest-unitgen/templates/commands/update.handler.spec.ts.hbs +32 -0
- package/adapters/nestjs/nest-unitgen/templates/handlers/search.handler.spec.ts.hbs +33 -0
- package/adapters/nestjs/nest-unitgen/templates/resource/entity.resource.spec.ts.hbs +22 -0
- package/adapters/nestjs/nestgen/runners/README.md +30 -0
- package/adapters/nestjs/nestgen/runners/generate.mjs +87 -0
- package/adapters/nestjs/nestgen/runners/lib/orm-fields.mjs +253 -0
- package/adapters/nestjs/nestgen/runners/lib/plan.mjs +124 -0
- package/adapters/nestjs/nestgen/runners/lib/read-spec.mjs +52 -0
- package/adapters/nestjs/nestgen/runners/lib/render.mjs +52 -0
- package/adapters/nestjs/nestgen/runners/lib/workspace-analysis.mjs +80 -0
- package/adapters/nestjs/nestgen/runners/lib/write-files.mjs +49 -0
- package/adapters/nestjs/nestgen/runners/validate-registry.mjs +36 -0
- package/adapters/nestjs/nestgen/templates/commands/create.command.ts.hbs +3 -0
- package/adapters/nestjs/nestgen/templates/commands/create.handler.ts.hbs +34 -0
- package/adapters/nestjs/nestgen/templates/commands/delete.command.ts.hbs +3 -0
- package/adapters/nestjs/nestgen/templates/commands/delete.handler.ts.hbs +33 -0
- package/adapters/nestjs/nestgen/templates/commands/update.command.ts.hbs +6 -0
- package/adapters/nestjs/nestgen/templates/commands/update.handler.ts.hbs +34 -0
- package/adapters/nestjs/nestgen/templates/entity.controller.ts.hbs +51 -0
- package/adapters/nestjs/nestgen/templates/entity.resource.ts.hbs +45 -0
- package/adapters/nestjs/nestgen/templates/module.module.ts.hbs +38 -0
- package/adapters/nestjs/nestgen/templates/orm/prisma.entity.ts.hbs +10 -0
- package/adapters/nestjs/nestgen/templates/orm/prisma.model.prisma.hbs +9 -0
- package/adapters/nestjs/nestgen/templates/orm/typeorm.entity.ts.hbs +20 -0
- package/adapters/nestjs/nestgen/templates/queries/search.handler.ts.hbs +36 -0
- package/adapters/nestjs/nestgen/templates/queries/search.query.ts.hbs +3 -0
- package/adapters/nestjs/registries/nest-codegen.registry.json +41 -0
- package/adapters/nestjs/registries/nest-unit-test.registry.json +31 -0
- package/adapters/nextjs/codegen/runners/README.md +68 -0
- package/adapters/nextjs/codegen/runners/generate.mjs +236 -0
- package/adapters/nextjs/codegen/runners/lib/component-resolve.mjs +79 -0
- package/adapters/nextjs/codegen/runners/lib/design-registry.mjs +333 -0
- package/adapters/nextjs/codegen/runners/lib/naming.mjs +236 -0
- package/adapters/nextjs/codegen/runners/lib/page-lifecycle.mjs +258 -0
- package/adapters/nextjs/codegen/runners/lib/plan.mjs +399 -0
- package/adapters/nextjs/codegen/runners/lib/read-spec.mjs +7 -0
- package/adapters/nextjs/codegen/runners/lib/render.mjs +47 -0
- package/adapters/nextjs/codegen/runners/lib/resolve-hub-id.mjs +288 -0
- package/adapters/nextjs/codegen/runners/lib/slots.mjs +121 -0
- package/adapters/nextjs/codegen/runners/lib/web-paths.mjs +64 -0
- package/adapters/nextjs/codegen/runners/lib/write-files.mjs +106 -0
- package/adapters/nextjs/codegen/runners/validate-registry.mjs +99 -0
- package/adapters/nextjs/codegen/templates/common/confirm-dialog.hbs +81 -0
- package/adapters/nextjs/codegen/templates/common/delete-flow.hbs +106 -0
- package/adapters/nextjs/codegen/templates/create/form.tsx.hbs +45 -0
- package/adapters/nextjs/codegen/templates/create/mock.ts.hbs +15 -0
- package/adapters/nextjs/codegen/templates/create/page.tsx.hbs +12 -0
- package/adapters/nextjs/codegen/templates/create/service.ts.hbs +25 -0
- package/adapters/nextjs/codegen/templates/create/useForm.ts.hbs +59 -0
- package/adapters/nextjs/codegen/templates/create/validation.ts.hbs +16 -0
- package/adapters/nextjs/codegen/templates/list/mock.ts.hbs +25 -0
- package/adapters/nextjs/codegen/templates/list/page.custom.tsx.hbs +65 -0
- package/adapters/nextjs/codegen/templates/list/page.tsx.hbs +37 -0
- package/adapters/nextjs/codegen/templates/list/service.ts.hbs +37 -0
- package/adapters/nextjs/codegen/templates/list/useList.ts.hbs +93 -0
- package/adapters/nextjs/codegen/templates/list/useListColumns.ts.hbs +27 -0
- package/adapters/nextjs/codegen/templates/list/useListExport.ts.hbs +31 -0
- package/adapters/nextjs/codegen/templates/list/useListFilters.ts.hbs +50 -0
- package/adapters/nextjs/codegen/templates/store/store.ts.hbs +28 -0
- package/adapters/nextjs/contractgen/runners/README.md +47 -0
- package/adapters/nextjs/contractgen/runners/generate.mjs +108 -0
- package/adapters/nextjs/contractgen/runners/lib/field-zod.mjs +83 -0
- package/adapters/nextjs/contractgen/runners/lib/naming.mjs +46 -0
- package/adapters/nextjs/contractgen/runners/lib/plan.mjs +147 -0
- package/adapters/nextjs/contractgen/runners/lib/render.mjs +57 -0
- package/adapters/nextjs/contractgen/runners/lib/write-files.mjs +54 -0
- package/adapters/nextjs/contractgen/runners/validate-registry.mjs +54 -0
- package/adapters/nextjs/contractgen/templates/index.ts.hbs +8 -0
- package/adapters/nextjs/contractgen/templates/read.schema.ts.hbs +22 -0
- package/adapters/nextjs/contractgen/templates/relationships.meta.ts.hbs +23 -0
- package/adapters/nextjs/contractgen/templates/types.ts.hbs +15 -0
- package/adapters/nextjs/contractgen/templates/write.schema.ts.hbs +11 -0
- package/adapters/nextjs/registries/contract-field.registry.json +22 -0
- package/adapters/nextjs/unitgen/runners/README.md +12 -0
- package/adapters/nextjs/unitgen/runners/generate.mjs +201 -0
- package/adapters/nextjs/unitgen/runners/lib/parse-tags.mjs +67 -0
- package/adapters/nextjs/unitgen/runners/lib/plan.mjs +563 -0
- package/adapters/nextjs/unitgen/runners/lib/read-codegen.mjs +42 -0
- package/adapters/nextjs/unitgen/runners/lib/render.mjs +32 -0
- package/adapters/nextjs/unitgen/runners/lib/resolve-model.mjs +28 -0
- package/adapters/nextjs/unitgen/runners/lib/unit-registry.mjs +52 -0
- package/adapters/nextjs/unitgen/runners/lib/write-files.mjs +103 -0
- package/adapters/nextjs/unitgen/runners/lib/write-spec-tags.mjs +37 -0
- package/adapters/nextjs/unitgen/runners/validate-registry.mjs +74 -0
- package/adapters/nextjs/unitgen/templates/hooks/use-form.test.ts.hbs +51 -0
- package/adapters/nextjs/unitgen/templates/hooks/use-list.test.ts.hbs +63 -0
- package/adapters/nextjs/unitgen/templates/models/schema.test.ts.hbs +24 -0
- package/adapters/nextjs/unitgen/templates/services/service.create.test.ts.hbs +28 -0
- package/adapters/nextjs/unitgen/templates/services/service.export.test.ts.hbs +20 -0
- package/adapters/nextjs/unitgen/templates/services/service.search.test.ts.hbs +25 -0
- package/adapters/nextjs/unitgen/templates/services/service.wire.test.ts.hbs +37 -0
- package/adapters/nextjs/unitgen/templates/validations/schemas.test.ts.hbs +19 -0
- package/adapters/nuxt4/codegen/runners/README.md +83 -0
- package/adapters/nuxt4/codegen/runners/generate.mjs +236 -0
- package/adapters/nuxt4/codegen/runners/lib/component-resolve.mjs +66 -0
- package/adapters/nuxt4/codegen/runners/lib/design-registry.mjs +332 -0
- package/adapters/nuxt4/codegen/runners/lib/naming.mjs +246 -0
- package/adapters/nuxt4/codegen/runners/lib/page-lifecycle.mjs +254 -0
- package/adapters/nuxt4/codegen/runners/lib/plan.mjs +370 -0
- package/adapters/nuxt4/codegen/runners/lib/read-spec.mjs +7 -0
- package/adapters/nuxt4/codegen/runners/lib/render.mjs +47 -0
- package/adapters/nuxt4/codegen/runners/lib/resolve-hub-id.mjs +288 -0
- package/adapters/nuxt4/codegen/runners/lib/slots.mjs +121 -0
- package/adapters/nuxt4/codegen/runners/lib/write-files.mjs +106 -0
- package/adapters/nuxt4/codegen/runners/validate-registry.mjs +121 -0
- package/adapters/nuxt4/codegen/templates/create/form.vue.hbs +26 -0
- package/adapters/nuxt4/codegen/templates/create/mock.ts.hbs +11 -0
- package/adapters/nuxt4/codegen/templates/create/model.schema.ts.hbs +14 -0
- package/adapters/nuxt4/codegen/templates/create/model.types.ts.hbs +9 -0
- package/adapters/nuxt4/codegen/templates/create/page.vue.hbs +11 -0
- package/adapters/nuxt4/codegen/templates/create/service.ts.hbs +25 -0
- package/adapters/nuxt4/codegen/templates/create/useForm.ts.hbs +29 -0
- package/adapters/nuxt4/codegen/templates/create/validation.ts.hbs +12 -0
- package/adapters/nuxt4/codegen/templates/list/mock.ts.hbs +27 -0
- package/adapters/nuxt4/codegen/templates/list/model.index.ts.hbs +2 -0
- package/adapters/nuxt4/codegen/templates/list/model.schema.ts.hbs +16 -0
- package/adapters/nuxt4/codegen/templates/list/model.types.ts.hbs +9 -0
- package/adapters/nuxt4/codegen/templates/list/page.custom.vue.hbs +105 -0
- package/adapters/nuxt4/codegen/templates/list/page.vue.hbs +55 -0
- package/adapters/nuxt4/codegen/templates/list/service.ts.hbs +37 -0
- package/adapters/nuxt4/codegen/templates/list/useList.ts.hbs +82 -0
- package/adapters/nuxt4/codegen/templates/list/useListColumns.ts.hbs +21 -0
- package/adapters/nuxt4/codegen/templates/list/useListExport.ts.hbs +26 -0
- package/adapters/nuxt4/codegen/templates/list/useListFilters.ts.hbs +45 -0
- package/adapters/nuxt4/codegen/templates/partials/component-stub.vue.hbs +44 -0
- package/adapters/nuxt4/codegen/templates/store/store.ts.hbs +30 -0
- package/adapters/nuxt4/unitgen/runners/README.md +12 -0
- package/adapters/nuxt4/unitgen/runners/generate.mjs +201 -0
- package/adapters/nuxt4/unitgen/runners/lib/parse-tags.mjs +49 -0
- package/adapters/nuxt4/unitgen/runners/lib/plan.mjs +567 -0
- package/adapters/nuxt4/unitgen/runners/lib/read-codegen.mjs +42 -0
- package/adapters/nuxt4/unitgen/runners/lib/render.mjs +32 -0
- package/adapters/nuxt4/unitgen/runners/lib/unit-registry.mjs +52 -0
- package/adapters/nuxt4/unitgen/runners/lib/write-files.mjs +103 -0
- package/adapters/nuxt4/unitgen/runners/lib/write-spec-tags.mjs +37 -0
- package/adapters/nuxt4/unitgen/runners/validate-registry.mjs +74 -0
- package/adapters/nuxt4/unitgen/templates/composables/use-form.test.ts.hbs +56 -0
- package/adapters/nuxt4/unitgen/templates/composables/use-list.test.ts.hbs +59 -0
- package/adapters/nuxt4/unitgen/templates/models/schema.test.ts.hbs +24 -0
- package/adapters/nuxt4/unitgen/templates/services/service.create.test.ts.hbs +28 -0
- package/adapters/nuxt4/unitgen/templates/services/service.export.test.ts.hbs +20 -0
- package/adapters/nuxt4/unitgen/templates/services/service.search.test.ts.hbs +25 -0
- package/adapters/nuxt4/unitgen/templates/services/service.wire.test.ts.hbs +37 -0
- package/adapters/nuxt4/unitgen/templates/validations/schemas.test.ts.hbs +19 -0
- package/adapters/shared/common-gen.mjs +599 -0
- package/adapters/shared/common-ui.catalog.json +224 -0
- package/adapters/shared/css-adapters/shadcn.mjs +56 -0
- package/adapters/shared/css-adapters/winforms.mjs +46 -0
- package/adapters/shared/css-gen.mjs +87 -0
- package/adapters/shared/fe-layout-profiles.mjs +74 -0
- package/adapters/shared/fe-ui-inventory.mjs +62 -0
- package/adapters/shared/i18n-merge.mjs +56 -0
- package/adapters/shared/read-fe-ir.mjs +64 -0
- package/adapters/shared/resolve-cli.mjs +16 -0
- package/adapters/shared/resolve-hub-id.mjs +381 -0
- package/adapters/shared/surface-common.mjs +41 -0
- package/bin/flowgrid-mcp.mjs +29 -0
- package/bin/flowgrid.mjs +915 -0
- package/bin/lib/agent-mcp.mjs +70 -0
- package/bin/lib/agent-profiles.mjs +127 -0
- package/bin/lib/audit-run.mjs +96 -0
- package/bin/lib/cli-update.mjs +254 -0
- package/bin/lib/doctor.mjs +163 -0
- package/bin/lib/harness-overlay.mjs +80 -0
- package/bin/lib/harness-sync.mjs +427 -0
- package/bin/lib/init-scaffold.mjs +158 -0
- package/bin/lib/npm-registry.mjs +45 -0
- package/bin/lib/project-gitignore.mjs +39 -0
- package/dist/codegen/adapters/run-be.d.ts +13 -0
- package/dist/codegen/adapters/run-be.js +190 -0
- package/dist/codegen/adapters/run-be.js.map +1 -0
- package/dist/codegen/adapters/run.d.ts +44 -0
- package/dist/codegen/adapters/run.js +146 -0
- package/dist/codegen/adapters/run.js.map +1 -0
- package/dist/codegen/config/project-root.d.ts +13 -0
- package/dist/codegen/config/project-root.js +64 -0
- package/dist/codegen/config/project-root.js.map +1 -0
- package/dist/codegen/mcp/tools.d.ts +2 -0
- package/dist/codegen/mcp/tools.js +138 -0
- package/dist/codegen/mcp/tools.js.map +1 -0
- package/dist/codegen/registries/common.d.ts +28 -0
- package/dist/codegen/registries/common.js +54 -0
- package/dist/codegen/registries/common.js.map +1 -0
- package/dist/dna/config/project-root.d.ts +12 -0
- package/dist/dna/config/project-root.js +41 -0
- package/dist/dna/config/project-root.js.map +1 -0
- package/dist/dna/profile/detect.d.ts +14 -0
- package/dist/dna/profile/detect.js +159 -0
- package/dist/dna/profile/detect.js.map +1 -0
- package/dist/dna/profile/manifest.d.ts +17 -0
- package/dist/dna/profile/manifest.js +10 -0
- package/dist/dna/profile/manifest.js.map +1 -0
- package/dist/docs/cli/engines.d.ts +13 -0
- package/dist/docs/cli/engines.js +53 -0
- package/dist/docs/cli/engines.js.map +1 -0
- package/dist/docs/config/docs-root.d.ts +8 -0
- package/dist/docs/config/docs-root.js +66 -0
- package/dist/docs/config/docs-root.js.map +1 -0
- package/dist/docs/mcp/tools.d.ts +2 -0
- package/dist/docs/mcp/tools.js +351 -0
- package/dist/docs/mcp/tools.js.map +1 -0
- package/dist/docs/scan/ids.d.ts +29 -0
- package/dist/docs/scan/ids.js +237 -0
- package/dist/docs/scan/ids.js.map +1 -0
- package/dist/docs/scan/links.d.ts +10 -0
- package/dist/docs/scan/links.js +98 -0
- package/dist/docs/scan/links.js.map +1 -0
- package/dist/docs/scan/route.d.ts +8 -0
- package/dist/docs/scan/route.js +114 -0
- package/dist/docs/scan/route.js.map +1 -0
- package/dist/graph/analyze/analyze-bullets.d.ts +17 -0
- package/dist/graph/analyze/analyze-bullets.js +137 -0
- package/dist/graph/analyze/analyze-bullets.js.map +1 -0
- package/dist/graph/analyze/analyze-spec.d.ts +12 -0
- package/dist/graph/analyze/analyze-spec.js +249 -0
- package/dist/graph/analyze/analyze-spec.js.map +1 -0
- package/dist/graph/analyze/api-routes.d.ts +66 -0
- package/dist/graph/analyze/api-routes.js +370 -0
- package/dist/graph/analyze/api-routes.js.map +1 -0
- package/dist/graph/analyze/context-orphan.d.ts +12 -0
- package/dist/graph/analyze/context-orphan.js +229 -0
- package/dist/graph/analyze/context-orphan.js.map +1 -0
- package/dist/graph/analyze/grill-check.d.ts +31 -0
- package/dist/graph/analyze/grill-check.js +92 -0
- package/dist/graph/analyze/grill-check.js.map +1 -0
- package/dist/graph/analyze/parity-check.d.ts +25 -0
- package/dist/graph/analyze/parity-check.js +406 -0
- package/dist/graph/analyze/parity-check.js.map +1 -0
- package/dist/graph/analyze/product-paths.d.ts +13 -0
- package/dist/graph/analyze/product-paths.js +29 -0
- package/dist/graph/analyze/product-paths.js.map +1 -0
- package/dist/graph/analyze/surface-paths.d.ts +13 -0
- package/dist/graph/analyze/surface-paths.js +29 -0
- package/dist/graph/analyze/surface-paths.js.map +1 -0
- package/dist/graph/config/load-config.d.ts +30 -0
- package/dist/graph/config/load-config.js +112 -0
- package/dist/graph/config/load-config.js.map +1 -0
- package/dist/graph/config/platform-repos.d.ts +36 -0
- package/dist/graph/config/platform-repos.js +124 -0
- package/dist/graph/config/platform-repos.js.map +1 -0
- package/dist/graph/config/resolve-paths.d.ts +45 -0
- package/dist/graph/config/resolve-paths.js +121 -0
- package/dist/graph/config/resolve-paths.js.map +1 -0
- package/dist/graph/db/index-store.d.ts +67 -0
- package/dist/graph/db/index-store.js +179 -0
- package/dist/graph/db/index-store.js.map +1 -0
- package/dist/graph/gen/run-command.d.ts +40 -0
- package/dist/graph/gen/run-command.js +110 -0
- package/dist/graph/gen/run-command.js.map +1 -0
- package/dist/graph/lexicon/infer-lane.d.ts +11 -0
- package/dist/graph/lexicon/infer-lane.js +28 -0
- package/dist/graph/lexicon/infer-lane.js.map +1 -0
- package/dist/graph/lexicon/load-lexicon.d.ts +60 -0
- package/dist/graph/lexicon/load-lexicon.js +492 -0
- package/dist/graph/lexicon/load-lexicon.js.map +1 -0
- package/dist/graph/mcp/tools.d.ts +9 -0
- package/dist/graph/mcp/tools.js +326 -0
- package/dist/graph/mcp/tools.js.map +1 -0
- package/dist/graph/registry/load-registries.d.ts +27 -0
- package/dist/graph/registry/load-registries.js +111 -0
- package/dist/graph/registry/load-registries.js.map +1 -0
- package/dist/graph/types.d.ts +208 -0
- package/dist/graph/types.js +11 -0
- package/dist/graph/types.js.map +1 -0
- package/dist/test/config/project-root.d.ts +5 -0
- package/dist/test/config/project-root.js +29 -0
- package/dist/test/config/project-root.js.map +1 -0
- package/dist/test/engines/run.d.ts +10 -0
- package/dist/test/engines/run.js +16 -0
- package/dist/test/engines/run.js.map +1 -0
- package/dist/test/mcp/tools.d.ts +2 -0
- package/dist/test/mcp/tools.js +43 -0
- package/dist/test/mcp/tools.js.map +1 -0
- package/dist/test/optional/fallback-evidence.d.ts +34 -0
- package/dist/test/optional/fallback-evidence.js +103 -0
- package/dist/test/optional/fallback-evidence.js.map +1 -0
- package/engines/cases/README.md +12 -0
- package/engines/cases/check-coverage.mjs +103 -0
- package/engines/cases/check-plans.mjs +31 -0
- package/engines/cases/gate.mjs +215 -0
- package/engines/cases/lib/audit-tc-traceability.mjs +139 -0
- package/engines/cases/lib/list-case-yaml.mjs +27 -0
- package/engines/cases/lib/parse-bundle-traceability.mjs +77 -0
- package/engines/cases/lib/render-github-catalog.mjs +141 -0
- package/engines/cases/lib/resolve-bundle-from-screen.mjs +73 -0
- package/engines/cases/lib/screen-facet-coverage.mjs +42 -0
- package/engines/cases/lib/validate-tc-schema.mjs +61 -0
- package/engines/cases/publish.mjs +4 -0
- package/engines/cases/render-cases.mjs +182 -0
- package/engines/cases/vitepress/config.ts +171 -0
- package/engines/cases/vitepress/theme/custom.css +418 -0
- package/engines/cases/vitepress/theme/index.ts +46 -0
- package/engines/codegen/adapters/shadcn.mjs +58 -0
- package/engines/codegen/adapters/winforms.mjs +46 -0
- package/engines/codegen/tokens.mjs +64 -0
- package/engines/docs/lib/load-dev-base-url.mjs +38 -0
- package/engines/docs/lib/markdown-table.mjs +65 -0
- package/engines/docs/lib/render-bundle-markdown.mjs +95 -0
- package/engines/docs/lib/render-design-tables.mjs +695 -0
- package/engines/docs/lib/render-github-catalog.mjs +194 -0
- package/engines/docs/lib/render-qa-list.mjs +57 -0
- package/engines/docs/lib/render-spec-markdown.mjs +19 -0
- package/engines/docs/lib/render-template.mjs +76 -0
- package/engines/docs/lib/route-page-probe.mjs +54 -0
- package/engines/docs/publish.mjs +4 -0
- package/engines/docs/render-docs.mjs +195 -0
- package/engines/docs/vitepress/config.ts +442 -0
- package/engines/docs/vitepress/surfaces-nav.mjs +171 -0
- package/engines/docs/vitepress/theme/custom.css +418 -0
- package/engines/docs/vitepress/theme/index.ts +46 -0
- package/engines/openapi/build-openapi-ui.mjs +72 -0
- package/engines/openapi/build-swagger-ui.mjs +72 -0
- package/engines/openapi/check-backend-spec.mjs +66 -0
- package/engines/openapi/gen-openapi.mjs +337 -0
- package/engines/openapi/render-backend-spec.mjs +170 -0
- package/engines/openapi/render-openapi.mjs +155 -0
- package/engines/shared/flowgrid-tests-docs.mjs +32 -0
- package/engines/spec/extract-i18n.mjs +74 -0
- package/engines/spec/legacy-dynamics-validate.mjs +67 -0
- package/engines/spec/lib/audit-api-gaps.mjs +198 -0
- package/engines/spec/lib/audit-bundle-gaps.mjs +582 -0
- package/engines/spec/lib/audit-e2e-coverage.mjs +381 -0
- package/engines/spec/lib/audit-fe-be-alignment.mjs +183 -0
- package/engines/spec/lib/audit-flow-gaps.mjs +151 -0
- package/engines/spec/lib/audit-legacy-gaps.mjs +73 -0
- package/engines/spec/lib/audit-scenario-coverage.mjs +175 -0
- package/engines/spec/lib/audit-testcase-bundle-cross.mjs +145 -0
- package/engines/spec/lib/audit-testcase-gaps.mjs +79 -0
- package/engines/spec/lib/audit-testcase-plan-gaps.mjs +131 -0
- package/engines/spec/lib/audit-testcase-tc.mjs +182 -0
- package/engines/spec/lib/audit-ux-affordance.mjs +269 -0
- package/engines/spec/lib/bundle-ir.mjs +360 -0
- package/engines/spec/lib/bundle-schema.mjs +199 -0
- package/engines/spec/lib/collect-screen-api-intents.mjs +69 -0
- package/engines/spec/lib/hydrate-design-api.mjs +58 -0
- package/engines/spec/lib/open-qa.mjs +66 -0
- package/engines/spec/lib/project-business-layout.mjs +214 -0
- package/engines/spec/lib/testcase-matrix-facets.mjs +9 -0
- package/engines/spec/merge-bundle.mjs +27 -0
- package/engines/spec/normalize-bundle-gen.mjs +69 -0
- package/engines/spec/split-all.mjs +78 -0
- package/engines/spec/split-bundle.mjs +45 -0
- package/engines/template-builder/runner.mjs +96 -0
- package/engines/template-builder/scanner.mjs +138 -0
- package/engines/testcase/_staging-from-portal/README-STAGING.md +13 -0
- package/engines/testcase/_staging-from-portal/runners/README.md +15 -0
- package/engines/testcase/_staging-from-portal/runners/generate.mjs +123 -0
- package/engines/testcase/_staging-from-portal/runners/lib/e2e-registry.mjs +77 -0
- package/engines/testcase/_staging-from-portal/runners/lib/plan.mjs +97 -0
- package/engines/testcase/_staging-from-portal/runners/lib/read-testcase.mjs +166 -0
- package/engines/testcase/_staging-from-portal/runners/lib/render.mjs +18 -0
- package/engines/testcase/_staging-from-portal/runners/lib/semantic-plan.mjs +178 -0
- package/engines/testcase/_staging-from-portal/runners/lib/write-files.mjs +42 -0
- package/engines/testcase/_staging-from-portal/runners/validate-registry.mjs +75 -0
- package/engines/testcase/_staging-from-portal/templates/page.ts.hbs +52 -0
- package/engines/testcase/_staging-from-portal/templates/partials/README.md +5 -0
- package/engines/testcase/_staging-from-portal/templates/spec.ts.hbs +214 -0
- package/engines/testcase/runners/README.md +27 -0
- package/engines/testcase/runners/generate-api.mjs +121 -0
- package/engines/testcase/runners/generate.mjs +161 -0
- package/engines/testcase/runners/lib/api-plan.mjs +64 -0
- package/engines/testcase/runners/lib/e2e-registry.mjs +77 -0
- package/engines/testcase/runners/lib/plan.mjs +123 -0
- package/engines/testcase/runners/lib/read-spec.mjs +37 -0
- package/engines/testcase/runners/lib/read-testcase.mjs +179 -0
- package/engines/testcase/runners/lib/render.mjs +18 -0
- package/engines/testcase/runners/lib/resolve-hub-id.mjs +324 -0
- package/engines/testcase/runners/lib/semantic-plan.mjs +178 -0
- package/engines/testcase/runners/lib/write-files.mjs +145 -0
- package/engines/testcase/runners/validate-registry.mjs +75 -0
- package/engines/testcase/templates/api.spec.ts.hbs +40 -0
- package/engines/testcase/templates/page.ts.hbs +69 -0
- package/engines/testcase/templates/partials/README.md +5 -0
- package/engines/testcase/templates/spec.ts.hbs +231 -0
- package/harness/agents/claude/rules/claude-flowgrid.mdc +9 -0
- package/harness/agents/cursor/rules/cursor-flowgrid.mdc +9 -0
- package/harness/agents/gemini_antigravity/rules/antigravity-mcp.mdc +10 -0
- package/harness/agents/kiro/rules/kiro-flowgrid.mdc +9 -0
- package/harness/be/adapters/dotnet-integration/skills/framework-rules-be/SKILL.md +21 -0
- package/harness/be/adapters/fastapi/skills/framework-rules-be/SKILL.md +27 -0
- package/harness/be/adapters/laravel/skills/framework-rules-be/SKILL.md +27 -0
- package/harness/be/extracts/artifactgraph-hooks-be.md +21 -0
- package/harness/be/extracts/risk-classes.md +69 -0
- package/harness/be/skills/api/SKILL.md +116 -0
- package/harness/be/skills/api-unit/SKILL.md +76 -0
- package/harness/be/skills/grill-api/SKILL.md +69 -0
- package/harness/be/skills/grill-api-unit/SKILL.md +57 -0
- package/harness/common/extracts/artifact-graph.md +23 -0
- package/harness/common/extracts/artifactgraph-hooks-core.md +17 -0
- package/harness/common/extracts/artifactgraph-phase-hooks.md +106 -0
- package/harness/common/extracts/core/agent-discipline.md +8 -0
- package/harness/common/extracts/docs-mark-detect.md +48 -0
- package/harness/common/extracts/docs-mark.md +62 -0
- package/harness/common/extracts/extract-registry.json +29 -0
- package/harness/common/extracts/ux-common-patterns.md +172 -0
- package/harness/common/rules/artifactgraph.mdc +26 -0
- package/harness/common/rules/cross-repo-index.mdc +47 -0
- package/harness/common/rules/flowgrid-ux-common.mdc +39 -0
- package/harness/common/rules/platform-code-size.mdc +24 -0
- package/harness/common/rules/team-flow-harness-state.mdc +12 -0
- package/harness/common/skills/business-impact-review/SKILL.md +106 -0
- package/harness/common/skills/configure-repo-maps/SKILL.md +58 -0
- package/harness/common/skills/docs-mark/SKILL.md +67 -0
- package/harness/common/skills/legacy/SKILL.md +29 -0
- package/harness/common/skills/ui-proposal/SKILL.md +28 -0
- package/harness/docs/extracts/agent-execution-protocol.md +31 -0
- package/harness/docs/extracts/architecture-core.md +71 -0
- package/harness/docs/extracts/artifactgraph-hooks-docs.md +15 -0
- package/harness/docs/extracts/artifactgraph-parity.md +10 -0
- package/harness/docs/extracts/business-process-trace.md +66 -0
- package/harness/docs/extracts/codegen/readiness.md +8 -0
- package/harness/docs/extracts/common-scope.md +65 -0
- package/harness/docs/extracts/docs-phase-hooks.md +22 -0
- package/harness/docs/extracts/extract-registry.docs.json +45 -0
- package/harness/docs/extracts/extract-registry.flowgrid-process.json +12 -0
- package/harness/docs/extracts/grill/validation.md +9 -0
- package/harness/docs/extracts/grill-docs-reconcile.md +5 -0
- package/harness/docs/extracts/qa-inbox.md +36 -0
- package/harness/docs/extracts/risk-classes.md +69 -0
- package/harness/docs/extracts/spec-core.md +5 -0
- package/harness/docs/extracts/spec-requirement.md +5 -0
- package/harness/docs/extracts/tpl-adr.md +23 -0
- package/harness/docs/extracts/tpl-arc42-chapter.md +29 -0
- package/harness/docs/extracts/tpl-cross-cutting.md +24 -0
- package/harness/docs/extracts/tpl-deployment.md +23 -0
- package/harness/docs/extracts/tpl-module.md +33 -0
- package/harness/docs/extracts/update-spec-delta.md +5 -0
- package/harness/docs/rules/agent-compliance.mdc +26 -0
- package/harness/docs/rules/docs-hub.mdc +54 -0
- package/harness/docs/rules/flowgrid-process.mdc +25 -0
- package/harness/docs/rules/team-flow-grill.mdc +31 -0
- package/harness/docs/rules/team-flow-harness-state.mdc +16 -0
- package/harness/docs/rules/team-flow-spec.mdc +36 -0
- package/harness/docs/schemas/flowgrid-docs/backend-api.schema.json +175 -0
- package/harness/docs/schemas/flowgrid-docs/missing-optional-event.schema.json +39 -0
- package/harness/docs/schemas/flowgrid-docs/spec.schema.json +643 -0
- package/harness/docs/schemas/flowgrid-docs/testcase.schema.json +29 -0
- package/harness/docs/schemas/flowgrid-process/missing-optional-event.schema.json +39 -0
- package/harness/docs/skills/adopt/SKILL.md +140 -0
- package/harness/docs/skills/api/SKILL.md +40 -0
- package/harness/docs/skills/api-integration/SKILL.md +110 -0
- package/harness/docs/skills/api-spec/SKILL.md +136 -0
- package/harness/docs/skills/api-update/SKILL.md +82 -0
- package/harness/docs/skills/architecture/SKILL.md +57 -0
- package/harness/docs/skills/architecture-grill/SKILL.md +29 -0
- package/harness/docs/skills/background-logic/SKILL.md +100 -0
- package/harness/docs/skills/build-templates/SKILL.md +47 -0
- package/harness/docs/skills/business-process/SKILL.md +109 -0
- package/harness/docs/skills/call-external/SKILL.md +32 -0
- package/harness/docs/skills/common/SKILL.md +46 -0
- package/harness/docs/skills/common-spec/SKILL.md +55 -0
- package/harness/docs/skills/cross-cutting/SKILL.md +33 -0
- package/harness/docs/skills/cross-entity-service/SKILL.md +32 -0
- package/harness/docs/skills/cross-service/SKILL.md +37 -0
- package/harness/docs/skills/db-erd/SKILL.md +29 -0
- package/harness/docs/skills/decision/SKILL.md +30 -0
- package/harness/docs/skills/deployment/SKILL.md +34 -0
- package/harness/docs/skills/docs-hub/SKILL.md +65 -0
- package/harness/docs/skills/grill/SKILL.md +46 -0
- package/harness/docs/skills/grill-api/SKILL.md +26 -0
- package/harness/docs/skills/grill-api-spec/SKILL.md +57 -0
- package/harness/docs/skills/grill-bqa/SKILL.md +119 -0
- package/harness/docs/skills/grill-common-spec/SKILL.md +43 -0
- package/harness/docs/skills/grill-dev/SKILL.md +172 -0
- package/harness/docs/skills/grill-docs/SKILL.md +79 -0
- package/harness/docs/skills/grill-integration-spec/SKILL.md +51 -0
- package/harness/docs/skills/module/SKILL.md +58 -0
- package/harness/docs/skills/openapi/SKILL.md +37 -0
- package/harness/docs/skills/overview/SKILL.md +42 -0
- package/harness/docs/skills/qa-resolve/SKILL.md +91 -0
- package/harness/docs/skills/spec/SKILL.md +240 -0
- package/harness/docs/skills/surfaces/SKILL.md +52 -0
- package/harness/docs/skills/update-spec/SKILL.md +83 -0
- package/harness/fe/adapters/dotnet-line/skills/framework-rules/SKILL.md +27 -0
- package/harness/fe/adapters/nextjs/skills/framework-rules/SKILL.md +29 -0
- package/harness/fe/adapters/nuxt4/skills/framework-rules/SKILL.md +33 -0
- package/harness/fe/extracts/artifactgraph-hooks-fe.md +15 -0
- package/harness/fe/extracts/risk-classes.md +69 -0
- package/harness/fe/rules/cross-repo-index-routing.mdc +24 -0
- package/harness/fe/rules/flowgrid-test-optional-accelerators.mdc +21 -0
- package/harness/fe/rules/platform-code-size.mdc +43 -0
- package/harness/fe/rules/platform-design-vocabulary.mdc +33 -0
- package/harness/fe/rules/team-flow-prototype.mdc +32 -0
- package/harness/fe/rules/team-flow-unit.mdc +27 -0
- package/harness/fe/skills/build-template-code/SKILL.md +42 -0
- package/harness/fe/skills/gen-common/SKILL.md +93 -0
- package/harness/fe/skills/grill-prototype/SKILL.md +41 -0
- package/harness/fe/skills/grill-test/SKILL.md +32 -0
- package/harness/fe/skills/grill-unit/SKILL.md +31 -0
- package/harness/fe/skills/model/SKILL.md +48 -0
- package/harness/fe/skills/prototype/SKILL.md +100 -0
- package/harness/fe/skills/test/SKILL.md +37 -0
- package/harness/fe/skills/unit/SKILL.md +55 -0
- package/harness/fe/skills/wire/SKILL.md +60 -0
- package/harness/shared/AGENTS.md +169 -0
- package/harness/shared/SSOT_AGENT_PROTOCOL.md +167 -0
- package/harness/shared/rules/flowgrid-code-optional-integrations.mdc +53 -0
- package/harness/shared/schemas/flowgrid-code/missing-optional-event.schema.json +62 -0
- package/harness/tests/extracts/artifactgraph-hooks-test.md +13 -0
- package/harness/tests/extracts/plans/readiness.md +14 -0
- package/harness/tests/rules/cross-repo-index-routing.mdc +24 -0
- package/harness/tests/rules/flowgrid-test-optional-accelerators.mdc +21 -0
- package/harness/tests/rules/plans-docs-first.mdc +13 -0
- package/harness/tests/skills/grill-testcase/SKILL.md +55 -0
- package/harness/tests/skills/scenario/SKILL.md +64 -0
- package/harness/tests/skills/test-api/SKILL.md +65 -0
- package/harness/tests/skills/testcase/SKILL.md +98 -0
- package/harness/tests/templates/SC.example.md +86 -0
- package/harness/tests/templates/TC.example-api.yaml +45 -0
- package/harness/tests/templates/TC.example.yaml +127 -0
- package/lexicon/registry-tags.en.txt +173 -0
- package/lexicon/testcase-taxonomy.en.txt +117 -0
- package/package.json +98 -0
- package/schemas/missing-optional-event.schema.json +37 -0
- package/schemas/testcase.schema.json +239 -0
- package/scripts/prepare-install.mjs +25 -0
- package/stacks/docs.json +21 -0
- package/stacks/dotnet-integration.json +66 -0
- package/stacks/dotnet-line.json +64 -0
- package/stacks/fastapi.json +98 -0
- package/stacks/generic.json +11 -0
- package/stacks/laravel.json +92 -0
- package/stacks/nextjs-nest.json +93 -0
- package/stacks/nextjs.json +132 -0
- package/stacks/nuxt4-nest.json +123 -0
- package/stacks/nuxt4.json +148 -0
- package/templates/project-skeleton/architecture/01-introduction/index.md +33 -0
- package/templates/project-skeleton/architecture/02-constraints/index.md +34 -0
- package/templates/project-skeleton/architecture/03-business-process/FLOW-login.md +101 -0
- package/templates/project-skeleton/architecture/03-business-process/FLOW-template.md +149 -0
- package/templates/project-skeleton/architecture/04-solution-strategy/index.md +26 -0
- package/templates/project-skeleton/architecture/07-deployment/index.md +26 -0
- package/templates/project-skeleton/architecture/08-cross-cutting/configuration.md +18 -0
- package/templates/project-skeleton/architecture/08-cross-cutting/index.md +27 -0
- package/templates/project-skeleton/architecture/08-cross-cutting/observability.md +18 -0
- package/templates/project-skeleton/architecture/08-cross-cutting/security.md +18 -0
- package/templates/project-skeleton/architecture/09-decisions/ADR-001-arc42-toc.md +31 -0
- package/templates/project-skeleton/architecture/09-decisions/index.md +13 -0
- package/templates/project-skeleton/architecture/10-quality/index.md +27 -0
- package/templates/project-skeleton/architecture/11-risks/index.md +25 -0
- package/templates/project-skeleton/architecture/12-glossary/index.md +31 -0
- package/templates/project-skeleton/architecture/index.md +1 -0
- package/templates/project-skeleton/architecture/model/workspace.dsl +71 -0
- package/templates/project-skeleton/index.md +2 -0
- package/templates/project-skeleton/overview/.gitkeep +1 -0
- package/templates/project-skeleton/overview/index.md +2 -0
- package/templates/project-skeleton/qa/README.md +11 -0
- package/templates/project-skeleton/qa/open/.gitkeep +0 -0
- package/templates/project-skeleton/surfaces/common/code/API-CMN-HEALTH-001/health.api.yaml +12 -0
- package/templates/project-skeleton/surfaces/common/code/API-CMN-HEALTH-001/index.md +12 -0
- package/templates/project-skeleton/surfaces/common/code/UI-CMN-EMPTY-001/empty.ui.yaml +14 -0
- package/templates/project-skeleton/surfaces/common/code/UI-CMN-EMPTY-001/index.md +11 -0
- package/templates/project-skeleton/surfaces/common/data-model/derived-data.md +26 -0
- package/templates/project-skeleton/surfaces/common/data-model/index.md +16 -0
- package/templates/project-skeleton/surfaces/common/index.md +32 -0
- package/templates/project-skeleton/surfaces/common/md/breadcrumb-flow/common-breadcrumb-flow.md +72 -0
- package/templates/project-skeleton/surfaces/common/md/buttons/common-buttons.md +160 -0
- package/templates/project-skeleton/surfaces/common/md/confirm-dialog/common-confirm-dialog.md +98 -0
- package/templates/project-skeleton/surfaces/common/md/data-table/common-data-table.md +91 -0
- package/templates/project-skeleton/surfaces/common/md/delete-flow/common-delete-flow.md +68 -0
- package/templates/project-skeleton/surfaces/common/md/feedback/common-feedback.md +140 -0
- package/templates/project-skeleton/surfaces/common/md/flat-design/common-flat-design.md +78 -0
- package/templates/project-skeleton/surfaces/common/md/form-validation/common-form-validation.md +74 -0
- package/templates/project-skeleton/surfaces/common/md/import-csv/common-import-csv.md +89 -0
- package/templates/project-skeleton/surfaces/common/md/list-page/common-list-page.md +102 -0
- package/templates/project-skeleton/surfaces/common/md/list-toolbar/common-list-toolbar.md +81 -0
- package/templates/project-skeleton/surfaces/common/md/navigation/common-navigation.md +70 -0
- package/templates/project-skeleton/surfaces/common/md/pagination/common-pagination.md +86 -0
- package/templates/project-skeleton/surfaces/common/md/search-filter/common-search-filter.md +96 -0
- package/templates/project-skeleton/surfaces/common/md/status-chip/common-status-chip.md +93 -0
- package/templates/project-skeleton/surfaces/common/md/table-action-column/common-table-action-column.md +90 -0
- package/templates/project-skeleton/surfaces/common/patterns/breadcrumb-flow.md +83 -0
- package/templates/project-skeleton/surfaces/common/patterns/delete-flow.md +30 -0
- package/templates/project-skeleton/surfaces/common/patterns/ui-spec.md +15 -0
- package/templates/project-skeleton/surfaces/common/yaml/breadcrumb-flow/common-breadcrumb-flow.bundle.yaml +60 -0
- package/templates/project-skeleton/surfaces/common/yaml/breadcrumb-flow/ir/design.yaml +13 -0
- package/templates/project-skeleton/surfaces/common/yaml/breadcrumb-flow/ir/legacy.yaml +11 -0
- package/templates/project-skeleton/surfaces/common/yaml/breadcrumb-flow/ir/spec.yaml +31 -0
- package/templates/project-skeleton/surfaces/common/yaml/buttons/common-buttons.bundle.yaml +147 -0
- package/templates/project-skeleton/surfaces/common/yaml/buttons/ir/design.yaml +13 -0
- package/templates/project-skeleton/surfaces/common/yaml/buttons/ir/legacy.yaml +11 -0
- package/templates/project-skeleton/surfaces/common/yaml/buttons/ir/spec.yaml +118 -0
- package/templates/project-skeleton/surfaces/common/yaml/confirm-dialog/common-confirm-dialog.bundle.yaml +89 -0
- package/templates/project-skeleton/surfaces/common/yaml/confirm-dialog/ir/design.yaml +13 -0
- package/templates/project-skeleton/surfaces/common/yaml/confirm-dialog/ir/legacy.yaml +11 -0
- package/templates/project-skeleton/surfaces/common/yaml/confirm-dialog/ir/spec.yaml +60 -0
- package/templates/project-skeleton/surfaces/common/yaml/data-table/common-data-table.bundle.yaml +85 -0
- package/templates/project-skeleton/surfaces/common/yaml/data-table/ir/design.yaml +13 -0
- package/templates/project-skeleton/surfaces/common/yaml/data-table/ir/legacy.yaml +11 -0
- package/templates/project-skeleton/surfaces/common/yaml/data-table/ir/spec.yaml +56 -0
- package/templates/project-skeleton/surfaces/common/yaml/delete-flow/common-delete-flow.bundle.yaml +59 -0
- package/templates/project-skeleton/surfaces/common/yaml/delete-flow/ir/design.yaml +13 -0
- package/templates/project-skeleton/surfaces/common/yaml/delete-flow/ir/legacy.yaml +11 -0
- package/templates/project-skeleton/surfaces/common/yaml/delete-flow/ir/spec.yaml +30 -0
- package/templates/project-skeleton/surfaces/common/yaml/design-system.bundle.yaml +29 -0
- package/templates/project-skeleton/surfaces/common/yaml/feedback/common-feedback.bundle.yaml +126 -0
- package/templates/project-skeleton/surfaces/common/yaml/feedback/ir/design.yaml +13 -0
- package/templates/project-skeleton/surfaces/common/yaml/feedback/ir/legacy.yaml +11 -0
- package/templates/project-skeleton/surfaces/common/yaml/feedback/ir/spec.yaml +97 -0
- package/templates/project-skeleton/surfaces/common/yaml/flat-design/common-flat-design.bundle.yaml +77 -0
- package/templates/project-skeleton/surfaces/common/yaml/flat-design/ir/design.yaml +13 -0
- package/templates/project-skeleton/surfaces/common/yaml/flat-design/ir/legacy.yaml +11 -0
- package/templates/project-skeleton/surfaces/common/yaml/flat-design/ir/spec.yaml +48 -0
- package/templates/project-skeleton/surfaces/common/yaml/form-validation/common-form-validation.bundle.yaml +66 -0
- package/templates/project-skeleton/surfaces/common/yaml/form-validation/ir/design.yaml +13 -0
- package/templates/project-skeleton/surfaces/common/yaml/form-validation/ir/legacy.yaml +11 -0
- package/templates/project-skeleton/surfaces/common/yaml/form-validation/ir/spec.yaml +37 -0
- package/templates/project-skeleton/surfaces/common/yaml/import-csv/common-import-csv.bundle.yaml +74 -0
- package/templates/project-skeleton/surfaces/common/yaml/import-csv/ir/design.yaml +13 -0
- package/templates/project-skeleton/surfaces/common/yaml/import-csv/ir/legacy.yaml +11 -0
- package/templates/project-skeleton/surfaces/common/yaml/import-csv/ir/spec.yaml +45 -0
- package/templates/project-skeleton/surfaces/common/yaml/list-page/common-list-page.bundle.yaml +90 -0
- package/templates/project-skeleton/surfaces/common/yaml/list-page/ir/design.yaml +13 -0
- package/templates/project-skeleton/surfaces/common/yaml/list-page/ir/legacy.yaml +14 -0
- package/templates/project-skeleton/surfaces/common/yaml/list-page/ir/spec.yaml +58 -0
- package/templates/project-skeleton/surfaces/common/yaml/list-toolbar/common-list-toolbar.bundle.yaml +86 -0
- package/templates/project-skeleton/surfaces/common/yaml/list-toolbar/ir/design.yaml +13 -0
- package/templates/project-skeleton/surfaces/common/yaml/list-toolbar/ir/legacy.yaml +12 -0
- package/templates/project-skeleton/surfaces/common/yaml/list-toolbar/ir/spec.yaml +56 -0
- package/templates/project-skeleton/surfaces/common/yaml/navigation/common-navigation.bundle.yaml +68 -0
- package/templates/project-skeleton/surfaces/common/yaml/navigation/ir/design.yaml +13 -0
- package/templates/project-skeleton/surfaces/common/yaml/navigation/ir/legacy.yaml +11 -0
- package/templates/project-skeleton/surfaces/common/yaml/navigation/ir/spec.yaml +39 -0
- package/templates/project-skeleton/surfaces/common/yaml/pagination/common-pagination.bundle.yaml +84 -0
- package/templates/project-skeleton/surfaces/common/yaml/pagination/ir/design.yaml +13 -0
- package/templates/project-skeleton/surfaces/common/yaml/pagination/ir/legacy.yaml +13 -0
- package/templates/project-skeleton/surfaces/common/yaml/pagination/ir/spec.yaml +53 -0
- package/templates/project-skeleton/surfaces/common/yaml/search-filter/common-search-filter.bundle.yaml +88 -0
- package/templates/project-skeleton/surfaces/common/yaml/search-filter/ir/design.yaml +13 -0
- package/templates/project-skeleton/surfaces/common/yaml/search-filter/ir/legacy.yaml +11 -0
- package/templates/project-skeleton/surfaces/common/yaml/search-filter/ir/spec.yaml +59 -0
- package/templates/project-skeleton/surfaces/common/yaml/status-chip/common-status-chip.bundle.yaml +89 -0
- package/templates/project-skeleton/surfaces/common/yaml/status-chip/ir/design.yaml +13 -0
- package/templates/project-skeleton/surfaces/common/yaml/status-chip/ir/legacy.yaml +11 -0
- package/templates/project-skeleton/surfaces/common/yaml/status-chip/ir/spec.yaml +60 -0
- package/templates/project-skeleton/surfaces/common/yaml/table-action-column/common-table-action-column.bundle.yaml +81 -0
- package/templates/project-skeleton/surfaces/common/yaml/table-action-column/ir/design.yaml +13 -0
- package/templates/project-skeleton/surfaces/common/yaml/table-action-column/ir/legacy.yaml +11 -0
- package/templates/project-skeleton/surfaces/common/yaml/table-action-column/ir/spec.yaml +52 -0
- package/templates/project-skeleton/surfaces/index.md +1 -0
- package/templates/schemas/backend-api.schema.json +174 -0
- package/templates/schemas/legacy-repos.schema.json +24 -0
- package/templates/schemas/platform-repos.schema.json +29 -0
- package/templates/schemas/spec.schema.json +718 -0
- package/templates/schemas/testcase.schema.json +28 -0
- package/templates/shared/AUTHORING-COMMON.md +109 -0
- package/templates/shared/api-contract-test.yaml +33 -0
- package/templates/shared/backend-api-integration.yaml +152 -0
- package/templates/shared/backend-api.bundle.yaml +177 -0
- package/templates/shared/backend-api.yaml +188 -0
- package/templates/shared/breadcrumb-flow.ejs +45 -0
- package/templates/shared/bundle-authoring.md +288 -0
- package/templates/shared/clients-line.yaml +18 -0
- package/templates/shared/default-layout.ejs +234 -0
- package/templates/shared/design-spec.yaml +85 -0
- package/templates/shared/entity-delta.example.yaml +45 -0
- package/templates/shared/feature.bundle.yaml +575 -0
- package/templates/shared/integration-adapter.bundle.yaml +77 -0
- package/templates/shared/integration-spec.yaml +37 -0
- package/templates/shared/ir-design.yaml +34 -0
- package/templates/shared/ir-legacy.yaml +12 -0
- package/templates/shared/ir-spec.yaml +18 -0
- package/templates/shared/line-client.bundle.yaml +65 -0
- package/templates/shared/mock-data.yaml +22 -0
- package/templates/shared/openapi.yaml +144 -0
- package/templates/shared/patterns/.gitkeep +0 -0
- package/templates/shared/patterns/admin-crud.pattern.yaml +37 -0
- package/templates/shared/qa-item.yaml +15 -0
- package/templates/shared/spec.yaml +162 -0
- package/templates/shared/testcase.yaml +2 -0
- package/templates/tests-skeleton/cases/README.md +5 -0
- package/templates/tests-skeleton/catalog/locale.yaml +7 -0
- package/templates/tests-skeleton/index.md +7 -0
- package/templates/tests-skeleton/scenarios/README.md +3 -0
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# Entity delta example — inherits admin-crud (guinea pig template)
|
|
2
|
+
|
|
3
|
+
schema: portal-feature-bundle/v1
|
|
4
|
+
id: example-entity-list
|
|
5
|
+
title: Example entity list (delta only)
|
|
6
|
+
specOrigin: requirement
|
|
7
|
+
|
|
8
|
+
design:
|
|
9
|
+
inherits: admin-crud
|
|
10
|
+
shell:
|
|
11
|
+
tag: "#shell: DataListPage"
|
|
12
|
+
zones:
|
|
13
|
+
- { id: search, label: Tìm kiếm }
|
|
14
|
+
- { id: toolbar, label: Toolbar, position: { after: search } }
|
|
15
|
+
- { id: table, label: Bảng }
|
|
16
|
+
behavior:
|
|
17
|
+
create: { enabled: true, surface: page }
|
|
18
|
+
delete: { enabled: true, mode: confirm_dialog }
|
|
19
|
+
|
|
20
|
+
spec:
|
|
21
|
+
actors: [{ id: admin, legacyRoleCode: master }]
|
|
22
|
+
entities: [{ name: ExampleEntity, table: example_entities }]
|
|
23
|
+
requirements:
|
|
24
|
+
- id: REQ-EX-LIST-001
|
|
25
|
+
title: Admin list example entities
|
|
26
|
+
priority: must
|
|
27
|
+
ui:
|
|
28
|
+
routes:
|
|
29
|
+
- path: /admin/example-entities
|
|
30
|
+
pageTestId: admin-example-list-page
|
|
31
|
+
api:
|
|
32
|
+
endpoints:
|
|
33
|
+
- method: GET
|
|
34
|
+
path: /example-entities
|
|
35
|
+
action: list
|
|
36
|
+
acceptance:
|
|
37
|
+
- List dùng common list shell; chỉ delta columns/filters khác hotel.
|
|
38
|
+
|
|
39
|
+
# gen: — dev-grill adds later
|
|
40
|
+
|
|
41
|
+
legacy:
|
|
42
|
+
legacyRef: null
|
|
43
|
+
|
|
44
|
+
review:
|
|
45
|
+
summary: Pilot delta — không copy hotel bundle.
|
|
@@ -0,0 +1,575 @@
|
|
|
1
|
+
# SSOT — portal-feature-bundle/v1. Split: pnpm spec:split -- <path>
|
|
2
|
+
# Authoring: docs/templates/bundle-authoring.md
|
|
3
|
+
# /spec MUST fill inventory when information exists. grill-* only re-checks gaps/conflicts.
|
|
4
|
+
|
|
5
|
+
schema: portal-feature-bundle/v1
|
|
6
|
+
page-id: role-domain-function
|
|
7
|
+
title: Feature title
|
|
8
|
+
status: draft
|
|
9
|
+
owner: portal-team
|
|
10
|
+
|
|
11
|
+
# 1. BẢN TÓM TẮT TỔNG QUAN (ARC42 BUSINESS SUMMARY)
|
|
12
|
+
summary: |
|
|
13
|
+
- mục tiêu nghiệp vụ (business_goals): [Nêu rõ vấn đề đang giải quyết và giá trị kinh tế/nghiệp vụ mang lại. Viết sâu sắc để Stakeholder hiểu rõ vì sao phải làm.]
|
|
14
|
+
- các bên liên quan (stakeholders): [Ai dùng, ai hưởng lợi, ai quản lý?]
|
|
15
|
+
- kịch bản người dùng (user_journey): [Kể câu chuyện người dùng trải qua các bước trên màn hình bằng ngôn ngữ đời thường.]
|
|
16
|
+
- bối cảnh (context):
|
|
17
|
+
- description: [Phân tích sâu luồng nghiệp vụ chi tiết]
|
|
18
|
+
- input: [Dữ liệu đầu vào. CHÚ Ý liên kết cross-page / cross-module nếu có]
|
|
19
|
+
- output: [Kết quả đầu ra]
|
|
20
|
+
- cách giải quyết (solution): [Tuỳ chọn. Ghi kỹ thuật phức tạp nếu có.]
|
|
21
|
+
|
|
22
|
+
# 2. KHỐI USER STORIES CHI TIẾT CHO MÀN HÌNH (SCREEN USER STORIES & SCENARIOS)
|
|
23
|
+
userStories:
|
|
24
|
+
primary:
|
|
25
|
+
asA: "[Persona / Role - vd: Nhân viên Vận hành / Khách hàng / Quản trị viên]"
|
|
26
|
+
iWant: "[Hành động chính trên màn hình: xem danh sách, lọc, tạo mới, cập nhật, phê duyệt...]"
|
|
27
|
+
soThat: "[Mục đích kinh doanh và giá trị thực tế đạt được]"
|
|
28
|
+
|
|
29
|
+
contextAndHandoff:
|
|
30
|
+
# 3 LOẠI CÁCH THỨC VÀO MÀN HÌNH (SCREEN ACCESS ENTRY MODE):
|
|
31
|
+
# - directRoute: Dành cho Login, Register, Public/Guest Page (mô tả path router)
|
|
32
|
+
# - sidebarMenu: Dành cho Dashboard, CRUD List, Admin Pages (mô tả menu đa cấp dropdown + label text)
|
|
33
|
+
# - contextualAction: Dành cho Detail, Edit Modal, Settings (mô tả nút bấm xxx từ màn hình A)
|
|
34
|
+
screenAccess:
|
|
35
|
+
accessType: sidebarMenu # directRoute | sidebarMenu | contextualAction
|
|
36
|
+
directRoute:
|
|
37
|
+
routePath: "/auth/login"
|
|
38
|
+
isPublic: true
|
|
39
|
+
urlParams: ["redirect_url"]
|
|
40
|
+
sidebarMenu:
|
|
41
|
+
menuHierarchy: ["Quản trị hệ thống", "Quản lý Người dùng"] # Cấu trúc menu đa cấp
|
|
42
|
+
menuLabel: "Danh sách tài khoản" # Text hiển thị trên left sidebar menu
|
|
43
|
+
icon: "user-cog"
|
|
44
|
+
badge: "New"
|
|
45
|
+
contextualAction:
|
|
46
|
+
sourceScreen: "W-ADM-LIST-01"
|
|
47
|
+
triggerControl: "Nút 'Chỉnh sửa' (btn_edit) trên từng dòng bảng User List"
|
|
48
|
+
navigationType: "pageRedirect" # pageRedirect | modalDialog | drawer | tabSwitch
|
|
49
|
+
inputsReceived: ["customer_id", "booking_id"]
|
|
50
|
+
|
|
51
|
+
sourceScreen: "W-ADM-LIST-01"
|
|
52
|
+
inputsReceived:
|
|
53
|
+
- "customer_id"
|
|
54
|
+
- "booking_id"
|
|
55
|
+
nextScreenOnSuccess: "W-ADM-DETAIL-01"
|
|
56
|
+
nextScreenOnCancel: "W-ADM-LIST-01"
|
|
57
|
+
|
|
58
|
+
scenarios:
|
|
59
|
+
- name: "Khởi tạo & Tải dữ liệu ban đầu (Initial Load)"
|
|
60
|
+
steps:
|
|
61
|
+
- "Kiểm tra quyền hạn người dùng (Role / Permissions) đối với màn hình."
|
|
62
|
+
- "Tải danh sách dữ liệu theo bộ lọc mặc định hoặc bind thông tin bản ghi theo ID nhận được."
|
|
63
|
+
- "Hiển thị trạng thái tải (Skeleton / Spinner), nếu không có dữ liệu hiển thị Empty State."
|
|
64
|
+
|
|
65
|
+
- name: "Tương tác Nhập liệu & Thẩm định Dữ liệu (Input & Validation)"
|
|
66
|
+
steps:
|
|
67
|
+
- "Người dùng nhập liệu các trường bắt buộc và tùy chọn trên form."
|
|
68
|
+
- "Hệ thống validate trực tiếp trên giao diện (Inline error) khi nhập sai định dạng hoặc bỏ trống."
|
|
69
|
+
- "Các trường có logic phụ thuộc tự động cập nhật hoặc mở thêm vùng nhập (Dynamic visibility / calculation)."
|
|
70
|
+
|
|
71
|
+
- name: "Nộp dữ liệu & Hoàn tất Thành công (Happy Path Submit)"
|
|
72
|
+
steps:
|
|
73
|
+
- "Người dùng nhấn nút thực thi chính (Primary Action Button)."
|
|
74
|
+
- "Hệ thống khóa nút và hiển thị loading để chống bấm đúp (double submit prevention)."
|
|
75
|
+
- "Lưu dữ liệu thành công (không phải xóa): Toast hoặc inline alert; điều hướng theo Handoff. Thao tác xóa — xem scenario UX affordances bên dưới."
|
|
76
|
+
|
|
77
|
+
# Thêm scenario này khi màn có delete/breadcrumb/filter/disabled reason / import CSV (sau audit UX_* hoặc DSL gap).
|
|
78
|
+
- name: "Affordances UX chuẩn portal (UX — khi áp dụng)"
|
|
79
|
+
steps:
|
|
80
|
+
- "Breadcrumb / ngữ cảnh: Người dùng luôn biết đang ở module và bản ghi nào (trail hoặc back + title rõ)."
|
|
81
|
+
- "Danh sách: Tìm kiếm/lọc (nếu có) và phân trang; empty state khác 'không có kết quả filter'."
|
|
82
|
+
- "Cột trạng thái: Hiển thị chip/badge có chữ, không chỉ màu."
|
|
83
|
+
- "Hành động trên dòng bị khóa: Có lý do hiển thị (tooltip/badge/chip), không chỉ nút disabled im lặng."
|
|
84
|
+
- "Xóa / xóa hàng loạt: Hộp thoại xác nhận chặn → gọi API → hộp thoại kết quả (thành công/lỗi) bắt người dùng xác nhận — không chỉ toast."
|
|
85
|
+
- "Import CSV (nếu có): Chọn file → kiểm tra → xác nhận → báo kết quả; lỗi theo dòng có thể tải log."
|
|
86
|
+
|
|
87
|
+
- name: "Xử lý Ngoại lệ & Lỗi Giao diện (Exceptions & Edge Cases)"
|
|
88
|
+
steps:
|
|
89
|
+
- "Xung đột dữ liệu / Đã bị sửa đổi bởi người khác (409 Conflict): Cảnh báo và tải lại."
|
|
90
|
+
- "Lỗi kết nối / Máy chủ (Network / 5xx error): Giữ nguyên dữ liệu đã nhập trên form, không bắt nhập lại."
|
|
91
|
+
- "Hết hạn phiên làm việc (Session timeout): Yêu cầu xác thực lại và bảo lưu tạm bản nháp."
|
|
92
|
+
|
|
93
|
+
- name: "Tác vụ Ngầm Kích hoạt từ Màn hình (Background / Async Logic - Tùy chọn)"
|
|
94
|
+
steps:
|
|
95
|
+
- "Nếu thao tác kích hoạt xử lý ngầm (gửi tin nhắn, tạo job đồng bộ): Hệ thống đẩy sự kiện vào hàng đợi."
|
|
96
|
+
- "Cập nhật trạng thái hiển thị trên màn hình thành 'Đang xử lý ngầm' (Processing) để người dùng theo dõi."
|
|
97
|
+
|
|
98
|
+
acceptanceCriteria:
|
|
99
|
+
- "[ ] Người dùng có quyền truy cập xem được toàn bộ thông tin hợp lệ."
|
|
100
|
+
- "[ ] Form chặn nộp khi thiếu các trường bắt buộc và thông báo lỗi rõ ràng."
|
|
101
|
+
- "[ ] Khi nộp thành công (không phải delete), dữ liệu được lưu đúng và chuyển trang mượt mà."
|
|
102
|
+
- "[ ] (Khi có delete) Confirm trước xóa và result dialog sau API — không toast-only."
|
|
103
|
+
- "[ ] (Khi có action disabled theo rule) Người dùng hiểu lý do bị khóa (copy/badge/tooltip)."
|
|
104
|
+
- "[ ] (Khi list/detail drill-down) Breadcrumb hoặc ngữ cảnh điều hướng đủ cho deep link."
|
|
105
|
+
|
|
106
|
+
specOrigin: requirement # requirement | legacy
|
|
107
|
+
|
|
108
|
+
grillStatus:
|
|
109
|
+
bqaFacts: pending # /grill-bqa Step A — inventory locked
|
|
110
|
+
bqaOpen: pending # /grill-bqa Step B — member wizard answers applied into design (no leftover Q list in YAML)
|
|
111
|
+
dev: pending
|
|
112
|
+
full: not_required
|
|
113
|
+
|
|
114
|
+
# Design v1 — author ui.list|form|detail + design.zones.items here.
|
|
115
|
+
# Do NOT put portal:gen flats in spec: ui.filters / ui.columns / composition / testIds belong in gen.
|
|
116
|
+
spec:
|
|
117
|
+
actors: []
|
|
118
|
+
entities: []
|
|
119
|
+
relationships: []
|
|
120
|
+
requirements:
|
|
121
|
+
- "[Ghi chú: Bắt buộc định nghĩa State Machine, và UI Permissions vào thuộc tính states của từng item trong design.sections. KHÔNG liệt kê chung chung ở đây]"
|
|
122
|
+
- "Edge Cases: [Bắt buộc định nghĩa ngoại lệ như lỗi luồng, data hỏng, concurrency]"
|
|
123
|
+
ui:
|
|
124
|
+
routes: []
|
|
125
|
+
# - path: /feature
|
|
126
|
+
# pageTestId: feature-page
|
|
127
|
+
validationMessages:
|
|
128
|
+
required: "Trường này là bắt buộc"
|
|
129
|
+
list:
|
|
130
|
+
columns:
|
|
131
|
+
- key: status
|
|
132
|
+
title: "Trạng thái"
|
|
133
|
+
meaning: "Tình trạng hoạt động của tài khoản trong hệ thống để quản lý quyền đăng nhập và giao dịch"
|
|
134
|
+
purpose: "Cho user thấy tài khoản còn hoạt động hay đã bị tạm khóa"
|
|
135
|
+
widget: chip
|
|
136
|
+
color: "#common:status-chip"
|
|
137
|
+
sortable: false
|
|
138
|
+
render: custom
|
|
139
|
+
filters:
|
|
140
|
+
- name: keyword
|
|
141
|
+
label: "Tìm kiếm"
|
|
142
|
+
meaning: "Từ khóa tra cứu nhanh để xác định đúng khách hàng hoặc mã giao dịch cụ thể"
|
|
143
|
+
purpose: "Tìm nhanh bản ghi theo tên hoặc mã định danh"
|
|
144
|
+
type: string
|
|
145
|
+
widget: search
|
|
146
|
+
placeholder: "Nhập tên hoặc mã để tìm..."
|
|
147
|
+
rowActions: []
|
|
148
|
+
bulkActions: []
|
|
149
|
+
pagination:
|
|
150
|
+
defaultPageSize: 20
|
|
151
|
+
pageSizeOptions: [20, 50, 100]
|
|
152
|
+
emptyState:
|
|
153
|
+
title: "Không có dữ liệu"
|
|
154
|
+
message: "Không tìm thấy bản ghi nào phù hợp với bộ lọc."
|
|
155
|
+
form:
|
|
156
|
+
layout:
|
|
157
|
+
mode: single-column # single-column | two-column | custom
|
|
158
|
+
sections: []
|
|
159
|
+
fields:
|
|
160
|
+
- key: name
|
|
161
|
+
label: "Tên hồ sơ"
|
|
162
|
+
meaning: "Tên danh xưng chính thức của khách hàng dùng để in trên chứng từ hợp đồng và xuất hóa đơn"
|
|
163
|
+
purpose: "Nhập tên hiển thị trên hồ sơ khách hàng"
|
|
164
|
+
type: string
|
|
165
|
+
widget: text
|
|
166
|
+
required: true
|
|
167
|
+
submit:
|
|
168
|
+
label: "Lưu thông tin"
|
|
169
|
+
emptyState:
|
|
170
|
+
title: "Chưa cấu hình trường"
|
|
171
|
+
message: "Form này chưa được cấu hình các trường nhập liệu."
|
|
172
|
+
detail:
|
|
173
|
+
header:
|
|
174
|
+
badges: []
|
|
175
|
+
sections: []
|
|
176
|
+
actions: []
|
|
177
|
+
emptyState:
|
|
178
|
+
title: "Chưa có thông tin"
|
|
179
|
+
message: "Trang chi tiết này chưa được thiết lập nội dung."
|
|
180
|
+
acceptance: []
|
|
181
|
+
|
|
182
|
+
# Dev-grill / portal:gen — /grill-dev MUST fill codegen.profile (flowgrid reads ir/design.yaml).
|
|
183
|
+
# Empty profile = grill incomplete; flowgrid gen MUST fail.
|
|
184
|
+
gen:
|
|
185
|
+
codegen:
|
|
186
|
+
profile: "admin-crud" # REQUIRED: auth | change-password | public | not-found | error | list | create | admin-crud
|
|
187
|
+
entity: ""
|
|
188
|
+
module: ""
|
|
189
|
+
tags: []
|
|
190
|
+
ui:
|
|
191
|
+
filters: []
|
|
192
|
+
columns: []
|
|
193
|
+
composition: null
|
|
194
|
+
testIds: null
|
|
195
|
+
|
|
196
|
+
design:
|
|
197
|
+
inherits: null
|
|
198
|
+
shell:
|
|
199
|
+
tag: "#shell: DataListPage" # AuthPage | AppShell
|
|
200
|
+
patterns: []
|
|
201
|
+
nav:
|
|
202
|
+
sidebar:
|
|
203
|
+
enabled: false
|
|
204
|
+
breadcrumb: []
|
|
205
|
+
|
|
206
|
+
# CÂY LAYOUT ĐỘNG — lồng sections[] tùy màn hình.
|
|
207
|
+
# THUỘC TÍNH ĐỘNG DÀNH CHO CÁC KHỐI UI & SHADCN PRIMITIVES:
|
|
208
|
+
# - primitive: Thẻ primitive của Shadcn UI (vd: #ui: Card, #ui: Form, #ui: Table, #ui: Dialog, #ui: Select, #ui: Badge, #ui: Sheet, #ui: Tabs)
|
|
209
|
+
# - visual: Cấu hình CSS/Tailwind (className), token màu (colorToken), font/typography, layout mode (layoutMode), kích thước
|
|
210
|
+
# - meaning: Ý NGHĨA NGHIỆP VỤ — Bản chất kinh doanh của trường/khối/nút trong thế giới thực
|
|
211
|
+
# - purpose: MỤC ĐÍCH THAO TÁC — Người dùng thao tác gì với control này trên UI
|
|
212
|
+
sections:
|
|
213
|
+
# LOẠI 1: KHỐI STATS BANNER / HEADER KPI CARD (#ui: Card, #ui: Badge)
|
|
214
|
+
- id: sec_kpi_banner
|
|
215
|
+
name: "Khối Thống Kê Tổng Quan"
|
|
216
|
+
kind: card
|
|
217
|
+
primitive: "#ui: Card"
|
|
218
|
+
meaning: "Cung cấp chỉ số hiệu suất tổng quan của tài khoản giúp nhân viên đưa ra quyết định xử lý nhanh"
|
|
219
|
+
purpose: "Hiển thị các thẻ KPI thống kê tổng số bản ghi và trạng thái"
|
|
220
|
+
visual:
|
|
221
|
+
colorToken: "#common:card-surface"
|
|
222
|
+
className: "grid grid-cols-1 md:grid-cols-3 gap-4 p-6 bg-card border rounded-xl shadow-xs"
|
|
223
|
+
typography: "text-card-foreground"
|
|
224
|
+
dynamicProps:
|
|
225
|
+
layoutMode: "responsive-grid"
|
|
226
|
+
columns: 3
|
|
227
|
+
items:
|
|
228
|
+
- id: kpi_total_records
|
|
229
|
+
kind: badge
|
|
230
|
+
primitive: "#ui: Badge"
|
|
231
|
+
label: "Tổng hồ sơ"
|
|
232
|
+
meaning: "Số lượng bản ghi đang quản lý trong hệ thống"
|
|
233
|
+
purpose: "Theo dõi số lượng hồ sơ hiện có"
|
|
234
|
+
colorToken: "#common:primary"
|
|
235
|
+
visual:
|
|
236
|
+
className: "text-2xl font-bold tracking-tight text-primary"
|
|
237
|
+
|
|
238
|
+
# LOẠI 2: KHỐI FORM NHẬP LIỆU ĐỘNG (#ui: Form, #ui: Select, #ui: Input)
|
|
239
|
+
- id: sec_main_info
|
|
240
|
+
name: "Khối Thông Tin Nhập Liệu Hồ Sơ"
|
|
241
|
+
kind: form_grid
|
|
242
|
+
primitive: "#ui: Form"
|
|
243
|
+
meaning: "Gom nhóm các thuộc tính nhận diện cốt lõi của bản ghi phục vụ tra cứu và kiểm toán"
|
|
244
|
+
purpose: "Khu vực nhập liệu thông tin chính của hồ sơ"
|
|
245
|
+
visual:
|
|
246
|
+
className: "space-y-6 border p-6 rounded-xl bg-background shadow-xs"
|
|
247
|
+
layoutMode: "two-column"
|
|
248
|
+
dynamicProps:
|
|
249
|
+
responsiveGrid: "grid grid-cols-1 lg:grid-cols-2 gap-6"
|
|
250
|
+
sections:
|
|
251
|
+
# Ví dụ 2.1: Input field có Dynamic Validation 5 Tiers + Messages chi tiết
|
|
252
|
+
- id: fld_record_code
|
|
253
|
+
name: "Record Code Field"
|
|
254
|
+
kind: input
|
|
255
|
+
primitive: "#ui: Input"
|
|
256
|
+
label: "Mã hồ sơ"
|
|
257
|
+
meaning: "Mã định danh duy nhất của hồ sơ dùng để đối soát kế toán và tra cứu hợp đồng"
|
|
258
|
+
purpose: "Nhập mã định danh hồ sơ nghiệp vụ"
|
|
259
|
+
visual:
|
|
260
|
+
className: "w-full focus:ring-2 focus:ring-ring font-mono uppercase"
|
|
261
|
+
copy:
|
|
262
|
+
placeholder: "VD: REC-2026-001"
|
|
263
|
+
helper: "Từ 5-20 ký tự, gồm chữ in hoa, số và gạch ngang"
|
|
264
|
+
bind:
|
|
265
|
+
field: record_code
|
|
266
|
+
db:
|
|
267
|
+
schema: records
|
|
268
|
+
field: code
|
|
269
|
+
validation:
|
|
270
|
+
prototype: "slug_uppercase" # Built-in prototype preset
|
|
271
|
+
required: true
|
|
272
|
+
rules:
|
|
273
|
+
- type: "regex"
|
|
274
|
+
pattern: "^[A-Z0-9_-]{5,20}$"
|
|
275
|
+
message: "Mã hồ sơ chỉ được gồm chữ in hoa, chữ số và ký tự gạch (- _)"
|
|
276
|
+
- type: "length"
|
|
277
|
+
min: 5
|
|
278
|
+
max: 20
|
|
279
|
+
message: "Độ dài mã hồ sơ bắt buộc từ 5 đến 20 ký tự"
|
|
280
|
+
remoteCheck:
|
|
281
|
+
endpoint: "/api/v1/records/check-duplicate-code"
|
|
282
|
+
trigger: "onBlur" # onBlur | onSubmit
|
|
283
|
+
debounceMs: 400
|
|
284
|
+
params:
|
|
285
|
+
code: "{value}"
|
|
286
|
+
excludeId: "{current_record_id}"
|
|
287
|
+
message: "Mã hồ sơ này đã tồn tại trên hệ thống. Vui lòng chọn mã khác."
|
|
288
|
+
messages:
|
|
289
|
+
required: "Vui lòng nhập mã hồ sơ."
|
|
290
|
+
|
|
291
|
+
# Ví dụ 2.2: Input tên hồ sơ có sanitize & boundary
|
|
292
|
+
- id: fld_record_name
|
|
293
|
+
name: "Record Name Field"
|
|
294
|
+
kind: input
|
|
295
|
+
primitive: "#ui: Input"
|
|
296
|
+
label: "Tên hồ sơ"
|
|
297
|
+
meaning: "Tên định danh giao dịch của khách hàng dùng làm tiêu đề hiển thị trên mọi báo cáo"
|
|
298
|
+
purpose: "Nhập tên hồ sơ hiển thị"
|
|
299
|
+
visual:
|
|
300
|
+
className: "w-full focus:ring-2 focus:ring-ring"
|
|
301
|
+
copy:
|
|
302
|
+
placeholder: "Nhập tên đầy đủ..."
|
|
303
|
+
helper: "Tối thiểu 3 ký tự, tối đa 100 ký tự"
|
|
304
|
+
bind:
|
|
305
|
+
field: record_name
|
|
306
|
+
db:
|
|
307
|
+
schema: records
|
|
308
|
+
field: name
|
|
309
|
+
validation:
|
|
310
|
+
prototype: "text_clean"
|
|
311
|
+
required: true
|
|
312
|
+
rules:
|
|
313
|
+
- type: "length"
|
|
314
|
+
min: 3
|
|
315
|
+
max: 100
|
|
316
|
+
message: "Tên hồ sơ bắt buộc từ 3 đến 100 ký tự"
|
|
317
|
+
messages:
|
|
318
|
+
required: "Vui lòng nhập tên hồ sơ."
|
|
319
|
+
|
|
320
|
+
# Ví dụ 2.3: Component chọn có điều kiện động (Dropdown + States)
|
|
321
|
+
- id: fld_service_level
|
|
322
|
+
name: "Service Level Select"
|
|
323
|
+
kind: select
|
|
324
|
+
primitive: "#ui: Select"
|
|
325
|
+
label: "Cấp độ dịch vụ"
|
|
326
|
+
meaning: "Xác định gói dịch vụ để áp dụng chính sách giá, cam kết SLA và kích hoạt tự động gửi tin Zalo nếu là gói VIP"
|
|
327
|
+
purpose: "Chọn gói dịch vụ áp dụng cho hồ sơ"
|
|
328
|
+
visual:
|
|
329
|
+
className: "w-full border-input"
|
|
330
|
+
bind:
|
|
331
|
+
field: service_level
|
|
332
|
+
db:
|
|
333
|
+
schema: records
|
|
334
|
+
field: service_level
|
|
335
|
+
enumMapping:
|
|
336
|
+
"STANDARD": "Tiêu chuẩn"
|
|
337
|
+
"PREMIUM": "Cao cấp VIP"
|
|
338
|
+
validation:
|
|
339
|
+
prototype: "enum"
|
|
340
|
+
required: true
|
|
341
|
+
messages:
|
|
342
|
+
required: "Vui lòng chọn cấp độ dịch vụ."
|
|
343
|
+
|
|
344
|
+
# Ví dụ 2.4: Component hiển thị & validate có điều kiện chéo (Cross-field Dependency)
|
|
345
|
+
- id: fld_vip_request
|
|
346
|
+
name: "VIP Special Request"
|
|
347
|
+
kind: textarea
|
|
348
|
+
primitive: "#ui: Textarea"
|
|
349
|
+
label: "Yêu cầu đặc biệt cho gói VIP"
|
|
350
|
+
meaning: "Chi tiết yêu cầu cá nhân hóa bổ sung cho khách hàng phân khúc cao cấp"
|
|
351
|
+
purpose: "Nhập ghi chú yêu cầu riêng cho gói dịch vụ VIP"
|
|
352
|
+
visual:
|
|
353
|
+
className: "col-span-full border-muted bg-muted/20"
|
|
354
|
+
copy:
|
|
355
|
+
placeholder: "Nhập yêu cầu chi tiết..."
|
|
356
|
+
bind:
|
|
357
|
+
field: vip_request
|
|
358
|
+
states:
|
|
359
|
+
visibleWhen: "service_level == 'PREMIUM'"
|
|
360
|
+
validation:
|
|
361
|
+
conditionalRules:
|
|
362
|
+
- when: "service_level == 'PREMIUM'"
|
|
363
|
+
apply:
|
|
364
|
+
required: true
|
|
365
|
+
message: "Khi chọn gói Cao cấp VIP, vui lòng nêu rõ yêu cầu đặc biệt của khách hàng."
|
|
366
|
+
rules:
|
|
367
|
+
- type: "length"
|
|
368
|
+
max: 500
|
|
369
|
+
message: "Yêu cầu đặc biệt không được vượt quá 500 ký tự."
|
|
370
|
+
messages:
|
|
371
|
+
required: "Vui lòng nhập yêu cầu đặc biệt khi đăng ký gói VIP."
|
|
372
|
+
maxLength: "Yêu cầu đặc biệt không vượt quá 500 ký tự."
|
|
373
|
+
|
|
374
|
+
# LOẠI 3: KHỐI BẢNG DỮ LIỆU (#ui: Table, #ui: DropdownMenu, #ui: Pagination)
|
|
375
|
+
- id: sec_data_table
|
|
376
|
+
name: "Khối Bảng Dữ Liệu & Bộ Lọc"
|
|
377
|
+
kind: table
|
|
378
|
+
primitive: "#ui: Table"
|
|
379
|
+
meaning: "Hiển thị danh sách kết quả sau bộ lọc hỗ trợ sắp xếp và thao tác tác vụ theo từng dòng"
|
|
380
|
+
purpose: "Duyệt danh sách bản ghi và chọn dòng cần xử lý"
|
|
381
|
+
visual:
|
|
382
|
+
className: "w-full border rounded-lg overflow-hidden shadow-xs"
|
|
383
|
+
colorToken: "#common:table-border"
|
|
384
|
+
dynamicProps:
|
|
385
|
+
selectionMode: "single"
|
|
386
|
+
enablePagination: true
|
|
387
|
+
|
|
388
|
+
# LOẠI 4: KHỐI MODAL HOẶC DRAWER SHEET (#ui: Dialog / #ui: Sheet)
|
|
389
|
+
- id: sec_edit_modal
|
|
390
|
+
name: "Khối Modal Chỉnh Sửa Nhanh"
|
|
391
|
+
kind: modal_dialog
|
|
392
|
+
primitive: "#ui: Dialog"
|
|
393
|
+
meaning: "Cung cấp cửa sổ pop-up thao tác nhanh không cần rời khỏi màn hình chính"
|
|
394
|
+
purpose: "Hiển thị form cập nhật trạng thái hoặc duyệt hồ sơ"
|
|
395
|
+
visual:
|
|
396
|
+
width: "540px"
|
|
397
|
+
className: "sm:max-w-lg p-6 bg-popover rounded-xl shadow-lg border"
|
|
398
|
+
states:
|
|
399
|
+
visibleWhen: "isModalOpen == true"
|
|
400
|
+
|
|
401
|
+
# LOẠI 5: KHỐI GIAO DIỆN TÙY BIẾN MỚI NGOÀI BASE KIT (CUSTOM NOVEL WIDGET)
|
|
402
|
+
# BẮT BUỘC ĐẶC TẢ CHI TIẾT KÍCH THƯỚC, BẢNG MÀU, VÀ HIỆU ỨNG TƯƠNG TÁC
|
|
403
|
+
- id: sec_workflow_timeline
|
|
404
|
+
name: "Khối Tiến Trình Xử Lý Hồ Sơ (Custom Timeline)"
|
|
405
|
+
kind: custom
|
|
406
|
+
customWidgetType: "interactive-timeline"
|
|
407
|
+
meaning: "Hiển thị trục thời gian trực quan ghi nhận các mốc xét duyệt của hồ sơ qua từng bộ phận"
|
|
408
|
+
purpose: "Theo dõi tiến độ xử lý và xem chi tiết phản hồi từng bước duyệt"
|
|
409
|
+
|
|
410
|
+
# Đặc tả kích thước & hình học (Geometry & Responsive Dimensions)
|
|
411
|
+
dimensions:
|
|
412
|
+
width: "100%"
|
|
413
|
+
minHeight: "180px"
|
|
414
|
+
maxHeight: "320px"
|
|
415
|
+
responsiveLayout:
|
|
416
|
+
desktop: "horizontal-stepper"
|
|
417
|
+
mobile: "vertical-accordion"
|
|
418
|
+
breakpoint: "768px"
|
|
419
|
+
|
|
420
|
+
# Bảng màu sắc & Bề mặt (Palette & Semantic Color Tokens)
|
|
421
|
+
palette:
|
|
422
|
+
backgroundToken: "#common:surface-muted"
|
|
423
|
+
borderToken: "#common:border-subtle"
|
|
424
|
+
accentToken: "#common:primary"
|
|
425
|
+
completedNodeColor: "#common:success-green"
|
|
426
|
+
pendingNodeColor: "#common:muted-gray"
|
|
427
|
+
activeNodeColor: "#common:warning-amber"
|
|
428
|
+
hoverStateColor: "rgba(var(--primary-rgb), 0.08)"
|
|
429
|
+
|
|
430
|
+
# Typography & Phông chữ
|
|
431
|
+
typography:
|
|
432
|
+
stepTitle: "font-semibold text-sm tracking-tight text-foreground"
|
|
433
|
+
stepDescription: "text-xs text-muted-foreground line-clamp-2"
|
|
434
|
+
timestamp: "font-mono text-[11px] text-muted-foreground/80"
|
|
435
|
+
|
|
436
|
+
# Trạng thái & Vi tương tác (Micro-Interactions)
|
|
437
|
+
interactions:
|
|
438
|
+
loadingSkeleton: "pulse-node-bar"
|
|
439
|
+
emptyStateText: "Chưa có tiến trình nào được ghi nhận cho hồ sơ này"
|
|
440
|
+
stepClickable: true
|
|
441
|
+
activeAnimation: "subtle-pulse"
|
|
442
|
+
|
|
443
|
+
zones: []
|
|
444
|
+
behavior:
|
|
445
|
+
create: { enabled: true, surface: page }
|
|
446
|
+
update: { enabled: true, surface: page }
|
|
447
|
+
delete: { enabled: true, mode: confirm_dialog }
|
|
448
|
+
|
|
449
|
+
# MA TRẬN TRẠNG THÁI GIAO DIỆN & PHÂN QUYỀN (UI STATE & PERMISSION MATRIX)
|
|
450
|
+
stateMatrix:
|
|
451
|
+
recordStatuses: ["DRAFT", "PENDING_APPROVAL", "APPROVED", "REJECTED"]
|
|
452
|
+
behaviors:
|
|
453
|
+
- status: "DRAFT"
|
|
454
|
+
fieldsState: "editable" # Tất cả input được phép nhập
|
|
455
|
+
visibleButtons: ["btn_save_draft", "btn_submit_record", "btn_cancel"]
|
|
456
|
+
- status: "PENDING_APPROVAL"
|
|
457
|
+
fieldsState: "readonly" # Khóa toàn bộ input form
|
|
458
|
+
visibleButtons: ["btn_cancel_request"]
|
|
459
|
+
rbacOverrides:
|
|
460
|
+
manager:
|
|
461
|
+
visibleButtons: ["btn_approve", "btn_reject"]
|
|
462
|
+
- status: "APPROVED"
|
|
463
|
+
fieldsState: "readonly"
|
|
464
|
+
visibleButtons: ["btn_print", "btn_export"] # Nút Lưu/Xóa biến mất hoàn toàn
|
|
465
|
+
- status: "REJECTED"
|
|
466
|
+
fieldsState: "editable"
|
|
467
|
+
visibleButtons: ["btn_resubmit", "btn_delete"]
|
|
468
|
+
|
|
469
|
+
# ĐẶC TẢ CHI TIẾT HÀNH ĐỘNG (ACTION FLOW SPECIFICATION — 6 KHỐI KỸ THUẬT)
|
|
470
|
+
actions:
|
|
471
|
+
- id: btn_save_record
|
|
472
|
+
label: "Lưu & Xác Nhận"
|
|
473
|
+
kind: button
|
|
474
|
+
variant: primary
|
|
475
|
+
position: form_footer
|
|
476
|
+
meaning: "Chính thức lưu trữ dữ liệu vào hệ thống, chuyển đổi trạng thái đơn sang 'Đã tạo' và kích hoạt Job gửi tin tự động"
|
|
477
|
+
purpose: "Thẩm định toàn bộ form và gửi dữ liệu lên máy chủ"
|
|
478
|
+
trigger: click
|
|
479
|
+
|
|
480
|
+
# 1. ĐIỀU KIỆN TIÊN QUYẾT (PRE-CONDITIONS)
|
|
481
|
+
preconditions:
|
|
482
|
+
uiState: "form.isValid == true"
|
|
483
|
+
recordState: "record.status in ['DRAFT', 'REJECTED']"
|
|
484
|
+
requiredPermissions: ["records.create", "records.edit"]
|
|
485
|
+
disabledReason: "Vui lòng điền đầy đủ các thông tin bắt buộc và sửa các trường bị báo lỗi trước khi lưu"
|
|
486
|
+
|
|
487
|
+
# 2. KIỂM SOÁT TƯƠNG TÁC (INTERACTION CONTROL)
|
|
488
|
+
interactionControl:
|
|
489
|
+
debounceMs: 500
|
|
490
|
+
preventDoubleSubmit: true # Khóa nút ngay khi click
|
|
491
|
+
loadingIndicator: "Đang lưu thông tin hồ sơ..."
|
|
492
|
+
confirmDialog:
|
|
493
|
+
required: false # Bật true nếu là hành động xóa/duyệt
|
|
494
|
+
|
|
495
|
+
# 3. BIẾN ĐỔI DỮ LIỆU ĐẦU VÀO (PAYLOAD TRANSFORMATION)
|
|
496
|
+
payloadTransformation:
|
|
497
|
+
trimStrings: true
|
|
498
|
+
sanitizeHtml: true
|
|
499
|
+
typeCasting:
|
|
500
|
+
record_code: "uppercase"
|
|
501
|
+
total_fee: "integer"
|
|
502
|
+
|
|
503
|
+
# 4. HỢP ĐỒNG THỰC THI (EXECUTION CONTRACT)
|
|
504
|
+
executionContract:
|
|
505
|
+
apiRef: "records.create"
|
|
506
|
+
method: POST
|
|
507
|
+
idempotencyKey: "Header: X-Idempotency-Key"
|
|
508
|
+
timeoutMs: 8000
|
|
509
|
+
concurrencyHandling:
|
|
510
|
+
strategy: "optimistic_locking"
|
|
511
|
+
onConflictStatus: 409
|
|
512
|
+
conflictResolution: "Thông báo bản ghi đã bị thay đổi bởi người khác; giữ nguyên dữ liệu form và load lại bản mới nhất"
|
|
513
|
+
|
|
514
|
+
# 5. MA TRẬN PHẢN HỒI KẾT QUẢ & NGOẠI LỆ (OUTCOMES & EDGE CASES MATRIX)
|
|
515
|
+
outcomes:
|
|
516
|
+
onSuccess:
|
|
517
|
+
toast:
|
|
518
|
+
type: success
|
|
519
|
+
message: "Lưu hồ sơ thành công! Mã: {record_code}"
|
|
520
|
+
navigation:
|
|
521
|
+
target: "W-ADM-DETAIL-01"
|
|
522
|
+
params:
|
|
523
|
+
id: "{response.data.id}"
|
|
524
|
+
backgroundTrigger:
|
|
525
|
+
event: "RecordCreated"
|
|
526
|
+
note: "Hệ thống ngầm sẽ kích hoạt Job xử lý thông báo nếu là gói PREMIUM"
|
|
527
|
+
onBusinessErrors:
|
|
528
|
+
- statusCode: 422
|
|
529
|
+
type: "ValidationFailure"
|
|
530
|
+
action: "Map lỗi chi tiết từ máy chủ vào chân từng trường tương ứng"
|
|
531
|
+
- statusCode: 409
|
|
532
|
+
type: "DuplicateRecord"
|
|
533
|
+
action: "Hiển thị cảnh báo: 'Hồ sơ với mã này đã tồn tại trong hệ thống!'"
|
|
534
|
+
onSecurityErrors:
|
|
535
|
+
- statusCode: 403
|
|
536
|
+
type: "Forbidden"
|
|
537
|
+
action: "Hiển thị Toast: 'Bạn không có quyền thực hiện thao tác này.'"
|
|
538
|
+
- statusCode: 401
|
|
539
|
+
type: "SessionExpired"
|
|
540
|
+
action: "Bảo lưu tạm dữ liệu form vào localStorage và mở Modal đăng nhập lại"
|
|
541
|
+
onSystemErrors:
|
|
542
|
+
- statusCode: 504
|
|
543
|
+
type: "GatewayTimeout"
|
|
544
|
+
action: "KHÔNG cho phép bấm submit lại ngay; hiển thị nút 'Kiểm tra trạng thái giao dịch' để tránh nhân đôi bản ghi"
|
|
545
|
+
- statusCode: "NETWORK_OFFLINE"
|
|
546
|
+
type: "ClientOffline"
|
|
547
|
+
action: "Hiển thị thông báo mất mạng; giữ nguyên dữ liệu đã nhập trên form"
|
|
548
|
+
|
|
549
|
+
- id: btn_cancel
|
|
550
|
+
label: "Hủy Bỏ"
|
|
551
|
+
kind: button
|
|
552
|
+
variant: outline
|
|
553
|
+
position: form_footer
|
|
554
|
+
meaning: "Từ bỏ các thông tin vừa điền và trở lại trang danh sách"
|
|
555
|
+
purpose: "Hủy thao tác tạo mới và quay lại trang trước"
|
|
556
|
+
trigger: click
|
|
557
|
+
preconditions:
|
|
558
|
+
uiState: "always_enabled"
|
|
559
|
+
interactionControl:
|
|
560
|
+
confirmDialog:
|
|
561
|
+
required: true
|
|
562
|
+
title: "Xác nhận hủy bỏ?"
|
|
563
|
+
message: "Các thông tin bạn vừa nhập sẽ không được lưu. Bạn có chắc chắn muốn quay lại trang danh sách?"
|
|
564
|
+
navigation:
|
|
565
|
+
target: "W-ADM-LIST-01"
|
|
566
|
+
|
|
567
|
+
i18n: {}
|
|
568
|
+
|
|
569
|
+
review:
|
|
570
|
+
summary: ""
|
|
571
|
+
layoutNotes: []
|
|
572
|
+
|
|
573
|
+
_meta:
|
|
574
|
+
generatedBy: null
|
|
575
|
+
sourceRevision: null
|