@specverse/engine-realize 3.5.3

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 (420) 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/templates/README.md +559 -0
  45. package/assets/templates/TEMPLATE-ENHANCEMENTS-V33.md +462 -0
  46. package/assets/templates/backend-only/CLAUDE.md +73 -0
  47. package/assets/templates/backend-only/README.md +197 -0
  48. package/assets/templates/backend-only/deployments/README.md +149 -0
  49. package/assets/templates/backend-only/deployments/development.specly +53 -0
  50. package/assets/templates/backend-only/deployments/production.specly +87 -0
  51. package/assets/templates/backend-only/docs/README.md +50 -0
  52. package/assets/templates/backend-only/docs/api/README.md +7 -0
  53. package/assets/templates/backend-only/docs/diagrams/README.md +85 -0
  54. package/assets/templates/backend-only/docs/example-documentation-template.md +269 -0
  55. package/assets/templates/backend-only/docs/guides/README.md +15 -0
  56. package/assets/templates/backend-only/dot.env.example +18 -0
  57. package/assets/templates/backend-only/generated/README.md +56 -0
  58. package/assets/templates/backend-only/generated/code/integration-test.template.js +320 -0
  59. package/assets/templates/backend-only/generated/code/package.json.template +34 -0
  60. package/assets/templates/backend-only/generated/docs/README.md +49 -0
  61. package/assets/templates/backend-only/gitignore +54 -0
  62. package/assets/templates/backend-only/manifests/README.md +72 -0
  63. package/assets/templates/backend-only/manifests/docker-compose.specly +91 -0
  64. package/assets/templates/backend-only/manifests/implementation.yaml +100 -0
  65. package/assets/templates/backend-only/manifests/kubernetes.specly +140 -0
  66. package/assets/templates/backend-only/package.json +59 -0
  67. package/assets/templates/backend-only/scripts/test-all.sh +160 -0
  68. package/assets/templates/backend-only/scripts/test-generated-code.sh +165 -0
  69. package/assets/templates/backend-only/specs/main.specly +67 -0
  70. package/assets/templates/default/CLAUDE.md +141 -0
  71. package/assets/templates/default/README.md +404 -0
  72. package/assets/templates/default/deployments/README.md +149 -0
  73. package/assets/templates/default/deployments/development.specly +53 -0
  74. package/assets/templates/default/deployments/production.specly +87 -0
  75. package/assets/templates/default/docs/README.md +50 -0
  76. package/assets/templates/default/docs/api/README.md +7 -0
  77. package/assets/templates/default/docs/diagrams/README.md +85 -0
  78. package/assets/templates/default/docs/example-documentation-template.md +269 -0
  79. package/assets/templates/default/docs/guides/README.md +15 -0
  80. package/assets/templates/default/dot.env.example +18 -0
  81. package/assets/templates/default/generated/README.md +56 -0
  82. package/assets/templates/default/generated/code/integration-test.template.js +320 -0
  83. package/assets/templates/default/generated/code/package.json.template +34 -0
  84. package/assets/templates/default/generated/docs/README.md +49 -0
  85. package/assets/templates/default/gitignore +54 -0
  86. package/assets/templates/default/manifests/README.md +72 -0
  87. package/assets/templates/default/manifests/docker-compose.specly +91 -0
  88. package/assets/templates/default/manifests/implementation.yaml +176 -0
  89. package/assets/templates/default/manifests/kubernetes.specly +140 -0
  90. package/assets/templates/default/package.json +61 -0
  91. package/assets/templates/default/scripts/test-all.sh +160 -0
  92. package/assets/templates/default/scripts/test-generated-code.sh +165 -0
  93. package/assets/templates/default/specs/main.specly +67 -0
  94. package/assets/templates/frontend-only/CLAUDE.md +75 -0
  95. package/assets/templates/frontend-only/README.md +231 -0
  96. package/assets/templates/frontend-only/deployments/README.md +149 -0
  97. package/assets/templates/frontend-only/deployments/development.specly +53 -0
  98. package/assets/templates/frontend-only/deployments/production.specly +87 -0
  99. package/assets/templates/frontend-only/docs/README.md +50 -0
  100. package/assets/templates/frontend-only/docs/api/README.md +7 -0
  101. package/assets/templates/frontend-only/docs/diagrams/README.md +85 -0
  102. package/assets/templates/frontend-only/docs/example-documentation-template.md +269 -0
  103. package/assets/templates/frontend-only/docs/guides/README.md +15 -0
  104. package/assets/templates/frontend-only/dot.env.example +18 -0
  105. package/assets/templates/frontend-only/generated/README.md +56 -0
  106. package/assets/templates/frontend-only/generated/code/integration-test.template.js +320 -0
  107. package/assets/templates/frontend-only/generated/code/package.json.template +34 -0
  108. package/assets/templates/frontend-only/generated/docs/README.md +49 -0
  109. package/assets/templates/frontend-only/gitignore +54 -0
  110. package/assets/templates/frontend-only/manifests/README.md +72 -0
  111. package/assets/templates/frontend-only/manifests/docker-compose.specly +91 -0
  112. package/assets/templates/frontend-only/manifests/implementation.yaml +58 -0
  113. package/assets/templates/frontend-only/manifests/kubernetes.specly +140 -0
  114. package/assets/templates/frontend-only/package.json +59 -0
  115. package/assets/templates/frontend-only/scripts/test-all.sh +160 -0
  116. package/assets/templates/frontend-only/scripts/test-generated-code.sh +165 -0
  117. package/assets/templates/frontend-only/specs/main.specly +57 -0
  118. package/assets/templates/full-stack/AI-GUIDE.md +60 -0
  119. package/assets/templates/full-stack/CLAUDE.md +141 -0
  120. package/assets/templates/full-stack/README.md +382 -0
  121. package/assets/templates/full-stack/archive/AI-GUIDE-legacy.md +392 -0
  122. package/assets/templates/full-stack/deployments/README.md +149 -0
  123. package/assets/templates/full-stack/deployments/development.specly +53 -0
  124. package/assets/templates/full-stack/deployments/production.specly +87 -0
  125. package/assets/templates/full-stack/docs/README.md +51 -0
  126. package/assets/templates/full-stack/docs/api/README.md +7 -0
  127. package/assets/templates/full-stack/docs/diagrams/README.md +85 -0
  128. package/assets/templates/full-stack/docs/example-documentation-template.md +269 -0
  129. package/assets/templates/full-stack/docs/guides/README.md +15 -0
  130. package/assets/templates/full-stack/generated/README.md +56 -0
  131. package/assets/templates/full-stack/generated/code/integration-test.template.js +320 -0
  132. package/assets/templates/full-stack/generated/code/package.json.template +34 -0
  133. package/assets/templates/full-stack/generated/docs/README.md +49 -0
  134. package/assets/templates/full-stack/gitignore +54 -0
  135. package/assets/templates/full-stack/manifests/README.md +72 -0
  136. package/assets/templates/full-stack/manifests/docker-compose.specly +91 -0
  137. package/assets/templates/full-stack/manifests/implementation.yaml +155 -0
  138. package/assets/templates/full-stack/manifests/kubernetes.specly +140 -0
  139. package/assets/templates/full-stack/package.json +45 -0
  140. package/assets/templates/full-stack/scripts/test-all.sh +160 -0
  141. package/assets/templates/full-stack/scripts/test-generated-code.sh +165 -0
  142. package/assets/templates/full-stack/specs/example-v33.specly +297 -0
  143. package/assets/templates/full-stack/specs/main-simple.specly +73 -0
  144. package/assets/templates/full-stack/specs/main.specly +408 -0
  145. package/dist/engines/code-generator.d.ts +86 -0
  146. package/dist/engines/code-generator.d.ts.map +1 -0
  147. package/dist/engines/code-generator.js +159 -0
  148. package/dist/engines/code-generator.js.map +1 -0
  149. package/dist/engines/engine-registry.d.ts +94 -0
  150. package/dist/engines/engine-registry.d.ts.map +1 -0
  151. package/dist/engines/engine-registry.js +163 -0
  152. package/dist/engines/engine-registry.js.map +1 -0
  153. package/dist/engines/index.d.ts +10 -0
  154. package/dist/engines/index.d.ts.map +1 -0
  155. package/dist/engines/index.js +12 -0
  156. package/dist/engines/index.js.map +1 -0
  157. package/dist/engines/typescript-engine.d.ts +74 -0
  158. package/dist/engines/typescript-engine.d.ts.map +1 -0
  159. package/dist/engines/typescript-engine.js +288 -0
  160. package/dist/engines/typescript-engine.js.map +1 -0
  161. package/dist/generators/index.d.ts +11 -0
  162. package/dist/generators/index.d.ts.map +1 -0
  163. package/dist/generators/index.js +11 -0
  164. package/dist/generators/index.js.map +1 -0
  165. package/dist/index.d.ts +48 -0
  166. package/dist/index.d.ts.map +1 -0
  167. package/dist/index.js +434 -0
  168. package/dist/index.js.map +1 -0
  169. package/dist/library/index.d.ts +12 -0
  170. package/dist/library/index.d.ts.map +1 -0
  171. package/dist/library/index.js +15 -0
  172. package/dist/library/index.js.map +1 -0
  173. package/dist/library/library.d.ts +132 -0
  174. package/dist/library/library.d.ts.map +1 -0
  175. package/dist/library/library.js +343 -0
  176. package/dist/library/library.js.map +1 -0
  177. package/dist/library/loader.d.ts +73 -0
  178. package/dist/library/loader.d.ts.map +1 -0
  179. package/dist/library/loader.js +150 -0
  180. package/dist/library/loader.js.map +1 -0
  181. package/dist/library/resolver.d.ts +104 -0
  182. package/dist/library/resolver.d.ts.map +1 -0
  183. package/dist/library/resolver.js +299 -0
  184. package/dist/library/resolver.js.map +1 -0
  185. package/dist/library/validator.d.ts +65 -0
  186. package/dist/library/validator.d.ts.map +1 -0
  187. package/dist/library/validator.js +203 -0
  188. package/dist/library/validator.js.map +1 -0
  189. package/dist/types/index.d.ts +7 -0
  190. package/dist/types/index.d.ts.map +1 -0
  191. package/dist/types/index.js +7 -0
  192. package/dist/types/index.js.map +1 -0
  193. package/dist/types/instance-factory.d.ts +289 -0
  194. package/dist/types/instance-factory.d.ts.map +1 -0
  195. package/dist/types/instance-factory.js +8 -0
  196. package/dist/types/instance-factory.js.map +1 -0
  197. package/dist/types/unified-mappings.d.ts +163 -0
  198. package/dist/types/unified-mappings.d.ts.map +1 -0
  199. package/dist/types/unified-mappings.js +110 -0
  200. package/dist/types/unified-mappings.js.map +1 -0
  201. package/dist/utils/ai-spec-loader.d.ts +77 -0
  202. package/dist/utils/ai-spec-loader.d.ts.map +1 -0
  203. package/dist/utils/ai-spec-loader.js +138 -0
  204. package/dist/utils/ai-spec-loader.js.map +1 -0
  205. package/dist/utils/index.d.ts +9 -0
  206. package/dist/utils/index.d.ts.map +1 -0
  207. package/dist/utils/index.js +9 -0
  208. package/dist/utils/index.js.map +1 -0
  209. package/dist/utils/manifest-loader.d.ts +107 -0
  210. package/dist/utils/manifest-loader.d.ts.map +1 -0
  211. package/dist/utils/manifest-loader.js +168 -0
  212. package/dist/utils/manifest-loader.js.map +1 -0
  213. package/dist/utils/mapping-migration.d.ts +53 -0
  214. package/dist/utils/mapping-migration.d.ts.map +1 -0
  215. package/dist/utils/mapping-migration.js +194 -0
  216. package/dist/utils/mapping-migration.js.map +1 -0
  217. package/libs/instance-factories/CURVED-INTERFACE.md +278 -0
  218. package/libs/instance-factories/README.md +433 -0
  219. package/libs/instance-factories/applications/generic-app.yaml +52 -0
  220. package/libs/instance-factories/applications/react-app.yaml +186 -0
  221. package/libs/instance-factories/applications/templates/generic/backend-env-generator.ts +31 -0
  222. package/libs/instance-factories/applications/templates/generic/backend-package-json-generator.ts +80 -0
  223. package/libs/instance-factories/applications/templates/generic/backend-tsconfig-generator.ts +69 -0
  224. package/libs/instance-factories/applications/templates/generic/main-generator.ts +308 -0
  225. package/libs/instance-factories/applications/templates/react/_view-components-source.ts +555 -0
  226. package/libs/instance-factories/applications/templates/react/api-client-generator.ts +436 -0
  227. package/libs/instance-factories/applications/templates/react/api-types-generator.ts +153 -0
  228. package/libs/instance-factories/applications/templates/react/app-tsx-generator.ts +94 -0
  229. package/libs/instance-factories/applications/templates/react/env-example-generator.ts +24 -0
  230. package/libs/instance-factories/applications/templates/react/field-helpers-generator.ts +106 -0
  231. package/libs/instance-factories/applications/templates/react/gitignore-generator.ts +38 -0
  232. package/libs/instance-factories/applications/templates/react/index-css-generator.ts +85 -0
  233. package/libs/instance-factories/applications/templates/react/index-html-generator.ts +30 -0
  234. package/libs/instance-factories/applications/templates/react/main-tsx-generator.ts +34 -0
  235. package/libs/instance-factories/applications/templates/react/package-json-generator.ts +54 -0
  236. package/libs/instance-factories/applications/templates/react/pattern-adapter-generator.ts +179 -0
  237. package/libs/instance-factories/applications/templates/react/react-pattern-adapter.tsx +1347 -0
  238. package/libs/instance-factories/applications/templates/react/relationship-field-generator.ts +150 -0
  239. package/libs/instance-factories/applications/templates/react/tailwind-adapter-generator.ts +704 -0
  240. package/libs/instance-factories/applications/templates/react/tailwind-adapter-wrapper-generator.ts +84 -0
  241. package/libs/instance-factories/applications/templates/react/tsconfig-generator.ts +35 -0
  242. package/libs/instance-factories/applications/templates/react/use-api-hooks-generator.ts +121 -0
  243. package/libs/instance-factories/applications/templates/react/view-dashboard-generator.ts +150 -0
  244. package/libs/instance-factories/applications/templates/react/view-detail-generator.ts +150 -0
  245. package/libs/instance-factories/applications/templates/react/view-form-generator.ts +362 -0
  246. package/libs/instance-factories/applications/templates/react/view-list-generator.ts +98 -0
  247. package/libs/instance-factories/applications/templates/react/view-router-generator.ts +89 -0
  248. package/libs/instance-factories/applications/templates/react/vite-config-generator.ts +49 -0
  249. package/libs/instance-factories/archived/fastify-prisma.yaml +104 -0
  250. package/libs/instance-factories/cli/commander-js.yaml +55 -0
  251. package/libs/instance-factories/cli/templates/commander/cli-entry-generator.d.ts +12 -0
  252. package/libs/instance-factories/cli/templates/commander/cli-entry-generator.d.ts.map +1 -0
  253. package/libs/instance-factories/cli/templates/commander/cli-entry-generator.js +115 -0
  254. package/libs/instance-factories/cli/templates/commander/cli-entry-generator.js.map +1 -0
  255. package/libs/instance-factories/cli/templates/commander/cli-entry-generator.ts +145 -0
  256. package/libs/instance-factories/cli/templates/commander/command-generator.d.ts +14 -0
  257. package/libs/instance-factories/cli/templates/commander/command-generator.d.ts.map +1 -0
  258. package/libs/instance-factories/cli/templates/commander/command-generator.js +182 -0
  259. package/libs/instance-factories/cli/templates/commander/command-generator.js.map +1 -0
  260. package/libs/instance-factories/cli/templates/commander/command-generator.ts +992 -0
  261. package/libs/instance-factories/communication/event-emitter.yaml +56 -0
  262. package/libs/instance-factories/communication/rabbitmq-events.yaml +87 -0
  263. package/libs/instance-factories/communication/templates/eventemitter/bus-generator.ts +93 -0
  264. package/libs/instance-factories/communication/templates/eventemitter/publisher-generator.ts +117 -0
  265. package/libs/instance-factories/communication/templates/eventemitter/subscriber-generator.ts +101 -0
  266. package/libs/instance-factories/controllers/fastify.yaml +127 -0
  267. package/libs/instance-factories/controllers/templates/fastify/meta-routes-generator.ts +103 -0
  268. package/libs/instance-factories/controllers/templates/fastify/routes-generator.ts +389 -0
  269. package/libs/instance-factories/controllers/templates/fastify/server-generator.ts +76 -0
  270. package/libs/instance-factories/infrastructure/docker-k8s.yaml +61 -0
  271. package/libs/instance-factories/infrastructure/templates/docker-k8s/infrastructure-generator.ts +46 -0
  272. package/libs/instance-factories/orms/prisma.yaml +89 -0
  273. package/libs/instance-factories/orms/templates/prisma/schema-generator.ts +563 -0
  274. package/libs/instance-factories/orms/templates/prisma/services-generator.ts +408 -0
  275. package/libs/instance-factories/scaffolding/generic-scaffold.yaml +65 -0
  276. package/libs/instance-factories/scaffolding/templates/generic/env-example-generator.ts +73 -0
  277. package/libs/instance-factories/scaffolding/templates/generic/env-generator.ts +85 -0
  278. package/libs/instance-factories/scaffolding/templates/generic/gitignore-generator.ts +69 -0
  279. package/libs/instance-factories/scaffolding/templates/generic/package-json-generator.ts +176 -0
  280. package/libs/instance-factories/scaffolding/templates/generic/readme-generator.ts +207 -0
  281. package/libs/instance-factories/scaffolding/templates/generic/tsconfig-generator.ts +78 -0
  282. package/libs/instance-factories/scaffolding/templates/generic/tsconfig-react-generator.ts +41 -0
  283. package/libs/instance-factories/sdks/python-sdk.yaml +66 -0
  284. package/libs/instance-factories/sdks/templates/python/sdk-generator.ts +50 -0
  285. package/libs/instance-factories/sdks/templates/typescript/sdk-generator.ts +49 -0
  286. package/libs/instance-factories/sdks/typescript-sdk.yaml +59 -0
  287. package/libs/instance-factories/services/prisma-services.yaml +71 -0
  288. package/libs/instance-factories/services/templates/prisma/behavior-generator.ts +303 -0
  289. package/libs/instance-factories/services/templates/prisma/controller-generator.ts +532 -0
  290. package/libs/instance-factories/services/templates/prisma/service-generator.ts +315 -0
  291. package/libs/instance-factories/shared/path-resolver.ts +111 -0
  292. package/libs/instance-factories/storage/mongodb.yaml +79 -0
  293. package/libs/instance-factories/storage/postgresql.yaml +75 -0
  294. package/libs/instance-factories/storage/redis.yaml +79 -0
  295. package/libs/instance-factories/storage/templates/mongodb/config-generator.ts +15 -0
  296. package/libs/instance-factories/storage/templates/mongodb/docker-generator.ts +18 -0
  297. package/libs/instance-factories/storage/templates/postgresql/config-generator.ts +54 -0
  298. package/libs/instance-factories/storage/templates/postgresql/docker-generator.ts +55 -0
  299. package/libs/instance-factories/storage/templates/redis/config-generator.ts +16 -0
  300. package/libs/instance-factories/storage/templates/redis/docker-generator.ts +18 -0
  301. package/libs/instance-factories/test-generation.ts +192 -0
  302. package/libs/instance-factories/testing/templates/vitest/tests-generator.ts +51 -0
  303. package/libs/instance-factories/testing/vitest-tests.yaml +63 -0
  304. package/libs/instance-factories/tools/templates/mcp/mcp-server-generator.ts +136 -0
  305. package/libs/instance-factories/tools/templates/mcp/static/docs/DEPLOYMENT_GUIDE.md +630 -0
  306. package/libs/instance-factories/tools/templates/mcp/static/docs/HYBRID_RESOURCE_SYSTEM.md +330 -0
  307. package/libs/instance-factories/tools/templates/mcp/static/docs/deployments/EXTENSION_DEPLOYMENT.md +552 -0
  308. package/libs/instance-factories/tools/templates/mcp/static/docs/deployments/LOCAL_DEPLOYMENT.md +164 -0
  309. package/libs/instance-factories/tools/templates/mcp/static/docs/deployments/WEB_DEPLOYMENT.md +247 -0
  310. package/libs/instance-factories/tools/templates/mcp/static/package.json +92 -0
  311. package/libs/instance-factories/tools/templates/mcp/static/scripts/build-enterprise.js +284 -0
  312. package/libs/instance-factories/tools/templates/mcp/static/scripts/build-extension.js +139 -0
  313. package/libs/instance-factories/tools/templates/mcp/static/scripts/build-local.js +74 -0
  314. package/libs/instance-factories/tools/templates/mcp/static/scripts/build-web.js +156 -0
  315. package/libs/instance-factories/tools/templates/mcp/static/scripts/copy-canonical-files.js +41 -0
  316. package/libs/instance-factories/tools/templates/mcp/static/scripts/test-deployments.js +259 -0
  317. package/libs/instance-factories/tools/templates/mcp/static/scripts/test-hybrid-resources.js +231 -0
  318. package/libs/instance-factories/tools/templates/mcp/static/scripts/test-hybrid-simple.js +196 -0
  319. package/libs/instance-factories/tools/templates/mcp/static/src/controllers/MCPServerController.ts +293 -0
  320. package/libs/instance-factories/tools/templates/mcp/static/src/events/EventEmitter.ts +90 -0
  321. package/libs/instance-factories/tools/templates/mcp/static/src/index.ts +24 -0
  322. package/libs/instance-factories/tools/templates/mcp/static/src/interfaces/ResourceProvider.ts +15 -0
  323. package/libs/instance-factories/tools/templates/mcp/static/src/models/LibrarySuggestion.ts +106 -0
  324. package/libs/instance-factories/tools/templates/mcp/static/src/models/SpecVerseResource.ts +75 -0
  325. package/libs/instance-factories/tools/templates/mcp/static/src/server/mcp-server.ts +239 -0
  326. package/libs/instance-factories/tools/templates/mcp/static/src/services/CLIProxyService.ts +1501 -0
  327. package/libs/instance-factories/tools/templates/mcp/static/src/services/EmbeddedResourcesAdapter.ts +211 -0
  328. package/libs/instance-factories/tools/templates/mcp/static/src/services/EntityModuleService.ts +308 -0
  329. package/libs/instance-factories/tools/templates/mcp/static/src/services/HybridResourcesProvider.ts +210 -0
  330. package/libs/instance-factories/tools/templates/mcp/static/src/services/LibraryToolsService.ts +356 -0
  331. package/libs/instance-factories/tools/templates/mcp/static/src/services/OrchestratorBridge.ts +524 -0
  332. package/libs/instance-factories/tools/templates/mcp/static/src/services/OrchestratorToolsService.ts +530 -0
  333. package/libs/instance-factories/tools/templates/mcp/static/src/services/PromptToolsService.ts +594 -0
  334. package/libs/instance-factories/tools/templates/mcp/static/src/services/ResourcesProviderService.ts +170 -0
  335. package/libs/instance-factories/tools/templates/mcp/static/src/tests/unit/CLIProxyService.init.test.ts +544 -0
  336. package/libs/instance-factories/tools/templates/mcp/static/src/tests/unit/CLIProxyService.test.ts +189 -0
  337. package/libs/instance-factories/tools/templates/mcp/static/src/tests/unit/ResourcesProviderService.test.ts +89 -0
  338. package/libs/instance-factories/tools/templates/mcp/static/src/types/index.ts +110 -0
  339. package/libs/instance-factories/tools/templates/mcp/static/tsconfig.json +28 -0
  340. package/libs/instance-factories/tools/templates/vscode/static/extension.ts +1195 -0
  341. package/libs/instance-factories/tools/templates/vscode/static/language-configuration.json +34 -0
  342. package/libs/instance-factories/tools/templates/vscode/static/schemas/specverse-v3-schema.json +4279 -0
  343. package/libs/instance-factories/tools/templates/vscode/static/syntaxes/specverse.tmLanguage.json +138 -0
  344. package/libs/instance-factories/tools/templates/vscode/static/themes/README.md +74 -0
  345. package/libs/instance-factories/tools/templates/vscode/static/themes/complete-specverse-colors.json +122 -0
  346. package/libs/instance-factories/tools/templates/vscode/static/themes/specverse-basic-theme.json +65 -0
  347. package/libs/instance-factories/tools/templates/vscode/static/themes/specverse-complete-theme.json +123 -0
  348. package/libs/instance-factories/tools/templates/vscode/static/themes/specverse-theme-colors.json +64 -0
  349. package/libs/instance-factories/tools/templates/vscode/vscode-extension-generator.ts +214 -0
  350. package/libs/instance-factories/validation/templates/zod/validation-generator.ts +46 -0
  351. package/libs/instance-factories/validation/zod.yaml +56 -0
  352. package/libs/instance-factories/views/index.d.ts +13 -0
  353. package/libs/instance-factories/views/index.d.ts.map +1 -0
  354. package/libs/instance-factories/views/index.js +18 -0
  355. package/libs/instance-factories/views/index.js.map +1 -0
  356. package/libs/instance-factories/views/index.ts +45 -0
  357. package/libs/instance-factories/views/react-components.yaml +129 -0
  358. package/libs/instance-factories/views/templates/ARCHITECTURE.md +198 -0
  359. package/libs/instance-factories/views/templates/react/adapters/antd-adapter.ts +869 -0
  360. package/libs/instance-factories/views/templates/react/adapters/mui-adapter.ts +953 -0
  361. package/libs/instance-factories/views/templates/react/adapters/shadcn-adapter.ts +806 -0
  362. package/libs/instance-factories/views/templates/react/app-generator.ts +55 -0
  363. package/libs/instance-factories/views/templates/react/components-generator.ts +391 -0
  364. package/libs/instance-factories/views/templates/react/forms-generator.ts +343 -0
  365. package/libs/instance-factories/views/templates/react/frontend-package-json-generator.ts +54 -0
  366. package/libs/instance-factories/views/templates/react/hooks-generator.ts +122 -0
  367. package/libs/instance-factories/views/templates/react/index-css-generator.ts +209 -0
  368. package/libs/instance-factories/views/templates/react/index-html-generator.ts +34 -0
  369. package/libs/instance-factories/views/templates/react/main-tsx-generator.ts +29 -0
  370. package/libs/instance-factories/views/templates/react/react-component-generator.d.ts +152 -0
  371. package/libs/instance-factories/views/templates/react/react-component-generator.d.ts.map +1 -0
  372. package/libs/instance-factories/views/templates/react/react-component-generator.js +398 -0
  373. package/libs/instance-factories/views/templates/react/react-component-generator.js.map +1 -0
  374. package/libs/instance-factories/views/templates/react/react-component-generator.ts +533 -0
  375. package/libs/instance-factories/views/templates/react/router-generator.ts +197 -0
  376. package/libs/instance-factories/views/templates/react/router-generic-generator.ts +103 -0
  377. package/libs/instance-factories/views/templates/react/spec-json-generator.ts +17 -0
  378. package/libs/instance-factories/views/templates/react/types-generator.ts +76 -0
  379. package/libs/instance-factories/views/templates/react/views-metadata-generator.ts +42 -0
  380. package/libs/instance-factories/views/templates/react/vite-config-generator.ts +38 -0
  381. package/libs/instance-factories/views/templates/runtime/runtime-view-renderer.d.ts.map +1 -0
  382. package/libs/instance-factories/views/templates/runtime/runtime-view-renderer.js.map +1 -0
  383. package/libs/instance-factories/views/templates/runtime/runtime-view-renderer.ts +474 -0
  384. package/libs/instance-factories/views/templates/shared/__tests__/composite-patterns.test.ts +242 -0
  385. package/libs/instance-factories/views/templates/shared/adapter-types.d.ts +77 -0
  386. package/libs/instance-factories/views/templates/shared/adapter-types.d.ts.map +1 -0
  387. package/libs/instance-factories/views/templates/shared/adapter-types.js +47 -0
  388. package/libs/instance-factories/views/templates/shared/adapter-types.js.map +1 -0
  389. package/libs/instance-factories/views/templates/shared/adapter-types.ts +142 -0
  390. package/libs/instance-factories/views/templates/shared/atomic-components-registry.d.ts +63 -0
  391. package/libs/instance-factories/views/templates/shared/atomic-components-registry.d.ts.map +1 -0
  392. package/libs/instance-factories/views/templates/shared/atomic-components-registry.js +822 -0
  393. package/libs/instance-factories/views/templates/shared/atomic-components-registry.js.map +1 -0
  394. package/libs/instance-factories/views/templates/shared/atomic-components-registry.ts +908 -0
  395. package/libs/instance-factories/views/templates/shared/base-generator.d.ts +247 -0
  396. package/libs/instance-factories/views/templates/shared/base-generator.d.ts.map +1 -0
  397. package/libs/instance-factories/views/templates/shared/base-generator.js +363 -0
  398. package/libs/instance-factories/views/templates/shared/base-generator.js.map +1 -0
  399. package/libs/instance-factories/views/templates/shared/base-generator.ts +608 -0
  400. package/libs/instance-factories/views/templates/shared/component-metadata.d.ts +254 -0
  401. package/libs/instance-factories/views/templates/shared/component-metadata.d.ts.map +1 -0
  402. package/libs/instance-factories/views/templates/shared/component-metadata.js +602 -0
  403. package/libs/instance-factories/views/templates/shared/component-metadata.js.map +1 -0
  404. package/libs/instance-factories/views/templates/shared/component-metadata.ts +803 -0
  405. package/libs/instance-factories/views/templates/shared/composite-pattern-types.ts +250 -0
  406. package/libs/instance-factories/views/templates/shared/composite-patterns.ts +535 -0
  407. package/libs/instance-factories/views/templates/shared/index.ts +68 -0
  408. package/libs/instance-factories/views/templates/shared/pattern-validator.ts +279 -0
  409. package/libs/instance-factories/views/templates/shared/property-mapper.d.ts +149 -0
  410. package/libs/instance-factories/views/templates/shared/property-mapper.d.ts.map +1 -0
  411. package/libs/instance-factories/views/templates/shared/property-mapper.js +580 -0
  412. package/libs/instance-factories/views/templates/shared/property-mapper.js.map +1 -0
  413. package/libs/instance-factories/views/templates/shared/property-mapper.ts +700 -0
  414. package/libs/instance-factories/views/templates/shared/syntax-mapper.d.ts +143 -0
  415. package/libs/instance-factories/views/templates/shared/syntax-mapper.d.ts.map +1 -0
  416. package/libs/instance-factories/views/templates/shared/syntax-mapper.js +420 -0
  417. package/libs/instance-factories/views/templates/shared/syntax-mapper.js.map +1 -0
  418. package/libs/instance-factories/views/templates/shared/syntax-mapper.ts +539 -0
  419. package/package.json +42 -0
  420. package/schema/SPECVERSE-SCHEMA.json +4274 -0
