@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
package/README.md
ADDED
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
<!-- flowgrid-catalog -->
|
|
2
|
+
**[Danh mục tài liệu](CATALOG.md)**
|
|
3
|
+
<!-- /flowgrid-catalog -->
|
|
4
|
+
|
|
5
|
+
# FlowGrid
|
|
6
|
+
|
|
7
|
+
**FlowGrid** là nền tảng **CLI + harness** dành cho team phát triển phần mềm khi làm việc với **agent AI** (Cursor, Claude Code, Gemini/Antigravity, Codex, OpenCode, Hermes, Kiro, Kilo Code, … — chọn ở bước `flowgrid init`).
|
|
8
|
+
|
|
9
|
+
- **Workflow cho team** — các phase phát triển theo quy chuẩn: **design**; phát triển **code + test**; **wire**.
|
|
10
|
+
- **Quản lý artifact** — quy trình và SSOT trên disk cho dự án phần mềm:
|
|
11
|
+
- **Spec / requirement** (docs-hub — SSOT):
|
|
12
|
+
- user story, bundle spec;
|
|
13
|
+
- thiết kế UI, action;
|
|
14
|
+
- QA: open question;
|
|
15
|
+
- artifact khác: technical debt, technical derived, call external service, …
|
|
16
|
+
- **Document testcase** (tests-docs):
|
|
17
|
+
- testcase, test suite;
|
|
18
|
+
- scenario test.
|
|
19
|
+
- **Toolkit T-shaped** — hỗ trợ member mở rộng lane khi làm việc với AI:
|
|
20
|
+
- **Dev** — skill dev chuyên sâu, kèm chút kỹ năng BA: nhờ AI phân tích / grill → spec đạt khoảng **70–80%** so với BA thông thường.
|
|
21
|
+
- **BA** — phân tích, tạo requirement spec: nhờ AI code **prototype** theo yêu cầu, **không** cần nhờ dev.
|
|
22
|
+
- **QA / Test** — skill manual test: nhờ AI sinh automation **E2E**; dev review bổ sung lỗ hổng còn thiếu theo document testcase.
|
|
23
|
+
|
|
24
|
+
FlowGrid **không** thay IDE hay model. Nó gắn **quy trình**, **định dạng artifact** và **lệnh kiểm định** vào repo để agent và member đi **cùng một lane**, **từng bước một**.
|
|
25
|
+
|
|
26
|
+
## Tổng quan
|
|
27
|
+
|
|
28
|
+
- **CLI (`flowgrid`)** — cài tool; `init` theo loại dự án; chạy audit, gate, codegen; `doctor`; sync harness.
|
|
29
|
+
- **Harness (skills + MCP)** — sau `init`, agent gọi slash command (vd. `/spec`, `/testcase`) theo `SKILL.md` đã sync; MCP server `flowgrid` nối engine docs / test / codegen với workspace.
|
|
30
|
+
- **Script audit** — kiểm tra **lượng** trên artifact (schema, field bắt buộc, trace testcase ↔ bundle) bằng Node thuần; output JSON `gaps[]`; bổ trợ grill **chất** của member và agent.
|
|
31
|
+
- **Workflow theo phase phát triển** — bám vòng đời thực tế **một tính năng**:
|
|
32
|
+
- **Phân tích** — yêu cầu, phạm vi, kiến trúc (overview, module, luồng nghiệp vụ).
|
|
33
|
+
- **Đặc tả** — bundle, user story, API contract trên **docs-hub**.
|
|
34
|
+
- **Prototype UI** — feedback sớm, thống nhất hành vi trước code production.
|
|
35
|
+
- **Backend** — spec API; sinh / xử lý service theo adapter stack (NestJS, FastAPI, …).
|
|
36
|
+
- **Tests-docs** — scenario, ma trận `TC-*.yaml`; gate trước khi coi testcase **đóng**.
|
|
37
|
+
- **E2E automation** — sinh Playwright từ testcase; regression trên **e2e-root** (repo FE); giảm **IT thủ công** lặp trước release.
|
|
38
|
+
- **Wire** — ghép FE với API thật; audit đối chiếu tests-docs ↔ spec E2E.
|
|
39
|
+
- **Skill ↔ vai trò member (T-shaped)** — mỗi phase gắn skill và vai trò gợi ý; AI **hỗ trợ đúng việc, đúng người** — **không** gom cả repo một lần:
|
|
40
|
+
- **Lead / BA** — phạm vi, kiến trúc, grill nghiệp vụ (`/overview`, `/grill-bqa`, …).
|
|
41
|
+
- **Dev FE** — prototype, wire, unit / E2E lane code.
|
|
42
|
+
- **Dev BE** — contract, implementation API, align FE–BE (`audit fe-be`).
|
|
43
|
+
- **QA** — testcase trên **tests-docs**, grill testcase, theo dõi coverage E2E.
|
|
44
|
+
- **Member** — vẫn **review, grill, chốt**; agent chuẩn hóa YAML/Markdown, gợi ý patch, chạy codegen — **không** tự quyết thay product owner.
|
|
45
|
+
- **Ba loại artifact trên disk** — có thể nhiều repo, nối bằng env:
|
|
46
|
+
- **docs-hub** — `*.bundle.yaml`, IR, kiến trúc & function (`FLOWGRID_DOCS_ROOT`).
|
|
47
|
+
- **tests-docs** — `cases/**`, `TC-*.yaml`, scenario (`FLOWGRID_TESTS_DOC`, `--tests-docs`).
|
|
48
|
+
- **Code** — FE / BE / fullstack; test tự động trên **e2e-root** (`--e2e-root`), tách khỏi hub testcase.
|
|
49
|
+
|
|
50
|
+
## Phase · vai trò · skill
|
|
51
|
+
|
|
52
|
+
| Phase (tóm tắt) | Vai trò thường gặp | Hỗ trợ FlowGrid (ví dụ) |
|
|
53
|
+
| --- | --- | --- |
|
|
54
|
+
| Phân tích & phạm vi | Lead / BA | `/overview`, `/architecture`, `/module` |
|
|
55
|
+
| Đặc tả chức năng | BA / Dev | `/spec`, `/grill-bqa`, `flowgrid audit spec` |
|
|
56
|
+
| Prototype UI | Dev FE | `/prototype`, portal/codegen adapters |
|
|
57
|
+
| Backend & contract | Dev BE | `/api-spec`, `/api`, `audit api`, `audit fe-be` |
|
|
58
|
+
| Testcase (tests-docs) | QA / Dev | `/testcase`, `/scenario`, `cases:gate` |
|
|
59
|
+
| E2E automation | QA / Dev | `testcase:gen`, Playwright trên **e2e-root** |
|
|
60
|
+
| Tích hợp & kiểm tra trước release | Dev FE + QA | `/wire`, `flowgrid audit e2e` |
|
|
61
|
+
|
|
62
|
+
`flowgrid audit *` và `cases:gate` dùng ở các mốc trên để phát hiện lệch artifact trước khi sang phase kế tiếp.
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
## Cài đặt
|
|
67
|
+
|
|
68
|
+
**Yêu cầu:** Node.js **≥ 22**.
|
|
69
|
+
|
|
70
|
+
### 1. Cài FlowGrid CLI
|
|
71
|
+
|
|
72
|
+
**Khuyến nghị — pnpm global từ npm** (cùng một lệnh trên **Linux**, **macOS**, **WSL** và **Windows PowerShell** / Terminal):
|
|
73
|
+
|
|
74
|
+
```text
|
|
75
|
+
pnpm add -g @shanyucoder/flowgrid
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
(Gõ trong bash, zsh, **PowerShell**, CMD hoặc Windows Terminal — cùng một lệnh. Tarball npm đã có `dist/` — **không** cần `--allow-build`.)
|
|
79
|
+
|
|
80
|
+
**Chưa có bản trên npm** (hoặc cần bản Git cụ thể):
|
|
81
|
+
|
|
82
|
+
```text
|
|
83
|
+
pnpm add -g github:ShanYuCoder/flowgrid --allow-build=@shanyucoder/flowgrid
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
pnpm 10+ cần `--allow-build` khi cài **từ GitHub** (build TypeScript lúc cài).
|
|
87
|
+
|
|
88
|
+
| Môi trường | PATH sau `pnpm add -g` |
|
|
89
|
+
| --- | --- |
|
|
90
|
+
| **Linux / macOS** | Chạy `pnpm setup` nếu shell báo thiếu bin; thường là `~/.local/share/pnpm`. |
|
|
91
|
+
| **WSL** | Giống Linux — dùng Node/pnpm **trong WSL**, không trộn với Node cài trên Windows host trừ khi cố ý. |
|
|
92
|
+
| **Windows (PowerShell, CMD, Windows Terminal)** | Chạy **`pnpm setup`** một lần (ghi PATH user), **đóng và mở lại** terminal; kiểm tra: `where.exe flowgrid` hoặc `flowgrid --version`. |
|
|
93
|
+
|
|
94
|
+
**WSL / Git Bash** có thể dùng lệnh pnpm ở trên; **không** bắt buộc `install.sh` nếu đã cài global qua pnpm.
|
|
95
|
+
|
|
96
|
+
**npx (không cài global):**
|
|
97
|
+
|
|
98
|
+
```text
|
|
99
|
+
npx -p @shanyucoder/flowgrid flowgrid init
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
Thay `init` bằng `doctor`, `harness sync`, … GitHub: `npx -p github:ShanYuCoder/flowgrid flowgrid init`.
|
|
103
|
+
|
|
104
|
+
**npm (global):**
|
|
105
|
+
|
|
106
|
+
```text
|
|
107
|
+
npm install -g @shanyucoder/flowgrid
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
Cài từ Git: `npm install -g github:ShanYuCoder/flowgrid` (npm 11+: có thể cần `npm install-scripts approve @shanyucoder/flowgrid`).
|
|
111
|
+
|
|
112
|
+
**Dev dependency trong repo dự án:**
|
|
113
|
+
|
|
114
|
+
```text
|
|
115
|
+
pnpm add -D @shanyucoder/flowgrid
|
|
116
|
+
pnpm exec flowgrid doctor
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
Từ Git: `pnpm add -D github:ShanYuCoder/flowgrid --allow-build=@shanyucoder/flowgrid`.
|
|
120
|
+
|
|
121
|
+
Đội toolkit publish npm: [PUBLISH-NPM.md](PUBLISH-NPM.md) (root, không build VitePress).
|
|
122
|
+
|
|
123
|
+
**Phát triển toolkit (clone repo):**
|
|
124
|
+
|
|
125
|
+
Linux / macOS / WSL:
|
|
126
|
+
|
|
127
|
+
```bash
|
|
128
|
+
git clone https://github.com/ShanYuCoder/flowgrid.git && cd flowgrid
|
|
129
|
+
pnpm install && sh install-local.sh
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
Windows (PowerShell):
|
|
133
|
+
|
|
134
|
+
```powershell
|
|
135
|
+
git clone https://github.com/ShanYuCoder/flowgrid.git; cd flowgrid
|
|
136
|
+
pnpm install; pnpm link --global
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
**Tùy chọn — script bash** (Linux / macOS / WSL / Git Bash — clone + `~/.local/bin`, **không** thay pnpm global):
|
|
140
|
+
|
|
141
|
+
```bash
|
|
142
|
+
curl -fsSL https://raw.githubusercontent.com/ShanYuCoder/flowgrid/main/install.sh | bash
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
**Cập nhật** (npm hoặc GitHub — không cần gỡ cài lại):
|
|
146
|
+
|
|
147
|
+
```text
|
|
148
|
+
flowgrid update
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
Tự nhận cách cài (pnpm global, npm global, `install.sh`, hoặc clone dev) và chạy lệnh phù hợp. Ghim ref: `FLOWGRID_REF=v0.1.0 flowgrid update`. Xem trước: `flowgrid update --check`.
|
|
152
|
+
|
|
153
|
+
**Gỡ:** `pnpm remove -g @shanyucoder/flowgrid` (mọi OS) · hoặc `npm uninstall -g @shanyucoder/flowgrid` · script bash: `bash install.sh --uninstall`.
|
|
154
|
+
|
|
155
|
+
### 2. Khởi tạo repo (`flowgrid init`)
|
|
156
|
+
|
|
157
|
+
```bash
|
|
158
|
+
cd your-project
|
|
159
|
+
flowgrid init
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
| Bước | Câu hỏi init | Ý nghĩa / gợi ý nhập |
|
|
163
|
+
| --- | --- | --- |
|
|
164
|
+
| **1** | **Select Agents/Skills to integrate** | Agent IDE/CLI (Cursor, Claude, …). Copy **skills** + **MCP** (`flowgrid`) vào thư mục agent. Có thể bỏ trống, sync sau: `flowgrid harness sync`. |
|
|
165
|
+
| **2** | **Select project type** | **Document** — docs-hub. **Frontend** / **Backend** / **Fullstack** — code (+ pointer docs/tests). **Test** — tests-docs. |
|
|
166
|
+
| **3** | **Base Architecture Profile** | **Standard** (Nuxt4, Next.js, NestJS, FastAPI, …) hoặc **Custom** (+ **Golden Sample** tùy chọn). |
|
|
167
|
+
| **4** | **Frontend / Backend technology** | Adapter codegen (`nuxt4`, `nextjs`, `nestjs`, `fastapi`, …). Fullstack: FE + BE (mặc định Nest). |
|
|
168
|
+
| **5** | **Docs-hub location** (FE / BE / Fullstack) | **This repository** — scaffold `docs/` (integration/hook surfaces trên repo BE). **Other** — path pointer → `FLOWGRID_DOCS_ROOT`. **Document**: cwd = hub. |
|
|
169
|
+
| **6** | **Tests-docs location** (FE / BE / Fullstack) | **This repository** — scaffold `tests/` (+ `/test-api`, `testcase:gen:api` cho hook). **Other** — path pointer → `FLOWGRID_TESTS_DOC`. **Test**: cwd = hub. |
|
|
170
|
+
| **7** | **Languages** (chỉ **Document**) | **Đa ngôn ngữ global** dự án (i18n toàn hệ thống, không phải bản dịch từng file docs): vd. `vi,en,ja` + locale mặc định; một ngôn ngữ thì nhập một. |
|
|
171
|
+
| **8** | **Installation Plan** + **Proceed?** | Xem lại và xác nhận. |
|
|
172
|
+
| **9** | *(sau confirm)* | `.flowgrid/`, scaffold, harness, MCP, `artifactgraph/`. |
|
|
173
|
+
| **10** | **Optional toolkits** | Tuỳ chọn **Codegraph**. |
|
|
174
|
+
|
|
175
|
+
Sau init: **`.flowgrid/config.json`**; dùng slash skill (vd. `/spec`) trong agent đã chọn.
|
|
176
|
+
|
|
177
|
+
```mermaid
|
|
178
|
+
flowchart LR
|
|
179
|
+
A[Chọn agents] --> B[Project type]
|
|
180
|
+
B --> C[Base profile]
|
|
181
|
+
C --> D[Stack FE/BE]
|
|
182
|
+
D --> E[Docs root]
|
|
183
|
+
E --> F[Tests root]
|
|
184
|
+
F --> G[Xác nhận plan]
|
|
185
|
+
G --> H[.flowgrid + MCP + skills]
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
Wizard tương tác: chạy `flowgrid init` trên repo dự án. Bảng bước, `flowgrid doctor` / `harness sync`: [docs/references/cli-and-commands.md](docs/references/cli-and-commands.md) (Audit & Harness · MCP).
|
|
189
|
+
|
|
190
|
+
### 3. Kiểm tra
|
|
191
|
+
|
|
192
|
+
```bash
|
|
193
|
+
flowgrid doctor
|
|
194
|
+
```
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
namespace IntegrationGen;
|
|
2
|
+
|
|
3
|
+
internal sealed class IntegrationContext
|
|
4
|
+
{
|
|
5
|
+
public required string Module { get; init; }
|
|
6
|
+
public required string ModulePascal { get; init; }
|
|
7
|
+
public required string EntityPascal { get; init; }
|
|
8
|
+
public required string EntitySnake { get; init; }
|
|
9
|
+
public required string Profile { get; init; }
|
|
10
|
+
public required string ApiPath { get; init; }
|
|
11
|
+
public required string ApiMethod { get; init; }
|
|
12
|
+
public required string Action { get; init; }
|
|
13
|
+
public required string ActionPascal { get; init; }
|
|
14
|
+
public required string FeatureId { get; init; }
|
|
15
|
+
|
|
16
|
+
public static IntegrationContext FromSpec(Dictionary<string, object?> spec)
|
|
17
|
+
{
|
|
18
|
+
var feature = YamlMap.GetDict(spec, "feature");
|
|
19
|
+
var codegen = YamlMap.GetDict(spec, "codegen");
|
|
20
|
+
var module = YamlMap.GetString(codegen, "module", "mes");
|
|
21
|
+
var entity = YamlMap.GetString(codegen, "entity", "Entity");
|
|
22
|
+
var profile = YamlMap.GetString(codegen, "profile", "adapter");
|
|
23
|
+
var endpoints = YamlMap.AsList(YamlMap.GetDict(spec, "api").GetValueOrDefault("endpoints")) ?? [];
|
|
24
|
+
var endpoint = endpoints.Count > 0 && YamlMap.AsDict(endpoints[0]) is { } value
|
|
25
|
+
? value
|
|
26
|
+
: new Dictionary<string, object?>();
|
|
27
|
+
var action = YamlMap.GetString(endpoint, "action", "get");
|
|
28
|
+
return new IntegrationContext
|
|
29
|
+
{
|
|
30
|
+
Module = module,
|
|
31
|
+
ModulePascal = NameUtil.ToPascal(module),
|
|
32
|
+
EntityPascal = NameUtil.ToPascal(entity),
|
|
33
|
+
EntitySnake = NameUtil.ToSnake(entity),
|
|
34
|
+
Profile = profile,
|
|
35
|
+
ApiPath = YamlMap.GetString(endpoint, "path", "/plants/{plant_id}/downtime"),
|
|
36
|
+
ApiMethod = YamlMap.GetString(endpoint, "method", "GET"),
|
|
37
|
+
Action = action,
|
|
38
|
+
ActionPascal = action == "getDowntime" ? "GetDowntime" : NameUtil.ToPascal(action),
|
|
39
|
+
FeatureId = YamlMap.GetString(feature, "id", NameUtil.ToSnake(entity)),
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
public object ToTemplateModel() => new
|
|
44
|
+
{
|
|
45
|
+
module = Module,
|
|
46
|
+
module_pascal = ModulePascal,
|
|
47
|
+
entity_pascal = EntityPascal,
|
|
48
|
+
entity_snake = EntitySnake,
|
|
49
|
+
profile = Profile,
|
|
50
|
+
api_path = ApiPath,
|
|
51
|
+
api_method = ApiMethod,
|
|
52
|
+
action = Action,
|
|
53
|
+
action_pascal = ActionPascal,
|
|
54
|
+
feature_id = FeatureId,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
<Project Sdk="Microsoft.NET.Sdk">
|
|
2
|
+
<PropertyGroup>
|
|
3
|
+
<OutputType>Exe</OutputType>
|
|
4
|
+
<TargetFramework>net8.0</TargetFramework>
|
|
5
|
+
<ImplicitUsings>enable</ImplicitUsings>
|
|
6
|
+
<Nullable>enable</Nullable>
|
|
7
|
+
<RootNamespace>IntegrationGen</RootNamespace>
|
|
8
|
+
</PropertyGroup>
|
|
9
|
+
<ItemGroup>
|
|
10
|
+
<PackageReference Include="Scriban" Version="7.2.5" />
|
|
11
|
+
<PackageReference Include="YamlDotNet" Version="16.3.0" />
|
|
12
|
+
</ItemGroup>
|
|
13
|
+
<ItemGroup>
|
|
14
|
+
<None Include="Templates\**\*" CopyToOutputDirectory="PreserveNewest" />
|
|
15
|
+
</ItemGroup>
|
|
16
|
+
</Project>
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
using System.Text.RegularExpressions;
|
|
2
|
+
|
|
3
|
+
namespace IntegrationGen;
|
|
4
|
+
|
|
5
|
+
internal static class NameUtil
|
|
6
|
+
{
|
|
7
|
+
public static string ToPascal(string value)
|
|
8
|
+
{
|
|
9
|
+
var parts = Regex.Split(value, @"[-_\s]+").Where(part => part.Length > 0);
|
|
10
|
+
return string.Concat(parts.Select(part => char.ToUpper(part[0]) + part[1..]));
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
public static string ToSnake(string value)
|
|
14
|
+
{
|
|
15
|
+
var snake = Regex.Replace(value, @"([a-z])([A-Z])", "$1_$2");
|
|
16
|
+
return Regex.Replace(snake, @"[\s\-]+", "_").ToLowerInvariant();
|
|
17
|
+
}
|
|
18
|
+
}
|
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
using System.Text.Json;
|
|
2
|
+
using IntegrationGen;
|
|
3
|
+
using Scriban;
|
|
4
|
+
using Scriban.Runtime;
|
|
5
|
+
|
|
6
|
+
static string ProjectRoot()
|
|
7
|
+
{
|
|
8
|
+
var configured = Environment.GetEnvironmentVariable("FLOWGRID_PROJECT_ROOT");
|
|
9
|
+
var root = Path.GetFullPath(string.IsNullOrWhiteSpace(configured) ? Directory.GetCurrentDirectory() : configured);
|
|
10
|
+
if (!Directory.Exists(root))
|
|
11
|
+
throw new DirectoryNotFoundException($"FLOWGRID_PROJECT_ROOT not found: {root}");
|
|
12
|
+
return root;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
static string UnderRoot(string root, string path, string label)
|
|
16
|
+
{
|
|
17
|
+
var full = Path.GetFullPath(path, root);
|
|
18
|
+
var relative = Path.GetRelativePath(root, full);
|
|
19
|
+
if (relative == ".." || relative.StartsWith($"..{Path.DirectorySeparatorChar}") || Path.IsPathRooted(relative))
|
|
20
|
+
throw new InvalidOperationException($"{label} must be inside FLOWGRID_PROJECT_ROOT: {full}");
|
|
21
|
+
return full;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
static (Dictionary<string, object?> spec, string specPath, string featureDir) ReadSpec(string root, string specArg)
|
|
25
|
+
{
|
|
26
|
+
var specPath = UnderRoot(root, specArg, "spec");
|
|
27
|
+
var spec = YamlMap.Load(specPath);
|
|
28
|
+
var parent = Path.GetFileName(Path.GetDirectoryName(specPath)!);
|
|
29
|
+
var featureDir = parent is "ir" or "integration"
|
|
30
|
+
? Path.GetDirectoryName(Path.GetDirectoryName(specPath))!
|
|
31
|
+
: Path.GetDirectoryName(specPath)!;
|
|
32
|
+
return (spec, specPath, featureDir);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
static string RenderTemplate(string name, object model)
|
|
36
|
+
{
|
|
37
|
+
var templatePath = Path.Combine(AppContext.BaseDirectory, "Templates", name);
|
|
38
|
+
var template = Template.Parse(File.ReadAllText(templatePath), templatePath);
|
|
39
|
+
var script = new ScriptObject();
|
|
40
|
+
script.Import(model, renamer: member => member.Name);
|
|
41
|
+
var context = new TemplateContext();
|
|
42
|
+
context.PushGlobal(script);
|
|
43
|
+
return template.Render(context).TrimEnd() + Environment.NewLine;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
static List<(string RelativePath, string Template)> BuildPlan(IntegrationContext context)
|
|
47
|
+
{
|
|
48
|
+
var module = context.ModulePascal;
|
|
49
|
+
var entity = context.EntityPascal;
|
|
50
|
+
return
|
|
51
|
+
[
|
|
52
|
+
($"src/Integration.Application/Generated/{module}/I{entity}Service.gen.cs", "application_service.cs.scriban"),
|
|
53
|
+
($"src/Integration.Infrastructure/Generated/{module}/Mock{entity}Repository.gen.cs", "infrastructure_mock.cs.scriban"),
|
|
54
|
+
($"src/Integration.Presenters/Generated/{module}/{entity}Presenter.gen.cs", "presenter.cs.scriban"),
|
|
55
|
+
($"tests/Integration.Api.Tests/Generated/{entity}ServiceTests.gen.cs", "service_test.cs.scriban"),
|
|
56
|
+
];
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
static void MergeI18nFlat(object? i18nObj, string localesDir, bool dryRun)
|
|
60
|
+
{
|
|
61
|
+
if (i18nObj is not Dictionary<string, object?> i18nDict) return;
|
|
62
|
+
|
|
63
|
+
var dataByLang = new Dictionary<string, Dictionary<string, string>>();
|
|
64
|
+
foreach (var kvp in i18nDict)
|
|
65
|
+
{
|
|
66
|
+
var key = kvp.Key;
|
|
67
|
+
if (kvp.Value is not Dictionary<string, object?> translations) continue;
|
|
68
|
+
|
|
69
|
+
foreach (var trans in translations)
|
|
70
|
+
{
|
|
71
|
+
var lang = trans.Key;
|
|
72
|
+
var val = trans.Value?.ToString();
|
|
73
|
+
if (val == null) continue;
|
|
74
|
+
|
|
75
|
+
if (!dataByLang.ContainsKey(lang)) dataByLang[lang] = new Dictionary<string, string>();
|
|
76
|
+
dataByLang[lang][key] = val;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
foreach (var langPair in dataByLang)
|
|
81
|
+
{
|
|
82
|
+
var lang = langPair.Key;
|
|
83
|
+
var newKeys = langPair.Value;
|
|
84
|
+
var localePath = Path.Combine(localesDir, $"{lang}.json");
|
|
85
|
+
var currentData = new Dictionary<string, string>();
|
|
86
|
+
if (File.Exists(localePath))
|
|
87
|
+
{
|
|
88
|
+
try
|
|
89
|
+
{
|
|
90
|
+
var existing = JsonSerializer.Deserialize<Dictionary<string, string>>(File.ReadAllText(localePath));
|
|
91
|
+
if (existing != null) currentData = existing;
|
|
92
|
+
}
|
|
93
|
+
catch { }
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
foreach (var kv in newKeys) currentData[kv.Key] = kv.Value;
|
|
97
|
+
|
|
98
|
+
if (!dryRun)
|
|
99
|
+
{
|
|
100
|
+
Directory.CreateDirectory(localesDir);
|
|
101
|
+
File.WriteAllText(localePath, JsonSerializer.Serialize(currentData, new JsonSerializerOptions { WriteIndented = true }) + "\n");
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
Console.WriteLine($" {(dryRun ? "[dry] " : "write")}: locales/{lang}.json (+{newKeys.Count} keys)");
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
static int Registry(string root)
|
|
109
|
+
{
|
|
110
|
+
Console.WriteLine(File.ReadAllText(Path.Combine(root, "registries", "dotnet-integration.codegen.registry.json")));
|
|
111
|
+
return 0;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
static int Run(string root, string command, string specArg, bool force)
|
|
115
|
+
{
|
|
116
|
+
var dryRun = command == "dry";
|
|
117
|
+
var (spec, specPath, featureDir) = ReadSpec(root, specArg);
|
|
118
|
+
var context = IntegrationContext.FromSpec(spec);
|
|
119
|
+
var model = context.ToTemplateModel();
|
|
120
|
+
var written = new List<string>();
|
|
121
|
+
Console.WriteLine($"integration-gen: entity={context.EntityPascal} module={context.ModulePascal}");
|
|
122
|
+
Console.WriteLine($" spec: {specPath}");
|
|
123
|
+
|
|
124
|
+
foreach (var (relative, template) in BuildPlan(context))
|
|
125
|
+
{
|
|
126
|
+
var destination = UnderRoot(root, relative, "output");
|
|
127
|
+
if (File.Exists(destination) && !force)
|
|
128
|
+
{
|
|
129
|
+
Console.WriteLine($" skip: {relative} (exists)");
|
|
130
|
+
continue;
|
|
131
|
+
}
|
|
132
|
+
var content = RenderTemplate(template, model);
|
|
133
|
+
if (dryRun) Console.WriteLine($" [dry]: {relative}");
|
|
134
|
+
else
|
|
135
|
+
{
|
|
136
|
+
Directory.CreateDirectory(Path.GetDirectoryName(destination)!);
|
|
137
|
+
File.WriteAllText(destination, content);
|
|
138
|
+
Console.WriteLine($" write: {relative}");
|
|
139
|
+
}
|
|
140
|
+
written.Add(relative);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
if (!dryRun)
|
|
144
|
+
{
|
|
145
|
+
var generatedDir = UnderRoot(root, Path.Combine(featureDir, "generated"), "generated metadata");
|
|
146
|
+
Directory.CreateDirectory(generatedDir);
|
|
147
|
+
var manifestPath = Path.Combine(generatedDir, "integration.manifest.json");
|
|
148
|
+
File.WriteAllText(manifestPath, JsonSerializer.Serialize(new
|
|
149
|
+
{
|
|
150
|
+
generatedAt = DateTime.UtcNow.ToString("o"),
|
|
151
|
+
spec = Path.GetRelativePath(root, specPath).Replace('\\', '/'),
|
|
152
|
+
profile = context.Profile,
|
|
153
|
+
files = written,
|
|
154
|
+
}, new JsonSerializerOptions { WriteIndented = true }));
|
|
155
|
+
var handoff = new ScriptObject();
|
|
156
|
+
handoff.Import(model, renamer: member => member.Name);
|
|
157
|
+
handoff["spec_path"] = specPath;
|
|
158
|
+
handoff["files"] = written;
|
|
159
|
+
var handoffContext = new TemplateContext();
|
|
160
|
+
handoffContext.PushGlobal(handoff);
|
|
161
|
+
var handoffTemplate = Template.Parse(File.ReadAllText(Path.Combine(AppContext.BaseDirectory, "Templates", "handoff.md.scriban")));
|
|
162
|
+
File.WriteAllText(Path.Combine(generatedDir, "INTEGRATION-HANDOFF.md"), handoffTemplate.Render(handoffContext));
|
|
163
|
+
Console.WriteLine($" manifest: {manifestPath}");
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
if (spec.TryGetValue("i18n", out var i18nData))
|
|
167
|
+
{
|
|
168
|
+
MergeI18nFlat(i18nData, Path.Combine(root, "locales"), dryRun);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
return 0;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
static List<string> ResolveSpecPaths(string root, string? specArg, string? idArg)
|
|
175
|
+
{
|
|
176
|
+
if (specArg is not null) return [specArg];
|
|
177
|
+
if (idArg is null) throw new InvalidOperationException("Either --spec or --id must be provided");
|
|
178
|
+
|
|
179
|
+
var dir = new DirectoryInfo(AppContext.BaseDirectory);
|
|
180
|
+
while (dir != null && dir.Name != "adapters")
|
|
181
|
+
{
|
|
182
|
+
dir = dir.Parent;
|
|
183
|
+
}
|
|
184
|
+
if (dir == null) throw new Exception("Could not locate adapters directory");
|
|
185
|
+
var scriptPath = Path.Combine(dir.FullName, "shared", "resolve-cli.mjs");
|
|
186
|
+
|
|
187
|
+
var process = new System.Diagnostics.Process
|
|
188
|
+
{
|
|
189
|
+
StartInfo = new System.Diagnostics.ProcessStartInfo
|
|
190
|
+
{
|
|
191
|
+
FileName = "node",
|
|
192
|
+
Arguments = $"\"{scriptPath}\" \"{root}\" \"{idArg}\" api-codegen",
|
|
193
|
+
RedirectStandardOutput = true,
|
|
194
|
+
RedirectStandardError = true,
|
|
195
|
+
UseShellExecute = false,
|
|
196
|
+
CreateNoWindow = true
|
|
197
|
+
}
|
|
198
|
+
};
|
|
199
|
+
process.Start();
|
|
200
|
+
var output = process.StandardOutput.ReadToEnd();
|
|
201
|
+
process.WaitForExit();
|
|
202
|
+
if (process.ExitCode != 0)
|
|
203
|
+
{
|
|
204
|
+
throw new Exception($"Failed to resolve ID {idArg}: {process.StandardError.ReadToEnd()}");
|
|
205
|
+
}
|
|
206
|
+
using var doc = JsonDocument.Parse(output);
|
|
207
|
+
var rootObj = doc.RootElement;
|
|
208
|
+
if (!rootObj.GetProperty("success").GetBoolean())
|
|
209
|
+
{
|
|
210
|
+
throw new Exception($"Failed to resolve ID {idArg}: {rootObj.GetProperty("error").GetString()}");
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
var paths = rootObj.GetProperty("paths").EnumerateArray().Select(x => x.GetString()!).ToList();
|
|
214
|
+
var notes = rootObj.GetProperty("notes").EnumerateArray().Select(x => x.GetString()!).ToList();
|
|
215
|
+
var kind = rootObj.GetProperty("kind").GetString();
|
|
216
|
+
|
|
217
|
+
foreach (var note in notes) Console.WriteLine($" note: {note}");
|
|
218
|
+
if (paths.Count == 0) throw new Exception($"--id {idArg}: no codegen specs");
|
|
219
|
+
Console.WriteLine($"integration-gen: --id {idArg} -> {paths.Count} spec(s) ({kind})");
|
|
220
|
+
return paths;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
if (args.Length == 0)
|
|
224
|
+
{
|
|
225
|
+
Console.Error.WriteLine("Usage: IntegrationGen registry | dry --spec <path> | write --spec <path> [--force]");
|
|
226
|
+
return 1;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
try
|
|
230
|
+
{
|
|
231
|
+
var root = ProjectRoot();
|
|
232
|
+
var force = args.Contains("--force");
|
|
233
|
+
var specIndex = Array.IndexOf(args, "--spec");
|
|
234
|
+
var specPath = specIndex >= 0 && specIndex + 1 < args.Length ? args[specIndex + 1] : null;
|
|
235
|
+
var idIndex = Array.IndexOf(args, "--id");
|
|
236
|
+
var idArg = idIndex >= 0 && idIndex + 1 < args.Length ? args[idIndex + 1] : null;
|
|
237
|
+
|
|
238
|
+
if (args[0] == "registry") return Registry(root);
|
|
239
|
+
if (args[0] == "dry" || args[0] == "write")
|
|
240
|
+
{
|
|
241
|
+
var paths = ResolveSpecPaths(root, specPath, idArg);
|
|
242
|
+
if (paths.Count > 1) Console.WriteLine($"integration-gen: {paths.Count} spec(s) to process");
|
|
243
|
+
var failed = 0;
|
|
244
|
+
foreach (var path in paths)
|
|
245
|
+
{
|
|
246
|
+
try
|
|
247
|
+
{
|
|
248
|
+
Run(root, args[0], path, force);
|
|
249
|
+
if (paths.Count > 1) Console.WriteLine("");
|
|
250
|
+
}
|
|
251
|
+
catch (Exception e)
|
|
252
|
+
{
|
|
253
|
+
failed++;
|
|
254
|
+
Console.Error.WriteLine($"integration-gen: FAIL {path}: {e.Message}");
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
return failed > 0 ? 1 : 0;
|
|
258
|
+
}
|
|
259
|
+
return 1;
|
|
260
|
+
}
|
|
261
|
+
catch (Exception error)
|
|
262
|
+
{
|
|
263
|
+
Console.Error.WriteLine($"IntegrationGen: {error.Message}");
|
|
264
|
+
return 1;
|
|
265
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
// Auto-generated by integration-gen
|
|
2
|
+
using Integration.Domain.{{ module_pascal }};
|
|
3
|
+
|
|
4
|
+
namespace Integration.Application.Generated.{{ module_pascal }};
|
|
5
|
+
|
|
6
|
+
public interface I{{ entity_pascal }}Service
|
|
7
|
+
{
|
|
8
|
+
Task<{{ entity_pascal }}> {{ action_pascal }}Async(int plantId, CancellationToken cancellationToken = default);
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
public sealed class {{ entity_pascal }}Service : I{{ entity_pascal }}Service
|
|
12
|
+
{
|
|
13
|
+
private readonly I{{ entity_pascal }}Repository _repository;
|
|
14
|
+
|
|
15
|
+
public {{ entity_pascal }}Service(I{{ entity_pascal }}Repository repository)
|
|
16
|
+
{
|
|
17
|
+
_repository = repository;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
public Task<{{ entity_pascal }}> {{ action_pascal }}Async(int plantId, CancellationToken cancellationToken = default)
|
|
21
|
+
=> _repository.GetAsync(plantId, cancellationToken);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
public interface I{{ entity_pascal }}Repository
|
|
25
|
+
{
|
|
26
|
+
Task<{{ entity_pascal }}> GetAsync(int plantId, CancellationToken cancellationToken = default);
|
|
27
|
+
}
|
package/adapters/dotnet-integration/codegen/runners/IntegrationGen/Templates/handoff.md.scriban
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# Integration gen — HANDOFF
|
|
2
|
+
|
|
3
|
+
Spec: `{{ spec_path }}`
|
|
4
|
+
|
|
5
|
+
Entity: **{{ entity_pascal }}** · module: **{{ module_pascal }}** · API: `{{ api_method }} {{ api_path }}`
|
|
6
|
+
|
|
7
|
+
## Generated files
|
|
8
|
+
|
|
9
|
+
{{ for f in files }}- `{{ f }}`
|
|
10
|
+
{{ end }}
|
|
11
|
+
|
|
12
|
+
## Manual follow-up
|
|
13
|
+
|
|
14
|
+
- Register DI in `WebAppFactory` / `Program`
|
|
15
|
+
- Validate the pilot-specific `mes-downtime` integration behavior
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
// Auto-generated by integration-gen
|
|
2
|
+
using Integration.Application.Generated.{{ module_pascal }};
|
|
3
|
+
using Integration.Domain.{{ module_pascal }};
|
|
4
|
+
|
|
5
|
+
namespace Integration.Infrastructure.Generated.{{ module_pascal }};
|
|
6
|
+
|
|
7
|
+
public sealed class Mock{{ entity_pascal }}Repository : I{{ entity_pascal }}Repository
|
|
8
|
+
{
|
|
9
|
+
public Task<{{ entity_pascal }}> GetAsync(int plantId, CancellationToken cancellationToken = default)
|
|
10
|
+
{
|
|
11
|
+
return Task.FromResult(new {{ entity_pascal }}
|
|
12
|
+
{
|
|
13
|
+
PlantId = plantId,
|
|
14
|
+
Items =
|
|
15
|
+
[
|
|
16
|
+
new DowntimeRecord { MachineId = "M-GEN-001", Minutes = 5, Reason = "integration-gen-stub" },
|
|
17
|
+
],
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
}
|
package/adapters/dotnet-integration/codegen/runners/IntegrationGen/Templates/presenter.cs.scriban
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
// Auto-generated by integration-gen
|
|
2
|
+
using System.Text.Json.Serialization;
|
|
3
|
+
using Integration.Domain.{{ module_pascal }};
|
|
4
|
+
|
|
5
|
+
namespace Integration.Presenters.Generated.{{ module_pascal }};
|
|
6
|
+
|
|
7
|
+
public sealed class {{ entity_pascal }}Contract
|
|
8
|
+
{
|
|
9
|
+
[JsonPropertyName("plant_id")]
|
|
10
|
+
public int PlantId { get; init; }
|
|
11
|
+
|
|
12
|
+
[JsonPropertyName("items")]
|
|
13
|
+
public IReadOnlyList<DowntimeItemContract> Items { get; init; } = Array.Empty<DowntimeItemContract>();
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
public sealed class DowntimeItemContract
|
|
17
|
+
{
|
|
18
|
+
[JsonPropertyName("machine_id")]
|
|
19
|
+
public string MachineId { get; init; } = string.Empty;
|
|
20
|
+
|
|
21
|
+
[JsonPropertyName("minutes")]
|
|
22
|
+
public int Minutes { get; init; }
|
|
23
|
+
|
|
24
|
+
[JsonPropertyName("reason")]
|
|
25
|
+
public string Reason { get; init; } = string.Empty;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
public static class {{ entity_pascal }}Presenter
|
|
29
|
+
{
|
|
30
|
+
public static {{ entity_pascal }}Contract ToContract({{ entity_pascal }} source)
|
|
31
|
+
=> new()
|
|
32
|
+
{
|
|
33
|
+
PlantId = source.PlantId,
|
|
34
|
+
Items = source.Items.Select(item => new DowntimeItemContract
|
|
35
|
+
{
|
|
36
|
+
MachineId = item.MachineId,
|
|
37
|
+
Minutes = item.Minutes,
|
|
38
|
+
Reason = item.Reason,
|
|
39
|
+
}).ToList(),
|
|
40
|
+
};
|
|
41
|
+
}
|
package/adapters/dotnet-integration/codegen/runners/IntegrationGen/Templates/service_test.cs.scriban
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
// Auto-generated by integration-gen
|
|
2
|
+
using Integration.Application.Generated.{{ module_pascal }};
|
|
3
|
+
using Integration.Infrastructure.Generated.{{ module_pascal }};
|
|
4
|
+
|
|
5
|
+
namespace Integration.Api.Tests.Generated;
|
|
6
|
+
|
|
7
|
+
public class {{ entity_pascal }}ServiceGenTests
|
|
8
|
+
{
|
|
9
|
+
[Fact]
|
|
10
|
+
public async Task Service_returns_gen_stub()
|
|
11
|
+
{
|
|
12
|
+
var service = new {{ entity_pascal }}Service(new Mock{{ entity_pascal }}Repository());
|
|
13
|
+
var result = await service.{{ action_pascal }}Async(1);
|
|
14
|
+
Assert.Equal(1, result.PlantId);
|
|
15
|
+
Assert.Contains(result.Items, item => item.Reason == "integration-gen-stub");
|
|
16
|
+
}
|
|
17
|
+
}
|