@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.
Files changed (817) hide show
  1. package/assets/examples/09-api/ai-spec.yaml +194 -0
  2. package/assets/examples/09-api/converted.yaml +95 -0
  3. package/assets/examples/09-api/diagram-architecture.mmd +10 -0
  4. package/assets/examples/09-api/diagram-er.mmd +10 -0
  5. package/assets/examples/09-api/documentation.html +104 -0
  6. package/assets/examples/09-api/documentation.md +95 -0
  7. package/assets/examples/09-api/inferred-spec.yaml +420 -0
  8. package/assets/examples/09-api/openapi.json +61 -0
  9. package/assets/examples/10-api/README.md +216 -0
  10. package/assets/examples/10-api/ai-spec.yaml +194 -0
  11. package/assets/examples/10-api/converted.yaml +96 -0
  12. package/assets/examples/10-api/diagram-architecture.mmd +10 -0
  13. package/assets/examples/10-api/diagram-er.mmd +10 -0
  14. package/assets/examples/10-api/documentation.html +104 -0
  15. package/assets/examples/10-api/documentation.md +95 -0
  16. package/assets/examples/10-api/inferred-spec.yaml +7 -0
  17. package/assets/examples/10-api/metadata.yaml +89 -0
  18. package/assets/examples/10-api/openapi.json +61 -0
  19. package/assets/examples/10-api/package-integration-test.js +177 -0
  20. package/assets/examples/10-api/usage-example.js +323 -0
  21. package/assets/examples/10-api/usage-example.ts +363 -0
  22. package/assets/examples/10-api/workflow-test.js +113 -0
  23. package/assets/examples/manifests/01-simple-default-mappings.yaml +36 -0
  24. package/assets/examples/manifests/02-capability-mappings.yaml +55 -0
  25. package/assets/examples/manifests/03-hybrid-mappings.yaml +109 -0
  26. package/assets/examples/manifests/README.md +245 -0
  27. package/assets/examples/manifests/backend-only.yaml +43 -0
  28. package/assets/examples/manifests/blog-api.md +78 -0
  29. package/assets/examples/manifests/blog-api.specly +79 -0
  30. package/assets/examples/manifests/frontend-only.yaml +27 -0
  31. package/assets/examples/manifests/fullstack-app.yaml +44 -0
  32. package/assets/examples/manifests/fullstack-monorepo.yaml +62 -0
  33. package/assets/examples/validate-examples-with-expected-failures.cjs +328 -0
  34. package/assets/examples/validate-examples.cjs +225 -0
  35. package/assets/examples-decomposed/cloud-native-manifest.example.yaml +8 -0
  36. package/assets/examples-decomposed/cloud-native-manifest.md +379 -0
  37. package/assets/examples-decomposed/cloud-native-manifest.specly +60 -0
  38. package/assets/examples-decomposed/docker-compose-manifest.example.yaml +8 -0
  39. package/assets/examples-decomposed/docker-compose-manifest.md +326 -0
  40. package/assets/examples-decomposed/docker-compose-manifest.specly +40 -0
  41. package/assets/examples-decomposed/kubernetes-deployment-manifest.example.yaml +8 -0
  42. package/assets/examples-decomposed/kubernetes-deployment-manifest.md +237 -0
  43. package/assets/examples-decomposed/kubernetes-deployment-manifest.specly +41 -0
  44. package/assets/examples-inference/inference-engine-demo.example.yaml +8 -0
  45. package/assets/examples-inference/inference-engine-demo.md +574 -0
  46. package/assets/examples-inference/inference-engine-demo.specly +216 -0
  47. package/assets/prompts/MOVED.md +35 -0
  48. package/assets/prompts/SUMMARY-v8-PROMOTION.md +445 -0
  49. package/assets/prompts/core/CHANGELOG.md +158 -0
  50. package/assets/prompts/core/MIGRATION-v6-to-v7.md +379 -0
  51. package/assets/prompts/core/README.md +319 -0
  52. package/assets/prompts/core/base-terminal-prompt.md +201 -0
  53. package/assets/prompts/core/examples/example-usage.ts +140 -0
  54. package/assets/prompts/core/schemas/prompt.schema.json +309 -0
  55. package/assets/prompts/core/schemas/prompt.schema.yaml +229 -0
  56. package/assets/prompts/core/standard/archive/v1/analyse.prompt.yaml +259 -0
  57. package/assets/prompts/core/standard/archive/v1/create.prompt.yaml +302 -0
  58. package/assets/prompts/core/standard/archive/v1/materialise.prompt.yaml +328 -0
  59. package/assets/prompts/core/standard/archive/v1/realize.prompt.yaml +606 -0
  60. package/assets/prompts/core/standard/archive/v2/README.md +110 -0
  61. package/assets/prompts/core/standard/archive/v2/analyse.prompt.yaml +151 -0
  62. package/assets/prompts/core/standard/archive/v2/create.prompt.yaml +151 -0
  63. package/assets/prompts/core/standard/archive/v2/materialise.prompt.yaml +132 -0
  64. package/assets/prompts/core/standard/archive/v2/realize.prompt.yaml +147 -0
  65. package/assets/prompts/core/standard/archive/v3/README.md +279 -0
  66. package/assets/prompts/core/standard/archive/v3/analyse.prompt.yaml +309 -0
  67. package/assets/prompts/core/standard/archive/v3/create.prompt.yaml +351 -0
  68. package/assets/prompts/core/standard/archive/v3/materialise.prompt.yaml +247 -0
  69. package/assets/prompts/core/standard/archive/v3/realize.prompt.yaml +344 -0
  70. package/assets/prompts/core/standard/archive/v4/README.md +79 -0
  71. package/assets/prompts/core/standard/archive/v4/analyse.prompt.yaml +204 -0
  72. package/assets/prompts/core/standard/archive/v4/create.prompt.yaml +185 -0
  73. package/assets/prompts/core/standard/archive/v5/README.md +224 -0
  74. package/assets/prompts/core/standard/archive/v5/analyse.prompt.yaml +209 -0
  75. package/assets/prompts/core/standard/archive/v5/create.prompt.yaml +225 -0
  76. package/assets/prompts/core/standard/archive/v5/materialise.prompt.yaml +242 -0
  77. package/assets/prompts/core/standard/archive/v5/realize.prompt.yaml +336 -0
  78. package/assets/prompts/core/standard/archive/v6/README.md +187 -0
  79. package/assets/prompts/core/standard/archive/v6/analyse.prompt.yaml +219 -0
  80. package/assets/prompts/core/standard/archive/v6/create.prompt.yaml +180 -0
  81. package/assets/prompts/core/standard/archive/v6/materialise.prompt.yaml +203 -0
  82. package/assets/prompts/core/standard/archive/v6/realize.prompt.yaml +215 -0
  83. package/assets/prompts/core/standard/archive/v7/analyse.prompt.nick.yaml +144 -0
  84. package/assets/prompts/core/standard/archive/v7/analyse.prompt.old.yaml +146 -0
  85. package/assets/prompts/core/standard/archive/v7/analyse.prompt.yaml +129 -0
  86. package/assets/prompts/core/standard/archive/v7/create.prompt.yaml +146 -0
  87. package/assets/prompts/core/standard/archive/v7/materialise.prompt.yaml +297 -0
  88. package/assets/prompts/core/standard/archive/v7/realize.prompt.yaml +294 -0
  89. package/assets/prompts/core/standard/archive/v8/README.md +400 -0
  90. package/assets/prompts/core/standard/archive/v8/analyse.prompt.yaml +185 -0
  91. package/assets/prompts/core/standard/archive/v8/create.prompt.yaml +203 -0
  92. package/assets/prompts/core/standard/archive/v8/materialise.prompt.yaml +297 -0
  93. package/assets/prompts/core/standard/archive/v8/realize.prompt.yaml +294 -0
  94. package/assets/prompts/core/standard/default/analyse.prompt.yaml +496 -0
  95. package/assets/prompts/core/standard/default/app-demo.prompt.yaml +213 -0
  96. package/assets/prompts/core/standard/default/create.prompt.yaml +418 -0
  97. package/assets/prompts/core/standard/default/materialise.prompt.yaml +814 -0
  98. package/assets/prompts/core/standard/default/realize.prompt.yaml +574 -0
  99. package/assets/prompts/core/standard/v9/analyse.prompt.yaml +496 -0
  100. package/assets/prompts/core/standard/v9/create.prompt.yaml +418 -0
  101. package/assets/prompts/core/standard/v9/materialise.prompt.yaml +814 -0
  102. package/assets/prompts/core/standard/v9/realize.prompt.yaml +574 -0
  103. package/assets/prompts/templates/api-orchestrator-template.yaml +188 -0
  104. package/assets/prompts/templates/claude-integration-template.md +121 -0
  105. package/assets/prompts/templates/terminal-prompt-template.md +97 -0
  106. package/dist/ai/commands/enhance.d.ts +8 -0
  107. package/dist/ai/commands/enhance.d.ts.map +1 -0
  108. package/dist/ai/commands/enhance.js +155 -0
  109. package/dist/ai/commands/enhance.js.map +1 -0
  110. package/dist/ai/commands/fill.d.ts +8 -0
  111. package/dist/ai/commands/fill.d.ts.map +1 -0
  112. package/dist/ai/commands/fill.js +179 -0
  113. package/dist/ai/commands/fill.js.map +1 -0
  114. package/dist/ai/commands/index.d.ts +11 -0
  115. package/dist/ai/commands/index.d.ts.map +1 -0
  116. package/dist/ai/commands/index.js +11 -0
  117. package/dist/ai/commands/index.js.map +1 -0
  118. package/dist/ai/commands/spec-analyser.d.ts +18 -0
  119. package/dist/ai/commands/spec-analyser.d.ts.map +1 -0
  120. package/dist/ai/commands/spec-analyser.js +175 -0
  121. package/dist/ai/commands/spec-analyser.js.map +1 -0
  122. package/dist/ai/commands/suggest.d.ts +8 -0
  123. package/dist/ai/commands/suggest.d.ts.map +1 -0
  124. package/dist/ai/commands/suggest.js +101 -0
  125. package/dist/ai/commands/suggest.js.map +1 -0
  126. package/dist/ai/commands/template.d.ts +8 -0
  127. package/dist/ai/commands/template.d.ts.map +1 -0
  128. package/dist/ai/commands/template.js +136 -0
  129. package/dist/ai/commands/template.js.map +1 -0
  130. package/dist/ai/config/index.d.ts +71 -0
  131. package/dist/ai/config/index.d.ts.map +1 -0
  132. package/dist/ai/config/index.js +193 -0
  133. package/dist/ai/config/index.js.map +1 -0
  134. package/dist/ai/config-loader.d.ts +31 -0
  135. package/dist/ai/config-loader.d.ts.map +1 -0
  136. package/dist/ai/config-loader.js +66 -0
  137. package/dist/ai/config-loader.js.map +1 -0
  138. package/dist/ai/core/ecosystem-prompt-manager.d.ts +107 -0
  139. package/dist/ai/core/ecosystem-prompt-manager.d.ts.map +1 -0
  140. package/dist/ai/core/ecosystem-prompt-manager.js +462 -0
  141. package/dist/ai/core/ecosystem-prompt-manager.js.map +1 -0
  142. package/dist/ai/examples/basic-usage.d.ts +9 -0
  143. package/dist/ai/examples/basic-usage.d.ts.map +1 -0
  144. package/dist/ai/examples/basic-usage.js +94 -0
  145. package/dist/ai/examples/basic-usage.js.map +1 -0
  146. package/dist/ai/index.d.ts +44 -0
  147. package/dist/ai/index.d.ts.map +1 -0
  148. package/dist/ai/index.js +164 -0
  149. package/dist/ai/index.js.map +1 -0
  150. package/dist/ai/orchestrator/index.d.ts +3 -0
  151. package/dist/ai/orchestrator/index.d.ts.map +1 -0
  152. package/dist/ai/orchestrator/index.js +3 -0
  153. package/dist/ai/orchestrator/index.js.map +1 -0
  154. package/dist/ai/orchestrator/interactive-workflow.d.ts +66 -0
  155. package/dist/ai/orchestrator/interactive-workflow.d.ts.map +1 -0
  156. package/dist/ai/orchestrator/interactive-workflow.js +214 -0
  157. package/dist/ai/orchestrator/interactive-workflow.js.map +1 -0
  158. package/dist/ai/orchestrator/specverse-orchestrator.d.ts +217 -0
  159. package/dist/ai/orchestrator/specverse-orchestrator.d.ts.map +1 -0
  160. package/dist/ai/orchestrator/specverse-orchestrator.js +745 -0
  161. package/dist/ai/orchestrator/specverse-orchestrator.js.map +1 -0
  162. package/dist/ai/prompt-loader.d.ts +24 -0
  163. package/dist/ai/prompt-loader.d.ts.map +1 -0
  164. package/dist/ai/prompt-loader.js +159 -0
  165. package/dist/ai/prompt-loader.js.map +1 -0
  166. package/dist/ai/providers/anthropic-provider.d.ts +38 -0
  167. package/dist/ai/providers/anthropic-provider.d.ts.map +1 -0
  168. package/dist/ai/providers/anthropic-provider.js +235 -0
  169. package/dist/ai/providers/anthropic-provider.js.map +1 -0
  170. package/dist/ai/providers/index.d.ts +6 -0
  171. package/dist/ai/providers/index.d.ts.map +1 -0
  172. package/dist/ai/providers/index.js +6 -0
  173. package/dist/ai/providers/index.js.map +1 -0
  174. package/dist/ai/providers/interactive-provider.d.ts +67 -0
  175. package/dist/ai/providers/interactive-provider.d.ts.map +1 -0
  176. package/dist/ai/providers/interactive-provider.js +337 -0
  177. package/dist/ai/providers/interactive-provider.js.map +1 -0
  178. package/dist/ai/providers/llm-provider.d.ts +127 -0
  179. package/dist/ai/providers/llm-provider.d.ts.map +1 -0
  180. package/dist/ai/providers/llm-provider.js +141 -0
  181. package/dist/ai/providers/llm-provider.js.map +1 -0
  182. package/dist/ai/providers/openai-provider.d.ts +39 -0
  183. package/dist/ai/providers/openai-provider.d.ts.map +1 -0
  184. package/dist/ai/providers/openai-provider.js +193 -0
  185. package/dist/ai/providers/openai-provider.js.map +1 -0
  186. package/dist/ai/providers/provider-factory.d.ts +47 -0
  187. package/dist/ai/providers/provider-factory.d.ts.map +1 -0
  188. package/dist/ai/providers/provider-factory.js +159 -0
  189. package/dist/ai/providers/provider-factory.js.map +1 -0
  190. package/dist/ai/session/claude-executor.d.ts +39 -0
  191. package/dist/ai/session/claude-executor.d.ts.map +1 -0
  192. package/dist/ai/session/claude-executor.js +136 -0
  193. package/dist/ai/session/claude-executor.js.map +1 -0
  194. package/dist/ai/session/session-manager.d.ts +72 -0
  195. package/dist/ai/session/session-manager.d.ts.map +1 -0
  196. package/dist/ai/session/session-manager.js +294 -0
  197. package/dist/ai/session/session-manager.js.map +1 -0
  198. package/dist/ai/session/types.d.ts +152 -0
  199. package/dist/ai/session/types.d.ts.map +1 -0
  200. package/dist/ai/session/types.js +6 -0
  201. package/dist/ai/session/types.js.map +1 -0
  202. package/dist/ai/types/index.d.ts +83 -0
  203. package/dist/ai/types/index.d.ts.map +1 -0
  204. package/dist/ai/types/index.js +5 -0
  205. package/dist/ai/types/index.js.map +1 -0
  206. package/dist/generators/UML-generator.d.ts +64 -0
  207. package/dist/generators/UML-generator.d.ts.map +1 -0
  208. package/dist/generators/UML-generator.js +541 -0
  209. package/dist/generators/UML-generator.js.map +1 -0
  210. package/dist/generators/ai-view-generator.d.ts +391 -0
  211. package/dist/generators/ai-view-generator.d.ts.map +1 -0
  212. package/dist/generators/ai-view-generator.js +907 -0
  213. package/dist/generators/ai-view-generator.js.map +1 -0
  214. package/dist/generators/diagram-engine/core/BaseDiagramPlugin.d.ts +41 -0
  215. package/dist/generators/diagram-engine/core/BaseDiagramPlugin.d.ts.map +1 -0
  216. package/dist/generators/diagram-engine/core/BaseDiagramPlugin.js +64 -0
  217. package/dist/generators/diagram-engine/core/BaseDiagramPlugin.js.map +1 -0
  218. package/dist/generators/diagram-engine/core/DiagramContext.d.ts +155 -0
  219. package/dist/generators/diagram-engine/core/DiagramContext.d.ts.map +1 -0
  220. package/dist/generators/diagram-engine/core/DiagramContext.js +481 -0
  221. package/dist/generators/diagram-engine/core/DiagramContext.js.map +1 -0
  222. package/dist/generators/diagram-engine/core/StyleManager.d.ts +51 -0
  223. package/dist/generators/diagram-engine/core/StyleManager.d.ts.map +1 -0
  224. package/dist/generators/diagram-engine/core/StyleManager.js +227 -0
  225. package/dist/generators/diagram-engine/core/StyleManager.js.map +1 -0
  226. package/dist/generators/diagram-engine/core/UnifiedDiagramGenerator.d.ts +83 -0
  227. package/dist/generators/diagram-engine/core/UnifiedDiagramGenerator.d.ts.map +1 -0
  228. package/dist/generators/diagram-engine/core/UnifiedDiagramGenerator.js +200 -0
  229. package/dist/generators/diagram-engine/core/UnifiedDiagramGenerator.js.map +1 -0
  230. package/dist/generators/diagram-engine/index.d.ts +41 -0
  231. package/dist/generators/diagram-engine/index.d.ts.map +1 -0
  232. package/dist/generators/diagram-engine/index.js +74 -0
  233. package/dist/generators/diagram-engine/index.js.map +1 -0
  234. package/dist/generators/diagram-engine/plugins/architecture/ArchitecturePlugin.d.ts +65 -0
  235. package/dist/generators/diagram-engine/plugins/architecture/ArchitecturePlugin.d.ts.map +1 -0
  236. package/dist/generators/diagram-engine/plugins/architecture/ArchitecturePlugin.js +490 -0
  237. package/dist/generators/diagram-engine/plugins/architecture/ArchitecturePlugin.js.map +1 -0
  238. package/dist/generators/diagram-engine/plugins/class-diagram/ClassDiagramPlugin.d.ts +40 -0
  239. package/dist/generators/diagram-engine/plugins/class-diagram/ClassDiagramPlugin.d.ts.map +1 -0
  240. package/dist/generators/diagram-engine/plugins/class-diagram/ClassDiagramPlugin.js +323 -0
  241. package/dist/generators/diagram-engine/plugins/class-diagram/ClassDiagramPlugin.js.map +1 -0
  242. package/dist/generators/diagram-engine/plugins/deployment/DeploymentPlugin.d.ts +46 -0
  243. package/dist/generators/diagram-engine/plugins/deployment/DeploymentPlugin.d.ts.map +1 -0
  244. package/dist/generators/diagram-engine/plugins/deployment/DeploymentPlugin.js +391 -0
  245. package/dist/generators/diagram-engine/plugins/deployment/DeploymentPlugin.js.map +1 -0
  246. package/dist/generators/diagram-engine/plugins/er-diagram/ERDiagramPlugin.d.ts +57 -0
  247. package/dist/generators/diagram-engine/plugins/er-diagram/ERDiagramPlugin.d.ts.map +1 -0
  248. package/dist/generators/diagram-engine/plugins/er-diagram/ERDiagramPlugin.js +300 -0
  249. package/dist/generators/diagram-engine/plugins/er-diagram/ERDiagramPlugin.js.map +1 -0
  250. package/dist/generators/diagram-engine/plugins/event-flow/EventFlowPlugin.d.ts +70 -0
  251. package/dist/generators/diagram-engine/plugins/event-flow/EventFlowPlugin.d.ts.map +1 -0
  252. package/dist/generators/diagram-engine/plugins/event-flow/EventFlowPlugin.js +955 -0
  253. package/dist/generators/diagram-engine/plugins/event-flow/EventFlowPlugin.js.map +1 -0
  254. package/dist/generators/diagram-engine/plugins/lifecycle/LifecyclePlugin.d.ts +40 -0
  255. package/dist/generators/diagram-engine/plugins/lifecycle/LifecyclePlugin.d.ts.map +1 -0
  256. package/dist/generators/diagram-engine/plugins/lifecycle/LifecyclePlugin.js +183 -0
  257. package/dist/generators/diagram-engine/plugins/lifecycle/LifecyclePlugin.js.map +1 -0
  258. package/dist/generators/diagram-engine/plugins/manifest/ManifestPlugin.d.ts +71 -0
  259. package/dist/generators/diagram-engine/plugins/manifest/ManifestPlugin.d.ts.map +1 -0
  260. package/dist/generators/diagram-engine/plugins/manifest/ManifestPlugin.js +396 -0
  261. package/dist/generators/diagram-engine/plugins/manifest/ManifestPlugin.js.map +1 -0
  262. package/dist/generators/diagram-engine/renderers/MermaidRenderer.d.ts +72 -0
  263. package/dist/generators/diagram-engine/renderers/MermaidRenderer.d.ts.map +1 -0
  264. package/dist/generators/diagram-engine/renderers/MermaidRenderer.js +441 -0
  265. package/dist/generators/diagram-engine/renderers/MermaidRenderer.js.map +1 -0
  266. package/dist/generators/diagram-engine/types/index.d.ts +261 -0
  267. package/dist/generators/diagram-engine/types/index.d.ts.map +1 -0
  268. package/dist/generators/diagram-engine/types/index.js +7 -0
  269. package/dist/generators/diagram-engine/types/index.js.map +1 -0
  270. package/dist/generators/documentation-generator.d.ts +54 -0
  271. package/dist/generators/documentation-generator.d.ts.map +1 -0
  272. package/dist/generators/documentation-generator.js +756 -0
  273. package/dist/generators/documentation-generator.js.map +1 -0
  274. package/dist/generators/index.d.ts +47 -0
  275. package/dist/generators/index.d.ts.map +1 -0
  276. package/dist/generators/index.js +51 -0
  277. package/dist/generators/index.js.map +1 -0
  278. package/dist/index.d.ts +13 -0
  279. package/dist/index.d.ts.map +1 -0
  280. package/dist/index.js +14 -0
  281. package/dist/index.js.map +1 -0
  282. package/dist/inference/comprehensive-engine.d.ts +71 -0
  283. package/dist/inference/comprehensive-engine.d.ts.map +1 -0
  284. package/dist/inference/comprehensive-engine.js +271 -0
  285. package/dist/inference/comprehensive-engine.js.map +1 -0
  286. package/dist/inference/core/context.d.ts +60 -0
  287. package/dist/inference/core/context.d.ts.map +1 -0
  288. package/dist/inference/core/context.js +292 -0
  289. package/dist/inference/core/context.js.map +1 -0
  290. package/dist/inference/core/index.d.ts +14 -0
  291. package/dist/inference/core/index.d.ts.map +1 -0
  292. package/dist/inference/core/index.js +18 -0
  293. package/dist/inference/core/index.js.map +1 -0
  294. package/dist/inference/core/rule-engine.d.ts +52 -0
  295. package/dist/inference/core/rule-engine.d.ts.map +1 -0
  296. package/dist/inference/core/rule-engine.js +1329 -0
  297. package/dist/inference/core/rule-engine.js.map +1 -0
  298. package/dist/inference/core/rule-file-types.d.ts +225 -0
  299. package/dist/inference/core/rule-file-types.d.ts.map +1 -0
  300. package/dist/inference/core/rule-file-types.js +79 -0
  301. package/dist/inference/core/rule-file-types.js.map +1 -0
  302. package/dist/inference/core/rule-loader.d.ts +93 -0
  303. package/dist/inference/core/rule-loader.d.ts.map +1 -0
  304. package/dist/inference/core/rule-loader.js +645 -0
  305. package/dist/inference/core/rule-loader.js.map +1 -0
  306. package/dist/inference/core/specly-converter.d.ts +50 -0
  307. package/dist/inference/core/specly-converter.d.ts.map +1 -0
  308. package/dist/inference/core/specly-converter.js +885 -0
  309. package/dist/inference/core/specly-converter.js.map +1 -0
  310. package/dist/inference/core/types.d.ts +395 -0
  311. package/dist/inference/core/types.d.ts.map +1 -0
  312. package/dist/inference/core/types.js +31 -0
  313. package/dist/inference/core/types.js.map +1 -0
  314. package/dist/inference/deployment/deployment-generator.d.ts +48 -0
  315. package/dist/inference/deployment/deployment-generator.d.ts.map +1 -0
  316. package/dist/inference/deployment/deployment-generator.js +343 -0
  317. package/dist/inference/deployment/deployment-generator.js.map +1 -0
  318. package/dist/inference/deployment/index.d.ts +6 -0
  319. package/dist/inference/deployment/index.d.ts.map +1 -0
  320. package/dist/inference/deployment/index.js +5 -0
  321. package/dist/inference/deployment/index.js.map +1 -0
  322. package/dist/inference/dev-specly-generator.d.ts +19 -0
  323. package/dist/inference/dev-specly-generator.d.ts.map +1 -0
  324. package/dist/inference/dev-specly-generator.js +127 -0
  325. package/dist/inference/dev-specly-generator.js.map +1 -0
  326. package/dist/inference/index.d.ts +29 -0
  327. package/dist/inference/index.d.ts.map +1 -0
  328. package/dist/inference/index.js +170 -0
  329. package/dist/inference/index.js.map +1 -0
  330. package/dist/inference/logical/generators/component-type-resolver.d.ts +82 -0
  331. package/dist/inference/logical/generators/component-type-resolver.d.ts.map +1 -0
  332. package/dist/inference/logical/generators/component-type-resolver.js +151 -0
  333. package/dist/inference/logical/generators/component-type-resolver.js.map +1 -0
  334. package/dist/inference/logical/generators/controller-generator.d.ts +43 -0
  335. package/dist/inference/logical/generators/controller-generator.d.ts.map +1 -0
  336. package/dist/inference/logical/generators/controller-generator.js +303 -0
  337. package/dist/inference/logical/generators/controller-generator.js.map +1 -0
  338. package/dist/inference/logical/generators/event-generator.d.ts +67 -0
  339. package/dist/inference/logical/generators/event-generator.d.ts.map +1 -0
  340. package/dist/inference/logical/generators/event-generator.js +466 -0
  341. package/dist/inference/logical/generators/event-generator.js.map +1 -0
  342. package/dist/inference/logical/generators/promotion-generator.d.ts +32 -0
  343. package/dist/inference/logical/generators/promotion-generator.d.ts.map +1 -0
  344. package/dist/inference/logical/generators/promotion-generator.js +133 -0
  345. package/dist/inference/logical/generators/promotion-generator.js.map +1 -0
  346. package/dist/inference/logical/generators/service-generator.d.ts +51 -0
  347. package/dist/inference/logical/generators/service-generator.d.ts.map +1 -0
  348. package/dist/inference/logical/generators/service-generator.js +268 -0
  349. package/dist/inference/logical/generators/service-generator.js.map +1 -0
  350. package/dist/inference/logical/generators/specialist-view-expander.d.ts +75 -0
  351. package/dist/inference/logical/generators/specialist-view-expander.d.ts.map +1 -0
  352. package/dist/inference/logical/generators/specialist-view-expander.js +182 -0
  353. package/dist/inference/logical/generators/specialist-view-expander.js.map +1 -0
  354. package/dist/inference/logical/generators/view-generator.d.ts +131 -0
  355. package/dist/inference/logical/generators/view-generator.d.ts.map +1 -0
  356. package/dist/inference/logical/generators/view-generator.js +1115 -0
  357. package/dist/inference/logical/generators/view-generator.js.map +1 -0
  358. package/dist/inference/logical/index.d.ts +19 -0
  359. package/dist/inference/logical/index.d.ts.map +1 -0
  360. package/dist/inference/logical/index.js +15 -0
  361. package/dist/inference/logical/index.js.map +1 -0
  362. package/dist/inference/logical/logical-engine.d.ts +68 -0
  363. package/dist/inference/logical/logical-engine.d.ts.map +1 -0
  364. package/dist/inference/logical/logical-engine.js +484 -0
  365. package/dist/inference/logical/logical-engine.js.map +1 -0
  366. package/dist/inference/quint-transpiler.d.ts +64 -0
  367. package/dist/inference/quint-transpiler.d.ts.map +1 -0
  368. package/dist/inference/quint-transpiler.js +433 -0
  369. package/dist/inference/quint-transpiler.js.map +1 -0
  370. package/dist/inference/test-harness.d.ts +41 -0
  371. package/dist/inference/test-harness.d.ts.map +1 -0
  372. package/dist/inference/test-harness.js +357 -0
  373. package/dist/inference/test-harness.js.map +1 -0
  374. package/dist/parser/convention-processor.d.ts +66 -0
  375. package/dist/parser/convention-processor.d.ts.map +1 -0
  376. package/dist/parser/convention-processor.js +349 -0
  377. package/dist/parser/convention-processor.js.map +1 -0
  378. package/dist/parser/import-resolver/cache.d.ts +56 -0
  379. package/dist/parser/import-resolver/cache.d.ts.map +1 -0
  380. package/dist/parser/import-resolver/cache.js +191 -0
  381. package/dist/parser/import-resolver/cache.js.map +1 -0
  382. package/dist/parser/import-resolver/index.d.ts +10 -0
  383. package/dist/parser/import-resolver/index.d.ts.map +1 -0
  384. package/dist/parser/import-resolver/index.js +9 -0
  385. package/dist/parser/import-resolver/index.js.map +1 -0
  386. package/dist/parser/import-resolver/resolver.d.ts +102 -0
  387. package/dist/parser/import-resolver/resolver.d.ts.map +1 -0
  388. package/dist/parser/import-resolver/resolver.js +669 -0
  389. package/dist/parser/import-resolver/resolver.js.map +1 -0
  390. package/dist/parser/import-resolver/types.d.ts +55 -0
  391. package/dist/parser/import-resolver/types.d.ts.map +1 -0
  392. package/dist/parser/import-resolver/types.js +5 -0
  393. package/dist/parser/import-resolver/types.js.map +1 -0
  394. package/dist/parser/index.d.ts +38 -0
  395. package/dist/parser/index.d.ts.map +1 -0
  396. package/dist/parser/index.js +61 -0
  397. package/dist/parser/index.js.map +1 -0
  398. package/dist/parser/namespace-utils.d.ts +61 -0
  399. package/dist/parser/namespace-utils.d.ts.map +1 -0
  400. package/dist/parser/namespace-utils.js +191 -0
  401. package/dist/parser/namespace-utils.js.map +1 -0
  402. package/dist/parser/processors/AbstractProcessor.d.ts +10 -0
  403. package/dist/parser/processors/AbstractProcessor.d.ts.map +1 -0
  404. package/dist/parser/processors/AbstractProcessor.js +11 -0
  405. package/dist/parser/processors/AbstractProcessor.js.map +1 -0
  406. package/dist/parser/processors/AttributeProcessor.d.ts +19 -0
  407. package/dist/parser/processors/AttributeProcessor.d.ts.map +1 -0
  408. package/dist/parser/processors/AttributeProcessor.js +154 -0
  409. package/dist/parser/processors/AttributeProcessor.js.map +1 -0
  410. package/dist/parser/processors/ControllerProcessor.d.ts +9 -0
  411. package/dist/parser/processors/ControllerProcessor.d.ts.map +1 -0
  412. package/dist/parser/processors/ControllerProcessor.js +74 -0
  413. package/dist/parser/processors/ControllerProcessor.js.map +1 -0
  414. package/dist/parser/processors/DeploymentProcessor.d.ts +19 -0
  415. package/dist/parser/processors/DeploymentProcessor.d.ts.map +1 -0
  416. package/dist/parser/processors/DeploymentProcessor.js +244 -0
  417. package/dist/parser/processors/DeploymentProcessor.js.map +1 -0
  418. package/dist/parser/processors/EventProcessor.d.ts +8 -0
  419. package/dist/parser/processors/EventProcessor.d.ts.map +1 -0
  420. package/dist/parser/processors/EventProcessor.js +28 -0
  421. package/dist/parser/processors/EventProcessor.js.map +1 -0
  422. package/dist/parser/processors/ExecutableProcessor.d.ts +21 -0
  423. package/dist/parser/processors/ExecutableProcessor.d.ts.map +1 -0
  424. package/dist/parser/processors/ExecutableProcessor.js +135 -0
  425. package/dist/parser/processors/ExecutableProcessor.js.map +1 -0
  426. package/dist/parser/processors/LifecycleProcessor.d.ts +9 -0
  427. package/dist/parser/processors/LifecycleProcessor.d.ts.map +1 -0
  428. package/dist/parser/processors/LifecycleProcessor.js +41 -0
  429. package/dist/parser/processors/LifecycleProcessor.js.map +1 -0
  430. package/dist/parser/processors/ModelProcessor.d.ts +67 -0
  431. package/dist/parser/processors/ModelProcessor.d.ts.map +1 -0
  432. package/dist/parser/processors/ModelProcessor.js +495 -0
  433. package/dist/parser/processors/ModelProcessor.js.map +1 -0
  434. package/dist/parser/processors/RelationshipProcessor.d.ts +10 -0
  435. package/dist/parser/processors/RelationshipProcessor.d.ts.map +1 -0
  436. package/dist/parser/processors/RelationshipProcessor.js +55 -0
  437. package/dist/parser/processors/RelationshipProcessor.js.map +1 -0
  438. package/dist/parser/processors/ServiceProcessor.d.ts +9 -0
  439. package/dist/parser/processors/ServiceProcessor.d.ts.map +1 -0
  440. package/dist/parser/processors/ServiceProcessor.js +59 -0
  441. package/dist/parser/processors/ServiceProcessor.js.map +1 -0
  442. package/dist/parser/processors/ViewProcessor.d.ts +7 -0
  443. package/dist/parser/processors/ViewProcessor.d.ts.map +1 -0
  444. package/dist/parser/processors/ViewProcessor.js +66 -0
  445. package/dist/parser/processors/ViewProcessor.js.map +1 -0
  446. package/dist/parser/types/ast.d.ts +518 -0
  447. package/dist/parser/types/ast.d.ts.map +1 -0
  448. package/dist/parser/types/ast.js +8 -0
  449. package/dist/parser/types/ast.js.map +1 -0
  450. package/dist/parser/types/views.d.ts +186 -0
  451. package/dist/parser/types/views.d.ts.map +1 -0
  452. package/dist/parser/types/views.js +8 -0
  453. package/dist/parser/types/views.js.map +1 -0
  454. package/dist/parser/unified-parser.d.ts +195 -0
  455. package/dist/parser/unified-parser.d.ts.map +1 -0
  456. package/dist/parser/unified-parser.js +1180 -0
  457. package/dist/parser/unified-parser.js.map +1 -0
  458. package/dist/parser/vitest.config.d.ts +3 -0
  459. package/dist/parser/vitest.config.d.ts.map +1 -0
  460. package/dist/parser/vitest.config.js +27 -0
  461. package/dist/parser/vitest.config.js.map +1 -0
  462. package/dist/realize/engines/code-generator.d.ts +86 -0
  463. package/dist/realize/engines/code-generator.d.ts.map +1 -0
  464. package/dist/realize/engines/code-generator.js +159 -0
  465. package/dist/realize/engines/code-generator.js.map +1 -0
  466. package/dist/realize/engines/engine-registry.d.ts +94 -0
  467. package/dist/realize/engines/engine-registry.d.ts.map +1 -0
  468. package/dist/realize/engines/engine-registry.js +163 -0
  469. package/dist/realize/engines/engine-registry.js.map +1 -0
  470. package/dist/realize/engines/index.d.ts +10 -0
  471. package/dist/realize/engines/index.d.ts.map +1 -0
  472. package/dist/realize/engines/index.js +12 -0
  473. package/dist/realize/engines/index.js.map +1 -0
  474. package/dist/realize/engines/typescript-engine.d.ts +74 -0
  475. package/dist/realize/engines/typescript-engine.d.ts.map +1 -0
  476. package/dist/realize/engines/typescript-engine.js +289 -0
  477. package/dist/realize/engines/typescript-engine.js.map +1 -0
  478. package/dist/realize/generators/index.d.ts +11 -0
  479. package/dist/realize/generators/index.d.ts.map +1 -0
  480. package/dist/realize/generators/index.js +11 -0
  481. package/dist/realize/generators/index.js.map +1 -0
  482. package/dist/realize/index.d.ts +48 -0
  483. package/dist/realize/index.d.ts.map +1 -0
  484. package/dist/realize/index.js +529 -0
  485. package/dist/realize/index.js.map +1 -0
  486. package/dist/realize/library/index.d.ts +12 -0
  487. package/dist/realize/library/index.d.ts.map +1 -0
  488. package/dist/realize/library/index.js +15 -0
  489. package/dist/realize/library/index.js.map +1 -0
  490. package/dist/realize/library/library.d.ts +132 -0
  491. package/dist/realize/library/library.d.ts.map +1 -0
  492. package/dist/realize/library/library.js +343 -0
  493. package/dist/realize/library/library.js.map +1 -0
  494. package/dist/realize/library/loader.d.ts +73 -0
  495. package/dist/realize/library/loader.d.ts.map +1 -0
  496. package/dist/realize/library/loader.js +159 -0
  497. package/dist/realize/library/loader.js.map +1 -0
  498. package/dist/realize/library/resolver.d.ts +104 -0
  499. package/dist/realize/library/resolver.d.ts.map +1 -0
  500. package/dist/realize/library/resolver.js +299 -0
  501. package/dist/realize/library/resolver.js.map +1 -0
  502. package/dist/realize/library/validator.d.ts +65 -0
  503. package/dist/realize/library/validator.d.ts.map +1 -0
  504. package/dist/realize/library/validator.js +203 -0
  505. package/dist/realize/library/validator.js.map +1 -0
  506. package/dist/realize/types/index.d.ts +5 -0
  507. package/dist/realize/types/index.d.ts.map +1 -0
  508. package/dist/realize/types/index.js +5 -0
  509. package/dist/realize/types/index.js.map +1 -0
  510. package/dist/realize/types/instance-factory.d.ts +7 -0
  511. package/dist/realize/types/instance-factory.d.ts.map +1 -0
  512. package/dist/realize/types/instance-factory.js +2 -0
  513. package/dist/realize/types/instance-factory.js.map +1 -0
  514. package/dist/realize/types/unified-mappings.d.ts +163 -0
  515. package/dist/realize/types/unified-mappings.d.ts.map +1 -0
  516. package/dist/realize/types/unified-mappings.js +110 -0
  517. package/dist/realize/types/unified-mappings.js.map +1 -0
  518. package/dist/realize/utils/ai-spec-loader.d.ts +77 -0
  519. package/dist/realize/utils/ai-spec-loader.d.ts.map +1 -0
  520. package/dist/realize/utils/ai-spec-loader.js +142 -0
  521. package/dist/realize/utils/ai-spec-loader.js.map +1 -0
  522. package/dist/realize/utils/index.d.ts +9 -0
  523. package/dist/realize/utils/index.d.ts.map +1 -0
  524. package/dist/realize/utils/index.js +9 -0
  525. package/dist/realize/utils/index.js.map +1 -0
  526. package/dist/realize/utils/manifest-loader.d.ts +107 -0
  527. package/dist/realize/utils/manifest-loader.d.ts.map +1 -0
  528. package/dist/realize/utils/manifest-loader.js +168 -0
  529. package/dist/realize/utils/manifest-loader.js.map +1 -0
  530. package/dist/realize/utils/mapping-migration.d.ts +53 -0
  531. package/dist/realize/utils/mapping-migration.d.ts.map +1 -0
  532. package/dist/realize/utils/mapping-migration.js +194 -0
  533. package/dist/realize/utils/mapping-migration.js.map +1 -0
  534. package/dist/registry/cache/cache-manager.d.ts +132 -0
  535. package/dist/registry/cache/cache-manager.d.ts.map +1 -0
  536. package/dist/registry/cache/cache-manager.js +218 -0
  537. package/dist/registry/cache/cache-manager.js.map +1 -0
  538. package/dist/registry/client/registry-client.d.ts +129 -0
  539. package/dist/registry/client/registry-client.d.ts.map +1 -0
  540. package/dist/registry/client/registry-client.js +317 -0
  541. package/dist/registry/client/registry-client.js.map +1 -0
  542. package/dist/registry/formatters/error-formatter.d.ts +100 -0
  543. package/dist/registry/formatters/error-formatter.d.ts.map +1 -0
  544. package/dist/registry/formatters/error-formatter.js +290 -0
  545. package/dist/registry/formatters/error-formatter.js.map +1 -0
  546. package/dist/registry/formatters/index.d.ts +8 -0
  547. package/dist/registry/formatters/index.d.ts.map +1 -0
  548. package/dist/registry/formatters/index.js +7 -0
  549. package/dist/registry/formatters/index.js.map +1 -0
  550. package/dist/registry/index.d.ts +19 -0
  551. package/dist/registry/index.d.ts.map +1 -0
  552. package/dist/registry/index.js +22 -0
  553. package/dist/registry/index.js.map +1 -0
  554. package/dist/registry/offline/offline-handler.d.ts +150 -0
  555. package/dist/registry/offline/offline-handler.d.ts.map +1 -0
  556. package/dist/registry/offline/offline-handler.js +290 -0
  557. package/dist/registry/offline/offline-handler.js.map +1 -0
  558. package/dist/registry/types/index.d.ts +13 -0
  559. package/dist/registry/types/index.d.ts.map +1 -0
  560. package/dist/registry/types/index.js +11 -0
  561. package/dist/registry/types/index.js.map +1 -0
  562. package/dist/registry/types/registry.d.ts +220 -0
  563. package/dist/registry/types/registry.d.ts.map +1 -0
  564. package/dist/registry/types/registry.js +55 -0
  565. package/dist/registry/types/registry.js.map +1 -0
  566. package/dist/registry/types/validation.d.ts +197 -0
  567. package/dist/registry/types/validation.d.ts.map +1 -0
  568. package/dist/registry/types/validation.js +140 -0
  569. package/dist/registry/types/validation.js.map +1 -0
  570. package/dist/registry/utils/manifest-adapter.d.ts +42 -0
  571. package/dist/registry/utils/manifest-adapter.d.ts.map +1 -0
  572. package/dist/registry/utils/manifest-adapter.js +182 -0
  573. package/dist/registry/utils/manifest-adapter.js.map +1 -0
  574. package/dist/registry/validators/index.d.ts +12 -0
  575. package/dist/registry/validators/index.d.ts.map +1 -0
  576. package/dist/registry/validators/index.js +9 -0
  577. package/dist/registry/validators/index.js.map +1 -0
  578. package/dist/registry/validators/installation-validator.d.ts +75 -0
  579. package/dist/registry/validators/installation-validator.d.ts.map +1 -0
  580. package/dist/registry/validators/installation-validator.js +142 -0
  581. package/dist/registry/validators/installation-validator.js.map +1 -0
  582. package/dist/registry/validators/manifest-validator.d.ts +82 -0
  583. package/dist/registry/validators/manifest-validator.d.ts.map +1 -0
  584. package/dist/registry/validators/manifest-validator.js +213 -0
  585. package/dist/registry/validators/manifest-validator.js.map +1 -0
  586. package/dist/registry/validators/validator.d.ts +113 -0
  587. package/dist/registry/validators/validator.d.ts.map +1 -0
  588. package/dist/registry/validators/validator.js +165 -0
  589. package/dist/registry/validators/validator.js.map +1 -0
  590. package/libs/instance-factories/CURVED-INTERFACE.md +278 -0
  591. package/libs/instance-factories/README.md +73 -0
  592. package/libs/instance-factories/applications/README.md +51 -0
  593. package/libs/instance-factories/applications/generic-app.yaml +52 -0
  594. package/libs/instance-factories/applications/react-app-runtime.yaml +139 -0
  595. package/libs/instance-factories/applications/react-app.yaml +186 -0
  596. package/libs/instance-factories/applications/templates/generic/backend-env-generator.ts +31 -0
  597. package/libs/instance-factories/applications/templates/generic/backend-package-json-generator.ts +84 -0
  598. package/libs/instance-factories/applications/templates/generic/backend-tsconfig-generator.ts +69 -0
  599. package/libs/instance-factories/applications/templates/generic/main-generator.ts +308 -0
  600. package/libs/instance-factories/applications/templates/react/_view-components-source.ts +555 -0
  601. package/libs/instance-factories/applications/templates/react/api-client-generator.ts +436 -0
  602. package/libs/instance-factories/applications/templates/react/api-types-generator.ts +153 -0
  603. package/libs/instance-factories/applications/templates/react/app-tsx-generator.ts +94 -0
  604. package/libs/instance-factories/applications/templates/react/env-example-generator.ts +24 -0
  605. package/libs/instance-factories/applications/templates/react/field-helpers-generator.ts +106 -0
  606. package/libs/instance-factories/applications/templates/react/gitignore-generator.ts +38 -0
  607. package/libs/instance-factories/applications/templates/react/index-css-generator.ts +14 -0
  608. package/libs/instance-factories/applications/templates/react/index-html-generator.ts +30 -0
  609. package/libs/instance-factories/applications/templates/react/main-tsx-generator.ts +34 -0
  610. package/libs/instance-factories/applications/templates/react/package-json-generator.ts +57 -0
  611. package/libs/instance-factories/applications/templates/react/pattern-adapter-generator.ts +179 -0
  612. package/libs/instance-factories/applications/templates/react/react-pattern-adapter.tsx +1347 -0
  613. package/libs/instance-factories/applications/templates/react/relationship-field-generator.ts +150 -0
  614. package/libs/instance-factories/applications/templates/react/runtime-app-tsx-generator.ts +90 -0
  615. package/libs/instance-factories/applications/templates/react/runtime-package-json-generator.ts +61 -0
  616. package/libs/instance-factories/applications/templates/react/tailwind-adapter-generator.ts +704 -0
  617. package/libs/instance-factories/applications/templates/react/tailwind-adapter-wrapper-generator.ts +84 -0
  618. package/libs/instance-factories/applications/templates/react/tsconfig-generator.ts +35 -0
  619. package/libs/instance-factories/applications/templates/react/use-api-hooks-generator.ts +121 -0
  620. package/libs/instance-factories/applications/templates/react/view-dashboard-generator.ts +150 -0
  621. package/libs/instance-factories/applications/templates/react/view-detail-generator.ts +150 -0
  622. package/libs/instance-factories/applications/templates/react/view-form-generator.ts +362 -0
  623. package/libs/instance-factories/applications/templates/react/view-list-generator.ts +98 -0
  624. package/libs/instance-factories/applications/templates/react/view-router-generator.ts +89 -0
  625. package/libs/instance-factories/applications/templates/react/vite-config-generator.ts +49 -0
  626. package/libs/instance-factories/archived/fastify-prisma.yaml +104 -0
  627. package/libs/instance-factories/cli/README.md +43 -0
  628. package/libs/instance-factories/cli/commander-js.yaml +55 -0
  629. package/libs/instance-factories/cli/templates/commander/cli-bin-wrapper-generator.ts +20 -0
  630. package/libs/instance-factories/cli/templates/commander/cli-entry-generator.d.ts +12 -0
  631. package/libs/instance-factories/cli/templates/commander/cli-entry-generator.d.ts.map +1 -0
  632. package/libs/instance-factories/cli/templates/commander/cli-entry-generator.js +115 -0
  633. package/libs/instance-factories/cli/templates/commander/cli-entry-generator.js.map +1 -0
  634. package/libs/instance-factories/cli/templates/commander/cli-entry-generator.ts +168 -0
  635. package/libs/instance-factories/cli/templates/commander/command-generator.d.ts +14 -0
  636. package/libs/instance-factories/cli/templates/commander/command-generator.d.ts.map +1 -0
  637. package/libs/instance-factories/cli/templates/commander/command-generator.js +182 -0
  638. package/libs/instance-factories/cli/templates/commander/command-generator.js.map +1 -0
  639. package/libs/instance-factories/cli/templates/commander/command-generator.ts +1036 -0
  640. package/libs/instance-factories/communication/README.md +47 -0
  641. package/libs/instance-factories/communication/event-emitter.yaml +56 -0
  642. package/libs/instance-factories/communication/rabbitmq-events.yaml +87 -0
  643. package/libs/instance-factories/communication/templates/eventemitter/bus-generator.ts +93 -0
  644. package/libs/instance-factories/communication/templates/eventemitter/publisher-generator.ts +117 -0
  645. package/libs/instance-factories/communication/templates/eventemitter/subscriber-generator.ts +101 -0
  646. package/libs/instance-factories/controllers/README.md +42 -0
  647. package/libs/instance-factories/controllers/fastify.yaml +127 -0
  648. package/libs/instance-factories/controllers/templates/fastify/meta-routes-generator.ts +103 -0
  649. package/libs/instance-factories/controllers/templates/fastify/routes-generator.ts +389 -0
  650. package/libs/instance-factories/controllers/templates/fastify/server-generator.ts +76 -0
  651. package/libs/instance-factories/infrastructure/README.md +29 -0
  652. package/libs/instance-factories/infrastructure/docker-k8s.yaml +61 -0
  653. package/libs/instance-factories/infrastructure/templates/docker-k8s/infrastructure-generator.ts +46 -0
  654. package/libs/instance-factories/orms/README.md +54 -0
  655. package/libs/instance-factories/orms/prisma.yaml +89 -0
  656. package/libs/instance-factories/orms/templates/prisma/schema-generator.ts +576 -0
  657. package/libs/instance-factories/orms/templates/prisma/services-generator.ts +408 -0
  658. package/libs/instance-factories/scaffolding/README.md +49 -0
  659. package/libs/instance-factories/scaffolding/generic-scaffold.yaml +65 -0
  660. package/libs/instance-factories/scaffolding/templates/generic/env-example-generator.ts +73 -0
  661. package/libs/instance-factories/scaffolding/templates/generic/env-generator.ts +85 -0
  662. package/libs/instance-factories/scaffolding/templates/generic/gitignore-generator.ts +69 -0
  663. package/libs/instance-factories/scaffolding/templates/generic/package-json-generator.ts +176 -0
  664. package/libs/instance-factories/scaffolding/templates/generic/readme-generator.ts +207 -0
  665. package/libs/instance-factories/scaffolding/templates/generic/tsconfig-generator.ts +78 -0
  666. package/libs/instance-factories/scaffolding/templates/generic/tsconfig-react-generator.ts +41 -0
  667. package/libs/instance-factories/sdks/README.md +28 -0
  668. package/libs/instance-factories/sdks/python-sdk.yaml +66 -0
  669. package/libs/instance-factories/sdks/templates/python/sdk-generator.ts +50 -0
  670. package/libs/instance-factories/sdks/templates/typescript/sdk-generator.ts +49 -0
  671. package/libs/instance-factories/sdks/typescript-sdk.yaml +59 -0
  672. package/libs/instance-factories/services/README.md +55 -0
  673. package/libs/instance-factories/services/prisma-services.yaml +71 -0
  674. package/libs/instance-factories/services/templates/memory/generate-interpreter.ts +25 -0
  675. package/libs/instance-factories/services/templates/memory/step-conventions-memory.ts +465 -0
  676. package/libs/instance-factories/services/templates/prisma/behavior-generator.ts +304 -0
  677. package/libs/instance-factories/services/templates/prisma/controller-generator.ts +532 -0
  678. package/libs/instance-factories/services/templates/prisma/service-generator.ts +334 -0
  679. package/libs/instance-factories/services/templates/prisma/step-conventions.ts +309 -0
  680. package/libs/instance-factories/services/templates/shared-patterns.ts +38 -0
  681. package/libs/instance-factories/shared/path-resolver.ts +111 -0
  682. package/libs/instance-factories/storage/README.md +34 -0
  683. package/libs/instance-factories/storage/mongodb.yaml +79 -0
  684. package/libs/instance-factories/storage/postgresql.yaml +75 -0
  685. package/libs/instance-factories/storage/redis.yaml +79 -0
  686. package/libs/instance-factories/storage/templates/mongodb/config-generator.ts +15 -0
  687. package/libs/instance-factories/storage/templates/mongodb/docker-generator.ts +18 -0
  688. package/libs/instance-factories/storage/templates/postgresql/config-generator.ts +54 -0
  689. package/libs/instance-factories/storage/templates/postgresql/docker-generator.ts +55 -0
  690. package/libs/instance-factories/storage/templates/redis/config-generator.ts +16 -0
  691. package/libs/instance-factories/storage/templates/redis/docker-generator.ts +18 -0
  692. package/libs/instance-factories/test-generation.ts +192 -0
  693. package/libs/instance-factories/testing/README.md +40 -0
  694. package/libs/instance-factories/testing/templates/vitest/tests-generator.ts +51 -0
  695. package/libs/instance-factories/testing/vitest-tests.yaml +63 -0
  696. package/libs/instance-factories/tools/README.md +70 -0
  697. package/libs/instance-factories/tools/mcp.yaml +36 -0
  698. package/libs/instance-factories/tools/templates/mcp/mcp-server-generator.ts +190 -0
  699. package/libs/instance-factories/tools/templates/mcp/static/docs/DEPLOYMENT_GUIDE.md +630 -0
  700. package/libs/instance-factories/tools/templates/mcp/static/docs/HYBRID_RESOURCE_SYSTEM.md +330 -0
  701. package/libs/instance-factories/tools/templates/mcp/static/docs/deployments/EXTENSION_DEPLOYMENT.md +552 -0
  702. package/libs/instance-factories/tools/templates/mcp/static/docs/deployments/LOCAL_DEPLOYMENT.md +164 -0
  703. package/libs/instance-factories/tools/templates/mcp/static/docs/deployments/WEB_DEPLOYMENT.md +247 -0
  704. package/libs/instance-factories/tools/templates/mcp/static/package.json +94 -0
  705. package/libs/instance-factories/tools/templates/mcp/static/scripts/build-enterprise.js +284 -0
  706. package/libs/instance-factories/tools/templates/mcp/static/scripts/build-extension.js +139 -0
  707. package/libs/instance-factories/tools/templates/mcp/static/scripts/build-local.js +74 -0
  708. package/libs/instance-factories/tools/templates/mcp/static/scripts/build-web.js +156 -0
  709. package/libs/instance-factories/tools/templates/mcp/static/scripts/copy-canonical-files.js +41 -0
  710. package/libs/instance-factories/tools/templates/mcp/static/scripts/test-deployments.js +259 -0
  711. package/libs/instance-factories/tools/templates/mcp/static/scripts/test-hybrid-resources.js +231 -0
  712. package/libs/instance-factories/tools/templates/mcp/static/scripts/test-hybrid-simple.js +196 -0
  713. package/libs/instance-factories/tools/templates/mcp/static/src/controllers/MCPServerController.ts +293 -0
  714. package/libs/instance-factories/tools/templates/mcp/static/src/events/EventEmitter.ts +90 -0
  715. package/libs/instance-factories/tools/templates/mcp/static/src/index.ts +24 -0
  716. package/libs/instance-factories/tools/templates/mcp/static/src/interfaces/ResourceProvider.ts +15 -0
  717. package/libs/instance-factories/tools/templates/mcp/static/src/models/LibrarySuggestion.ts +106 -0
  718. package/libs/instance-factories/tools/templates/mcp/static/src/models/SpecVerseResource.ts +75 -0
  719. package/libs/instance-factories/tools/templates/mcp/static/src/server/mcp-server.ts +239 -0
  720. package/libs/instance-factories/tools/templates/mcp/static/src/services/CLIProxyService.ts +1501 -0
  721. package/libs/instance-factories/tools/templates/mcp/static/src/services/EmbeddedResourcesAdapter.ts +211 -0
  722. package/libs/instance-factories/tools/templates/mcp/static/src/services/EntityModuleService.ts +308 -0
  723. package/libs/instance-factories/tools/templates/mcp/static/src/services/HybridResourcesProvider.ts +210 -0
  724. package/libs/instance-factories/tools/templates/mcp/static/src/services/LibraryToolsService.ts +356 -0
  725. package/libs/instance-factories/tools/templates/mcp/static/src/services/OrchestratorBridge.ts +522 -0
  726. package/libs/instance-factories/tools/templates/mcp/static/src/services/OrchestratorToolsService.ts +530 -0
  727. package/libs/instance-factories/tools/templates/mcp/static/src/services/PromptToolsService.ts +594 -0
  728. package/libs/instance-factories/tools/templates/mcp/static/src/services/ResourcesProviderService.ts +170 -0
  729. package/libs/instance-factories/tools/templates/mcp/static/src/tests/unit/CLIProxyService.init.test.ts +544 -0
  730. package/libs/instance-factories/tools/templates/mcp/static/src/tests/unit/CLIProxyService.test.ts +189 -0
  731. package/libs/instance-factories/tools/templates/mcp/static/src/tests/unit/ResourcesProviderService.test.ts +89 -0
  732. package/libs/instance-factories/tools/templates/mcp/static/src/types/index.ts +110 -0
  733. package/libs/instance-factories/tools/templates/mcp/static/tsconfig.json +28 -0
  734. package/libs/instance-factories/tools/templates/vscode/static/extension.ts +1195 -0
  735. package/libs/instance-factories/tools/templates/vscode/static/language-configuration.json +34 -0
  736. package/libs/instance-factories/tools/templates/vscode/static/schemas/specverse-v3-schema.json +4279 -0
  737. package/libs/instance-factories/tools/templates/vscode/static/syntaxes/specverse.tmLanguage.json +138 -0
  738. package/libs/instance-factories/tools/templates/vscode/static/themes/README.md +74 -0
  739. package/libs/instance-factories/tools/templates/vscode/static/themes/complete-specverse-colors.json +122 -0
  740. package/libs/instance-factories/tools/templates/vscode/static/themes/specverse-basic-theme.json +65 -0
  741. package/libs/instance-factories/tools/templates/vscode/static/themes/specverse-complete-theme.json +123 -0
  742. package/libs/instance-factories/tools/templates/vscode/static/themes/specverse-theme-colors.json +64 -0
  743. package/libs/instance-factories/tools/templates/vscode/vscode-extension-generator.ts +300 -0
  744. package/libs/instance-factories/tools/vscode.yaml +35 -0
  745. package/libs/instance-factories/validation/README.md +38 -0
  746. package/libs/instance-factories/validation/templates/zod/validation-generator.ts +46 -0
  747. package/libs/instance-factories/validation/zod.yaml +56 -0
  748. package/libs/instance-factories/views/README.md +62 -0
  749. package/libs/instance-factories/views/index.d.ts +13 -0
  750. package/libs/instance-factories/views/index.d.ts.map +1 -0
  751. package/libs/instance-factories/views/index.js +18 -0
  752. package/libs/instance-factories/views/index.js.map +1 -0
  753. package/libs/instance-factories/views/index.ts +45 -0
  754. package/libs/instance-factories/views/react-components.yaml +129 -0
  755. package/libs/instance-factories/views/templates/ARCHITECTURE.md +198 -0
  756. package/libs/instance-factories/views/templates/react/adapters/antd-adapter.ts +869 -0
  757. package/libs/instance-factories/views/templates/react/adapters/mui-adapter.ts +953 -0
  758. package/libs/instance-factories/views/templates/react/adapters/shadcn-adapter.ts +806 -0
  759. package/libs/instance-factories/views/templates/react/app-generator.ts +55 -0
  760. package/libs/instance-factories/views/templates/react/components-generator.ts +887 -0
  761. package/libs/instance-factories/views/templates/react/forms-generator.ts +343 -0
  762. package/libs/instance-factories/views/templates/react/frontend-package-json-generator.ts +57 -0
  763. package/libs/instance-factories/views/templates/react/hooks-generator.ts +122 -0
  764. package/libs/instance-factories/views/templates/react/index-css-generator.ts +14 -0
  765. package/libs/instance-factories/views/templates/react/index-html-generator.ts +34 -0
  766. package/libs/instance-factories/views/templates/react/main-tsx-generator.ts +29 -0
  767. package/libs/instance-factories/views/templates/react/react-component-generator.d.ts +152 -0
  768. package/libs/instance-factories/views/templates/react/react-component-generator.d.ts.map +1 -0
  769. package/libs/instance-factories/views/templates/react/react-component-generator.js +398 -0
  770. package/libs/instance-factories/views/templates/react/react-component-generator.js.map +1 -0
  771. package/libs/instance-factories/views/templates/react/react-component-generator.ts +533 -0
  772. package/libs/instance-factories/views/templates/react/router-generator.ts +197 -0
  773. package/libs/instance-factories/views/templates/react/router-generic-generator.ts +132 -0
  774. package/libs/instance-factories/views/templates/react/shared-utils-generator.ts +188 -0
  775. package/libs/instance-factories/views/templates/react/spec-json-generator.ts +17 -0
  776. package/libs/instance-factories/views/templates/react/types-generator.ts +76 -0
  777. package/libs/instance-factories/views/templates/react/views-metadata-generator.ts +42 -0
  778. package/libs/instance-factories/views/templates/react/vite-config-generator.ts +38 -0
  779. package/libs/instance-factories/views/templates/runtime/runtime-view-renderer.d.ts.map +1 -0
  780. package/libs/instance-factories/views/templates/runtime/runtime-view-renderer.js.map +1 -0
  781. package/libs/instance-factories/views/templates/runtime/runtime-view-renderer.ts +474 -0
  782. package/libs/instance-factories/views/templates/shared/__tests__/composite-patterns.test.ts +242 -0
  783. package/libs/instance-factories/views/templates/shared/adapter-types.d.ts +77 -0
  784. package/libs/instance-factories/views/templates/shared/adapter-types.d.ts.map +1 -0
  785. package/libs/instance-factories/views/templates/shared/adapter-types.js +47 -0
  786. package/libs/instance-factories/views/templates/shared/adapter-types.js.map +1 -0
  787. package/libs/instance-factories/views/templates/shared/adapter-types.ts +142 -0
  788. package/libs/instance-factories/views/templates/shared/atomic-components-registry.d.ts +63 -0
  789. package/libs/instance-factories/views/templates/shared/atomic-components-registry.d.ts.map +1 -0
  790. package/libs/instance-factories/views/templates/shared/atomic-components-registry.js +822 -0
  791. package/libs/instance-factories/views/templates/shared/atomic-components-registry.js.map +1 -0
  792. package/libs/instance-factories/views/templates/shared/atomic-components-registry.ts +908 -0
  793. package/libs/instance-factories/views/templates/shared/base-generator.d.ts +247 -0
  794. package/libs/instance-factories/views/templates/shared/base-generator.d.ts.map +1 -0
  795. package/libs/instance-factories/views/templates/shared/base-generator.js +363 -0
  796. package/libs/instance-factories/views/templates/shared/base-generator.js.map +1 -0
  797. package/libs/instance-factories/views/templates/shared/base-generator.ts +608 -0
  798. package/libs/instance-factories/views/templates/shared/component-metadata.d.ts +254 -0
  799. package/libs/instance-factories/views/templates/shared/component-metadata.d.ts.map +1 -0
  800. package/libs/instance-factories/views/templates/shared/component-metadata.js +602 -0
  801. package/libs/instance-factories/views/templates/shared/component-metadata.js.map +1 -0
  802. package/libs/instance-factories/views/templates/shared/component-metadata.ts +803 -0
  803. package/libs/instance-factories/views/templates/shared/composite-pattern-types.ts +250 -0
  804. package/libs/instance-factories/views/templates/shared/composite-patterns.ts +535 -0
  805. package/libs/instance-factories/views/templates/shared/index.ts +68 -0
  806. package/libs/instance-factories/views/templates/shared/pattern-validator.ts +279 -0
  807. package/libs/instance-factories/views/templates/shared/property-mapper.d.ts +149 -0
  808. package/libs/instance-factories/views/templates/shared/property-mapper.d.ts.map +1 -0
  809. package/libs/instance-factories/views/templates/shared/property-mapper.js +580 -0
  810. package/libs/instance-factories/views/templates/shared/property-mapper.js.map +1 -0
  811. package/libs/instance-factories/views/templates/shared/property-mapper.ts +700 -0
  812. package/libs/instance-factories/views/templates/shared/syntax-mapper.d.ts +143 -0
  813. package/libs/instance-factories/views/templates/shared/syntax-mapper.d.ts.map +1 -0
  814. package/libs/instance-factories/views/templates/shared/syntax-mapper.js +420 -0
  815. package/libs/instance-factories/views/templates/shared/syntax-mapper.js.map +1 -0
  816. package/libs/instance-factories/views/templates/shared/syntax-mapper.ts +539 -0
  817. package/package.json +63 -0