@@ -0,0 +1,84 @@
1
+ /**
2
+ * Tailwind Adapter Wrapper Generator
3
+ *
4
+ * Bundles the tailwind-adapter-generator.ts source file for generated projects.
5
+ * This file is imported by react-pattern-adapter.tsx.
6
+ */
7
+
8
+ import { readFileSync, existsSync } from 'fs';
9
+ import { join, dirname } from 'path';
10
+ import { fileURLToPath } from 'url';
11
+
12
+ export interface TailwindAdapterGeneratorContext {
13
+ spec: any;
14
+ manifest: any;
15
+ }
16
+
17
+ export async function generate(context: TailwindAdapterGeneratorContext): Promise<string> {
18
+ const __filename = fileURLToPath(import.meta.url);
19
+ const __dirname = dirname(__filename);
20
+
21
+ // Try to find the tailwind-adapter-generator.ts source file
22
+ const possiblePaths = [
23
+ // PRIORITY 1: Bundled with package (in libs/ directory)
24
+ join(__dirname, '../../../../../../libs/instance-factories/applications/templates/react/tailwind-adapter-generator.ts'),
25
+ // PRIORITY 2: Development environment (local)
26
+ join(__dirname, './tailwind-adapter-generator.ts'),
27
+ join(__dirname, '../tailwind-adapter-generator.ts')
28
+ ];
29
+
30
+ let adapterSource: string | null = null;
31
+ let foundPath: string | null = null;
32
+
33
+ for (const path of possiblePaths) {
34
+ if (existsSync(path)) {
35
+ try {
36
+ adapterSource = readFileSync(path, 'utf-8');
37
+ foundPath = path;
38
+ break;
39
+ } catch (error) {
40
+ // Continue to next path
41
+ }
42
+ }
43
+ }
44
+
45
+ if (adapterSource) {
46
+ // Successfully read the adapter - return it with a header comment
47
+ return `/**
48
+ * Universal Tailwind Adapter Generator
49
+ *
50
+ * AUTO-GENERATED: Copied from @specverse/lang
51
+ * Source: ${foundPath}
52
+ *
53
+ * This file provides Tailwind CSS rendering for all atomic component types.
54
+ * It is imported by react-pattern-adapter.tsx.
55
+ *
56
+ * DO NOT EDIT: Changes will be overwritten on next generation.
57
+ */
58
+
59
+ ${adapterSource}
60
+ `;
61
+ }
62
+
63
+ // Fallback: Return minimal stub (should never happen with bundled source)
64
+ return `/**
65
+ * Tailwind Adapter Generator (STUB)
66
+ *
67
+ * ⚠️ WARNING: Could not locate tailwind-adapter-generator.ts source file.
68
+ */
69
+
70
+ import type { ComponentAdapter } from '@specverse/lang';
71
+
72
+ export function createUniversalTailwindAdapter(): ComponentAdapter {
73
+ return {
74
+ renderComponent(type: string, properties: Record<string, any> = {}, children?: string): string {
75
+ return \`<div class="p-4 border border-gray-300 rounded bg-gray-50">
76
+ <span class="text-gray-700">\${type}</span>
77
+ </div>\`;
78
+ }
79
+ };
80
+ }
81
+
82
+ console.warn('⚠️ Using stub Tailwind adapter - full source file not found during generation');
83
+ `;
84
+ }
@@ -0,0 +1,35 @@
1
+ /**
2
+ * TSConfig Generator for React App
3
+ *
4
+ * Generates TypeScript configuration for frontend
5
+ */
6
+
7
+ import type { TemplateContext } from '@specverse/engine-realize';
8
+
9
+ export default function generateTsConfig(context: TemplateContext): string {
10
+ return JSON.stringify({
11
+ compilerOptions: {
12
+ target: "ES2020",
13
+ useDefineForClassFields: true,
14
+ lib: ["ES2020", "DOM", "DOM.Iterable"],
15
+ module: "ESNext",
16
+ skipLibCheck: true,
17
+ types: ["vite/client"],
18
+
19
+ /* Bundler mode */
20
+ moduleResolution: "bundler",
21
+ allowImportingTsExtensions: true,
22
+ resolveJsonModule: true,
23
+ isolatedModules: true,
24
+ noEmit: true,
25
+ jsx: "react-jsx",
26
+
27
+ /* Linting */
28
+ strict: true,
29
+ noUnusedLocals: true,
30
+ noUnusedParameters: true,
31
+ noFallthroughCasesInSwitch: true
32
+ },
33
+ include: ["src"]
34
+ }, null, 2);
35
+ }
@@ -0,0 +1,121 @@
1
+ /**
2
+ * useApi Hooks Generator
3
+ * Generates React Query hooks for API operations in generated projects
4
+ */
5
+
6
+ export interface UseApiHooksGeneratorContext {
7
+ spec: any;
8
+ manifest: any;
9
+ }
10
+
11
+ export async function generate(context: UseApiHooksGeneratorContext): Promise<string> {
12
+ return `/**
13
+ * useApi - React Query Hooks
14
+ *
15
+ * Custom hooks for API operations using React Query
16
+ * Simplified version for generated projects (no Zustand store dependency)
17
+ */
18
+
19
+ import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
20
+ import {
21
+ getModelSchema,
22
+ listEntities,
23
+ executeOperation,
24
+ transitionState
25
+ } from '../lib/apiClient';
26
+ import type { ModelSchema, Entity, ApiResponse } from '../types/api';
27
+
28
+ /**
29
+ * Query hook for model schema
30
+ */
31
+ export function useModelSchemaQuery(modelName: string | null) {
32
+ return useQuery({
33
+ queryKey: ['modelSchema', modelName],
34
+ queryFn: async (): Promise<ModelSchema> => {
35
+ if (!modelName) throw new Error('Model name is required');
36
+ return await getModelSchema(modelName);
37
+ },
38
+ enabled: !!modelName,
39
+ staleTime: 5 * 60 * 1000, // Cache for 5 minutes
40
+ refetchOnWindowFocus: false // Schema rarely changes
41
+ });
42
+ }
43
+
44
+ /**
45
+ * Query hook for entities
46
+ */
47
+ export function useEntitiesQuery(controllerName: string | null, modelName: string | null) {
48
+ return useQuery({
49
+ queryKey: ['entities', modelName],
50
+ queryFn: async (): Promise<Entity[]> => {
51
+ if (!controllerName || !modelName) {
52
+ throw new Error('Controller and model names are required');
53
+ }
54
+ return await listEntities(controllerName);
55
+ },
56
+ enabled: !!controllerName && !!modelName,
57
+ refetchInterval: 5000 // Refetch every 5 seconds for real-time feel
58
+ });
59
+ }
60
+
61
+ /**
62
+ * Mutation hook for executing operations
63
+ */
64
+ export function useExecuteOperationMutation() {
65
+ const queryClient = useQueryClient();
66
+
67
+ return useMutation({
68
+ mutationFn: ({
69
+ controllerName,
70
+ operationName,
71
+ params
72
+ }: {
73
+ controllerName: string;
74
+ operationName: string;
75
+ params: Record<string, any>;
76
+ }): Promise<ApiResponse> => executeOperation(controllerName, operationName, params),
77
+ onSuccess: (_data, variables) => {
78
+ // Invalidate entities query to refetch
79
+ const modelName = variables.controllerName.replace(/Controller$/, '');
80
+ queryClient.invalidateQueries({ queryKey: ['entities', modelName] });
81
+ }
82
+ });
83
+ }
84
+
85
+ /**
86
+ * Mutation hook for lifecycle transitions
87
+ */
88
+ export function useTransitionStateMutation() {
89
+ const queryClient = useQueryClient();
90
+
91
+ return useMutation({
92
+ mutationFn: ({
93
+ modelName,
94
+ entityId,
95
+ toState,
96
+ lifecycleName
97
+ }: {
98
+ modelName: string;
99
+ entityId: string;
100
+ toState: string;
101
+ lifecycleName?: string;
102
+ }): Promise<ApiResponse> => transitionState(modelName, entityId, toState, lifecycleName),
103
+ onSuccess: (_data, variables) => {
104
+ // Invalidate entities query to refetch
105
+ queryClient.invalidateQueries({ queryKey: ['entities', variables.modelName] });
106
+ }
107
+ });
108
+ }
109
+
110
+ /**
111
+ * Hook for invalidating all queries (useful for manual refresh)
112
+ */
113
+ export function useInvalidateAll() {
114
+ const queryClient = useQueryClient();
115
+
116
+ return () => {
117
+ queryClient.invalidateQueries();
118
+ };
119
+ }
120
+ `;
121
+ }
@@ -0,0 +1,150 @@
1
+ /**
2
+ * DashboardView Generator (Pattern-Based v0.9.0)
3
+ * Generates pattern-based DashboardView using RuntimeView architecture
4
+ */
5
+
6
+ export interface ViewDashboardGeneratorContext {
7
+ spec: any;
8
+ manifest: any;
9
+ }
10
+
11
+ export async function generate(context: ViewDashboardGeneratorContext): Promise<string> {
12
+ return `/**
13
+ * DashboardView - Pattern-Based Dashboard View Component
14
+ *
15
+ * Uses pattern-based rendering with ReactPatternAdapter.
16
+ * Supports multi-component dashboard layouts with entity selection.
17
+ */
18
+
19
+ import { useState, useEffect, useMemo } from 'react';
20
+ import { useEntitiesQuery, useModelSchemaQuery } from '../../hooks/useApi';
21
+ import { usePatternAdapter, REACT_PROTOCOL_MAPPING } from '../../lib/react-pattern-adapter';
22
+ import type { View } from '../../types/api';
23
+
24
+ interface DashboardViewProps {
25
+ view: View;
26
+ spec?: any;
27
+ }
28
+
29
+ export function DashboardView({ view, spec }: DashboardViewProps) {
30
+ const patternAdapter = usePatternAdapter();
31
+
32
+ // Determine controller and model
33
+ let controllerName: string;
34
+ let modelName: string;
35
+
36
+ if (view.controller && spec) {
37
+ controllerName = view.controller;
38
+ const controller = spec.controllers[view.controller];
39
+ modelName = controller.model;
40
+ } else {
41
+ modelName = view.model as string;
42
+ controllerName = \`\${modelName}Controller\`;
43
+ }
44
+
45
+ // Fetch data and schema
46
+ const { data: entities = [] } = useEntitiesQuery(controllerName, modelName);
47
+ const { data: schema } = useModelSchemaQuery(modelName);
48
+
49
+ // Track selected entity
50
+ const [selectedEntityId, setSelectedEntityId] = useState<string | null>(
51
+ entities.length > 0 ? entities[0].id : null
52
+ );
53
+
54
+ // Update selected entity when entities change
55
+ useEffect(() => {
56
+ if (entities.length > 0 && !selectedEntityId) {
57
+ setSelectedEntityId(entities[0].id);
58
+ }
59
+ }, [entities, selectedEntityId]);
60
+
61
+ // Get selected entity
62
+ const selectedEntity = useMemo(
63
+ () => entities.find((e: any) => e.id === selectedEntityId) || null,
64
+ [entities, selectedEntityId]
65
+ );
66
+
67
+ // Build model data and schemas
68
+ const modelData = useMemo(() => ({
69
+ [modelName]: entities
70
+ }), [modelName, entities]);
71
+
72
+ const modelSchemas = useMemo(() =>
73
+ schema ? { [modelName]: schema } : {}
74
+ , [modelName, schema]);
75
+
76
+ if (entities.length === 0) {
77
+ return <div className="p-4">No entities found</div>;
78
+ }
79
+
80
+ // Detect pattern
81
+ const pattern = patternAdapter.detectPattern({ ...view, type: 'dashboard' });
82
+
83
+ if (!pattern) {
84
+ return (
85
+ <div className="p-4 text-red-600">
86
+ Pattern not found for dashboard view
87
+ </div>
88
+ );
89
+ }
90
+
91
+ // Build render context
92
+ const context = {
93
+ pattern,
94
+ viewSpec: { ...view, type: 'dashboard', model: modelName },
95
+ modelData,
96
+ modelSchemas,
97
+ primaryModel: modelName,
98
+ selectedEntity,
99
+ primaryEntities: entities,
100
+ protocolMapping: REACT_PROTOCOL_MAPPING,
101
+ tailwindAdapter: patternAdapter['tailwindAdapter']
102
+ };
103
+
104
+ // Render entity selector
105
+ let html = '';
106
+ if (entities.length > 0) {
107
+ html += \`
108
+ <div class="mb-4 pb-4 border-b border-gray-200 dark:border-gray-700">
109
+ <label class="block text-sm font-semibold text-gray-700 dark:text-gray-200 mb-2">
110
+ Select \${modelName}:
111
+ </label>
112
+ <select
113
+ id="entity-selector"
114
+ class="w-full max-w-md px-3 py-2 border border-gray-300 dark:border-gray-600 rounded bg-white dark:bg-gray-700 text-gray-900 dark:text-gray-100 focus:outline-none focus:ring-2 focus:ring-blue-500"
115
+ >
116
+ \${entities.map((entity: any) => {
117
+ const displayName = entity.data?.name || entity.data?.title || entity.id;
118
+ return \`<option value="\${entity.id}" \${entity.id === selectedEntityId ? 'selected' : ''}>\${displayName}</option>\`;
119
+ }).join('')}
120
+ </select>
121
+ </div>
122
+ \`;
123
+ }
124
+
125
+ // Render pattern
126
+ html += patternAdapter.renderPattern(context);
127
+
128
+ // Add event handler for selector
129
+ useEffect(() => {
130
+ const selector = document.getElementById('entity-selector') as HTMLSelectElement;
131
+ if (selector) {
132
+ const handler = (e: Event) => {
133
+ const newId = (e.target as HTMLSelectElement).value;
134
+ setSelectedEntityId(newId);
135
+ };
136
+ selector.addEventListener('change', handler);
137
+ return () => selector.removeEventListener('change', handler);
138
+ }
139
+ }, [html]);
140
+
141
+ return (
142
+ <div className="runtime-view-container p-4 h-full overflow-auto">
143
+ <div dangerouslySetInnerHTML={{ __html: html }} />
144
+ </div>
145
+ );
146
+ }
147
+
148
+ export default DashboardView;
149
+ `;
150
+ }
@@ -0,0 +1,150 @@
1
+ /**
2
+ * DetailView Generator (Pattern-Based v0.9.0)
3
+ * Generates pattern-based DetailView using RuntimeView architecture
4
+ */
5
+
6
+ export interface ViewDetailGeneratorContext {
7
+ spec: any;
8
+ manifest: any;
9
+ }
10
+
11
+ export async function generate(context: ViewDetailGeneratorContext): Promise<string> {
12
+ return `/**
13
+ * DetailView - Pattern-Based Detail View Component
14
+ *
15
+ * Uses pattern-based rendering with ReactPatternAdapter.
16
+ * Supports entity selection and relationship display.
17
+ */
18
+
19
+ import { useState, useEffect, useMemo } from 'react';
20
+ import { useEntitiesQuery, useModelSchemaQuery } from '../../hooks/useApi';
21
+ import { usePatternAdapter, REACT_PROTOCOL_MAPPING } from '../../lib/react-pattern-adapter';
22
+ import type { View } from '../../types/api';
23
+
24
+ interface DetailViewProps {
25
+ view: View;
26
+ spec?: any;
27
+ }
28
+
29
+ export function DetailView({ view, spec }: DetailViewProps) {
30
+ const patternAdapter = usePatternAdapter();
31
+
32
+ // Determine controller and model
33
+ let controllerName: string;
34
+ let modelName: string;
35
+
36
+ if (view.controller && spec) {
37
+ controllerName = view.controller;
38
+ const controller = spec.controllers[view.controller];
39
+ modelName = controller.model;
40
+ } else {
41
+ modelName = view.model as string;
42
+ controllerName = \`\${modelName}Controller\`;
43
+ }
44
+
45
+ // Fetch data and schema
46
+ const { data: entities = [] } = useEntitiesQuery(controllerName, modelName);
47
+ const { data: schema } = useModelSchemaQuery(modelName);
48
+
49
+ // Track selected entity
50
+ const [selectedEntityId, setSelectedEntityId] = useState<string | null>(
51
+ entities.length > 0 ? entities[0].id : null
52
+ );
53
+
54
+ // Update selected entity when entities change
55
+ useEffect(() => {
56
+ if (entities.length > 0 && !selectedEntityId) {
57
+ setSelectedEntityId(entities[0].id);
58
+ }
59
+ }, [entities, selectedEntityId]);
60
+
61
+ // Get selected entity
62
+ const selectedEntity = useMemo(
63
+ () => entities.find((e: any) => e.id === selectedEntityId) || null,
64
+ [entities, selectedEntityId]
65
+ );
66
+
67
+ // Build model data and schemas
68
+ const modelData = useMemo(() => ({
69
+ [modelName]: entities
70
+ }), [modelName, entities]);
71
+
72
+ const modelSchemas = useMemo(() =>
73
+ schema ? { [modelName]: schema } : {}
74
+ , [modelName, schema]);
75
+
76
+ if (entities.length === 0) {
77
+ return <div className="p-4">No entities found</div>;
78
+ }
79
+
80
+ // Detect pattern
81
+ const pattern = patternAdapter.detectPattern({ ...view, type: 'detail' });
82
+
83
+ if (!pattern) {
84
+ return (
85
+ <div className="p-4 text-red-600">
86
+ Pattern not found for detail view
87
+ </div>
88
+ );
89
+ }
90
+
91
+ // Build render context
92
+ const context = {
93
+ pattern,
94
+ viewSpec: { ...view, type: 'detail', model: modelName },
95
+ modelData,
96
+ modelSchemas,
97
+ primaryModel: modelName,
98
+ selectedEntity,
99
+ primaryEntities: entities,
100
+ protocolMapping: REACT_PROTOCOL_MAPPING,
101
+ tailwindAdapter: patternAdapter['tailwindAdapter']
102
+ };
103
+
104
+ // Render entity selector
105
+ let html = '';
106
+ if (entities.length > 0) {
107
+ html += \`
108
+ <div class="mb-4 pb-4 border-b border-gray-200 dark:border-gray-700">
109
+ <label class="block text-sm font-semibold text-gray-700 dark:text-gray-200 mb-2">
110
+ Select \${modelName}:
111
+ </label>
112
+ <select
113
+ id="entity-selector"
114
+ class="w-full max-w-md px-3 py-2 border border-gray-300 dark:border-gray-600 rounded bg-white dark:bg-gray-700 text-gray-900 dark:text-gray-100 focus:outline-none focus:ring-2 focus:ring-blue-500"
115
+ >
116
+ \${entities.map((entity: any) => {
117
+ const displayName = entity.data?.name || entity.data?.title || entity.id;
118
+ return \`<option value="\${entity.id}" \${entity.id === selectedEntityId ? 'selected' : ''}>\${displayName}</option>\`;
119
+ }).join('')}
120
+ </select>
121
+ </div>
122
+ \`;
123
+ }
124
+
125
+ // Render pattern
126
+ html += patternAdapter.renderPattern(context);
127
+
128
+ // Add event handler for selector
129
+ useEffect(() => {
130
+ const selector = document.getElementById('entity-selector') as HTMLSelectElement;
131
+ if (selector) {
132
+ const handler = (e: Event) => {
133
+ const newId = (e.target as HTMLSelectElement).value;
134
+ setSelectedEntityId(newId);
135
+ };
136
+ selector.addEventListener('change', handler);
137
+ return () => selector.removeEventListener('change', handler);
138
+ }
139
+ }, [html]);
140
+
141
+ return (
142
+ <div className="runtime-view-container p-4 h-full overflow-auto">
143
+ <div dangerouslySetInnerHTML={{ __html: html }} />
144
+ </div>
145
+ );
146
+ }
147
+
148
+ export default DetailView;
149
+ `;
150
+ }