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