@@ -0,0 +1,1115 @@
1
+ /**
2
+ * View Generator for V3.4.0 Logical Inference
3
+ * Generates views with relationship-aware components and event subscriptions
4
+ * Now uses dynamic component type resolution from v3.4 rules
5
+ */
6
+ import { RuleEngine } from '../../core/rule-engine.js';
7
+ import { InferenceContextManager, ContextUtils } from '../../core/context.js';
8
+ import { ComponentTypeResolver } from './component-type-resolver.js';
9
+ import { SpecialistViewExpander } from './specialist-view-expander.js';
10
+ import { pluralize } from '@specverse/types';
11
+ export class ViewGenerator {
12
+ debug;
13
+ name = 'ViewGenerator';
14
+ ruleEngine;
15
+ contextManager;
16
+ componentResolver;
17
+ specialistExpander;
18
+ rulesLoaded = false;
19
+ constructor(debug = false) {
20
+ this.debug = debug;
21
+ this.ruleEngine = new RuleEngine(debug);
22
+ this.contextManager = new InferenceContextManager(debug);
23
+ this.componentResolver = new ComponentTypeResolver();
24
+ this.specialistExpander = new SpecialistViewExpander();
25
+ }
26
+ /**
27
+ * Load component mapping rules from domain-specific format (v3.4.0 Phase 2)
28
+ */
29
+ loadComponentMappingsFromDomainSpecific(ruleFile) {
30
+ this.componentResolver.loadRulesFromDomainSpecific(ruleFile);
31
+ if (this.debug) {
32
+ console.log(`📋 Loaded component mappings (domain-specific): ${ruleFile.version}`);
33
+ }
34
+ }
35
+ /**
36
+ * Load component mapping rules from legacy format (backward compatibility)
37
+ */
38
+ loadComponentMappings(rules) {
39
+ this.componentResolver.loadRules(rules);
40
+ if (this.debug) {
41
+ console.log(`📋 Loaded component mapping rules (legacy): ${rules.version}`);
42
+ }
43
+ }
44
+ /**
45
+ * Load specialist view rules from domain-specific format (v3.4.0 Phase 3)
46
+ */
47
+ loadSpecialistViewRulesFromDomainSpecific(ruleFile) {
48
+ this.specialistExpander.loadRulesFromDomainSpecific(ruleFile);
49
+ if (this.debug) {
50
+ console.log(`📋 Loaded specialist views (domain-specific): ${ruleFile.version}`);
51
+ console.log(` Types: ${this.specialistExpander.getAvailableTypes().join(', ')}`);
52
+ }
53
+ }
54
+ /**
55
+ * Load specialist view rules from legacy format (backward compatibility)
56
+ */
57
+ loadSpecialistViewRules(rules) {
58
+ this.specialistExpander.loadRules(rules);
59
+ if (this.debug) {
60
+ console.log(`📋 Loaded specialist view rules (legacy): ${rules.version}`);
61
+ console.log(` Specialist types: ${this.specialistExpander.getAvailableTypes().join(', ')}`);
62
+ }
63
+ }
64
+ /**
65
+ * Load view inference rules
66
+ */
67
+ async loadRules(rules) {
68
+ if (this.debug) {
69
+ console.log(`📋 Loading ${rules.length} view rules`);
70
+ }
71
+ const validation = this.ruleEngine.loadRules('views', rules);
72
+ if (validation.valid) {
73
+ this.rulesLoaded = true;
74
+ if (this.debug) {
75
+ console.log(`✅ View rules loaded successfully`);
76
+ }
77
+ }
78
+ else {
79
+ console.error('❌ Failed to load view rules:', validation.errors);
80
+ }
81
+ return validation;
82
+ }
83
+ /**
84
+ * Check if this generator supports the given input
85
+ */
86
+ supports(input, context) {
87
+ return this.rulesLoaded && input.name !== undefined;
88
+ }
89
+ /**
90
+ * Generate views for all models
91
+ */
92
+ async generate(models, baseContext) {
93
+ const views = {};
94
+ let rulesUsed = 0;
95
+ const validation = {
96
+ valid: true,
97
+ errors: [],
98
+ warnings: []
99
+ };
100
+ if (!this.rulesLoaded) {
101
+ validation.errors.push({
102
+ code: 'RULES_NOT_LOADED',
103
+ message: 'View rules not loaded. Call loadRules() first.',
104
+ location: 'ViewGenerator.generate'
105
+ });
106
+ validation.valid = false;
107
+ return { views, rulesUsed, validation };
108
+ }
109
+ try {
110
+ // Process user-specified views first (Phase 4)
111
+ // User views come from the parsed .specly file, passed via metadata
112
+ const userViews = baseContext.metadata?.userSpecifiedViews || {};
113
+ if (Object.keys(userViews).length > 0) {
114
+ if (this.debug) {
115
+ console.log(`👁️ Processing ${Object.keys(userViews).length} user-specified views`);
116
+ }
117
+ for (const [viewName, userViewSpec] of Object.entries(userViews)) {
118
+ views[viewName] = this.processUserSpecifiedView(viewName, userViewSpec, models);
119
+ rulesUsed++;
120
+ if (this.debug) {
121
+ console.log(` ✅ Processed user-specified view: ${viewName} (${userViewSpec.type})`);
122
+ }
123
+ }
124
+ }
125
+ // Generate auto views for each model (standard + specialist)
126
+ for (const model of models) {
127
+ if (this.debug) {
128
+ console.log(`👁️ Generating views for model: ${model.name}`);
129
+ }
130
+ // Create model-specific context
131
+ const modelContext = ContextUtils.withCurrentModel(baseContext, model, this.contextManager);
132
+ // Generate standard views (but skip if user already defined them)
133
+ const standardViews = this.generateStandardViews(model, modelContext);
134
+ for (const [viewName, viewSpec] of Object.entries(standardViews)) {
135
+ // Only add if not already defined by user
136
+ if (!views[viewName]) {
137
+ views[viewName] = viewSpec;
138
+ rulesUsed++;
139
+ if (this.debug) {
140
+ console.log(` ✅ Generated standard view: ${viewName} (${viewSpec.type})`);
141
+ }
142
+ }
143
+ else if (this.debug) {
144
+ console.log(` ⏭️ Skipped standard view (user-defined): ${viewName}`);
145
+ }
146
+ }
147
+ // Generate specialist views (but skip if user already defined them)
148
+ const specialistViews = this.generateSpecialistViews(model, modelContext);
149
+ for (const [viewName, viewSpec] of Object.entries(specialistViews)) {
150
+ // Only add if not already defined by user
151
+ if (!views[viewName]) {
152
+ views[viewName] = viewSpec;
153
+ rulesUsed++;
154
+ if (this.debug) {
155
+ console.log(` ✅ Generated specialist view: ${viewName} (${viewSpec.type})`);
156
+ }
157
+ }
158
+ else if (this.debug) {
159
+ console.log(` ⏭️ Skipped specialist view (user-defined): ${viewName}`);
160
+ }
161
+ }
162
+ // Generate relationship views
163
+ if (model.relationships && model.relationships.length > 0) {
164
+ const relationshipViews = this.generateRelationshipViews(model, models, modelContext);
165
+ for (const [viewName, viewSpec] of Object.entries(relationshipViews)) {
166
+ views[viewName] = viewSpec;
167
+ rulesUsed++;
168
+ if (this.debug) {
169
+ console.log(` ✅ Generated relationship view: ${viewName} (${viewSpec.type})`);
170
+ }
171
+ }
172
+ }
173
+ // Apply custom view rules
174
+ const matchingRules = this.ruleEngine.findMatches('views', model, modelContext);
175
+ for (const rule of matchingRules) {
176
+ try {
177
+ const ruleViews = this.ruleEngine.apply(rule, model, modelContext);
178
+ // Handle both single view and multiple views from rules
179
+ if (typeof ruleViews === 'object' && ruleViews !== null) {
180
+ if ('type' in ruleViews) {
181
+ // Single view
182
+ const viewName = this.generateViewName(model, rule);
183
+ views[viewName] = ruleViews;
184
+ rulesUsed++;
185
+ }
186
+ else {
187
+ // Multiple views
188
+ for (const [viewName, viewSpec] of Object.entries(ruleViews)) {
189
+ views[viewName] = viewSpec;
190
+ rulesUsed++;
191
+ }
192
+ }
193
+ }
194
+ if (this.debug) {
195
+ console.log(` ✅ Applied rule: ${rule.name} (${rule.pattern})`);
196
+ }
197
+ }
198
+ catch (error) {
199
+ validation.errors.push({
200
+ code: 'RULE_APPLICATION_ERROR',
201
+ message: `Failed to apply rule '${rule.name}' to model '${model.name}': ${error instanceof Error ? error.message : String(error)}`,
202
+ location: `model:${model.name}:rule:${rule.name}`
203
+ });
204
+ validation.valid = false;
205
+ }
206
+ }
207
+ }
208
+ // Generate aggregate views for related models
209
+ const aggregateViews = this.generateAggregateViews(models, baseContext);
210
+ for (const [viewName, viewSpec] of Object.entries(aggregateViews)) {
211
+ views[viewName] = viewSpec;
212
+ rulesUsed++;
213
+ if (this.debug) {
214
+ console.log(` ✅ Generated aggregate view: ${viewName} (${viewSpec.type})`);
215
+ }
216
+ }
217
+ // Validate all generated views
218
+ for (const [viewName, viewSpec] of Object.entries(views)) {
219
+ const viewValidation = this.validateViewSpec(viewSpec, viewName);
220
+ validation.errors.push(...viewValidation.errors);
221
+ validation.warnings.push(...viewValidation.warnings);
222
+ if (!viewValidation.valid) {
223
+ validation.valid = false;
224
+ }
225
+ }
226
+ }
227
+ catch (error) {
228
+ validation.errors.push({
229
+ code: 'GENERATION_ERROR',
230
+ message: `View generation failed: ${error instanceof Error ? error.message : String(error)}`,
231
+ location: 'ViewGenerator.generate'
232
+ });
233
+ validation.valid = false;
234
+ }
235
+ if (this.debug) {
236
+ console.log(`👁️ View generation complete:`);
237
+ console.log(` Models processed: ${models.length}`);
238
+ console.log(` Views generated: ${Object.keys(views).length}`);
239
+ console.log(` Rules applied: ${rulesUsed}`);
240
+ console.log(` Validation: ${validation.valid ? 'PASSED' : 'FAILED'} (${validation.errors.length} errors, ${validation.warnings.length} warnings)`);
241
+ }
242
+ return { views, rulesUsed, validation };
243
+ }
244
+ // ===============================
245
+ // Private Implementation
246
+ // ===============================
247
+ /**
248
+ * Generate standard views for a model (list, detail, form)
249
+ */
250
+ generateStandardViews(model, context) {
251
+ const views = {};
252
+ // List View
253
+ // List View - Runtime auto-infers table from model
254
+ views[`${model.name}ListView`] = {
255
+ type: 'list',
256
+ model: model.name,
257
+ description: `List view for ${model.name}s`,
258
+ subscribes_to: this.generateListViewSubscriptions(model)
259
+ // Runtime auto-infers: table columns, filters, pagination, sorting
260
+ };
261
+ // Detail View - Runtime auto-infers layout from model and relationships
262
+ const detailView = {
263
+ type: 'detail',
264
+ description: `Detail view for ${model.name}`,
265
+ subscribes_to: this.generateDetailViewSubscriptions(model)
266
+ };
267
+ // Always add minimal uiComponents for detail views
268
+ const uiComponents = {};
269
+ // Add related models if there are child relationships
270
+ if (context.relationships?.childRelationships && context.relationships.childRelationships.length > 0) {
271
+ const relatedModels = [model.name];
272
+ const uniqueRelated = new Set();
273
+ context.relationships.childRelationships.forEach(rel => {
274
+ uniqueRelated.add(rel.targetModel);
275
+ });
276
+ relatedModels.push(...Array.from(uniqueRelated));
277
+ detailView.model = relatedModels;
278
+ // Main model content
279
+ uiComponents[`${model.name.toLowerCase()}Content`] = {
280
+ type: 'content'
281
+ // Fields auto-inferred from model
282
+ };
283
+ // Related model lists
284
+ Array.from(uniqueRelated).forEach(relatedModel => {
285
+ uiComponents[`${relatedModel.toLowerCase()}List`] = {
286
+ type: 'list'
287
+ // Fields auto-inferred from related model
288
+ };
289
+ });
290
+ }
291
+ else {
292
+ // Single model detail view - just content component
293
+ detailView.model = model.name;
294
+ uiComponents[`${model.name.toLowerCase()}Content`] = {
295
+ type: 'content'
296
+ // Fields auto-inferred from model
297
+ };
298
+ }
299
+ detailView.uiComponents = uiComponents;
300
+ views[`${model.name}DetailView`] = detailView;
301
+ // Form View - Runtime auto-infers all UI components
302
+ views[`${model.name}FormView`] = {
303
+ type: 'form',
304
+ model: model.name,
305
+ description: `Form view for creating and editing ${model.name}`,
306
+ subscribes_to: [`${model.name}Created`, `${model.name}Updated`]
307
+ // Runtime auto-infers: form fields, relationship selectors, submit buttons
308
+ };
309
+ return views;
310
+ }
311
+ /**
312
+ * Generate specialist views if expander is loaded (v3.4.0 Phase 3)
313
+ * Specialist views include: dashboard, analytics, board, calendar, timeline, etc.
314
+ *
315
+ * DISABLED: Phase 2 - Reduce view generation to essentials only
316
+ * Only list, detail, and form views are generated per model
317
+ * No specialist views (dashboard, analytics, board, timeline, workflow, calendar)
318
+ */
319
+ generateSpecialistViews(model, context) {
320
+ const views = {};
321
+ // Only generate if specialist expander has rules loaded
322
+ if (!this.specialistExpander.isLoaded()) {
323
+ return views;
324
+ }
325
+ // Check model characteristics for smart specialist view generation
326
+ const numericAttrs = model.attributes?.filter(attr => ['integer', 'number', 'money', 'decimal', 'float'].includes(attr.type.toLowerCase())) || [];
327
+ const hasMetrics = numericAttrs.length > 0;
328
+ const hasLifecycle = !!model.lifecycle && (model.lifecycle.states?.length || 0) > 0;
329
+ const hasRelationships = (model.relationships?.length || 0) > 0;
330
+ // At least one specialist-worthy characteristic needed
331
+ if (hasMetrics || hasLifecycle) {
332
+ // Generate dashboard view
333
+ if (this.specialistExpander.isSpecialistView('dashboard')) {
334
+ try {
335
+ const metrics = model.attributes
336
+ ?.filter(attr => ['integer', 'number', 'money'].includes(attr.type.toLowerCase()))
337
+ .map(attr => attr.name)
338
+ .slice(0, 3) || []; // Limit to 3 metrics
339
+ if (metrics.length > 0) {
340
+ const dashboardComponents = this.specialistExpander.expandSpecialistView({
341
+ type: 'dashboard',
342
+ model: model.name,
343
+ metrics
344
+ });
345
+ views[`${model.name}DashboardView`] = {
346
+ type: 'dashboard',
347
+ model: model.name,
348
+ description: `Dashboard view for ${model.name} with metrics and summary`,
349
+ subscribes_to: this.generateListViewSubscriptions(model),
350
+ uiComponents: dashboardComponents
351
+ };
352
+ if (this.debug) {
353
+ console.log(` ✅ Generated specialist dashboard view for ${model.name}`);
354
+ }
355
+ }
356
+ }
357
+ catch (error) {
358
+ if (this.debug) {
359
+ console.warn(` ⚠️ Failed to generate dashboard for ${model.name}:`, error);
360
+ }
361
+ }
362
+ }
363
+ // Generate analytics view only for models with lifecycle AND metrics
364
+ if (this.specialistExpander.isSpecialistView('analytics') && hasLifecycle && hasMetrics) {
365
+ try {
366
+ const charts = ['trend', 'distribution'];
367
+ const analyticsComponents = this.specialistExpander.expandSpecialistView({
368
+ type: 'analytics',
369
+ model: model.name,
370
+ charts
371
+ });
372
+ views[`${model.name}AnalyticsView`] = {
373
+ type: 'analytics',
374
+ model: model.name,
375
+ description: `Analytics view for ${model.name} with charts and filters`,
376
+ subscribes_to: this.generateListViewSubscriptions(model),
377
+ uiComponents: analyticsComponents
378
+ };
379
+ if (this.debug) {
380
+ console.log(` ✅ Generated specialist analytics view for ${model.name}`);
381
+ }
382
+ }
383
+ catch (error) {
384
+ if (this.debug) {
385
+ console.warn(` ⚠️ Failed to generate analytics for ${model.name}:`, error);
386
+ }
387
+ }
388
+ }
389
+ // Generate board view for models with workflow/lifecycle
390
+ if (this.specialistExpander.isSpecialistView('board') && model.lifecycle) {
391
+ try {
392
+ // Use lifecycle states as board columns
393
+ const states = model.lifecycle?.states || [];
394
+ if (states.length > 0) {
395
+ // Handle both string[] and object[] state formats
396
+ const stateNames = states.map(s => typeof s === 'string' ? s : s.name);
397
+ const boardComponents = this.specialistExpander.expandSpecialistView({
398
+ type: 'board',
399
+ model: model.name,
400
+ columns: stateNames
401
+ });
402
+ views[`${model.name}BoardView`] = {
403
+ type: 'board',
404
+ model: model.name,
405
+ description: `Kanban board view for ${model.name} workflow`,
406
+ subscribes_to: [...this.generateListViewSubscriptions(model), `${model.name}Evolved`],
407
+ uiComponents: boardComponents
408
+ };
409
+ if (this.debug) {
410
+ console.log(` ✅ Generated specialist board view for ${model.name}`);
411
+ }
412
+ }
413
+ }
414
+ catch (error) {
415
+ if (this.debug) {
416
+ console.warn(` ⚠️ Failed to generate board for ${model.name}:`, error);
417
+ }
418
+ }
419
+ }
420
+ // Generate timeline view for models with domain-specific date fields (not just audit fields)
421
+ const auditFields = new Set(['createdat', 'updatedat', 'createdby', 'updatedby', 'deletedat']);
422
+ const hasTemporalAttributes = model.attributes?.some(attr => ['datetime', 'date', 'timestamp'].includes(attr.type.toLowerCase()) &&
423
+ !auditFields.has(attr.name.toLowerCase()));
424
+ if (this.specialistExpander.isSpecialistView('timeline') && hasTemporalAttributes) {
425
+ try {
426
+ const timelineComponents = this.specialistExpander.expandSpecialistView({
427
+ type: 'timeline',
428
+ model: model.name
429
+ });
430
+ views[`${model.name}TimelineView`] = {
431
+ type: 'timeline',
432
+ model: model.name,
433
+ description: `Timeline view for ${model.name} chronological history`,
434
+ subscribes_to: this.generateListViewSubscriptions(model),
435
+ uiComponents: timelineComponents
436
+ };
437
+ if (this.debug) {
438
+ console.log(` ✅ Generated specialist timeline view for ${model.name}`);
439
+ }
440
+ }
441
+ catch (error) {
442
+ if (this.debug) {
443
+ console.warn(` ⚠️ Failed to generate timeline for ${model.name}:`, error);
444
+ }
445
+ }
446
+ }
447
+ // Generate calendar view for models with date/time scheduling attributes
448
+ const hasSchedulingAttributes = model.attributes?.some(attr => ['startDate', 'endDate', 'scheduledAt', 'dueDate'].some(name => attr.name.toLowerCase().includes(name.toLowerCase())));
449
+ if (this.specialistExpander.isSpecialistView('calendar') && hasSchedulingAttributes) {
450
+ try {
451
+ const calendarComponents = this.specialistExpander.expandSpecialistView({
452
+ type: 'calendar',
453
+ model: model.name
454
+ });
455
+ views[`${model.name}CalendarView`] = {
456
+ type: 'calendar',
457
+ model: model.name,
458
+ description: `Calendar view for ${model.name} scheduling`,
459
+ subscribes_to: this.generateListViewSubscriptions(model),
460
+ uiComponents: calendarComponents
461
+ };
462
+ if (this.debug) {
463
+ console.log(` ✅ Generated specialist calendar view for ${model.name}`);
464
+ }
465
+ }
466
+ catch (error) {
467
+ if (this.debug) {
468
+ console.warn(` ⚠️ Failed to generate calendar for ${model.name}:`, error);
469
+ }
470
+ }
471
+ }
472
+ // Generate workflow view for models with complex lifecycles (3+ states)
473
+ if (this.specialistExpander.isSpecialistView('workflow') && model.lifecycle) {
474
+ const states = model.lifecycle?.states || [];
475
+ if (states.length >= 3) {
476
+ try {
477
+ const workflowComponents = this.specialistExpander.expandSpecialistView({
478
+ type: 'workflow',
479
+ model: model.name
480
+ });
481
+ views[`${model.name}WorkflowView`] = {
482
+ type: 'workflow',
483
+ model: model.name,
484
+ description: `Workflow state machine for ${model.name}`,
485
+ subscribes_to: [...this.generateListViewSubscriptions(model), `${model.name}Evolved`],
486
+ uiComponents: workflowComponents
487
+ };
488
+ if (this.debug) {
489
+ console.log(` ✅ Generated specialist workflow view for ${model.name}`);
490
+ }
491
+ }
492
+ catch (error) {
493
+ if (this.debug) {
494
+ console.warn(` ⚠️ Failed to generate workflow for ${model.name}:`, error);
495
+ }
496
+ }
497
+ }
498
+ }
499
+ }
500
+ return views;
501
+ }
502
+ /**
503
+ * Process user-specified view from .specly file (Phase 4)
504
+ * User views can be simple (just type) or detailed (full uiComponents)
505
+ */
506
+ processUserSpecifiedView(viewName, userSpec, models) {
507
+ const viewSpec = {
508
+ type: userSpec.type,
509
+ model: userSpec.model,
510
+ models: userSpec.models,
511
+ description: userSpec.description || `User-defined ${userSpec.type} view`,
512
+ subscribes_to: userSpec.subscribes_to || []
513
+ };
514
+ // If user provided full uiComponents, use them
515
+ if (userSpec.uiComponents) {
516
+ viewSpec.uiComponents = userSpec.uiComponents;
517
+ }
518
+ // If user requested a specialist view but didn't provide components, expand it
519
+ else if (this.specialistExpander.isSpecialistView(userSpec.type)) {
520
+ // Build expansion parameters from user spec
521
+ const expansionParams = {
522
+ type: userSpec.type,
523
+ model: userSpec.model || viewName.replace(/View$/, '')
524
+ };
525
+ // Extract type-specific parameters
526
+ if (userSpec.metrics)
527
+ expansionParams.metrics = userSpec.metrics;
528
+ if (userSpec.charts)
529
+ expansionParams.charts = userSpec.charts;
530
+ if (userSpec.columns)
531
+ expansionParams.columns = userSpec.columns;
532
+ // Expand using specialist expander
533
+ viewSpec.uiComponents = this.specialistExpander.expandSpecialistView(expansionParams);
534
+ }
535
+ // Otherwise, create minimal components
536
+ else {
537
+ viewSpec.uiComponents = {
538
+ container: {
539
+ type: 'container',
540
+ properties: {
541
+ model: userSpec.model
542
+ }
543
+ }
544
+ };
545
+ }
546
+ return viewSpec;
547
+ }
548
+ /**
549
+ * Generate relationship-specific views
550
+ *
551
+ * DISABLED: Phase 2 - master_detail views disabled
552
+ * Only association views for many-to-many relationships are generated
553
+ */
554
+ generateRelationshipViews(model, allModels, context) {
555
+ const views = {};
556
+ if (!model.relationships)
557
+ return views;
558
+ const relationships = context.relationships;
559
+ // DISABLED: Phase 2 - master_detail view type not supported
560
+ // Generate master-detail views for parent-child relationships
561
+ // if (relationships?.childRelationships && relationships.childRelationships.length > 0) {
562
+ // views[`${model.name}MasterDetailView`] = {
563
+ // type: 'master_detail',
564
+ // model: model.name,
565
+ // description: `Master-detail view showing ${model.name} with related entities`,
566
+ // subscribes_to: this.generateMasterDetailSubscriptions(model, relationships.childRelationships),
567
+ // uiComponents: this.generateMasterDetailComponents(model, relationships.childRelationships, context)
568
+ // };
569
+ // }
570
+ // Generate relationship management views for many-to-many
571
+ if (relationships?.manyToManyRelationships && relationships.manyToManyRelationships.length > 0) {
572
+ for (const relationship of relationships.manyToManyRelationships) {
573
+ views[`${model.name}${relationship.targetModel}AssociationView`] = {
574
+ type: 'list',
575
+ model: model.name,
576
+ description: `Manage ${model.name} associations with ${relationship.targetModel}`,
577
+ subscribes_to: [
578
+ `${model.name}AssociatedWith${relationship.targetModel}`,
579
+ `${model.name}DisassociatedFrom${relationship.targetModel}`
580
+ ],
581
+ uiComponents: this.generateAssociationViewComponents(model, relationship, context)
582
+ };
583
+ }
584
+ }
585
+ return views;
586
+ }
587
+ /**
588
+ * Generate aggregate views for dashboard and overview purposes
589
+ */
590
+ generateAggregateViews(models, context) {
591
+ const views = {};
592
+ if (models.length < 2)
593
+ return views;
594
+ // Find root models (models without parent relationships)
595
+ const rootModels = models.filter(model => {
596
+ if (!model.relationships)
597
+ return true;
598
+ return !model.relationships.some(rel => rel.type === 'belongsTo');
599
+ });
600
+ if (rootModels.length > 1) {
601
+ // System dashboard view - using models array for dashboard type
602
+ views['SystemDashboardView'] = {
603
+ type: 'dashboard',
604
+ model: rootModels[0].name,
605
+ description: 'System-wide dashboard showing overview of all main entities',
606
+ subscribes_to: rootModels.flatMap(model => [
607
+ `${model.name}Created`,
608
+ `${model.name}Updated`,
609
+ `${model.name}Deleted`
610
+ ]),
611
+ uiComponents: this.generateDashboardComponents(rootModels, context)
612
+ };
613
+ }
614
+ return views;
615
+ }
616
+ /**
617
+ * Generate list view event subscriptions
618
+ */
619
+ generateListViewSubscriptions(model) {
620
+ const subscriptions = [
621
+ `${model.name}Created`,
622
+ `${model.name}Updated`,
623
+ `${model.name}Deleted`
624
+ ];
625
+ // Add lifecycle subscriptions
626
+ if (model.lifecycle) {
627
+ subscriptions.push(`${model.name}Evolved`);
628
+ }
629
+ return subscriptions;
630
+ }
631
+ /**
632
+ * Generate detail view event subscriptions
633
+ */
634
+ generateDetailViewSubscriptions(model) {
635
+ const subscriptions = [`${model.name}Updated`];
636
+ // Add lifecycle subscriptions
637
+ if (model.lifecycle) {
638
+ subscriptions.push(`${model.name}Evolved`);
639
+ }
640
+ // Add relationship subscriptions (use PascalCase for event names to match event generator)
641
+ if (model.relationships) {
642
+ for (const rel of model.relationships) {
643
+ if (rel.type === 'hasMany' || rel.type === 'hasOne') {
644
+ const relationshipNamePascal = this.pascalCase(rel.name);
645
+ subscriptions.push(`${relationshipNamePascal}AddedTo${model.name}`);
646
+ subscriptions.push(`${relationshipNamePascal}RemovedFrom${model.name}`);
647
+ }
648
+ }
649
+ }
650
+ return subscriptions;
651
+ }
652
+ /**
653
+ * Generate master-detail view subscriptions
654
+ */
655
+ generateMasterDetailSubscriptions(model, childRelationships) {
656
+ const subscriptions = [`${model.name}Updated`];
657
+ for (const rel of childRelationships) {
658
+ subscriptions.push(`${rel.targetModel}Created`);
659
+ subscriptions.push(`${rel.targetModel}Updated`);
660
+ subscriptions.push(`${rel.targetModel}Deleted`);
661
+ }
662
+ return subscriptions;
663
+ }
664
+ /**
665
+ * Generate list view components
666
+ */
667
+ generateListViewComponents(model, context) {
668
+ // v3.4.0: Use pattern from component mapping rules if available
669
+ const pattern = this.componentResolver.getListViewPattern();
670
+ if (pattern) {
671
+ return {
672
+ searchBar: {
673
+ type: pattern.searchBar.type, // 'input' from v3.4 rules
674
+ properties: {
675
+ placeholder: `Search ${pluralize(model.name.toLowerCase())}...`,
676
+ debounce: 300
677
+ }
678
+ },
679
+ filters: {
680
+ type: pattern.filterPanel.type, // 'filterPanel' from v3.4 rules
681
+ properties: {
682
+ model: model.name,
683
+ filterFields: this.getFilterableFields(model)
684
+ }
685
+ },
686
+ [`${model.name.toLowerCase()}List`]: {
687
+ type: pattern.table.type, // 'table' from v3.4 rules
688
+ properties: {
689
+ model: model.name,
690
+ itemTemplate: `${model.name}Card`,
691
+ pagination: true,
692
+ sortable: true,
693
+ selectable: true
694
+ }
695
+ },
696
+ actionToolbar: {
697
+ type: 'button-group', // v3.4 atomic type
698
+ properties: {
699
+ actions: [
700
+ { name: 'create', label: `Create ${model.name}`, icon: 'plus' },
701
+ { name: 'delete', label: 'Delete Selected', icon: 'trash', bulk: true },
702
+ { name: 'export', label: 'Export', icon: 'download' }
703
+ ]
704
+ }
705
+ }
706
+ };
707
+ }
708
+ // Fallback to legacy types
709
+ return {
710
+ searchBar: {
711
+ type: 'SearchInput',
712
+ properties: {
713
+ placeholder: `Search ${pluralize(model.name.toLowerCase())}...`,
714
+ debounce: 300
715
+ }
716
+ },
717
+ filters: {
718
+ type: 'FilterPanel',
719
+ properties: {
720
+ model: model.name,
721
+ filterFields: this.getFilterableFields(model)
722
+ }
723
+ },
724
+ [`${model.name.toLowerCase()}List`]: {
725
+ type: 'List',
726
+ properties: {
727
+ model: model.name,
728
+ itemTemplate: `${model.name}Card`,
729
+ pagination: true,
730
+ sortable: true,
731
+ selectable: true
732
+ }
733
+ },
734
+ actionToolbar: {
735
+ type: 'ActionToolbar',
736
+ properties: {
737
+ actions: [
738
+ { name: 'create', label: `Create ${model.name}`, icon: 'plus' },
739
+ { name: 'delete', label: 'Delete Selected', icon: 'trash', bulk: true },
740
+ { name: 'export', label: 'Export', icon: 'download' }
741
+ ]
742
+ }
743
+ }
744
+ };
745
+ }
746
+ /**
747
+ * Generate detail view components
748
+ */
749
+ generateDetailViewComponents(model, context) {
750
+ // v3.4.0: Use pattern from component mapping rules if available
751
+ const pattern = this.componentResolver.getDetailViewPattern();
752
+ const components = {
753
+ detailHeader: {
754
+ type: pattern?.header?.type || 'header', // 'header' from v3.4 rules
755
+ properties: {
756
+ title: `${model.name} Details`,
757
+ model: model.name,
758
+ showBreadcrumb: true
759
+ }
760
+ },
761
+ detailsPanel: {
762
+ type: pattern?.card?.type || 'card', // 'card' from v3.4 rules
763
+ properties: {
764
+ model: model.name,
765
+ layout: 'card',
766
+ showMetadata: true
767
+ }
768
+ },
769
+ actions: {
770
+ type: pattern?.actions?.type || 'button-group', // 'button-group' from v3.4 rules
771
+ properties: {
772
+ buttons: [
773
+ { name: 'edit', label: 'Edit', icon: 'edit' },
774
+ { name: 'delete', label: 'Delete', icon: 'trash' }
775
+ ]
776
+ }
777
+ }
778
+ };
779
+ // Related data sections based on relationships
780
+ const relationships = context.relationships;
781
+ if (relationships?.childRelationships) {
782
+ for (const rel of relationships.childRelationships) {
783
+ // v3.4.0: Use relationship type resolver
784
+ const relType = this.componentResolver.isLoaded()
785
+ ? this.componentResolver.resolveRelationshipComponentType(rel)
786
+ : { type: 'list' }; // v3.4 atomic type
787
+ components[`related${rel.targetModel}Section`] = {
788
+ type: relType.type, // 'list' from v3.4 rules for hasMany
789
+ properties: {
790
+ title: `Related ${pluralize(rel.targetModel)}`,
791
+ model: rel.targetModel,
792
+ relationship: rel.type,
793
+ allowCreate: true,
794
+ allowEdit: true,
795
+ allowDelete: !rel.cascadeDelete
796
+ }
797
+ };
798
+ }
799
+ }
800
+ // Lifecycle controls if model has lifecycle
801
+ if (model.lifecycle) {
802
+ components.lifecycleControls = {
803
+ type: 'LifecycleControls',
804
+ properties: {
805
+ model: model.name,
806
+ lifecycle: model.lifecycle.name,
807
+ showHistory: true
808
+ }
809
+ };
810
+ }
811
+ return components;
812
+ }
813
+ /**
814
+ * Generate form view components
815
+ */
816
+ generateFormViewComponents(model, context) {
817
+ // v3.4.0: Use pattern from component mapping rules if available
818
+ const pattern = this.componentResolver.getFormViewPattern();
819
+ // Phase 1: Removed formHeader - runtime auto-infers headers
820
+ const components = {};
821
+ // Form container
822
+ const formComponent = {
823
+ type: pattern?.form?.type || 'form', // 'form' from v3.4 rules
824
+ properties: {
825
+ model: model.name,
826
+ sections: []
827
+ }
828
+ };
829
+ // Form sections based on attributes
830
+ const sections = this.groupAttributesIntoSections(model);
831
+ for (const [sectionName, attributes] of Object.entries(sections)) {
832
+ // Phase 2: Filter out id and auto-generated fields from forms
833
+ const editableAttrs = attributes.filter(attr => attr.name !== 'id' && !attr.auto);
834
+ if (editableAttrs.length > 0) {
835
+ formComponent.properties.sections.push({
836
+ title: sectionName,
837
+ fields: editableAttrs.map(attr => ({
838
+ name: attr.name,
839
+ type: this.getInputType(attr), // Uses v3.4 resolver
840
+ label: this.humanize(attr.name),
841
+ required: attr.required,
842
+ validation: attr.constraints
843
+ }))
844
+ });
845
+ }
846
+ }
847
+ components.form = formComponent;
848
+ // Relationship fields
849
+ const relationships = context.relationships;
850
+ if (relationships?.parentRelationships) {
851
+ for (const rel of relationships.parentRelationships) {
852
+ // v3.4.0: Use relationship resolver
853
+ const relType = this.componentResolver.isLoaded()
854
+ ? this.componentResolver.resolveRelationshipComponentType(rel)
855
+ : { type: 'autocomplete' }; // v3.4 atomic type
856
+ components[`${rel.name}Selector`] = {
857
+ type: relType.type, // 'autocomplete' from v3.4 rules for belongsTo
858
+ properties: {
859
+ name: `${rel.name}Id`,
860
+ label: `Select ${rel.targetModel}`,
861
+ model: rel.targetModel,
862
+ required: true,
863
+ searchable: true
864
+ }
865
+ };
866
+ }
867
+ }
868
+ // Submit controls
869
+ components.formActions = {
870
+ type: pattern?.actions?.type || 'button-group', // 'button-group' from v3.4 rules
871
+ properties: {
872
+ buttons: [
873
+ { name: 'submit', label: `Save ${model.name}`, type: 'primary' },
874
+ { name: 'cancel', label: 'Cancel', type: 'secondary' }
875
+ ],
876
+ showValidation: true
877
+ }
878
+ };
879
+ return components;
880
+ }
881
+ /**
882
+ * Generate master-detail view components
883
+ */
884
+ generateMasterDetailComponents(model, childRelationships, context) {
885
+ const components = {
886
+ masterPane: {
887
+ type: 'MasterPane',
888
+ properties: {
889
+ model: model.name,
890
+ displayMode: 'detail',
891
+ resizable: true
892
+ }
893
+ }
894
+ };
895
+ // Detail panes for each child relationship
896
+ for (const rel of childRelationships) {
897
+ components[`${rel.targetModel.toLowerCase()}DetailPane`] = {
898
+ type: 'DetailPane',
899
+ properties: {
900
+ title: `${pluralize(rel.targetModel)}`,
901
+ model: rel.targetModel,
902
+ parentModel: model.name,
903
+ relationshipType: rel.type,
904
+ allowCreate: true,
905
+ allowEdit: true,
906
+ allowDelete: !rel.cascadeDelete
907
+ }
908
+ };
909
+ }
910
+ return components;
911
+ }
912
+ /**
913
+ * Generate association view components for many-to-many relationships
914
+ */
915
+ generateAssociationViewComponents(model, relationship, context) {
916
+ return {
917
+ associationManager: {
918
+ type: 'AssociationManager',
919
+ properties: {
920
+ sourceModel: model.name,
921
+ targetModel: relationship.targetModel,
922
+ relationshipType: 'manyToMany',
923
+ allowAdd: true,
924
+ allowRemove: true,
925
+ showAssociationData: true,
926
+ searchable: true
927
+ }
928
+ }
929
+ };
930
+ }
931
+ /**
932
+ * Generate dashboard components
933
+ */
934
+ generateDashboardComponents(models, context) {
935
+ // v3.4.0 Phase 3: Use specialist view expander if rules are loaded
936
+ if (this.specialistExpander.isLoaded() && this.specialistExpander.isSpecialistView('dashboard')) {
937
+ const metrics = models.map(m => m.name.toLowerCase());
938
+ const viewDef = {
939
+ type: 'dashboard',
940
+ model: models[0]?.name || 'System',
941
+ metrics: metrics.slice(0, 3) // Limit to first 3 for dashboard overview
942
+ };
943
+ return this.specialistExpander.expandSpecialistView(viewDef);
944
+ }
945
+ // Fallback to legacy component types
946
+ const components = {};
947
+ // Summary cards for each model
948
+ for (const model of models) {
949
+ components[`${model.name.toLowerCase()}Summary`] = {
950
+ type: 'SummaryCard',
951
+ properties: {
952
+ model: model.name,
953
+ title: `${pluralize(model.name)} Overview`,
954
+ showCount: true,
955
+ showRecentActivity: true,
956
+ showTrends: true
957
+ }
958
+ };
959
+ }
960
+ // Recent activity feed
961
+ components.activityFeed = {
962
+ type: 'ActivityFeed',
963
+ properties: {
964
+ title: 'Recent Activity',
965
+ models: models.map(m => m.name),
966
+ limit: 20,
967
+ groupByDate: true
968
+ }
969
+ };
970
+ return components;
971
+ }
972
+ // Utility methods
973
+ generateViewName(model, rule) {
974
+ switch (rule.pattern) {
975
+ case 'CustomListView':
976
+ return `${model.name}CustomListView`;
977
+ case 'ReportView':
978
+ return `${model.name}ReportView`;
979
+ case 'AnalyticsView':
980
+ return `${model.name}AnalyticsView`;
981
+ default:
982
+ return `${model.name}CustomView`;
983
+ }
984
+ }
985
+ getFilterableFields(model) {
986
+ return model.attributes
987
+ .filter(attr => ['String', 'Text', 'Integer', 'Boolean', 'DateTime'].includes(attr.type))
988
+ .map(attr => attr.name);
989
+ }
990
+ groupAttributesIntoSections(model) {
991
+ // Phase 4: Semantic section grouping based on attribute semantics
992
+ const sections = {
993
+ 'Basic Information': [],
994
+ 'Publishing': [],
995
+ 'Metadata': []
996
+ };
997
+ for (const attr of model.attributes) {
998
+ const attrName = attr.name.toLowerCase();
999
+ // Core identifying fields
1000
+ if (['name', 'title', 'content', 'description', 'bio'].includes(attrName)) {
1001
+ sections['Basic Information'].push(attr);
1002
+ }
1003
+ // Publishing/visibility related fields
1004
+ else if (['publishedat', 'publishdate', 'status', 'visibility', 'ispublished'].includes(attrName.replace('_', ''))) {
1005
+ sections['Publishing'].push(attr);
1006
+ }
1007
+ // Metadata fields
1008
+ else if (['createdat', 'updatedat', 'joinedat', 'viewcount', 'metadata'].includes(attrName.replace('_', ''))) {
1009
+ sections['Metadata'].push(attr);
1010
+ }
1011
+ // Everything else goes to Basic Information
1012
+ else {
1013
+ sections['Basic Information'].push(attr);
1014
+ }
1015
+ }
1016
+ // Remove empty sections
1017
+ Object.keys(sections).forEach(key => {
1018
+ if (sections[key].length === 0) {
1019
+ delete sections[key];
1020
+ }
1021
+ });
1022
+ return sections;
1023
+ }
1024
+ getInputType(attribute) {
1025
+ // Phase 3: Semantic type mapping based on attribute type and name
1026
+ const attrType = attribute.type.toLowerCase();
1027
+ const attrName = attribute.name.toLowerCase();
1028
+ // Map to simple, semantic types matching TARGET specification
1029
+ if (attrName.includes('content') || attrName.includes('description') || attrName.includes('bio')) {
1030
+ return 'textarea';
1031
+ }
1032
+ switch (attrType) {
1033
+ case 'string':
1034
+ case 'text':
1035
+ return 'text';
1036
+ case 'integer':
1037
+ case 'number':
1038
+ return 'number';
1039
+ case 'money':
1040
+ return 'currency';
1041
+ case 'boolean':
1042
+ return 'checkbox';
1043
+ case 'datetime':
1044
+ case 'date':
1045
+ return 'datetime';
1046
+ case 'email':
1047
+ return 'email';
1048
+ default:
1049
+ return 'text';
1050
+ }
1051
+ }
1052
+ humanize(str) {
1053
+ return str
1054
+ .replace(/([A-Z])/g, ' $1')
1055
+ .replace(/^./, c => c.toUpperCase())
1056
+ .trim();
1057
+ }
1058
+ /**
1059
+ * Convert string to PascalCase
1060
+ */
1061
+ pascalCase(str) {
1062
+ return str.charAt(0).toUpperCase() + str.slice(1);
1063
+ }
1064
+ /**
1065
+ * Validate generated view specification
1066
+ */
1067
+ validateViewSpec(spec, viewName) {
1068
+ const validation = {
1069
+ valid: true,
1070
+ errors: [],
1071
+ warnings: []
1072
+ };
1073
+ // Check required fields
1074
+ if (!spec.type) {
1075
+ validation.errors.push({
1076
+ code: 'MISSING_VIEW_TYPE',
1077
+ message: `View '${viewName}' missing type`,
1078
+ location: `view:${viewName}:type`
1079
+ });
1080
+ validation.valid = false;
1081
+ }
1082
+ // Validate view type
1083
+ const validTypes = [
1084
+ 'list', 'detail', 'form', 'dashboard', 'master_detail',
1085
+ 'analytics', 'board', 'calendar', 'timeline', 'map',
1086
+ 'wizard', 'feed', 'profile', 'settings', 'workflow', 'comparison'
1087
+ ];
1088
+ if (spec.type && !validTypes.includes(spec.type)) {
1089
+ validation.errors.push({
1090
+ code: 'INVALID_VIEW_TYPE',
1091
+ message: `View '${viewName}' has invalid type '${spec.type}'. Valid types: ${validTypes.join(', ')}`,
1092
+ location: `view:${viewName}:type`
1093
+ });
1094
+ validation.valid = false;
1095
+ }
1096
+ // Check model consistency
1097
+ if (spec.type !== 'dashboard' && !spec.model && (!spec.models || spec.models.length === 0)) {
1098
+ validation.warnings.push({
1099
+ code: 'NO_MODEL_REFERENCE',
1100
+ message: `View '${viewName}' should reference at least one model`,
1101
+ location: `view:${viewName}:model`
1102
+ });
1103
+ }
1104
+ // Validate UI components
1105
+ if (!spec.uiComponents || Object.keys(spec.uiComponents).length === 0) {
1106
+ validation.warnings.push({
1107
+ code: 'NO_UI_COMPONENTS',
1108
+ message: `View '${viewName}' has no UI components`,
1109
+ location: `view:${viewName}:uiComponents`
1110
+ });
1111
+ }
1112
+ return validation;
1113
+ }
1114
+ }
1115
+ //# sourceMappingURL=view-generator.js.map