@specverse/engines 4.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/assets/examples/09-api/ai-spec.yaml +194 -0
- package/assets/examples/09-api/converted.yaml +95 -0
- package/assets/examples/09-api/diagram-architecture.mmd +10 -0
- package/assets/examples/09-api/diagram-er.mmd +10 -0
- package/assets/examples/09-api/documentation.html +104 -0
- package/assets/examples/09-api/documentation.md +95 -0
- package/assets/examples/09-api/inferred-spec.yaml +420 -0
- package/assets/examples/09-api/openapi.json +61 -0
- package/assets/examples/10-api/README.md +216 -0
- package/assets/examples/10-api/ai-spec.yaml +194 -0
- package/assets/examples/10-api/converted.yaml +96 -0
- package/assets/examples/10-api/diagram-architecture.mmd +10 -0
- package/assets/examples/10-api/diagram-er.mmd +10 -0
- package/assets/examples/10-api/documentation.html +104 -0
- package/assets/examples/10-api/documentation.md +95 -0
- package/assets/examples/10-api/inferred-spec.yaml +7 -0
- package/assets/examples/10-api/metadata.yaml +89 -0
- package/assets/examples/10-api/openapi.json +61 -0
- package/assets/examples/10-api/package-integration-test.js +177 -0
- package/assets/examples/10-api/usage-example.js +323 -0
- package/assets/examples/10-api/usage-example.ts +363 -0
- package/assets/examples/10-api/workflow-test.js +113 -0
- package/assets/examples/manifests/01-simple-default-mappings.yaml +36 -0
- package/assets/examples/manifests/02-capability-mappings.yaml +55 -0
- package/assets/examples/manifests/03-hybrid-mappings.yaml +109 -0
- package/assets/examples/manifests/README.md +245 -0
- package/assets/examples/manifests/backend-only.yaml +43 -0
- package/assets/examples/manifests/blog-api.md +78 -0
- package/assets/examples/manifests/blog-api.specly +79 -0
- package/assets/examples/manifests/frontend-only.yaml +27 -0
- package/assets/examples/manifests/fullstack-app.yaml +44 -0
- package/assets/examples/manifests/fullstack-monorepo.yaml +62 -0
- package/assets/examples/validate-examples-with-expected-failures.cjs +328 -0
- package/assets/examples/validate-examples.cjs +225 -0
- package/assets/examples-decomposed/cloud-native-manifest.example.yaml +8 -0
- package/assets/examples-decomposed/cloud-native-manifest.md +379 -0
- package/assets/examples-decomposed/cloud-native-manifest.specly +60 -0
- package/assets/examples-decomposed/docker-compose-manifest.example.yaml +8 -0
- package/assets/examples-decomposed/docker-compose-manifest.md +326 -0
- package/assets/examples-decomposed/docker-compose-manifest.specly +40 -0
- package/assets/examples-decomposed/kubernetes-deployment-manifest.example.yaml +8 -0
- package/assets/examples-decomposed/kubernetes-deployment-manifest.md +237 -0
- package/assets/examples-decomposed/kubernetes-deployment-manifest.specly +41 -0
- package/assets/examples-inference/inference-engine-demo.example.yaml +8 -0
- package/assets/examples-inference/inference-engine-demo.md +574 -0
- package/assets/examples-inference/inference-engine-demo.specly +216 -0
- package/assets/prompts/MOVED.md +35 -0
- package/assets/prompts/SUMMARY-v8-PROMOTION.md +445 -0
- package/assets/prompts/core/CHANGELOG.md +158 -0
- package/assets/prompts/core/MIGRATION-v6-to-v7.md +379 -0
- package/assets/prompts/core/README.md +319 -0
- package/assets/prompts/core/base-terminal-prompt.md +201 -0
- package/assets/prompts/core/examples/example-usage.ts +140 -0
- package/assets/prompts/core/schemas/prompt.schema.json +309 -0
- package/assets/prompts/core/schemas/prompt.schema.yaml +229 -0
- package/assets/prompts/core/standard/archive/v1/analyse.prompt.yaml +259 -0
- package/assets/prompts/core/standard/archive/v1/create.prompt.yaml +302 -0
- package/assets/prompts/core/standard/archive/v1/materialise.prompt.yaml +328 -0
- package/assets/prompts/core/standard/archive/v1/realize.prompt.yaml +606 -0
- package/assets/prompts/core/standard/archive/v2/README.md +110 -0
- package/assets/prompts/core/standard/archive/v2/analyse.prompt.yaml +151 -0
- package/assets/prompts/core/standard/archive/v2/create.prompt.yaml +151 -0
- package/assets/prompts/core/standard/archive/v2/materialise.prompt.yaml +132 -0
- package/assets/prompts/core/standard/archive/v2/realize.prompt.yaml +147 -0
- package/assets/prompts/core/standard/archive/v3/README.md +279 -0
- package/assets/prompts/core/standard/archive/v3/analyse.prompt.yaml +309 -0
- package/assets/prompts/core/standard/archive/v3/create.prompt.yaml +351 -0
- package/assets/prompts/core/standard/archive/v3/materialise.prompt.yaml +247 -0
- package/assets/prompts/core/standard/archive/v3/realize.prompt.yaml +344 -0
- package/assets/prompts/core/standard/archive/v4/README.md +79 -0
- package/assets/prompts/core/standard/archive/v4/analyse.prompt.yaml +204 -0
- package/assets/prompts/core/standard/archive/v4/create.prompt.yaml +185 -0
- package/assets/prompts/core/standard/archive/v5/README.md +224 -0
- package/assets/prompts/core/standard/archive/v5/analyse.prompt.yaml +209 -0
- package/assets/prompts/core/standard/archive/v5/create.prompt.yaml +225 -0
- package/assets/prompts/core/standard/archive/v5/materialise.prompt.yaml +242 -0
- package/assets/prompts/core/standard/archive/v5/realize.prompt.yaml +336 -0
- package/assets/prompts/core/standard/archive/v6/README.md +187 -0
- package/assets/prompts/core/standard/archive/v6/analyse.prompt.yaml +219 -0
- package/assets/prompts/core/standard/archive/v6/create.prompt.yaml +180 -0
- package/assets/prompts/core/standard/archive/v6/materialise.prompt.yaml +203 -0
- package/assets/prompts/core/standard/archive/v6/realize.prompt.yaml +215 -0
- package/assets/prompts/core/standard/archive/v7/analyse.prompt.nick.yaml +144 -0
- package/assets/prompts/core/standard/archive/v7/analyse.prompt.old.yaml +146 -0
- package/assets/prompts/core/standard/archive/v7/analyse.prompt.yaml +129 -0
- package/assets/prompts/core/standard/archive/v7/create.prompt.yaml +146 -0
- package/assets/prompts/core/standard/archive/v7/materialise.prompt.yaml +297 -0
- package/assets/prompts/core/standard/archive/v7/realize.prompt.yaml +294 -0
- package/assets/prompts/core/standard/archive/v8/README.md +400 -0
- package/assets/prompts/core/standard/archive/v8/analyse.prompt.yaml +185 -0
- package/assets/prompts/core/standard/archive/v8/create.prompt.yaml +203 -0
- package/assets/prompts/core/standard/archive/v8/materialise.prompt.yaml +297 -0
- package/assets/prompts/core/standard/archive/v8/realize.prompt.yaml +294 -0
- package/assets/prompts/core/standard/default/analyse.prompt.yaml +496 -0
- package/assets/prompts/core/standard/default/app-demo.prompt.yaml +213 -0
- package/assets/prompts/core/standard/default/create.prompt.yaml +418 -0
- package/assets/prompts/core/standard/default/materialise.prompt.yaml +814 -0
- package/assets/prompts/core/standard/default/realize.prompt.yaml +574 -0
- package/assets/prompts/core/standard/v9/analyse.prompt.yaml +496 -0
- package/assets/prompts/core/standard/v9/create.prompt.yaml +418 -0
- package/assets/prompts/core/standard/v9/materialise.prompt.yaml +814 -0
- package/assets/prompts/core/standard/v9/realize.prompt.yaml +574 -0
- package/assets/prompts/templates/api-orchestrator-template.yaml +188 -0
- package/assets/prompts/templates/claude-integration-template.md +121 -0
- package/assets/prompts/templates/terminal-prompt-template.md +97 -0
- package/dist/ai/commands/enhance.d.ts +8 -0
- package/dist/ai/commands/enhance.d.ts.map +1 -0
- package/dist/ai/commands/enhance.js +155 -0
- package/dist/ai/commands/enhance.js.map +1 -0
- package/dist/ai/commands/fill.d.ts +8 -0
- package/dist/ai/commands/fill.d.ts.map +1 -0
- package/dist/ai/commands/fill.js +179 -0
- package/dist/ai/commands/fill.js.map +1 -0
- package/dist/ai/commands/index.d.ts +11 -0
- package/dist/ai/commands/index.d.ts.map +1 -0
- package/dist/ai/commands/index.js +11 -0
- package/dist/ai/commands/index.js.map +1 -0
- package/dist/ai/commands/spec-analyser.d.ts +18 -0
- package/dist/ai/commands/spec-analyser.d.ts.map +1 -0
- package/dist/ai/commands/spec-analyser.js +175 -0
- package/dist/ai/commands/spec-analyser.js.map +1 -0
- package/dist/ai/commands/suggest.d.ts +8 -0
- package/dist/ai/commands/suggest.d.ts.map +1 -0
- package/dist/ai/commands/suggest.js +101 -0
- package/dist/ai/commands/suggest.js.map +1 -0
- package/dist/ai/commands/template.d.ts +8 -0
- package/dist/ai/commands/template.d.ts.map +1 -0
- package/dist/ai/commands/template.js +136 -0
- package/dist/ai/commands/template.js.map +1 -0
- package/dist/ai/config/index.d.ts +71 -0
- package/dist/ai/config/index.d.ts.map +1 -0
- package/dist/ai/config/index.js +193 -0
- package/dist/ai/config/index.js.map +1 -0
- package/dist/ai/config-loader.d.ts +31 -0
- package/dist/ai/config-loader.d.ts.map +1 -0
- package/dist/ai/config-loader.js +66 -0
- package/dist/ai/config-loader.js.map +1 -0
- package/dist/ai/core/ecosystem-prompt-manager.d.ts +107 -0
- package/dist/ai/core/ecosystem-prompt-manager.d.ts.map +1 -0
- package/dist/ai/core/ecosystem-prompt-manager.js +462 -0
- package/dist/ai/core/ecosystem-prompt-manager.js.map +1 -0
- package/dist/ai/examples/basic-usage.d.ts +9 -0
- package/dist/ai/examples/basic-usage.d.ts.map +1 -0
- package/dist/ai/examples/basic-usage.js +94 -0
- package/dist/ai/examples/basic-usage.js.map +1 -0
- package/dist/ai/index.d.ts +44 -0
- package/dist/ai/index.d.ts.map +1 -0
- package/dist/ai/index.js +164 -0
- package/dist/ai/index.js.map +1 -0
- package/dist/ai/orchestrator/index.d.ts +3 -0
- package/dist/ai/orchestrator/index.d.ts.map +1 -0
- package/dist/ai/orchestrator/index.js +3 -0
- package/dist/ai/orchestrator/index.js.map +1 -0
- package/dist/ai/orchestrator/interactive-workflow.d.ts +66 -0
- package/dist/ai/orchestrator/interactive-workflow.d.ts.map +1 -0
- package/dist/ai/orchestrator/interactive-workflow.js +214 -0
- package/dist/ai/orchestrator/interactive-workflow.js.map +1 -0
- package/dist/ai/orchestrator/specverse-orchestrator.d.ts +217 -0
- package/dist/ai/orchestrator/specverse-orchestrator.d.ts.map +1 -0
- package/dist/ai/orchestrator/specverse-orchestrator.js +745 -0
- package/dist/ai/orchestrator/specverse-orchestrator.js.map +1 -0
- package/dist/ai/prompt-loader.d.ts +24 -0
- package/dist/ai/prompt-loader.d.ts.map +1 -0
- package/dist/ai/prompt-loader.js +159 -0
- package/dist/ai/prompt-loader.js.map +1 -0
- package/dist/ai/providers/anthropic-provider.d.ts +38 -0
- package/dist/ai/providers/anthropic-provider.d.ts.map +1 -0
- package/dist/ai/providers/anthropic-provider.js +235 -0
- package/dist/ai/providers/anthropic-provider.js.map +1 -0
- package/dist/ai/providers/index.d.ts +6 -0
- package/dist/ai/providers/index.d.ts.map +1 -0
- package/dist/ai/providers/index.js +6 -0
- package/dist/ai/providers/index.js.map +1 -0
- package/dist/ai/providers/interactive-provider.d.ts +67 -0
- package/dist/ai/providers/interactive-provider.d.ts.map +1 -0
- package/dist/ai/providers/interactive-provider.js +337 -0
- package/dist/ai/providers/interactive-provider.js.map +1 -0
- package/dist/ai/providers/llm-provider.d.ts +127 -0
- package/dist/ai/providers/llm-provider.d.ts.map +1 -0
- package/dist/ai/providers/llm-provider.js +141 -0
- package/dist/ai/providers/llm-provider.js.map +1 -0
- package/dist/ai/providers/openai-provider.d.ts +39 -0
- package/dist/ai/providers/openai-provider.d.ts.map +1 -0
- package/dist/ai/providers/openai-provider.js +193 -0
- package/dist/ai/providers/openai-provider.js.map +1 -0
- package/dist/ai/providers/provider-factory.d.ts +47 -0
- package/dist/ai/providers/provider-factory.d.ts.map +1 -0
- package/dist/ai/providers/provider-factory.js +159 -0
- package/dist/ai/providers/provider-factory.js.map +1 -0
- package/dist/ai/session/claude-executor.d.ts +39 -0
- package/dist/ai/session/claude-executor.d.ts.map +1 -0
- package/dist/ai/session/claude-executor.js +136 -0
- package/dist/ai/session/claude-executor.js.map +1 -0
- package/dist/ai/session/session-manager.d.ts +72 -0
- package/dist/ai/session/session-manager.d.ts.map +1 -0
- package/dist/ai/session/session-manager.js +294 -0
- package/dist/ai/session/session-manager.js.map +1 -0
- package/dist/ai/session/types.d.ts +152 -0
- package/dist/ai/session/types.d.ts.map +1 -0
- package/dist/ai/session/types.js +6 -0
- package/dist/ai/session/types.js.map +1 -0
- package/dist/ai/types/index.d.ts +83 -0
- package/dist/ai/types/index.d.ts.map +1 -0
- package/dist/ai/types/index.js +5 -0
- package/dist/ai/types/index.js.map +1 -0
- package/dist/generators/UML-generator.d.ts +64 -0
- package/dist/generators/UML-generator.d.ts.map +1 -0
- package/dist/generators/UML-generator.js +541 -0
- package/dist/generators/UML-generator.js.map +1 -0
- package/dist/generators/ai-view-generator.d.ts +391 -0
- package/dist/generators/ai-view-generator.d.ts.map +1 -0
- package/dist/generators/ai-view-generator.js +907 -0
- package/dist/generators/ai-view-generator.js.map +1 -0
- package/dist/generators/diagram-engine/core/BaseDiagramPlugin.d.ts +41 -0
- package/dist/generators/diagram-engine/core/BaseDiagramPlugin.d.ts.map +1 -0
- package/dist/generators/diagram-engine/core/BaseDiagramPlugin.js +64 -0
- package/dist/generators/diagram-engine/core/BaseDiagramPlugin.js.map +1 -0
- package/dist/generators/diagram-engine/core/DiagramContext.d.ts +155 -0
- package/dist/generators/diagram-engine/core/DiagramContext.d.ts.map +1 -0
- package/dist/generators/diagram-engine/core/DiagramContext.js +481 -0
- package/dist/generators/diagram-engine/core/DiagramContext.js.map +1 -0
- package/dist/generators/diagram-engine/core/StyleManager.d.ts +51 -0
- package/dist/generators/diagram-engine/core/StyleManager.d.ts.map +1 -0
- package/dist/generators/diagram-engine/core/StyleManager.js +227 -0
- package/dist/generators/diagram-engine/core/StyleManager.js.map +1 -0
- package/dist/generators/diagram-engine/core/UnifiedDiagramGenerator.d.ts +83 -0
- package/dist/generators/diagram-engine/core/UnifiedDiagramGenerator.d.ts.map +1 -0
- package/dist/generators/diagram-engine/core/UnifiedDiagramGenerator.js +200 -0
- package/dist/generators/diagram-engine/core/UnifiedDiagramGenerator.js.map +1 -0
- package/dist/generators/diagram-engine/index.d.ts +41 -0
- package/dist/generators/diagram-engine/index.d.ts.map +1 -0
- package/dist/generators/diagram-engine/index.js +74 -0
- package/dist/generators/diagram-engine/index.js.map +1 -0
- package/dist/generators/diagram-engine/plugins/architecture/ArchitecturePlugin.d.ts +65 -0
- package/dist/generators/diagram-engine/plugins/architecture/ArchitecturePlugin.d.ts.map +1 -0
- package/dist/generators/diagram-engine/plugins/architecture/ArchitecturePlugin.js +490 -0
- package/dist/generators/diagram-engine/plugins/architecture/ArchitecturePlugin.js.map +1 -0
- package/dist/generators/diagram-engine/plugins/class-diagram/ClassDiagramPlugin.d.ts +40 -0
- package/dist/generators/diagram-engine/plugins/class-diagram/ClassDiagramPlugin.d.ts.map +1 -0
- package/dist/generators/diagram-engine/plugins/class-diagram/ClassDiagramPlugin.js +323 -0
- package/dist/generators/diagram-engine/plugins/class-diagram/ClassDiagramPlugin.js.map +1 -0
- package/dist/generators/diagram-engine/plugins/deployment/DeploymentPlugin.d.ts +46 -0
- package/dist/generators/diagram-engine/plugins/deployment/DeploymentPlugin.d.ts.map +1 -0
- package/dist/generators/diagram-engine/plugins/deployment/DeploymentPlugin.js +391 -0
- package/dist/generators/diagram-engine/plugins/deployment/DeploymentPlugin.js.map +1 -0
- package/dist/generators/diagram-engine/plugins/er-diagram/ERDiagramPlugin.d.ts +57 -0
- package/dist/generators/diagram-engine/plugins/er-diagram/ERDiagramPlugin.d.ts.map +1 -0
- package/dist/generators/diagram-engine/plugins/er-diagram/ERDiagramPlugin.js +300 -0
- package/dist/generators/diagram-engine/plugins/er-diagram/ERDiagramPlugin.js.map +1 -0
- package/dist/generators/diagram-engine/plugins/event-flow/EventFlowPlugin.d.ts +70 -0
- package/dist/generators/diagram-engine/plugins/event-flow/EventFlowPlugin.d.ts.map +1 -0
- package/dist/generators/diagram-engine/plugins/event-flow/EventFlowPlugin.js +955 -0
- package/dist/generators/diagram-engine/plugins/event-flow/EventFlowPlugin.js.map +1 -0
- package/dist/generators/diagram-engine/plugins/lifecycle/LifecyclePlugin.d.ts +40 -0
- package/dist/generators/diagram-engine/plugins/lifecycle/LifecyclePlugin.d.ts.map +1 -0
- package/dist/generators/diagram-engine/plugins/lifecycle/LifecyclePlugin.js +183 -0
- package/dist/generators/diagram-engine/plugins/lifecycle/LifecyclePlugin.js.map +1 -0
- package/dist/generators/diagram-engine/plugins/manifest/ManifestPlugin.d.ts +71 -0
- package/dist/generators/diagram-engine/plugins/manifest/ManifestPlugin.d.ts.map +1 -0
- package/dist/generators/diagram-engine/plugins/manifest/ManifestPlugin.js +396 -0
- package/dist/generators/diagram-engine/plugins/manifest/ManifestPlugin.js.map +1 -0
- package/dist/generators/diagram-engine/renderers/MermaidRenderer.d.ts +72 -0
- package/dist/generators/diagram-engine/renderers/MermaidRenderer.d.ts.map +1 -0
- package/dist/generators/diagram-engine/renderers/MermaidRenderer.js +441 -0
- package/dist/generators/diagram-engine/renderers/MermaidRenderer.js.map +1 -0
- package/dist/generators/diagram-engine/types/index.d.ts +261 -0
- package/dist/generators/diagram-engine/types/index.d.ts.map +1 -0
- package/dist/generators/diagram-engine/types/index.js +7 -0
- package/dist/generators/diagram-engine/types/index.js.map +1 -0
- package/dist/generators/documentation-generator.d.ts +54 -0
- package/dist/generators/documentation-generator.d.ts.map +1 -0
- package/dist/generators/documentation-generator.js +756 -0
- package/dist/generators/documentation-generator.js.map +1 -0
- package/dist/generators/index.d.ts +47 -0
- package/dist/generators/index.d.ts.map +1 -0
- package/dist/generators/index.js +51 -0
- package/dist/generators/index.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/dist/inference/comprehensive-engine.d.ts +71 -0
- package/dist/inference/comprehensive-engine.d.ts.map +1 -0
- package/dist/inference/comprehensive-engine.js +271 -0
- package/dist/inference/comprehensive-engine.js.map +1 -0
- package/dist/inference/core/context.d.ts +60 -0
- package/dist/inference/core/context.d.ts.map +1 -0
- package/dist/inference/core/context.js +292 -0
- package/dist/inference/core/context.js.map +1 -0
- package/dist/inference/core/index.d.ts +14 -0
- package/dist/inference/core/index.d.ts.map +1 -0
- package/dist/inference/core/index.js +18 -0
- package/dist/inference/core/index.js.map +1 -0
- package/dist/inference/core/rule-engine.d.ts +52 -0
- package/dist/inference/core/rule-engine.d.ts.map +1 -0
- package/dist/inference/core/rule-engine.js +1329 -0
- package/dist/inference/core/rule-engine.js.map +1 -0
- package/dist/inference/core/rule-file-types.d.ts +225 -0
- package/dist/inference/core/rule-file-types.d.ts.map +1 -0
- package/dist/inference/core/rule-file-types.js +79 -0
- package/dist/inference/core/rule-file-types.js.map +1 -0
- package/dist/inference/core/rule-loader.d.ts +93 -0
- package/dist/inference/core/rule-loader.d.ts.map +1 -0
- package/dist/inference/core/rule-loader.js +645 -0
- package/dist/inference/core/rule-loader.js.map +1 -0
- package/dist/inference/core/specly-converter.d.ts +50 -0
- package/dist/inference/core/specly-converter.d.ts.map +1 -0
- package/dist/inference/core/specly-converter.js +885 -0
- package/dist/inference/core/specly-converter.js.map +1 -0
- package/dist/inference/core/types.d.ts +395 -0
- package/dist/inference/core/types.d.ts.map +1 -0
- package/dist/inference/core/types.js +31 -0
- package/dist/inference/core/types.js.map +1 -0
- package/dist/inference/deployment/deployment-generator.d.ts +48 -0
- package/dist/inference/deployment/deployment-generator.d.ts.map +1 -0
- package/dist/inference/deployment/deployment-generator.js +343 -0
- package/dist/inference/deployment/deployment-generator.js.map +1 -0
- package/dist/inference/deployment/index.d.ts +6 -0
- package/dist/inference/deployment/index.d.ts.map +1 -0
- package/dist/inference/deployment/index.js +5 -0
- package/dist/inference/deployment/index.js.map +1 -0
- package/dist/inference/dev-specly-generator.d.ts +19 -0
- package/dist/inference/dev-specly-generator.d.ts.map +1 -0
- package/dist/inference/dev-specly-generator.js +127 -0
- package/dist/inference/dev-specly-generator.js.map +1 -0
- package/dist/inference/index.d.ts +29 -0
- package/dist/inference/index.d.ts.map +1 -0
- package/dist/inference/index.js +170 -0
- package/dist/inference/index.js.map +1 -0
- package/dist/inference/logical/generators/component-type-resolver.d.ts +82 -0
- package/dist/inference/logical/generators/component-type-resolver.d.ts.map +1 -0
- package/dist/inference/logical/generators/component-type-resolver.js +151 -0
- package/dist/inference/logical/generators/component-type-resolver.js.map +1 -0
- package/dist/inference/logical/generators/controller-generator.d.ts +43 -0
- package/dist/inference/logical/generators/controller-generator.d.ts.map +1 -0
- package/dist/inference/logical/generators/controller-generator.js +303 -0
- package/dist/inference/logical/generators/controller-generator.js.map +1 -0
- package/dist/inference/logical/generators/event-generator.d.ts +67 -0
- package/dist/inference/logical/generators/event-generator.d.ts.map +1 -0
- package/dist/inference/logical/generators/event-generator.js +466 -0
- package/dist/inference/logical/generators/event-generator.js.map +1 -0
- package/dist/inference/logical/generators/promotion-generator.d.ts +32 -0
- package/dist/inference/logical/generators/promotion-generator.d.ts.map +1 -0
- package/dist/inference/logical/generators/promotion-generator.js +133 -0
- package/dist/inference/logical/generators/promotion-generator.js.map +1 -0
- package/dist/inference/logical/generators/service-generator.d.ts +51 -0
- package/dist/inference/logical/generators/service-generator.d.ts.map +1 -0
- package/dist/inference/logical/generators/service-generator.js +268 -0
- package/dist/inference/logical/generators/service-generator.js.map +1 -0
- package/dist/inference/logical/generators/specialist-view-expander.d.ts +75 -0
- package/dist/inference/logical/generators/specialist-view-expander.d.ts.map +1 -0
- package/dist/inference/logical/generators/specialist-view-expander.js +182 -0
- package/dist/inference/logical/generators/specialist-view-expander.js.map +1 -0
- package/dist/inference/logical/generators/view-generator.d.ts +131 -0
- package/dist/inference/logical/generators/view-generator.d.ts.map +1 -0
- package/dist/inference/logical/generators/view-generator.js +1115 -0
- package/dist/inference/logical/generators/view-generator.js.map +1 -0
- package/dist/inference/logical/index.d.ts +19 -0
- package/dist/inference/logical/index.d.ts.map +1 -0
- package/dist/inference/logical/index.js +15 -0
- package/dist/inference/logical/index.js.map +1 -0
- package/dist/inference/logical/logical-engine.d.ts +68 -0
- package/dist/inference/logical/logical-engine.d.ts.map +1 -0
- package/dist/inference/logical/logical-engine.js +484 -0
- package/dist/inference/logical/logical-engine.js.map +1 -0
- package/dist/inference/quint-transpiler.d.ts +64 -0
- package/dist/inference/quint-transpiler.d.ts.map +1 -0
- package/dist/inference/quint-transpiler.js +433 -0
- package/dist/inference/quint-transpiler.js.map +1 -0
- package/dist/inference/test-harness.d.ts +41 -0
- package/dist/inference/test-harness.d.ts.map +1 -0
- package/dist/inference/test-harness.js +357 -0
- package/dist/inference/test-harness.js.map +1 -0
- package/dist/parser/convention-processor.d.ts +66 -0
- package/dist/parser/convention-processor.d.ts.map +1 -0
- package/dist/parser/convention-processor.js +349 -0
- package/dist/parser/convention-processor.js.map +1 -0
- package/dist/parser/import-resolver/cache.d.ts +56 -0
- package/dist/parser/import-resolver/cache.d.ts.map +1 -0
- package/dist/parser/import-resolver/cache.js +191 -0
- package/dist/parser/import-resolver/cache.js.map +1 -0
- package/dist/parser/import-resolver/index.d.ts +10 -0
- package/dist/parser/import-resolver/index.d.ts.map +1 -0
- package/dist/parser/import-resolver/index.js +9 -0
- package/dist/parser/import-resolver/index.js.map +1 -0
- package/dist/parser/import-resolver/resolver.d.ts +102 -0
- package/dist/parser/import-resolver/resolver.d.ts.map +1 -0
- package/dist/parser/import-resolver/resolver.js +669 -0
- package/dist/parser/import-resolver/resolver.js.map +1 -0
- package/dist/parser/import-resolver/types.d.ts +55 -0
- package/dist/parser/import-resolver/types.d.ts.map +1 -0
- package/dist/parser/import-resolver/types.js +5 -0
- package/dist/parser/import-resolver/types.js.map +1 -0
- package/dist/parser/index.d.ts +38 -0
- package/dist/parser/index.d.ts.map +1 -0
- package/dist/parser/index.js +61 -0
- package/dist/parser/index.js.map +1 -0
- package/dist/parser/namespace-utils.d.ts +61 -0
- package/dist/parser/namespace-utils.d.ts.map +1 -0
- package/dist/parser/namespace-utils.js +191 -0
- package/dist/parser/namespace-utils.js.map +1 -0
- package/dist/parser/processors/AbstractProcessor.d.ts +10 -0
- package/dist/parser/processors/AbstractProcessor.d.ts.map +1 -0
- package/dist/parser/processors/AbstractProcessor.js +11 -0
- package/dist/parser/processors/AbstractProcessor.js.map +1 -0
- package/dist/parser/processors/AttributeProcessor.d.ts +19 -0
- package/dist/parser/processors/AttributeProcessor.d.ts.map +1 -0
- package/dist/parser/processors/AttributeProcessor.js +154 -0
- package/dist/parser/processors/AttributeProcessor.js.map +1 -0
- package/dist/parser/processors/ControllerProcessor.d.ts +9 -0
- package/dist/parser/processors/ControllerProcessor.d.ts.map +1 -0
- package/dist/parser/processors/ControllerProcessor.js +74 -0
- package/dist/parser/processors/ControllerProcessor.js.map +1 -0
- package/dist/parser/processors/DeploymentProcessor.d.ts +19 -0
- package/dist/parser/processors/DeploymentProcessor.d.ts.map +1 -0
- package/dist/parser/processors/DeploymentProcessor.js +244 -0
- package/dist/parser/processors/DeploymentProcessor.js.map +1 -0
- package/dist/parser/processors/EventProcessor.d.ts +8 -0
- package/dist/parser/processors/EventProcessor.d.ts.map +1 -0
- package/dist/parser/processors/EventProcessor.js +28 -0
- package/dist/parser/processors/EventProcessor.js.map +1 -0
- package/dist/parser/processors/ExecutableProcessor.d.ts +21 -0
- package/dist/parser/processors/ExecutableProcessor.d.ts.map +1 -0
- package/dist/parser/processors/ExecutableProcessor.js +135 -0
- package/dist/parser/processors/ExecutableProcessor.js.map +1 -0
- package/dist/parser/processors/LifecycleProcessor.d.ts +9 -0
- package/dist/parser/processors/LifecycleProcessor.d.ts.map +1 -0
- package/dist/parser/processors/LifecycleProcessor.js +41 -0
- package/dist/parser/processors/LifecycleProcessor.js.map +1 -0
- package/dist/parser/processors/ModelProcessor.d.ts +67 -0
- package/dist/parser/processors/ModelProcessor.d.ts.map +1 -0
- package/dist/parser/processors/ModelProcessor.js +495 -0
- package/dist/parser/processors/ModelProcessor.js.map +1 -0
- package/dist/parser/processors/RelationshipProcessor.d.ts +10 -0
- package/dist/parser/processors/RelationshipProcessor.d.ts.map +1 -0
- package/dist/parser/processors/RelationshipProcessor.js +55 -0
- package/dist/parser/processors/RelationshipProcessor.js.map +1 -0
- package/dist/parser/processors/ServiceProcessor.d.ts +9 -0
- package/dist/parser/processors/ServiceProcessor.d.ts.map +1 -0
- package/dist/parser/processors/ServiceProcessor.js +59 -0
- package/dist/parser/processors/ServiceProcessor.js.map +1 -0
- package/dist/parser/processors/ViewProcessor.d.ts +7 -0
- package/dist/parser/processors/ViewProcessor.d.ts.map +1 -0
- package/dist/parser/processors/ViewProcessor.js +66 -0
- package/dist/parser/processors/ViewProcessor.js.map +1 -0
- package/dist/parser/types/ast.d.ts +518 -0
- package/dist/parser/types/ast.d.ts.map +1 -0
- package/dist/parser/types/ast.js +8 -0
- package/dist/parser/types/ast.js.map +1 -0
- package/dist/parser/types/views.d.ts +186 -0
- package/dist/parser/types/views.d.ts.map +1 -0
- package/dist/parser/types/views.js +8 -0
- package/dist/parser/types/views.js.map +1 -0
- package/dist/parser/unified-parser.d.ts +195 -0
- package/dist/parser/unified-parser.d.ts.map +1 -0
- package/dist/parser/unified-parser.js +1180 -0
- package/dist/parser/unified-parser.js.map +1 -0
- package/dist/parser/vitest.config.d.ts +3 -0
- package/dist/parser/vitest.config.d.ts.map +1 -0
- package/dist/parser/vitest.config.js +27 -0
- package/dist/parser/vitest.config.js.map +1 -0
- package/dist/realize/engines/code-generator.d.ts +86 -0
- package/dist/realize/engines/code-generator.d.ts.map +1 -0
- package/dist/realize/engines/code-generator.js +159 -0
- package/dist/realize/engines/code-generator.js.map +1 -0
- package/dist/realize/engines/engine-registry.d.ts +94 -0
- package/dist/realize/engines/engine-registry.d.ts.map +1 -0
- package/dist/realize/engines/engine-registry.js +163 -0
- package/dist/realize/engines/engine-registry.js.map +1 -0
- package/dist/realize/engines/index.d.ts +10 -0
- package/dist/realize/engines/index.d.ts.map +1 -0
- package/dist/realize/engines/index.js +12 -0
- package/dist/realize/engines/index.js.map +1 -0
- package/dist/realize/engines/typescript-engine.d.ts +74 -0
- package/dist/realize/engines/typescript-engine.d.ts.map +1 -0
- package/dist/realize/engines/typescript-engine.js +289 -0
- package/dist/realize/engines/typescript-engine.js.map +1 -0
- package/dist/realize/generators/index.d.ts +11 -0
- package/dist/realize/generators/index.d.ts.map +1 -0
- package/dist/realize/generators/index.js +11 -0
- package/dist/realize/generators/index.js.map +1 -0
- package/dist/realize/index.d.ts +48 -0
- package/dist/realize/index.d.ts.map +1 -0
- package/dist/realize/index.js +529 -0
- package/dist/realize/index.js.map +1 -0
- package/dist/realize/library/index.d.ts +12 -0
- package/dist/realize/library/index.d.ts.map +1 -0
- package/dist/realize/library/index.js +15 -0
- package/dist/realize/library/index.js.map +1 -0
- package/dist/realize/library/library.d.ts +132 -0
- package/dist/realize/library/library.d.ts.map +1 -0
- package/dist/realize/library/library.js +343 -0
- package/dist/realize/library/library.js.map +1 -0
- package/dist/realize/library/loader.d.ts +73 -0
- package/dist/realize/library/loader.d.ts.map +1 -0
- package/dist/realize/library/loader.js +159 -0
- package/dist/realize/library/loader.js.map +1 -0
- package/dist/realize/library/resolver.d.ts +104 -0
- package/dist/realize/library/resolver.d.ts.map +1 -0
- package/dist/realize/library/resolver.js +299 -0
- package/dist/realize/library/resolver.js.map +1 -0
- package/dist/realize/library/validator.d.ts +65 -0
- package/dist/realize/library/validator.d.ts.map +1 -0
- package/dist/realize/library/validator.js +203 -0
- package/dist/realize/library/validator.js.map +1 -0
- package/dist/realize/types/index.d.ts +5 -0
- package/dist/realize/types/index.d.ts.map +1 -0
- package/dist/realize/types/index.js +5 -0
- package/dist/realize/types/index.js.map +1 -0
- package/dist/realize/types/instance-factory.d.ts +7 -0
- package/dist/realize/types/instance-factory.d.ts.map +1 -0
- package/dist/realize/types/instance-factory.js +2 -0
- package/dist/realize/types/instance-factory.js.map +1 -0
- package/dist/realize/types/unified-mappings.d.ts +163 -0
- package/dist/realize/types/unified-mappings.d.ts.map +1 -0
- package/dist/realize/types/unified-mappings.js +110 -0
- package/dist/realize/types/unified-mappings.js.map +1 -0
- package/dist/realize/utils/ai-spec-loader.d.ts +77 -0
- package/dist/realize/utils/ai-spec-loader.d.ts.map +1 -0
- package/dist/realize/utils/ai-spec-loader.js +142 -0
- package/dist/realize/utils/ai-spec-loader.js.map +1 -0
- package/dist/realize/utils/index.d.ts +9 -0
- package/dist/realize/utils/index.d.ts.map +1 -0
- package/dist/realize/utils/index.js +9 -0
- package/dist/realize/utils/index.js.map +1 -0
- package/dist/realize/utils/manifest-loader.d.ts +107 -0
- package/dist/realize/utils/manifest-loader.d.ts.map +1 -0
- package/dist/realize/utils/manifest-loader.js +168 -0
- package/dist/realize/utils/manifest-loader.js.map +1 -0
- package/dist/realize/utils/mapping-migration.d.ts +53 -0
- package/dist/realize/utils/mapping-migration.d.ts.map +1 -0
- package/dist/realize/utils/mapping-migration.js +194 -0
- package/dist/realize/utils/mapping-migration.js.map +1 -0
- package/dist/registry/cache/cache-manager.d.ts +132 -0
- package/dist/registry/cache/cache-manager.d.ts.map +1 -0
- package/dist/registry/cache/cache-manager.js +218 -0
- package/dist/registry/cache/cache-manager.js.map +1 -0
- package/dist/registry/client/registry-client.d.ts +129 -0
- package/dist/registry/client/registry-client.d.ts.map +1 -0
- package/dist/registry/client/registry-client.js +317 -0
- package/dist/registry/client/registry-client.js.map +1 -0
- package/dist/registry/formatters/error-formatter.d.ts +100 -0
- package/dist/registry/formatters/error-formatter.d.ts.map +1 -0
- package/dist/registry/formatters/error-formatter.js +290 -0
- package/dist/registry/formatters/error-formatter.js.map +1 -0
- package/dist/registry/formatters/index.d.ts +8 -0
- package/dist/registry/formatters/index.d.ts.map +1 -0
- package/dist/registry/formatters/index.js +7 -0
- package/dist/registry/formatters/index.js.map +1 -0
- package/dist/registry/index.d.ts +19 -0
- package/dist/registry/index.d.ts.map +1 -0
- package/dist/registry/index.js +22 -0
- package/dist/registry/index.js.map +1 -0
- package/dist/registry/offline/offline-handler.d.ts +150 -0
- package/dist/registry/offline/offline-handler.d.ts.map +1 -0
- package/dist/registry/offline/offline-handler.js +290 -0
- package/dist/registry/offline/offline-handler.js.map +1 -0
- package/dist/registry/types/index.d.ts +13 -0
- package/dist/registry/types/index.d.ts.map +1 -0
- package/dist/registry/types/index.js +11 -0
- package/dist/registry/types/index.js.map +1 -0
- package/dist/registry/types/registry.d.ts +220 -0
- package/dist/registry/types/registry.d.ts.map +1 -0
- package/dist/registry/types/registry.js +55 -0
- package/dist/registry/types/registry.js.map +1 -0
- package/dist/registry/types/validation.d.ts +197 -0
- package/dist/registry/types/validation.d.ts.map +1 -0
- package/dist/registry/types/validation.js +140 -0
- package/dist/registry/types/validation.js.map +1 -0
- package/dist/registry/utils/manifest-adapter.d.ts +42 -0
- package/dist/registry/utils/manifest-adapter.d.ts.map +1 -0
- package/dist/registry/utils/manifest-adapter.js +182 -0
- package/dist/registry/utils/manifest-adapter.js.map +1 -0
- package/dist/registry/validators/index.d.ts +12 -0
- package/dist/registry/validators/index.d.ts.map +1 -0
- package/dist/registry/validators/index.js +9 -0
- package/dist/registry/validators/index.js.map +1 -0
- package/dist/registry/validators/installation-validator.d.ts +75 -0
- package/dist/registry/validators/installation-validator.d.ts.map +1 -0
- package/dist/registry/validators/installation-validator.js +142 -0
- package/dist/registry/validators/installation-validator.js.map +1 -0
- package/dist/registry/validators/manifest-validator.d.ts +82 -0
- package/dist/registry/validators/manifest-validator.d.ts.map +1 -0
- package/dist/registry/validators/manifest-validator.js +213 -0
- package/dist/registry/validators/manifest-validator.js.map +1 -0
- package/dist/registry/validators/validator.d.ts +113 -0
- package/dist/registry/validators/validator.d.ts.map +1 -0
- package/dist/registry/validators/validator.js +165 -0
- package/dist/registry/validators/validator.js.map +1 -0
- package/libs/instance-factories/CURVED-INTERFACE.md +278 -0
- package/libs/instance-factories/README.md +73 -0
- package/libs/instance-factories/applications/README.md +51 -0
- package/libs/instance-factories/applications/generic-app.yaml +52 -0
- package/libs/instance-factories/applications/react-app-runtime.yaml +139 -0
- package/libs/instance-factories/applications/react-app.yaml +186 -0
- package/libs/instance-factories/applications/templates/generic/backend-env-generator.ts +31 -0
- package/libs/instance-factories/applications/templates/generic/backend-package-json-generator.ts +84 -0
- package/libs/instance-factories/applications/templates/generic/backend-tsconfig-generator.ts +69 -0
- package/libs/instance-factories/applications/templates/generic/main-generator.ts +308 -0
- package/libs/instance-factories/applications/templates/react/_view-components-source.ts +555 -0
- package/libs/instance-factories/applications/templates/react/api-client-generator.ts +436 -0
- package/libs/instance-factories/applications/templates/react/api-types-generator.ts +153 -0
- package/libs/instance-factories/applications/templates/react/app-tsx-generator.ts +94 -0
- package/libs/instance-factories/applications/templates/react/env-example-generator.ts +24 -0
- package/libs/instance-factories/applications/templates/react/field-helpers-generator.ts +106 -0
- package/libs/instance-factories/applications/templates/react/gitignore-generator.ts +38 -0
- package/libs/instance-factories/applications/templates/react/index-css-generator.ts +14 -0
- package/libs/instance-factories/applications/templates/react/index-html-generator.ts +30 -0
- package/libs/instance-factories/applications/templates/react/main-tsx-generator.ts +34 -0
- package/libs/instance-factories/applications/templates/react/package-json-generator.ts +57 -0
- package/libs/instance-factories/applications/templates/react/pattern-adapter-generator.ts +179 -0
- package/libs/instance-factories/applications/templates/react/react-pattern-adapter.tsx +1347 -0
- package/libs/instance-factories/applications/templates/react/relationship-field-generator.ts +150 -0
- package/libs/instance-factories/applications/templates/react/runtime-app-tsx-generator.ts +90 -0
- package/libs/instance-factories/applications/templates/react/runtime-package-json-generator.ts +61 -0
- package/libs/instance-factories/applications/templates/react/tailwind-adapter-generator.ts +704 -0
- package/libs/instance-factories/applications/templates/react/tailwind-adapter-wrapper-generator.ts +84 -0
- package/libs/instance-factories/applications/templates/react/tsconfig-generator.ts +35 -0
- package/libs/instance-factories/applications/templates/react/use-api-hooks-generator.ts +121 -0
- package/libs/instance-factories/applications/templates/react/view-dashboard-generator.ts +150 -0
- package/libs/instance-factories/applications/templates/react/view-detail-generator.ts +150 -0
- package/libs/instance-factories/applications/templates/react/view-form-generator.ts +362 -0
- package/libs/instance-factories/applications/templates/react/view-list-generator.ts +98 -0
- package/libs/instance-factories/applications/templates/react/view-router-generator.ts +89 -0
- package/libs/instance-factories/applications/templates/react/vite-config-generator.ts +49 -0
- package/libs/instance-factories/archived/fastify-prisma.yaml +104 -0
- package/libs/instance-factories/cli/README.md +43 -0
- package/libs/instance-factories/cli/commander-js.yaml +55 -0
- package/libs/instance-factories/cli/templates/commander/cli-bin-wrapper-generator.ts +20 -0
- package/libs/instance-factories/cli/templates/commander/cli-entry-generator.d.ts +12 -0
- package/libs/instance-factories/cli/templates/commander/cli-entry-generator.d.ts.map +1 -0
- package/libs/instance-factories/cli/templates/commander/cli-entry-generator.js +115 -0
- package/libs/instance-factories/cli/templates/commander/cli-entry-generator.js.map +1 -0
- package/libs/instance-factories/cli/templates/commander/cli-entry-generator.ts +168 -0
- package/libs/instance-factories/cli/templates/commander/command-generator.d.ts +14 -0
- package/libs/instance-factories/cli/templates/commander/command-generator.d.ts.map +1 -0
- package/libs/instance-factories/cli/templates/commander/command-generator.js +182 -0
- package/libs/instance-factories/cli/templates/commander/command-generator.js.map +1 -0
- package/libs/instance-factories/cli/templates/commander/command-generator.ts +1036 -0
- package/libs/instance-factories/communication/README.md +47 -0
- package/libs/instance-factories/communication/event-emitter.yaml +56 -0
- package/libs/instance-factories/communication/rabbitmq-events.yaml +87 -0
- package/libs/instance-factories/communication/templates/eventemitter/bus-generator.ts +93 -0
- package/libs/instance-factories/communication/templates/eventemitter/publisher-generator.ts +117 -0
- package/libs/instance-factories/communication/templates/eventemitter/subscriber-generator.ts +101 -0
- package/libs/instance-factories/controllers/README.md +42 -0
- package/libs/instance-factories/controllers/fastify.yaml +127 -0
- package/libs/instance-factories/controllers/templates/fastify/meta-routes-generator.ts +103 -0
- package/libs/instance-factories/controllers/templates/fastify/routes-generator.ts +389 -0
- package/libs/instance-factories/controllers/templates/fastify/server-generator.ts +76 -0
- package/libs/instance-factories/infrastructure/README.md +29 -0
- package/libs/instance-factories/infrastructure/docker-k8s.yaml +61 -0
- package/libs/instance-factories/infrastructure/templates/docker-k8s/infrastructure-generator.ts +46 -0
- package/libs/instance-factories/orms/README.md +54 -0
- package/libs/instance-factories/orms/prisma.yaml +89 -0
- package/libs/instance-factories/orms/templates/prisma/schema-generator.ts +576 -0
- package/libs/instance-factories/orms/templates/prisma/services-generator.ts +408 -0
- package/libs/instance-factories/scaffolding/README.md +49 -0
- package/libs/instance-factories/scaffolding/generic-scaffold.yaml +65 -0
- package/libs/instance-factories/scaffolding/templates/generic/env-example-generator.ts +73 -0
- package/libs/instance-factories/scaffolding/templates/generic/env-generator.ts +85 -0
- package/libs/instance-factories/scaffolding/templates/generic/gitignore-generator.ts +69 -0
- package/libs/instance-factories/scaffolding/templates/generic/package-json-generator.ts +176 -0
- package/libs/instance-factories/scaffolding/templates/generic/readme-generator.ts +207 -0
- package/libs/instance-factories/scaffolding/templates/generic/tsconfig-generator.ts +78 -0
- package/libs/instance-factories/scaffolding/templates/generic/tsconfig-react-generator.ts +41 -0
- package/libs/instance-factories/sdks/README.md +28 -0
- package/libs/instance-factories/sdks/python-sdk.yaml +66 -0
- package/libs/instance-factories/sdks/templates/python/sdk-generator.ts +50 -0
- package/libs/instance-factories/sdks/templates/typescript/sdk-generator.ts +49 -0
- package/libs/instance-factories/sdks/typescript-sdk.yaml +59 -0
- package/libs/instance-factories/services/README.md +55 -0
- package/libs/instance-factories/services/prisma-services.yaml +71 -0
- package/libs/instance-factories/services/templates/memory/generate-interpreter.ts +25 -0
- package/libs/instance-factories/services/templates/memory/step-conventions-memory.ts +465 -0
- package/libs/instance-factories/services/templates/prisma/behavior-generator.ts +304 -0
- package/libs/instance-factories/services/templates/prisma/controller-generator.ts +532 -0
- package/libs/instance-factories/services/templates/prisma/service-generator.ts +334 -0
- package/libs/instance-factories/services/templates/prisma/step-conventions.ts +309 -0
- package/libs/instance-factories/services/templates/shared-patterns.ts +38 -0
- package/libs/instance-factories/shared/path-resolver.ts +111 -0
- package/libs/instance-factories/storage/README.md +34 -0
- package/libs/instance-factories/storage/mongodb.yaml +79 -0
- package/libs/instance-factories/storage/postgresql.yaml +75 -0
- package/libs/instance-factories/storage/redis.yaml +79 -0
- package/libs/instance-factories/storage/templates/mongodb/config-generator.ts +15 -0
- package/libs/instance-factories/storage/templates/mongodb/docker-generator.ts +18 -0
- package/libs/instance-factories/storage/templates/postgresql/config-generator.ts +54 -0
- package/libs/instance-factories/storage/templates/postgresql/docker-generator.ts +55 -0
- package/libs/instance-factories/storage/templates/redis/config-generator.ts +16 -0
- package/libs/instance-factories/storage/templates/redis/docker-generator.ts +18 -0
- package/libs/instance-factories/test-generation.ts +192 -0
- package/libs/instance-factories/testing/README.md +40 -0
- package/libs/instance-factories/testing/templates/vitest/tests-generator.ts +51 -0
- package/libs/instance-factories/testing/vitest-tests.yaml +63 -0
- package/libs/instance-factories/tools/README.md +70 -0
- package/libs/instance-factories/tools/mcp.yaml +36 -0
- package/libs/instance-factories/tools/templates/mcp/mcp-server-generator.ts +190 -0
- package/libs/instance-factories/tools/templates/mcp/static/docs/DEPLOYMENT_GUIDE.md +630 -0
- package/libs/instance-factories/tools/templates/mcp/static/docs/HYBRID_RESOURCE_SYSTEM.md +330 -0
- package/libs/instance-factories/tools/templates/mcp/static/docs/deployments/EXTENSION_DEPLOYMENT.md +552 -0
- package/libs/instance-factories/tools/templates/mcp/static/docs/deployments/LOCAL_DEPLOYMENT.md +164 -0
- package/libs/instance-factories/tools/templates/mcp/static/docs/deployments/WEB_DEPLOYMENT.md +247 -0
- package/libs/instance-factories/tools/templates/mcp/static/package.json +94 -0
- package/libs/instance-factories/tools/templates/mcp/static/scripts/build-enterprise.js +284 -0
- package/libs/instance-factories/tools/templates/mcp/static/scripts/build-extension.js +139 -0
- package/libs/instance-factories/tools/templates/mcp/static/scripts/build-local.js +74 -0
- package/libs/instance-factories/tools/templates/mcp/static/scripts/build-web.js +156 -0
- package/libs/instance-factories/tools/templates/mcp/static/scripts/copy-canonical-files.js +41 -0
- package/libs/instance-factories/tools/templates/mcp/static/scripts/test-deployments.js +259 -0
- package/libs/instance-factories/tools/templates/mcp/static/scripts/test-hybrid-resources.js +231 -0
- package/libs/instance-factories/tools/templates/mcp/static/scripts/test-hybrid-simple.js +196 -0
- package/libs/instance-factories/tools/templates/mcp/static/src/controllers/MCPServerController.ts +293 -0
- package/libs/instance-factories/tools/templates/mcp/static/src/events/EventEmitter.ts +90 -0
- package/libs/instance-factories/tools/templates/mcp/static/src/index.ts +24 -0
- package/libs/instance-factories/tools/templates/mcp/static/src/interfaces/ResourceProvider.ts +15 -0
- package/libs/instance-factories/tools/templates/mcp/static/src/models/LibrarySuggestion.ts +106 -0
- package/libs/instance-factories/tools/templates/mcp/static/src/models/SpecVerseResource.ts +75 -0
- package/libs/instance-factories/tools/templates/mcp/static/src/server/mcp-server.ts +239 -0
- package/libs/instance-factories/tools/templates/mcp/static/src/services/CLIProxyService.ts +1501 -0
- package/libs/instance-factories/tools/templates/mcp/static/src/services/EmbeddedResourcesAdapter.ts +211 -0
- package/libs/instance-factories/tools/templates/mcp/static/src/services/EntityModuleService.ts +308 -0
- package/libs/instance-factories/tools/templates/mcp/static/src/services/HybridResourcesProvider.ts +210 -0
- package/libs/instance-factories/tools/templates/mcp/static/src/services/LibraryToolsService.ts +356 -0
- package/libs/instance-factories/tools/templates/mcp/static/src/services/OrchestratorBridge.ts +522 -0
- package/libs/instance-factories/tools/templates/mcp/static/src/services/OrchestratorToolsService.ts +530 -0
- package/libs/instance-factories/tools/templates/mcp/static/src/services/PromptToolsService.ts +594 -0
- package/libs/instance-factories/tools/templates/mcp/static/src/services/ResourcesProviderService.ts +170 -0
- package/libs/instance-factories/tools/templates/mcp/static/src/tests/unit/CLIProxyService.init.test.ts +544 -0
- package/libs/instance-factories/tools/templates/mcp/static/src/tests/unit/CLIProxyService.test.ts +189 -0
- package/libs/instance-factories/tools/templates/mcp/static/src/tests/unit/ResourcesProviderService.test.ts +89 -0
- package/libs/instance-factories/tools/templates/mcp/static/src/types/index.ts +110 -0
- package/libs/instance-factories/tools/templates/mcp/static/tsconfig.json +28 -0
- package/libs/instance-factories/tools/templates/vscode/static/extension.ts +1195 -0
- package/libs/instance-factories/tools/templates/vscode/static/language-configuration.json +34 -0
- package/libs/instance-factories/tools/templates/vscode/static/schemas/specverse-v3-schema.json +4279 -0
- package/libs/instance-factories/tools/templates/vscode/static/syntaxes/specverse.tmLanguage.json +138 -0
- package/libs/instance-factories/tools/templates/vscode/static/themes/README.md +74 -0
- package/libs/instance-factories/tools/templates/vscode/static/themes/complete-specverse-colors.json +122 -0
- package/libs/instance-factories/tools/templates/vscode/static/themes/specverse-basic-theme.json +65 -0
- package/libs/instance-factories/tools/templates/vscode/static/themes/specverse-complete-theme.json +123 -0
- package/libs/instance-factories/tools/templates/vscode/static/themes/specverse-theme-colors.json +64 -0
- package/libs/instance-factories/tools/templates/vscode/vscode-extension-generator.ts +300 -0
- package/libs/instance-factories/tools/vscode.yaml +35 -0
- package/libs/instance-factories/validation/README.md +38 -0
- package/libs/instance-factories/validation/templates/zod/validation-generator.ts +46 -0
- package/libs/instance-factories/validation/zod.yaml +56 -0
- package/libs/instance-factories/views/README.md +62 -0
- package/libs/instance-factories/views/index.d.ts +13 -0
- package/libs/instance-factories/views/index.d.ts.map +1 -0
- package/libs/instance-factories/views/index.js +18 -0
- package/libs/instance-factories/views/index.js.map +1 -0
- package/libs/instance-factories/views/index.ts +45 -0
- package/libs/instance-factories/views/react-components.yaml +129 -0
- package/libs/instance-factories/views/templates/ARCHITECTURE.md +198 -0
- package/libs/instance-factories/views/templates/react/adapters/antd-adapter.ts +869 -0
- package/libs/instance-factories/views/templates/react/adapters/mui-adapter.ts +953 -0
- package/libs/instance-factories/views/templates/react/adapters/shadcn-adapter.ts +806 -0
- package/libs/instance-factories/views/templates/react/app-generator.ts +55 -0
- package/libs/instance-factories/views/templates/react/components-generator.ts +887 -0
- package/libs/instance-factories/views/templates/react/forms-generator.ts +343 -0
- package/libs/instance-factories/views/templates/react/frontend-package-json-generator.ts +57 -0
- package/libs/instance-factories/views/templates/react/hooks-generator.ts +122 -0
- package/libs/instance-factories/views/templates/react/index-css-generator.ts +14 -0
- package/libs/instance-factories/views/templates/react/index-html-generator.ts +34 -0
- package/libs/instance-factories/views/templates/react/main-tsx-generator.ts +29 -0
- package/libs/instance-factories/views/templates/react/react-component-generator.d.ts +152 -0
- package/libs/instance-factories/views/templates/react/react-component-generator.d.ts.map +1 -0
- package/libs/instance-factories/views/templates/react/react-component-generator.js +398 -0
- package/libs/instance-factories/views/templates/react/react-component-generator.js.map +1 -0
- package/libs/instance-factories/views/templates/react/react-component-generator.ts +533 -0
- package/libs/instance-factories/views/templates/react/router-generator.ts +197 -0
- package/libs/instance-factories/views/templates/react/router-generic-generator.ts +132 -0
- package/libs/instance-factories/views/templates/react/shared-utils-generator.ts +188 -0
- package/libs/instance-factories/views/templates/react/spec-json-generator.ts +17 -0
- package/libs/instance-factories/views/templates/react/types-generator.ts +76 -0
- package/libs/instance-factories/views/templates/react/views-metadata-generator.ts +42 -0
- package/libs/instance-factories/views/templates/react/vite-config-generator.ts +38 -0
- package/libs/instance-factories/views/templates/runtime/runtime-view-renderer.d.ts.map +1 -0
- package/libs/instance-factories/views/templates/runtime/runtime-view-renderer.js.map +1 -0
- package/libs/instance-factories/views/templates/runtime/runtime-view-renderer.ts +474 -0
- package/libs/instance-factories/views/templates/shared/__tests__/composite-patterns.test.ts +242 -0
- package/libs/instance-factories/views/templates/shared/adapter-types.d.ts +77 -0
- package/libs/instance-factories/views/templates/shared/adapter-types.d.ts.map +1 -0
- package/libs/instance-factories/views/templates/shared/adapter-types.js +47 -0
- package/libs/instance-factories/views/templates/shared/adapter-types.js.map +1 -0
- package/libs/instance-factories/views/templates/shared/adapter-types.ts +142 -0
- package/libs/instance-factories/views/templates/shared/atomic-components-registry.d.ts +63 -0
- package/libs/instance-factories/views/templates/shared/atomic-components-registry.d.ts.map +1 -0
- package/libs/instance-factories/views/templates/shared/atomic-components-registry.js +822 -0
- package/libs/instance-factories/views/templates/shared/atomic-components-registry.js.map +1 -0
- package/libs/instance-factories/views/templates/shared/atomic-components-registry.ts +908 -0
- package/libs/instance-factories/views/templates/shared/base-generator.d.ts +247 -0
- package/libs/instance-factories/views/templates/shared/base-generator.d.ts.map +1 -0
- package/libs/instance-factories/views/templates/shared/base-generator.js +363 -0
- package/libs/instance-factories/views/templates/shared/base-generator.js.map +1 -0
- package/libs/instance-factories/views/templates/shared/base-generator.ts +608 -0
- package/libs/instance-factories/views/templates/shared/component-metadata.d.ts +254 -0
- package/libs/instance-factories/views/templates/shared/component-metadata.d.ts.map +1 -0
- package/libs/instance-factories/views/templates/shared/component-metadata.js +602 -0
- package/libs/instance-factories/views/templates/shared/component-metadata.js.map +1 -0
- package/libs/instance-factories/views/templates/shared/component-metadata.ts +803 -0
- package/libs/instance-factories/views/templates/shared/composite-pattern-types.ts +250 -0
- package/libs/instance-factories/views/templates/shared/composite-patterns.ts +535 -0
- package/libs/instance-factories/views/templates/shared/index.ts +68 -0
- package/libs/instance-factories/views/templates/shared/pattern-validator.ts +279 -0
- package/libs/instance-factories/views/templates/shared/property-mapper.d.ts +149 -0
- package/libs/instance-factories/views/templates/shared/property-mapper.d.ts.map +1 -0
- package/libs/instance-factories/views/templates/shared/property-mapper.js +580 -0
- package/libs/instance-factories/views/templates/shared/property-mapper.js.map +1 -0
- package/libs/instance-factories/views/templates/shared/property-mapper.ts +700 -0
- package/libs/instance-factories/views/templates/shared/syntax-mapper.d.ts +143 -0
- package/libs/instance-factories/views/templates/shared/syntax-mapper.d.ts.map +1 -0
- package/libs/instance-factories/views/templates/shared/syntax-mapper.js +420 -0
- package/libs/instance-factories/views/templates/shared/syntax-mapper.js.map +1 -0
- package/libs/instance-factories/views/templates/shared/syntax-mapper.ts +539 -0
- package/package.json +63 -0
|
@@ -0,0 +1,1329 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core Rule Engine for V3.1 Inference System
|
|
3
|
+
* Provides pattern matching and rule application for both logical and deployment inference
|
|
4
|
+
*/
|
|
5
|
+
import * as yaml from 'js-yaml';
|
|
6
|
+
export class RuleEngine {
|
|
7
|
+
debug;
|
|
8
|
+
rules = new Map();
|
|
9
|
+
conditionCache = new Map();
|
|
10
|
+
constructor(debug = false) {
|
|
11
|
+
this.debug = debug;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Load rules for a specific category (e.g., 'controllers', 'services')
|
|
15
|
+
*/
|
|
16
|
+
loadRules(category, rules) {
|
|
17
|
+
const validation = {
|
|
18
|
+
valid: true,
|
|
19
|
+
errors: [],
|
|
20
|
+
warnings: []
|
|
21
|
+
};
|
|
22
|
+
// Validate rules before loading
|
|
23
|
+
for (const rule of rules) {
|
|
24
|
+
const ruleValidation = this.validateRule(rule);
|
|
25
|
+
validation.errors.push(...ruleValidation.errors);
|
|
26
|
+
validation.warnings.push(...ruleValidation.warnings);
|
|
27
|
+
if (ruleValidation.errors.length > 0) {
|
|
28
|
+
validation.valid = false;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
if (validation.valid) {
|
|
32
|
+
// Sort rules by priority (highest first)
|
|
33
|
+
const sortedRules = [...rules].sort((a, b) => b.priority - a.priority);
|
|
34
|
+
this.rules.set(category, sortedRules);
|
|
35
|
+
if (this.debug) {
|
|
36
|
+
console.log(`Loaded ${rules.length} rules for category: ${category}`);
|
|
37
|
+
console.log(`Rule priorities: ${sortedRules.map(r => `${r.name}:${r.priority}`).join(', ')}`);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return validation;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Find all matching rules for input in a category
|
|
44
|
+
*/
|
|
45
|
+
findMatches(category, input, context) {
|
|
46
|
+
const categoryRules = this.rules.get(category) || [];
|
|
47
|
+
const matches = [];
|
|
48
|
+
for (const rule of categoryRules) {
|
|
49
|
+
if (this.evaluateCondition(rule, input, context)) {
|
|
50
|
+
matches.push(rule);
|
|
51
|
+
if (this.debug) {
|
|
52
|
+
console.log(`Rule matched: ${rule.name} (priority: ${rule.priority})`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return matches;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Apply a rule to generate output
|
|
60
|
+
*/
|
|
61
|
+
apply(rule, input, context) {
|
|
62
|
+
try {
|
|
63
|
+
// Create template context
|
|
64
|
+
const templateContext = this.buildTemplateContext(input, context);
|
|
65
|
+
// Apply template based on type
|
|
66
|
+
switch (rule.template.type) {
|
|
67
|
+
case 'handlebars':
|
|
68
|
+
return this.applyHandlebarsTemplate(rule, templateContext);
|
|
69
|
+
case 'json':
|
|
70
|
+
return this.applyJsonTemplate(rule, templateContext);
|
|
71
|
+
case 'yaml':
|
|
72
|
+
return this.applyYamlTemplate(rule, templateContext);
|
|
73
|
+
case 'specly':
|
|
74
|
+
return this.applySpeclyTemplate(rule, templateContext);
|
|
75
|
+
default:
|
|
76
|
+
throw new Error(`Unsupported template type: ${rule.template.type}`);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
throw new Error(`Failed to apply rule '${rule.name}': ${error instanceof Error ? error.message : String(error)}`);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Get all loaded rules for debugging
|
|
85
|
+
*/
|
|
86
|
+
getAllRules() {
|
|
87
|
+
return new Map(this.rules);
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Clear all loaded rules
|
|
91
|
+
*/
|
|
92
|
+
clearRules() {
|
|
93
|
+
this.rules.clear();
|
|
94
|
+
this.conditionCache.clear();
|
|
95
|
+
}
|
|
96
|
+
// ===============================
|
|
97
|
+
// Private Implementation
|
|
98
|
+
// ===============================
|
|
99
|
+
validateRule(rule) {
|
|
100
|
+
const result = {
|
|
101
|
+
valid: true,
|
|
102
|
+
errors: [],
|
|
103
|
+
warnings: []
|
|
104
|
+
};
|
|
105
|
+
// Validate required fields
|
|
106
|
+
if (!rule.name) {
|
|
107
|
+
result.errors.push({
|
|
108
|
+
code: 'MISSING_NAME',
|
|
109
|
+
message: 'Rule must have a name',
|
|
110
|
+
location: 'rule.name'
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
if (!rule.pattern) {
|
|
114
|
+
result.errors.push({
|
|
115
|
+
code: 'MISSING_PATTERN',
|
|
116
|
+
message: 'Rule must have a pattern',
|
|
117
|
+
location: 'rule.pattern'
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
if (!rule.template || !rule.template.content) {
|
|
121
|
+
result.errors.push({
|
|
122
|
+
code: 'MISSING_TEMPLATE',
|
|
123
|
+
message: 'Rule must have template content',
|
|
124
|
+
location: 'rule.template.content'
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
// Validate priority
|
|
128
|
+
if (typeof rule.priority !== 'number') {
|
|
129
|
+
result.errors.push({
|
|
130
|
+
code: 'INVALID_PRIORITY',
|
|
131
|
+
message: 'Rule priority must be a number',
|
|
132
|
+
location: 'rule.priority'
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
// Validate condition syntax if present
|
|
136
|
+
if (rule.condition) {
|
|
137
|
+
try {
|
|
138
|
+
// Basic syntax check - attempt to create function
|
|
139
|
+
new Function('input', 'context', `return ${rule.condition}`);
|
|
140
|
+
}
|
|
141
|
+
catch (error) {
|
|
142
|
+
result.errors.push({
|
|
143
|
+
code: 'INVALID_CONDITION',
|
|
144
|
+
message: `Invalid condition syntax: ${error instanceof Error ? error.message : String(error)}`,
|
|
145
|
+
location: 'rule.condition'
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
// Validate template type
|
|
150
|
+
const validTemplateTypes = ['handlebars', 'json', 'yaml', 'specly'];
|
|
151
|
+
if (rule.template && !validTemplateTypes.includes(rule.template.type)) {
|
|
152
|
+
result.errors.push({
|
|
153
|
+
code: 'INVALID_TEMPLATE_TYPE',
|
|
154
|
+
message: `Template type must be one of: ${validTemplateTypes.join(', ')}`,
|
|
155
|
+
location: 'rule.template.type'
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
// Warnings for best practices
|
|
159
|
+
if (!rule.description) {
|
|
160
|
+
result.warnings.push({
|
|
161
|
+
code: 'MISSING_DESCRIPTION',
|
|
162
|
+
message: 'Rule should have a description for documentation',
|
|
163
|
+
location: 'rule.description'
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
if (rule.priority === 0) {
|
|
167
|
+
result.warnings.push({
|
|
168
|
+
code: 'ZERO_PRIORITY',
|
|
169
|
+
message: 'Rule priority of 0 may cause unexpected ordering',
|
|
170
|
+
location: 'rule.priority'
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
result.valid = result.errors.length === 0;
|
|
174
|
+
return result;
|
|
175
|
+
}
|
|
176
|
+
evaluateCondition(rule, input, context) {
|
|
177
|
+
if (!rule.condition) {
|
|
178
|
+
return true; // No condition means always matches
|
|
179
|
+
}
|
|
180
|
+
const cacheKey = `${rule.name}:${JSON.stringify(input)}:${JSON.stringify(context)}`;
|
|
181
|
+
if (this.conditionCache.has(cacheKey)) {
|
|
182
|
+
return this.conditionCache.get(cacheKey);
|
|
183
|
+
}
|
|
184
|
+
try {
|
|
185
|
+
// Create safe evaluation context
|
|
186
|
+
const evalContext = {
|
|
187
|
+
input,
|
|
188
|
+
context,
|
|
189
|
+
model: context.currentModel,
|
|
190
|
+
relationships: context.relationships,
|
|
191
|
+
// Helper functions for common conditions
|
|
192
|
+
hasParentRelationship: () => {
|
|
193
|
+
return (context.relationships?.parentRelationships?.length || 0) > 0;
|
|
194
|
+
},
|
|
195
|
+
hasChildRelationships: () => {
|
|
196
|
+
return (context.relationships?.childRelationships?.length || 0) > 0;
|
|
197
|
+
},
|
|
198
|
+
hasLifecycle: () => {
|
|
199
|
+
return context.currentModel?.lifecycle !== undefined;
|
|
200
|
+
},
|
|
201
|
+
belongsTo: (targetModel) => {
|
|
202
|
+
return context.relationships?.parentRelationships?.some(r => r.targetModel === targetModel) || false;
|
|
203
|
+
},
|
|
204
|
+
hasMany: (targetModel) => {
|
|
205
|
+
return context.relationships?.childRelationships?.some(r => r.name === targetModel) || false;
|
|
206
|
+
}
|
|
207
|
+
};
|
|
208
|
+
// Evaluate condition safely
|
|
209
|
+
const conditionFunc = new Function('input', 'context', 'model', 'relationships', 'hasParentRelationship', 'hasChildRelationships', 'hasLifecycle', 'belongsTo', 'hasMany', `
|
|
210
|
+
return ${rule.condition}
|
|
211
|
+
`);
|
|
212
|
+
const result = conditionFunc(evalContext.input, evalContext.context, evalContext.model, evalContext.relationships, evalContext.hasParentRelationship, evalContext.hasChildRelationships, evalContext.hasLifecycle, evalContext.belongsTo, evalContext.hasMany);
|
|
213
|
+
this.conditionCache.set(cacheKey, result);
|
|
214
|
+
return result;
|
|
215
|
+
}
|
|
216
|
+
catch (error) {
|
|
217
|
+
if (this.debug) {
|
|
218
|
+
console.warn(`Condition evaluation failed for rule '${rule.name}': ${error instanceof Error ? error.message : String(error)}`);
|
|
219
|
+
}
|
|
220
|
+
return false;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
buildTemplateContext(input, context) {
|
|
224
|
+
const model = context.currentModel;
|
|
225
|
+
const relationships = context.relationships;
|
|
226
|
+
return {
|
|
227
|
+
// Input data
|
|
228
|
+
input,
|
|
229
|
+
model,
|
|
230
|
+
modelName: model?.name,
|
|
231
|
+
// Context data
|
|
232
|
+
context,
|
|
233
|
+
version: context.version,
|
|
234
|
+
models: context.models,
|
|
235
|
+
// Relationship analysis
|
|
236
|
+
relationships,
|
|
237
|
+
parentRelationships: relationships?.parentRelationships || [],
|
|
238
|
+
childRelationships: relationships?.childRelationships || [],
|
|
239
|
+
manyToManyRelationships: relationships?.manyToManyRelationships || [],
|
|
240
|
+
// Naming helpers
|
|
241
|
+
controllerName: model?.name ? `${model.name}Controller` : undefined,
|
|
242
|
+
serviceName: model?.name ? `${model.name}Service` : undefined,
|
|
243
|
+
// Common patterns
|
|
244
|
+
curedOps: ['create', 'update', 'retrieve', 'retrieve_many', 'evolve', 'delete'],
|
|
245
|
+
// Helper functions for templates
|
|
246
|
+
humanize: (str) => {
|
|
247
|
+
if (typeof str !== 'string') {
|
|
248
|
+
return String(str || '');
|
|
249
|
+
}
|
|
250
|
+
return str
|
|
251
|
+
.replace(/([A-Z])/g, ' $1')
|
|
252
|
+
.replace(/^./, c => c.toUpperCase())
|
|
253
|
+
.trim();
|
|
254
|
+
},
|
|
255
|
+
camelCase: (str) => {
|
|
256
|
+
const s = typeof str === 'string' ? str : String(str || '');
|
|
257
|
+
return s.charAt(0).toLowerCase() + s.slice(1);
|
|
258
|
+
},
|
|
259
|
+
pascalCase: (str) => {
|
|
260
|
+
const s = typeof str === 'string' ? str : String(str || '');
|
|
261
|
+
return s.charAt(0).toUpperCase() + s.slice(1);
|
|
262
|
+
},
|
|
263
|
+
pluralize: (str) => {
|
|
264
|
+
const s = typeof str === 'string' ? str : String(str || '');
|
|
265
|
+
if (s.endsWith('y')) {
|
|
266
|
+
return s.slice(0, -1) + 'ies';
|
|
267
|
+
}
|
|
268
|
+
if (s.endsWith('s') || s.endsWith('x') || s.endsWith('z') || s.endsWith('ch') || s.endsWith('sh')) {
|
|
269
|
+
return s + 'es';
|
|
270
|
+
}
|
|
271
|
+
return s + 's';
|
|
272
|
+
}
|
|
273
|
+
};
|
|
274
|
+
}
|
|
275
|
+
applyHandlebarsTemplate(rule, templateContext) {
|
|
276
|
+
// For now, we'll do a simple template substitution
|
|
277
|
+
// In a full implementation, we'd use the Handlebars library
|
|
278
|
+
let result = Array.isArray(rule.template.content)
|
|
279
|
+
? rule.template.content.join('\n')
|
|
280
|
+
: rule.template.content;
|
|
281
|
+
// Ensure result is a string
|
|
282
|
+
if (typeof result !== 'string') {
|
|
283
|
+
throw new Error(`Template content must be string or string array, got ${typeof result} in applyHandlebarsTemplate`);
|
|
284
|
+
}
|
|
285
|
+
// Simple variable substitution for common patterns
|
|
286
|
+
result = result.replace(/\{\{modelName\}\}/g, templateContext.modelName || '');
|
|
287
|
+
result = result.replace(/\{\{controllerName\}\}/g, templateContext.controllerName || '');
|
|
288
|
+
result = result.replace(/\{\{serviceName\}\}/g, templateContext.serviceName || '');
|
|
289
|
+
// Handle arrays and objects in a basic way
|
|
290
|
+
if (templateContext.parentRelationships?.length > 0) {
|
|
291
|
+
result = result.replace(/\{\{#each parentRelationships\}\}/g, '');
|
|
292
|
+
result = result.replace(/\{\{\/each\}\}/g, '');
|
|
293
|
+
result = result.replace(/\{\{targetModel\}\}/g, templateContext.parentRelationships[0].targetModel);
|
|
294
|
+
}
|
|
295
|
+
try {
|
|
296
|
+
// Try to parse as YAML/JSON
|
|
297
|
+
if (result.trim().startsWith('{') || result.trim().includes(':')) {
|
|
298
|
+
return JSON.parse(result);
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
catch {
|
|
302
|
+
// If parsing fails, return as string
|
|
303
|
+
}
|
|
304
|
+
return result;
|
|
305
|
+
}
|
|
306
|
+
applyJsonTemplate(rule, templateContext) {
|
|
307
|
+
try {
|
|
308
|
+
let template = Array.isArray(rule.template.content)
|
|
309
|
+
? rule.template.content.join('\n')
|
|
310
|
+
: rule.template.content;
|
|
311
|
+
// Simple variable substitution
|
|
312
|
+
template = template.replace(/\{\{(\w+)\}\}/g, (match, key) => {
|
|
313
|
+
return templateContext[key] || match;
|
|
314
|
+
});
|
|
315
|
+
return JSON.parse(template);
|
|
316
|
+
}
|
|
317
|
+
catch (error) {
|
|
318
|
+
throw new Error(`Failed to parse JSON template: ${error instanceof Error ? error.message : String(error)}`);
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
applyYamlTemplate(rule, templateContext) {
|
|
322
|
+
try {
|
|
323
|
+
let template = Array.isArray(rule.template.content)
|
|
324
|
+
? rule.template.content.join('\n')
|
|
325
|
+
: rule.template.content;
|
|
326
|
+
// Ensure template is a string
|
|
327
|
+
if (typeof template !== 'string') {
|
|
328
|
+
throw new Error(`Template content must be string or string array, got ${typeof template}`);
|
|
329
|
+
}
|
|
330
|
+
// Apply basic variable substitution
|
|
331
|
+
template = template.replace(/\{\{modelName\}\}/g, templateContext.modelName || '');
|
|
332
|
+
template = template.replace(/\{\{controllerName\}\}/g, templateContext.controllerName || '');
|
|
333
|
+
template = template.replace(/\{\{serviceName\}\}/g, templateContext.serviceName || '');
|
|
334
|
+
// Handle parent relationships processing
|
|
335
|
+
if (templateContext.relationships?.parentRelationships?.length > 0) {
|
|
336
|
+
const parentRel = templateContext.relationships.parentRelationships[0];
|
|
337
|
+
// Process the each loop for parent relationships
|
|
338
|
+
template = template.replace(/\{\{#each relationships\.parentRelationships\}\}/g, '');
|
|
339
|
+
template = template.replace(/\{\{\/each\}\}/g, '');
|
|
340
|
+
// Replace context variables
|
|
341
|
+
template = template.replace(/\{\{targetModel\}\}/g, parentRel.targetModel || '');
|
|
342
|
+
template = template.replace(/\{\{\.\.\/modelName\}\}/g, templateContext.modelName || '');
|
|
343
|
+
// Handle nested attribute loops
|
|
344
|
+
template = template.replace(/\{\{#each \.\.\/model\.attributes\}\}/g, '');
|
|
345
|
+
// Process the required conditional specifically for attribute loops
|
|
346
|
+
template = template.replace(/\{\{#if required\}\}([^]*?)\{\{\/if\}\}/g, (match, content) => {
|
|
347
|
+
// For attributes, assume required if we're in parent relationship context
|
|
348
|
+
return content;
|
|
349
|
+
});
|
|
350
|
+
template = template.replace(/\{\{name\}\}/g, 'sampleAttribute');
|
|
351
|
+
}
|
|
352
|
+
// Handle many-to-many relationships processing
|
|
353
|
+
if (templateContext.relationships?.manyToManyRelationships?.length > 0) {
|
|
354
|
+
const manyToManyRel = templateContext.relationships.manyToManyRelationships[0];
|
|
355
|
+
// Process the each loop for many-to-many relationships
|
|
356
|
+
template = template.replace(/\{\{#each relationships\.manyToManyRelationships\}\}/g, '');
|
|
357
|
+
template = template.replace(/\{\{\/each\}\}/g, '');
|
|
358
|
+
// Replace context variables
|
|
359
|
+
template = template.replace(/\{\{targetModel\}\}/g, manyToManyRel.targetModel || '');
|
|
360
|
+
template = template.replace(/\{\{\.\.\/modelName\}\}/g, templateContext.modelName || '');
|
|
361
|
+
}
|
|
362
|
+
// Use the shared handlebars processing that handles all conditionals consistently
|
|
363
|
+
template = this.processSpeclyHandlebars(template, templateContext);
|
|
364
|
+
// Clean up any double empty lines that might confuse YAML parser
|
|
365
|
+
template = template.replace(/\n\n+/g, '\n\n');
|
|
366
|
+
// Template processing completed
|
|
367
|
+
// Handlebars processing already done above
|
|
368
|
+
// Parse the processed template as YAML
|
|
369
|
+
const result = yaml.load(template);
|
|
370
|
+
return result;
|
|
371
|
+
}
|
|
372
|
+
catch (error) {
|
|
373
|
+
throw new Error(`Failed to parse YAML template: ${error instanceof Error ? error.message : String(error)}`);
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
applySpeclyTemplate(rule, templateContext) {
|
|
377
|
+
try {
|
|
378
|
+
// For controller rules, return a ControllerSpec object instead of a string
|
|
379
|
+
if (rule.pattern === 'StandardCURED') {
|
|
380
|
+
return this.generateCuredControllerSpec(templateContext);
|
|
381
|
+
}
|
|
382
|
+
// For service rules, return ServiceSpec objects
|
|
383
|
+
if (rule.pattern === 'ProcessingService') {
|
|
384
|
+
return this.generateProcessingServiceSpec(templateContext);
|
|
385
|
+
}
|
|
386
|
+
if (rule.pattern === 'ValidationService') {
|
|
387
|
+
return this.generateValidationServiceSpec(templateContext);
|
|
388
|
+
}
|
|
389
|
+
// For event rules, return EventSpec objects
|
|
390
|
+
if (rule.pattern === 'StandardEvents') {
|
|
391
|
+
return this.generateStandardEventsSpec(templateContext);
|
|
392
|
+
}
|
|
393
|
+
if (rule.pattern === 'RelationshipEvents') {
|
|
394
|
+
return this.generateRelationshipEventsSpec(templateContext);
|
|
395
|
+
}
|
|
396
|
+
// For view rules, return ViewSpec objects
|
|
397
|
+
if (rule.pattern === 'EnhancedListView' || rule.pattern === 'AnalyticsView') {
|
|
398
|
+
return this.generateViewSpec(rule.pattern, templateContext);
|
|
399
|
+
}
|
|
400
|
+
// For additional service patterns
|
|
401
|
+
if (rule.pattern === 'IntegrationService') {
|
|
402
|
+
return this.generateIntegrationServiceSpec(templateContext);
|
|
403
|
+
}
|
|
404
|
+
if (rule.pattern === 'LifecycleService') {
|
|
405
|
+
return this.generateLifecycleServiceSpec(templateContext);
|
|
406
|
+
}
|
|
407
|
+
if (rule.pattern === 'RelationshipService') {
|
|
408
|
+
return this.generateRelationshipServiceSpec(templateContext);
|
|
409
|
+
}
|
|
410
|
+
// For other specly templates, process as string
|
|
411
|
+
let template = Array.isArray(rule.template.content)
|
|
412
|
+
? rule.template.content.join('\n')
|
|
413
|
+
: rule.template.content;
|
|
414
|
+
// Apply basic variable substitution
|
|
415
|
+
template = template.replace(/\{\{modelName\}\}/g, templateContext.modelName || '');
|
|
416
|
+
template = template.replace(/\{\{controllerName\}\}/g, templateContext.controllerName || '');
|
|
417
|
+
template = template.replace(/\{\{serviceName\}\}/g, templateContext.serviceName || '');
|
|
418
|
+
// Process conditionals and loops
|
|
419
|
+
template = this.processSpeclyHandlebars(template, templateContext);
|
|
420
|
+
return template;
|
|
421
|
+
}
|
|
422
|
+
catch (error) {
|
|
423
|
+
throw new Error(`Failed to process Specly template: ${error instanceof Error ? error.message : String(error)}`);
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
generateCuredControllerSpec(context) {
|
|
427
|
+
const modelName = context.modelName || 'Unknown';
|
|
428
|
+
// Build CURED operations spec
|
|
429
|
+
const curedOps = {
|
|
430
|
+
create: {
|
|
431
|
+
parameters: {
|
|
432
|
+
data: `${modelName} required`
|
|
433
|
+
},
|
|
434
|
+
returns: modelName,
|
|
435
|
+
requires: [
|
|
436
|
+
`${modelName} data is valid`
|
|
437
|
+
],
|
|
438
|
+
ensures: [
|
|
439
|
+
`${modelName} created with unique ID`,
|
|
440
|
+
`${modelName} persisted to storage`
|
|
441
|
+
],
|
|
442
|
+
publishes: [`${modelName}Created`]
|
|
443
|
+
},
|
|
444
|
+
retrieve: {
|
|
445
|
+
parameters: {
|
|
446
|
+
id: 'UUID required'
|
|
447
|
+
},
|
|
448
|
+
returns: modelName,
|
|
449
|
+
requires: [`${modelName} with ID exists`],
|
|
450
|
+
ensures: [`Returns complete ${modelName} details`]
|
|
451
|
+
},
|
|
452
|
+
retrieve_many: {
|
|
453
|
+
parameters: {
|
|
454
|
+
filters: `${modelName}Filter optional`,
|
|
455
|
+
limit: 'Integer default=20',
|
|
456
|
+
offset: 'Integer default=0'
|
|
457
|
+
},
|
|
458
|
+
returns: `Array[${modelName}]`,
|
|
459
|
+
ensures: [
|
|
460
|
+
`Returns paginated list of ${modelName}s`,
|
|
461
|
+
`Applies filters if specified`
|
|
462
|
+
]
|
|
463
|
+
},
|
|
464
|
+
update: {
|
|
465
|
+
parameters: {
|
|
466
|
+
id: 'UUID required',
|
|
467
|
+
updates: `Object required`
|
|
468
|
+
},
|
|
469
|
+
returns: modelName,
|
|
470
|
+
requires: [
|
|
471
|
+
`${modelName} with ID exists`,
|
|
472
|
+
`Update data is valid`
|
|
473
|
+
],
|
|
474
|
+
ensures: [
|
|
475
|
+
`${modelName} attributes updated`,
|
|
476
|
+
`Version number incremented`
|
|
477
|
+
],
|
|
478
|
+
publishes: [`${modelName}Updated`]
|
|
479
|
+
},
|
|
480
|
+
delete: {
|
|
481
|
+
parameters: {
|
|
482
|
+
id: 'UUID required',
|
|
483
|
+
soft: 'Boolean default=true'
|
|
484
|
+
},
|
|
485
|
+
returns: 'Boolean',
|
|
486
|
+
requires: [`${modelName} with ID exists`],
|
|
487
|
+
ensures: [`${modelName} marked as deleted`],
|
|
488
|
+
publishes: [`${modelName}Deleted`]
|
|
489
|
+
},
|
|
490
|
+
validate: {
|
|
491
|
+
parameters: {
|
|
492
|
+
data: `${modelName} required`,
|
|
493
|
+
operation: 'String required'
|
|
494
|
+
},
|
|
495
|
+
returns: 'ValidationResult',
|
|
496
|
+
requires: [
|
|
497
|
+
`Operation is one of: create, update, evolve`,
|
|
498
|
+
`Data structure matches ${modelName} schema`
|
|
499
|
+
],
|
|
500
|
+
ensures: [
|
|
501
|
+
`Returns validation status and errors`,
|
|
502
|
+
`No side effects - dry run only`
|
|
503
|
+
]
|
|
504
|
+
}
|
|
505
|
+
};
|
|
506
|
+
// Add dynamic required field validation
|
|
507
|
+
if (context.model?.attributes) {
|
|
508
|
+
const requiredFields = context.model.attributes.filter((attr) => attr.required);
|
|
509
|
+
if (requiredFields.length > 0) {
|
|
510
|
+
requiredFields.forEach((attr) => {
|
|
511
|
+
curedOps.create.requires.push(`${attr.name} is not empty`);
|
|
512
|
+
});
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
// Add lifecycle operations if model has lifecycle
|
|
516
|
+
if (context.model?.lifecycle) {
|
|
517
|
+
curedOps.evolve = {
|
|
518
|
+
parameters: {
|
|
519
|
+
id: 'UUID required',
|
|
520
|
+
from: `${modelName}State required`,
|
|
521
|
+
to: `${modelName}State required`,
|
|
522
|
+
reason: 'String optional'
|
|
523
|
+
},
|
|
524
|
+
returns: modelName,
|
|
525
|
+
requires: [
|
|
526
|
+
`${modelName} with ID exists`,
|
|
527
|
+
`${modelName} current state is 'from' state`,
|
|
528
|
+
`Transition from 'from' to 'to' is valid`
|
|
529
|
+
],
|
|
530
|
+
ensures: [
|
|
531
|
+
`${modelName} state changed to 'to' state`,
|
|
532
|
+
`State transition logged`
|
|
533
|
+
],
|
|
534
|
+
publishes: [`${modelName}Evolved`]
|
|
535
|
+
};
|
|
536
|
+
}
|
|
537
|
+
return {
|
|
538
|
+
description: `Auto-generated CURED controller for ${modelName}`,
|
|
539
|
+
model: modelName,
|
|
540
|
+
cured: curedOps
|
|
541
|
+
};
|
|
542
|
+
}
|
|
543
|
+
generateProcessingServiceSpec(context) {
|
|
544
|
+
const modelName = context.modelName || 'Unknown';
|
|
545
|
+
const operations = {
|
|
546
|
+
[`handle${modelName}Creation`]: {
|
|
547
|
+
parameters: {
|
|
548
|
+
event: `${modelName}CreatedEvent required`
|
|
549
|
+
},
|
|
550
|
+
returns: 'Void',
|
|
551
|
+
requires: ['Event data is valid'],
|
|
552
|
+
ensures: [
|
|
553
|
+
`${modelName} creation processing completed`,
|
|
554
|
+
'Related systems notified'
|
|
555
|
+
]
|
|
556
|
+
},
|
|
557
|
+
[`handle${modelName}Update`]: {
|
|
558
|
+
parameters: {
|
|
559
|
+
event: `${modelName}UpdatedEvent required`
|
|
560
|
+
},
|
|
561
|
+
returns: 'Void',
|
|
562
|
+
requires: ['Event data is valid'],
|
|
563
|
+
ensures: [
|
|
564
|
+
`${modelName} update processing completed`,
|
|
565
|
+
'Change propagated to dependent systems'
|
|
566
|
+
]
|
|
567
|
+
},
|
|
568
|
+
[`validate${modelName}`]: {
|
|
569
|
+
parameters: {
|
|
570
|
+
data: `${modelName} required`,
|
|
571
|
+
validationContext: 'Object optional'
|
|
572
|
+
},
|
|
573
|
+
returns: 'ValidationResult',
|
|
574
|
+
requires: [`${modelName} data is provided`],
|
|
575
|
+
ensures: [
|
|
576
|
+
'Complete validation performed',
|
|
577
|
+
'Business rules checked'
|
|
578
|
+
]
|
|
579
|
+
},
|
|
580
|
+
[`process${modelName}BusinessRules`]: {
|
|
581
|
+
parameters: {
|
|
582
|
+
id: 'UUID required',
|
|
583
|
+
ruleContext: 'Object required'
|
|
584
|
+
},
|
|
585
|
+
returns: 'BusinessRuleResult',
|
|
586
|
+
requires: [
|
|
587
|
+
`${modelName} exists`,
|
|
588
|
+
'Rule context is valid'
|
|
589
|
+
],
|
|
590
|
+
ensures: [
|
|
591
|
+
'All applicable business rules processed',
|
|
592
|
+
'Results documented'
|
|
593
|
+
]
|
|
594
|
+
}
|
|
595
|
+
};
|
|
596
|
+
const subscribes_to = {
|
|
597
|
+
[`${modelName}Created`]: `handle${modelName}Creation`,
|
|
598
|
+
[`${modelName}Updated`]: `handle${modelName}Update`
|
|
599
|
+
};
|
|
600
|
+
// Add lifecycle operations if model has lifecycle
|
|
601
|
+
if (context.model?.lifecycle) {
|
|
602
|
+
operations[`handle${modelName}Evolution`] = {
|
|
603
|
+
parameters: {
|
|
604
|
+
event: `${modelName}EvolvedEvent required`
|
|
605
|
+
},
|
|
606
|
+
returns: 'Void',
|
|
607
|
+
requires: ['Lifecycle transition is valid'],
|
|
608
|
+
ensures: [
|
|
609
|
+
'Lifecycle change processed',
|
|
610
|
+
'State-dependent actions triggered'
|
|
611
|
+
]
|
|
612
|
+
};
|
|
613
|
+
subscribes_to[`${modelName}Evolved`] = `handle${modelName}Evolution`;
|
|
614
|
+
}
|
|
615
|
+
return {
|
|
616
|
+
description: `Handles complex business logic and processing for ${modelName}`,
|
|
617
|
+
subscribes_to,
|
|
618
|
+
operations
|
|
619
|
+
};
|
|
620
|
+
}
|
|
621
|
+
generateValidationServiceSpec(context) {
|
|
622
|
+
const modelName = context.modelName || 'Unknown';
|
|
623
|
+
const operations = {
|
|
624
|
+
validateCreate: {
|
|
625
|
+
parameters: {
|
|
626
|
+
data: `${modelName} required`,
|
|
627
|
+
parentContext: 'Object optional'
|
|
628
|
+
},
|
|
629
|
+
returns: 'ValidationResult',
|
|
630
|
+
requires: [`${modelName} data is provided`],
|
|
631
|
+
ensures: [
|
|
632
|
+
'All create validations performed',
|
|
633
|
+
'Parent relationships validated',
|
|
634
|
+
'Business constraints checked'
|
|
635
|
+
]
|
|
636
|
+
},
|
|
637
|
+
validateUpdate: {
|
|
638
|
+
parameters: {
|
|
639
|
+
id: 'UUID required',
|
|
640
|
+
updates: 'Object required',
|
|
641
|
+
currentState: `${modelName} required`
|
|
642
|
+
},
|
|
643
|
+
returns: 'ValidationResult',
|
|
644
|
+
requires: [
|
|
645
|
+
`${modelName} exists`,
|
|
646
|
+
'Current state is provided'
|
|
647
|
+
],
|
|
648
|
+
ensures: [
|
|
649
|
+
'All update validations performed',
|
|
650
|
+
'State transition rules checked'
|
|
651
|
+
]
|
|
652
|
+
},
|
|
653
|
+
validateBusinessRules: {
|
|
654
|
+
parameters: {
|
|
655
|
+
data: `${modelName} required`,
|
|
656
|
+
ruleSet: 'String optional'
|
|
657
|
+
},
|
|
658
|
+
returns: 'BusinessRuleValidationResult',
|
|
659
|
+
ensures: [
|
|
660
|
+
'All business rules validated',
|
|
661
|
+
'Cross-model dependencies checked'
|
|
662
|
+
]
|
|
663
|
+
}
|
|
664
|
+
};
|
|
665
|
+
// Add lifecycle validation if model has lifecycle
|
|
666
|
+
if (context.model?.lifecycle) {
|
|
667
|
+
operations.validateStateTransition = {
|
|
668
|
+
parameters: {
|
|
669
|
+
id: 'UUID required',
|
|
670
|
+
fromState: 'String required',
|
|
671
|
+
toState: 'String required',
|
|
672
|
+
transitionContext: 'Object optional'
|
|
673
|
+
},
|
|
674
|
+
returns: 'ValidationResult',
|
|
675
|
+
requires: [
|
|
676
|
+
`${modelName} exists`,
|
|
677
|
+
'States are valid'
|
|
678
|
+
],
|
|
679
|
+
ensures: [
|
|
680
|
+
'Transition rules validated',
|
|
681
|
+
'Prerequisites checked'
|
|
682
|
+
]
|
|
683
|
+
};
|
|
684
|
+
}
|
|
685
|
+
return {
|
|
686
|
+
description: `Provides comprehensive validation for ${modelName} data`,
|
|
687
|
+
operations
|
|
688
|
+
};
|
|
689
|
+
}
|
|
690
|
+
generateStandardEventsSpec(context) {
|
|
691
|
+
const modelName = context.modelName || 'Unknown';
|
|
692
|
+
const events = {};
|
|
693
|
+
// Created event
|
|
694
|
+
events[`${modelName}Created`] = {
|
|
695
|
+
description: `${modelName} was created`,
|
|
696
|
+
attributes: {
|
|
697
|
+
id: 'UUID required',
|
|
698
|
+
timestamp: 'DateTime required',
|
|
699
|
+
createdBy: 'UUID required',
|
|
700
|
+
version: 'Integer default=1'
|
|
701
|
+
}
|
|
702
|
+
};
|
|
703
|
+
// Updated event
|
|
704
|
+
events[`${modelName}Updated`] = {
|
|
705
|
+
description: `${modelName} was updated`,
|
|
706
|
+
attributes: {
|
|
707
|
+
id: 'UUID required',
|
|
708
|
+
changedFields: 'Array required',
|
|
709
|
+
previousValues: 'Object optional',
|
|
710
|
+
newValues: 'Object required',
|
|
711
|
+
timestamp: 'DateTime required',
|
|
712
|
+
updatedBy: 'UUID required',
|
|
713
|
+
version: 'Integer required'
|
|
714
|
+
}
|
|
715
|
+
};
|
|
716
|
+
// Deleted event
|
|
717
|
+
events[`${modelName}Deleted`] = {
|
|
718
|
+
description: `${modelName} was deleted`,
|
|
719
|
+
attributes: {
|
|
720
|
+
id: 'UUID required',
|
|
721
|
+
deletedBy: 'UUID required',
|
|
722
|
+
timestamp: 'DateTime required',
|
|
723
|
+
soft: 'Boolean default=true',
|
|
724
|
+
reason: 'String optional'
|
|
725
|
+
}
|
|
726
|
+
};
|
|
727
|
+
// Add key attributes from model to events
|
|
728
|
+
if (context.model?.attributes) {
|
|
729
|
+
const keyAttributes = context.model.attributes.filter((attr) => attr.name === 'name' || attr.name === 'title' || attr.name === 'status');
|
|
730
|
+
keyAttributes.forEach((attr) => {
|
|
731
|
+
events[`${modelName}Created`].attributes[attr.name] = `${attr.type} required`;
|
|
732
|
+
events[`${modelName}Updated`].attributes[attr.name] = `${attr.type} optional`;
|
|
733
|
+
if (attr.name === 'name') {
|
|
734
|
+
events[`${modelName}Deleted`].attributes[attr.name] = `${attr.type} optional`;
|
|
735
|
+
}
|
|
736
|
+
});
|
|
737
|
+
}
|
|
738
|
+
return events;
|
|
739
|
+
}
|
|
740
|
+
generateViewSpec(pattern, context) {
|
|
741
|
+
const modelName = context.modelName || 'Unknown';
|
|
742
|
+
if (pattern === 'EnhancedListView') {
|
|
743
|
+
return {
|
|
744
|
+
[`${modelName}EnhancedListView`]: {
|
|
745
|
+
type: 'list',
|
|
746
|
+
model: modelName,
|
|
747
|
+
description: `Enhanced list view for ${modelName} with advanced filtering`,
|
|
748
|
+
subscribes_to: [
|
|
749
|
+
`${modelName}Created`,
|
|
750
|
+
`${modelName}Updated`,
|
|
751
|
+
`${modelName}Deleted`
|
|
752
|
+
],
|
|
753
|
+
uiComponents: {
|
|
754
|
+
advancedSearch: {
|
|
755
|
+
type: 'AdvancedSearchInput',
|
|
756
|
+
properties: {
|
|
757
|
+
placeholder: `Search ${modelName}s...`,
|
|
758
|
+
debounce: 300,
|
|
759
|
+
enableSuggestions: true
|
|
760
|
+
}
|
|
761
|
+
},
|
|
762
|
+
advancedFilters: {
|
|
763
|
+
type: 'FilterPanel',
|
|
764
|
+
properties: {
|
|
765
|
+
model: modelName,
|
|
766
|
+
collapsible: true
|
|
767
|
+
}
|
|
768
|
+
},
|
|
769
|
+
[`${modelName.toLowerCase()}Table`]: {
|
|
770
|
+
type: 'DataTable',
|
|
771
|
+
properties: {
|
|
772
|
+
model: modelName,
|
|
773
|
+
pagination: {
|
|
774
|
+
enabled: true,
|
|
775
|
+
pageSize: 25,
|
|
776
|
+
showSizeSelector: true
|
|
777
|
+
},
|
|
778
|
+
selection: {
|
|
779
|
+
enabled: true,
|
|
780
|
+
multiSelect: true
|
|
781
|
+
},
|
|
782
|
+
sorting: {
|
|
783
|
+
enabled: true,
|
|
784
|
+
multiColumn: true
|
|
785
|
+
}
|
|
786
|
+
}
|
|
787
|
+
}
|
|
788
|
+
}
|
|
789
|
+
}
|
|
790
|
+
};
|
|
791
|
+
}
|
|
792
|
+
else if (pattern === 'AnalyticsView') {
|
|
793
|
+
return {
|
|
794
|
+
[`${modelName}AnalyticsView`]: {
|
|
795
|
+
type: 'dashboard',
|
|
796
|
+
model: modelName,
|
|
797
|
+
description: `Analytics and reporting dashboard for ${modelName}`,
|
|
798
|
+
subscribes_to: [
|
|
799
|
+
`${modelName}Created`,
|
|
800
|
+
`${modelName}Updated`,
|
|
801
|
+
`${modelName}Deleted`
|
|
802
|
+
],
|
|
803
|
+
uiComponents: {
|
|
804
|
+
keyMetrics: {
|
|
805
|
+
type: 'MetricsSummary',
|
|
806
|
+
properties: {
|
|
807
|
+
title: `${modelName} Key Metrics`,
|
|
808
|
+
refreshInterval: 300000
|
|
809
|
+
}
|
|
810
|
+
},
|
|
811
|
+
trendsChart: {
|
|
812
|
+
type: 'TimeSeriesChart',
|
|
813
|
+
properties: {
|
|
814
|
+
title: `${modelName} Trends Over Time`,
|
|
815
|
+
chartType: 'line',
|
|
816
|
+
dateRange: 'last30Days'
|
|
817
|
+
}
|
|
818
|
+
}
|
|
819
|
+
}
|
|
820
|
+
}
|
|
821
|
+
};
|
|
822
|
+
}
|
|
823
|
+
return {};
|
|
824
|
+
}
|
|
825
|
+
processSpeclyHandlebars(template, context) {
|
|
826
|
+
// Process {{#if model.lifecycle}} blocks
|
|
827
|
+
template = template.replace(/\{\{#if model\.lifecycle\}\}([^]*?)\{\{\/if\}\}/g, (match, content) => {
|
|
828
|
+
return context.model?.lifecycle ? content : '';
|
|
829
|
+
});
|
|
830
|
+
// Process {{#each model.attributes}} blocks
|
|
831
|
+
template = template.replace(/\{\{#each model\.attributes\}\}([^]*?)\{\{\/each\}\}/g, (match, content) => {
|
|
832
|
+
if (!context.model?.attributes)
|
|
833
|
+
return '';
|
|
834
|
+
if (typeof content !== 'string') {
|
|
835
|
+
throw new Error(`content in model.attributes each loop is not a string: ${typeof content}`);
|
|
836
|
+
}
|
|
837
|
+
return context.model.attributes.map((attr) => {
|
|
838
|
+
return content.replace(/\{\{name\}\}/g, attr.name)
|
|
839
|
+
.replace(/\{\{type\}\}/g, attr.type)
|
|
840
|
+
.replace(/\{\{required\}\}/g, attr.required ? 'true' : 'false');
|
|
841
|
+
}).join('');
|
|
842
|
+
});
|
|
843
|
+
// Process {{#if required}} blocks within attribute loops
|
|
844
|
+
template = template.replace(/\{\{#if required\}\}([^]*?)\{\{\/if\}\}/g, (match, content) => {
|
|
845
|
+
// This will be processed within the context of each attribute
|
|
846
|
+
return content; // Keep the content, the required check happens in the attribute loop
|
|
847
|
+
});
|
|
848
|
+
// Process {{#each relationships.cascadeDeleteTargets}} blocks
|
|
849
|
+
template = template.replace(/\{\{#each relationships\.cascadeDeleteTargets\}\}([^]*?)\{\{\/each\}\}/g, (match, content) => {
|
|
850
|
+
if (!context.relationships?.cascadeDeleteTargets)
|
|
851
|
+
return '';
|
|
852
|
+
return context.relationships.cascadeDeleteTargets.map((target) => {
|
|
853
|
+
return content.replace(/\{\{this\}\}/g, target);
|
|
854
|
+
}).join('');
|
|
855
|
+
});
|
|
856
|
+
// Process {{#each relationships.parentRelationships}} blocks
|
|
857
|
+
template = template.replace(/\{\{#each relationships\.parentRelationships\}\}([^]*?)\{\{\/each\}\}/g, (match, content) => {
|
|
858
|
+
if (!context.relationships?.parentRelationships)
|
|
859
|
+
return '';
|
|
860
|
+
return context.relationships.parentRelationships.map((rel) => {
|
|
861
|
+
let processedContent = content;
|
|
862
|
+
// Ensure content is a string
|
|
863
|
+
if (typeof processedContent !== 'string') {
|
|
864
|
+
throw new Error(`processedContent is not a string: ${typeof processedContent}`);
|
|
865
|
+
}
|
|
866
|
+
// Replace relationship-specific variables
|
|
867
|
+
processedContent = processedContent.replace(/\{\{targetModel\}\}/g, rel.targetModel)
|
|
868
|
+
.replace(/\{\{\.\.\/modelName\}\}/g, context.modelName || '')
|
|
869
|
+
.replace(/\{\{\.\.\/\.\.\/modelName\}\}/g, context.modelName || '');
|
|
870
|
+
// Process nested {{#each ../model.attributes}} blocks within this content
|
|
871
|
+
processedContent = processedContent.replace(/\{\{#each \.\.\/model\.attributes\}\}([^]*?)\{\{\/each\}\}/g, (nestedMatch, nestedContent) => {
|
|
872
|
+
if (!context.model?.attributes)
|
|
873
|
+
return '';
|
|
874
|
+
if (typeof nestedContent !== 'string') {
|
|
875
|
+
throw new Error(`nestedContent is not a string: ${typeof nestedContent}`);
|
|
876
|
+
}
|
|
877
|
+
return context.model.attributes.map((attr) => {
|
|
878
|
+
if (attr.required) {
|
|
879
|
+
return nestedContent.replace(/\{\{name\}\}/g, attr.name)
|
|
880
|
+
.replace(/\{\{type\}\}/g, attr.type);
|
|
881
|
+
}
|
|
882
|
+
return '';
|
|
883
|
+
}).join('');
|
|
884
|
+
});
|
|
885
|
+
// Process nested {{#if required}} blocks
|
|
886
|
+
processedContent = processedContent.replace(/\{\{#if required\}\}([^]*?)\{\{\/if\}\}/g, (ifMatch, ifContent) => {
|
|
887
|
+
return ifContent; // Keep content, filtering happens in the attributes loop
|
|
888
|
+
});
|
|
889
|
+
return processedContent;
|
|
890
|
+
}).join('');
|
|
891
|
+
});
|
|
892
|
+
return template;
|
|
893
|
+
}
|
|
894
|
+
processHandlebarsInJson(obj, context) {
|
|
895
|
+
if (typeof obj === 'string') {
|
|
896
|
+
// Process Handlebars variables
|
|
897
|
+
let result = obj.replace(/\{\{(\w+)\}\}/g, (match, key) => {
|
|
898
|
+
return context[key] || match;
|
|
899
|
+
});
|
|
900
|
+
// Process Handlebars conditionals and loops (basic implementation)
|
|
901
|
+
result = this.processHandlebarsConditionals(result, context);
|
|
902
|
+
return result;
|
|
903
|
+
}
|
|
904
|
+
else if (Array.isArray(obj)) {
|
|
905
|
+
return obj.map(item => this.processHandlebarsInJson(item, context));
|
|
906
|
+
}
|
|
907
|
+
else if (obj && typeof obj === 'object') {
|
|
908
|
+
const processed = {};
|
|
909
|
+
for (const [key, value] of Object.entries(obj)) {
|
|
910
|
+
const processedKey = this.processHandlebarsInJson(key, context);
|
|
911
|
+
processed[processedKey] = this.processHandlebarsInJson(value, context);
|
|
912
|
+
}
|
|
913
|
+
return processed;
|
|
914
|
+
}
|
|
915
|
+
return obj;
|
|
916
|
+
}
|
|
917
|
+
processHandlebarsConditionals(template, context) {
|
|
918
|
+
// Basic conditional processing for {{#if}} and {{#each}}
|
|
919
|
+
// This is a simplified version - a full implementation would use the Handlebars library
|
|
920
|
+
// Process {{#if model.lifecycle}} blocks
|
|
921
|
+
template = template.replace(/\{\{#if model\.lifecycle\}\}([^]*?)\{\{\/if\}\}/g, (match, content) => {
|
|
922
|
+
return context.model?.lifecycle ? content : '';
|
|
923
|
+
});
|
|
924
|
+
// Process {{#each model.attributes}} blocks
|
|
925
|
+
template = template.replace(/\{\{#each model\.attributes\}\}([^]*?)\{\{\/each\}\}/g, (match, content) => {
|
|
926
|
+
if (!context.model?.attributes)
|
|
927
|
+
return '';
|
|
928
|
+
return context.model.attributes.map((attr) => {
|
|
929
|
+
return content.replace(/\{\{name\}\}/g, attr.name)
|
|
930
|
+
.replace(/\{\{type\}\}/g, attr.type)
|
|
931
|
+
.replace(/\{\{required\}\}/g, attr.required);
|
|
932
|
+
}).join('');
|
|
933
|
+
});
|
|
934
|
+
return template;
|
|
935
|
+
}
|
|
936
|
+
convertJsonToSpecly(obj) {
|
|
937
|
+
// Convert processed JSON object to .specly syntax
|
|
938
|
+
let result = '';
|
|
939
|
+
if (obj.description) {
|
|
940
|
+
result += `description: "${obj.description}"\n`;
|
|
941
|
+
}
|
|
942
|
+
if (obj.model) {
|
|
943
|
+
result += `model: ${obj.model}\n`;
|
|
944
|
+
}
|
|
945
|
+
if (obj.actions) {
|
|
946
|
+
result += 'actions:\n';
|
|
947
|
+
for (const [actionName, action] of Object.entries(obj.actions)) {
|
|
948
|
+
result += ` ${actionName}:\n`;
|
|
949
|
+
const actionObj = action;
|
|
950
|
+
if (actionObj.parameters) {
|
|
951
|
+
result += ' parameters:\n';
|
|
952
|
+
for (const [paramName, paramType] of Object.entries(actionObj.parameters)) {
|
|
953
|
+
result += ` ${paramName}: ${paramType}\n`;
|
|
954
|
+
}
|
|
955
|
+
}
|
|
956
|
+
if (actionObj.returns) {
|
|
957
|
+
result += ` returns: ${actionObj.returns}\n`;
|
|
958
|
+
}
|
|
959
|
+
if (actionObj.requires && Array.isArray(actionObj.requires)) {
|
|
960
|
+
result += ' requires:\n';
|
|
961
|
+
for (const req of actionObj.requires) {
|
|
962
|
+
result += ` - "${req}"\n`;
|
|
963
|
+
}
|
|
964
|
+
}
|
|
965
|
+
if (actionObj.ensures && Array.isArray(actionObj.ensures)) {
|
|
966
|
+
result += ' ensures:\n';
|
|
967
|
+
for (const ens of actionObj.ensures) {
|
|
968
|
+
result += ` - "${ens}"\n`;
|
|
969
|
+
}
|
|
970
|
+
}
|
|
971
|
+
if (actionObj.publishes && Array.isArray(actionObj.publishes)) {
|
|
972
|
+
result += ' publishes:\n';
|
|
973
|
+
for (const pub of actionObj.publishes) {
|
|
974
|
+
result += ` - ${pub}\n`;
|
|
975
|
+
}
|
|
976
|
+
}
|
|
977
|
+
}
|
|
978
|
+
}
|
|
979
|
+
return result;
|
|
980
|
+
}
|
|
981
|
+
generateIntegrationServiceSpec(context) {
|
|
982
|
+
const modelName = context.modelName || 'Unknown';
|
|
983
|
+
const operations = {
|
|
984
|
+
syncToExternalSystems: {
|
|
985
|
+
parameters: {
|
|
986
|
+
event: `${modelName}CreatedEvent required`
|
|
987
|
+
},
|
|
988
|
+
returns: 'IntegrationResult',
|
|
989
|
+
requires: ['External systems are available'],
|
|
990
|
+
ensures: [
|
|
991
|
+
`${modelName} synchronized to all external systems`,
|
|
992
|
+
'Integration status tracked'
|
|
993
|
+
]
|
|
994
|
+
},
|
|
995
|
+
updateExternalSystems: {
|
|
996
|
+
parameters: {
|
|
997
|
+
event: `${modelName}UpdatedEvent required`
|
|
998
|
+
},
|
|
999
|
+
returns: 'IntegrationResult',
|
|
1000
|
+
requires: ['External systems are available'],
|
|
1001
|
+
ensures: [
|
|
1002
|
+
'Changes synchronized to external systems',
|
|
1003
|
+
'Sync conflicts resolved'
|
|
1004
|
+
]
|
|
1005
|
+
},
|
|
1006
|
+
removeFromExternalSystems: {
|
|
1007
|
+
parameters: {
|
|
1008
|
+
event: `${modelName}DeletedEvent required`
|
|
1009
|
+
},
|
|
1010
|
+
returns: 'IntegrationResult',
|
|
1011
|
+
ensures: [
|
|
1012
|
+
`${modelName} removed from external systems`,
|
|
1013
|
+
'Cleanup operations completed'
|
|
1014
|
+
]
|
|
1015
|
+
},
|
|
1016
|
+
pullFromExternalSystem: {
|
|
1017
|
+
parameters: {
|
|
1018
|
+
externalSystemId: 'String required',
|
|
1019
|
+
lastSyncTime: 'DateTime optional'
|
|
1020
|
+
},
|
|
1021
|
+
returns: `Array[${modelName}]`,
|
|
1022
|
+
requires: ['External system is accessible'],
|
|
1023
|
+
ensures: [
|
|
1024
|
+
'Latest data retrieved from external system',
|
|
1025
|
+
'Sync timestamp updated'
|
|
1026
|
+
]
|
|
1027
|
+
},
|
|
1028
|
+
pushToExternalSystem: {
|
|
1029
|
+
parameters: {
|
|
1030
|
+
id: 'UUID required',
|
|
1031
|
+
externalSystemId: 'String required',
|
|
1032
|
+
forceSync: 'Boolean default=false'
|
|
1033
|
+
},
|
|
1034
|
+
returns: 'IntegrationResult',
|
|
1035
|
+
requires: [
|
|
1036
|
+
`${modelName} exists`,
|
|
1037
|
+
'External system is accessible'
|
|
1038
|
+
],
|
|
1039
|
+
ensures: [
|
|
1040
|
+
`${modelName} pushed to external system`,
|
|
1041
|
+
'Integration status updated'
|
|
1042
|
+
]
|
|
1043
|
+
}
|
|
1044
|
+
};
|
|
1045
|
+
return {
|
|
1046
|
+
description: `Manages external system integration for ${modelName}`,
|
|
1047
|
+
subscribes_to: {
|
|
1048
|
+
[`${modelName}Created`]: 'syncToExternalSystems',
|
|
1049
|
+
[`${modelName}Updated`]: 'updateExternalSystems',
|
|
1050
|
+
[`${modelName}Deleted`]: 'removeFromExternalSystems'
|
|
1051
|
+
},
|
|
1052
|
+
operations
|
|
1053
|
+
};
|
|
1054
|
+
}
|
|
1055
|
+
generateLifecycleServiceSpec(context) {
|
|
1056
|
+
const modelName = context.modelName || 'Unknown';
|
|
1057
|
+
const operations = {
|
|
1058
|
+
handleStateChange: {
|
|
1059
|
+
parameters: {
|
|
1060
|
+
event: `${modelName}EvolvedEvent required`
|
|
1061
|
+
},
|
|
1062
|
+
returns: 'Void',
|
|
1063
|
+
requires: ['State transition is valid'],
|
|
1064
|
+
ensures: [
|
|
1065
|
+
'State-dependent actions triggered',
|
|
1066
|
+
'Transition side-effects processed'
|
|
1067
|
+
]
|
|
1068
|
+
},
|
|
1069
|
+
validateTransition: {
|
|
1070
|
+
parameters: {
|
|
1071
|
+
id: 'UUID required',
|
|
1072
|
+
fromState: 'String required',
|
|
1073
|
+
toState: 'String required',
|
|
1074
|
+
context: 'Object optional'
|
|
1075
|
+
},
|
|
1076
|
+
returns: 'TransitionValidationResult',
|
|
1077
|
+
requires: [
|
|
1078
|
+
`${modelName} exists`,
|
|
1079
|
+
'States are valid lifecycle states'
|
|
1080
|
+
],
|
|
1081
|
+
ensures: [
|
|
1082
|
+
'Transition prerequisites validated',
|
|
1083
|
+
'Business rules checked'
|
|
1084
|
+
]
|
|
1085
|
+
},
|
|
1086
|
+
getAvailableTransitions: {
|
|
1087
|
+
parameters: {
|
|
1088
|
+
[`${modelName}Id`]: 'UUID required'
|
|
1089
|
+
},
|
|
1090
|
+
returns: 'Array[TransitionOption]',
|
|
1091
|
+
requires: [`${modelName} exists`],
|
|
1092
|
+
ensures: ['Returns all valid transitions from current state']
|
|
1093
|
+
},
|
|
1094
|
+
getStateHistory: {
|
|
1095
|
+
parameters: {
|
|
1096
|
+
id: 'UUID required',
|
|
1097
|
+
limit: 'Integer default=50'
|
|
1098
|
+
},
|
|
1099
|
+
returns: 'Array[StateHistoryEntry]',
|
|
1100
|
+
requires: [`${modelName} exists`],
|
|
1101
|
+
ensures: ['Returns chronological state change history']
|
|
1102
|
+
}
|
|
1103
|
+
};
|
|
1104
|
+
// Add dynamic transition operations if lifecycle exists
|
|
1105
|
+
if (context.model?.lifecycle?.transitions) {
|
|
1106
|
+
context.model.lifecycle.transitions.forEach((transition) => {
|
|
1107
|
+
const operationName = `execute${transition.name}Transition`;
|
|
1108
|
+
operations[operationName] = {
|
|
1109
|
+
parameters: {
|
|
1110
|
+
id: 'UUID required',
|
|
1111
|
+
reason: 'String optional',
|
|
1112
|
+
context: 'Object optional'
|
|
1113
|
+
},
|
|
1114
|
+
returns: modelName,
|
|
1115
|
+
requires: [
|
|
1116
|
+
`${modelName} exists`,
|
|
1117
|
+
`${modelName} current state is '${transition.from}'`
|
|
1118
|
+
],
|
|
1119
|
+
ensures: [
|
|
1120
|
+
`${modelName} state changed to '${transition.to}'`,
|
|
1121
|
+
'Transition side-effects completed'
|
|
1122
|
+
]
|
|
1123
|
+
};
|
|
1124
|
+
});
|
|
1125
|
+
}
|
|
1126
|
+
return {
|
|
1127
|
+
description: `Manages lifecycle transitions and state-dependent behavior for ${modelName}`,
|
|
1128
|
+
subscribes_to: {
|
|
1129
|
+
[`${modelName}Evolved`]: 'handleStateChange'
|
|
1130
|
+
},
|
|
1131
|
+
operations
|
|
1132
|
+
};
|
|
1133
|
+
}
|
|
1134
|
+
generateRelationshipServiceSpec(context) {
|
|
1135
|
+
const modelName = context.modelName || 'Unknown';
|
|
1136
|
+
const operations = {
|
|
1137
|
+
handleChildAdded: {
|
|
1138
|
+
parameters: {
|
|
1139
|
+
event: 'ChildEntityEvent required'
|
|
1140
|
+
},
|
|
1141
|
+
returns: 'Void',
|
|
1142
|
+
ensures: [
|
|
1143
|
+
'Parent relationship established',
|
|
1144
|
+
'Relationship integrity maintained'
|
|
1145
|
+
]
|
|
1146
|
+
},
|
|
1147
|
+
handleChildRemoved: {
|
|
1148
|
+
parameters: {
|
|
1149
|
+
event: 'ChildEntityEvent required'
|
|
1150
|
+
},
|
|
1151
|
+
returns: 'Void',
|
|
1152
|
+
ensures: [
|
|
1153
|
+
'Parent relationship cleaned up',
|
|
1154
|
+
'Cascade rules applied'
|
|
1155
|
+
]
|
|
1156
|
+
},
|
|
1157
|
+
validateRelationshipIntegrity: {
|
|
1158
|
+
parameters: {
|
|
1159
|
+
id: 'UUID required',
|
|
1160
|
+
relationshipType: 'String optional'
|
|
1161
|
+
},
|
|
1162
|
+
returns: 'IntegrityValidationResult',
|
|
1163
|
+
requires: [`${modelName} exists`],
|
|
1164
|
+
ensures: [
|
|
1165
|
+
'All relationships validated for integrity',
|
|
1166
|
+
'Constraint violations identified'
|
|
1167
|
+
]
|
|
1168
|
+
},
|
|
1169
|
+
repairRelationshipIntegrity: {
|
|
1170
|
+
parameters: {
|
|
1171
|
+
id: 'UUID required',
|
|
1172
|
+
repairOptions: 'RepairOptions required'
|
|
1173
|
+
},
|
|
1174
|
+
returns: 'RepairResult',
|
|
1175
|
+
requires: [
|
|
1176
|
+
`${modelName} exists`,
|
|
1177
|
+
'Repair options are valid'
|
|
1178
|
+
],
|
|
1179
|
+
ensures: [
|
|
1180
|
+
'Relationship integrity issues resolved',
|
|
1181
|
+
'Repair actions logged'
|
|
1182
|
+
]
|
|
1183
|
+
}
|
|
1184
|
+
};
|
|
1185
|
+
const subscribes_to = {};
|
|
1186
|
+
// Add child relationship subscriptions
|
|
1187
|
+
if (context.relationships?.childRelationships) {
|
|
1188
|
+
context.relationships.childRelationships.forEach((rel) => {
|
|
1189
|
+
subscribes_to[`${rel.targetModel}Created`] = 'handleChildAdded';
|
|
1190
|
+
subscribes_to[`${rel.targetModel}Deleted`] = 'handleChildRemoved';
|
|
1191
|
+
});
|
|
1192
|
+
}
|
|
1193
|
+
// Add many-to-many relationship subscriptions and operations
|
|
1194
|
+
if (context.relationships?.manyToManyRelationships) {
|
|
1195
|
+
context.relationships.manyToManyRelationships.forEach((rel) => {
|
|
1196
|
+
subscribes_to[`${modelName}AssociatedWith${rel.targetModel}`] = 'handleAssociationAdded';
|
|
1197
|
+
subscribes_to[`${modelName}DisassociatedFrom${rel.targetModel}`] = 'handleAssociationRemoved';
|
|
1198
|
+
operations.handleAssociationAdded = {
|
|
1199
|
+
parameters: {
|
|
1200
|
+
event: 'AssociationEvent required'
|
|
1201
|
+
},
|
|
1202
|
+
returns: 'Void',
|
|
1203
|
+
ensures: [
|
|
1204
|
+
'Association established',
|
|
1205
|
+
'Association metadata updated'
|
|
1206
|
+
]
|
|
1207
|
+
};
|
|
1208
|
+
operations.handleAssociationRemoved = {
|
|
1209
|
+
parameters: {
|
|
1210
|
+
event: 'DisassociationEvent required'
|
|
1211
|
+
},
|
|
1212
|
+
returns: 'Void',
|
|
1213
|
+
ensures: [
|
|
1214
|
+
'Association removed',
|
|
1215
|
+
'Related data cleaned up'
|
|
1216
|
+
]
|
|
1217
|
+
};
|
|
1218
|
+
});
|
|
1219
|
+
}
|
|
1220
|
+
return {
|
|
1221
|
+
description: `Manages complex relationships and ensures relationship integrity for ${modelName}`,
|
|
1222
|
+
subscribes_to,
|
|
1223
|
+
operations
|
|
1224
|
+
};
|
|
1225
|
+
}
|
|
1226
|
+
generateRelationshipEventsSpec(context) {
|
|
1227
|
+
const modelName = context.modelName || 'Unknown';
|
|
1228
|
+
const events = {};
|
|
1229
|
+
// Parent relationship events
|
|
1230
|
+
if (context.relationships?.parentRelationships) {
|
|
1231
|
+
context.relationships.parentRelationships.forEach((rel) => {
|
|
1232
|
+
const targetModel = rel.targetModel;
|
|
1233
|
+
// Child created within parent
|
|
1234
|
+
events[`${modelName}CreatedIn${targetModel}`] = {
|
|
1235
|
+
description: `${modelName} was created within ${targetModel}`,
|
|
1236
|
+
attributes: {
|
|
1237
|
+
id: 'UUID required',
|
|
1238
|
+
[`${targetModel.toLowerCase()}Id`]: 'UUID required',
|
|
1239
|
+
[`${targetModel.toLowerCase()}Name`]: 'String optional',
|
|
1240
|
+
timestamp: 'DateTime required',
|
|
1241
|
+
createdBy: 'UUID required'
|
|
1242
|
+
}
|
|
1243
|
+
};
|
|
1244
|
+
// Add name attribute if model has one
|
|
1245
|
+
if (context.model?.attributes?.some((attr) => attr.name === 'name')) {
|
|
1246
|
+
events[`${modelName}CreatedIn${targetModel}`].attributes.name = 'String required';
|
|
1247
|
+
}
|
|
1248
|
+
// Child removed from parent
|
|
1249
|
+
events[`${modelName}RemovedFrom${targetModel}`] = {
|
|
1250
|
+
description: `${modelName} was removed from ${targetModel}`,
|
|
1251
|
+
attributes: {
|
|
1252
|
+
id: 'UUID required',
|
|
1253
|
+
[`${targetModel.toLowerCase()}Id`]: 'UUID required',
|
|
1254
|
+
[`${targetModel.toLowerCase()}Name`]: 'String optional',
|
|
1255
|
+
removedBy: 'UUID required',
|
|
1256
|
+
timestamp: 'DateTime required',
|
|
1257
|
+
reason: 'String optional'
|
|
1258
|
+
}
|
|
1259
|
+
};
|
|
1260
|
+
});
|
|
1261
|
+
}
|
|
1262
|
+
// Child relationship events
|
|
1263
|
+
if (context.relationships?.childRelationships) {
|
|
1264
|
+
context.relationships.childRelationships.forEach((rel) => {
|
|
1265
|
+
const targetModel = rel.targetModel || rel.name;
|
|
1266
|
+
const relType = rel.type || 'hasMany';
|
|
1267
|
+
// Child added to parent
|
|
1268
|
+
events[`${targetModel}AddedTo${modelName}`] = {
|
|
1269
|
+
description: `${targetModel} was added to ${modelName}`,
|
|
1270
|
+
attributes: {
|
|
1271
|
+
[`${modelName.toLowerCase()}Id`]: 'UUID required',
|
|
1272
|
+
[`${targetModel.toLowerCase()}Id`]: 'UUID required',
|
|
1273
|
+
relationshipType: `String default=${relType}`,
|
|
1274
|
+
addedBy: 'UUID required',
|
|
1275
|
+
timestamp: 'DateTime required'
|
|
1276
|
+
}
|
|
1277
|
+
};
|
|
1278
|
+
// Child removed from parent
|
|
1279
|
+
const removeEvent = {
|
|
1280
|
+
description: `${targetModel} was removed from ${modelName}`,
|
|
1281
|
+
attributes: {
|
|
1282
|
+
[`${modelName.toLowerCase()}Id`]: 'UUID required',
|
|
1283
|
+
[`${targetModel.toLowerCase()}Id`]: 'UUID required',
|
|
1284
|
+
relationshipType: `String default=${relType}`,
|
|
1285
|
+
removedBy: 'UUID required',
|
|
1286
|
+
timestamp: 'DateTime required'
|
|
1287
|
+
}
|
|
1288
|
+
};
|
|
1289
|
+
// Add cascade flag if specified
|
|
1290
|
+
if (rel.cascadeDelete) {
|
|
1291
|
+
removeEvent.attributes.cascadeTriggered = 'Boolean default=true';
|
|
1292
|
+
}
|
|
1293
|
+
events[`${targetModel}RemovedFrom${modelName}`] = removeEvent;
|
|
1294
|
+
});
|
|
1295
|
+
}
|
|
1296
|
+
// Many-to-many relationship events
|
|
1297
|
+
if (context.relationships?.manyToManyRelationships) {
|
|
1298
|
+
context.relationships.manyToManyRelationships.forEach((rel) => {
|
|
1299
|
+
const targetModel = rel.targetModel;
|
|
1300
|
+
// Association created
|
|
1301
|
+
events[`${modelName}AssociatedWith${targetModel}`] = {
|
|
1302
|
+
description: `${modelName} was associated with ${targetModel}`,
|
|
1303
|
+
attributes: {
|
|
1304
|
+
[`${modelName.toLowerCase()}Id`]: 'UUID required',
|
|
1305
|
+
[`${targetModel.toLowerCase()}Id`]: 'UUID required',
|
|
1306
|
+
associationType: 'String default=manyToMany',
|
|
1307
|
+
associationData: 'Object optional',
|
|
1308
|
+
associatedBy: 'UUID required',
|
|
1309
|
+
timestamp: 'DateTime required'
|
|
1310
|
+
}
|
|
1311
|
+
};
|
|
1312
|
+
// Association removed
|
|
1313
|
+
events[`${modelName}DisassociatedFrom${targetModel}`] = {
|
|
1314
|
+
description: `${modelName} was disassociated from ${targetModel}`,
|
|
1315
|
+
attributes: {
|
|
1316
|
+
[`${modelName.toLowerCase()}Id`]: 'UUID required',
|
|
1317
|
+
[`${targetModel.toLowerCase()}Id`]: 'UUID required',
|
|
1318
|
+
associationType: 'String default=manyToMany',
|
|
1319
|
+
disassociatedBy: 'UUID required',
|
|
1320
|
+
timestamp: 'DateTime required',
|
|
1321
|
+
reason: 'String optional'
|
|
1322
|
+
}
|
|
1323
|
+
};
|
|
1324
|
+
});
|
|
1325
|
+
}
|
|
1326
|
+
return events;
|
|
1327
|
+
}
|
|
1328
|
+
}
|
|
1329
|
+
//# sourceMappingURL=rule-engine.js.map
|