@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,408 @@
1
+ /**
2
+ * Prisma Services Generator
3
+ *
4
+ * Generates service classes with Prisma ORM integration
5
+ */
6
+
7
+ import type { TemplateContext } from '@specverse/engine-realize';
8
+
9
+ /**
10
+ * Generate Prisma service for a model
11
+ */
12
+ export default function generatePrismaService(context: TemplateContext): string {
13
+ const { model, controller, spec, implType } = context;
14
+
15
+ if (!model) {
16
+ throw new Error('Model is required in template context');
17
+ }
18
+
19
+ const modelName = model.name;
20
+ const serviceName = `${modelName}Service`;
21
+ const prismaModel = modelName.charAt(0).toLowerCase() + modelName.slice(1);
22
+
23
+ // Generate imports
24
+ const imports = generateImports(modelName, implType);
25
+
26
+ // Generate CURED methods
27
+ const methods = generateCRUDEMethods(modelName, prismaModel, model, implType);
28
+
29
+ // Generate validation method
30
+ const validateMethod = generateValidationMethod(modelName, model, implType);
31
+
32
+ // Generate the complete service class
33
+ return `${imports}
34
+
35
+ /**
36
+ * ${serviceName}
37
+ * Generated service for ${modelName} model
38
+ *
39
+ * Provides CURED operations (Create, Retrieve, Update, Evolve, Delete)
40
+ * with Prisma ORM integration
41
+ */
42
+ export class ${serviceName} {
43
+ constructor(private prisma: PrismaClient) {}
44
+
45
+ ${methods}
46
+
47
+ ${validateMethod}
48
+ }
49
+ `;
50
+ }
51
+
52
+ /**
53
+ * Generate imports for the service file
54
+ */
55
+ function generateImports(modelName: string, implType: any): string {
56
+ const imports = [
57
+ `import { PrismaClient, ${modelName} } from '@prisma/client';`,
58
+ ];
59
+
60
+ return imports.join('\n');
61
+ }
62
+
63
+ /**
64
+ * Generate CRUDE methods for the service
65
+ */
66
+ function generateCRUDEMethods(
67
+ modelName: string,
68
+ prismaModel: string,
69
+ model: any,
70
+ implType: any
71
+ ): string {
72
+ const methods: string[] = [];
73
+
74
+ // Create method
75
+ methods.push(generateCreateMethod(modelName, prismaModel, model));
76
+
77
+ // Retrieve method
78
+ methods.push(generateRetrieveMethod(modelName, prismaModel, model));
79
+
80
+ // Update method
81
+ methods.push(generateUpdateMethod(modelName, prismaModel, model));
82
+
83
+ // Evolve method (lifecycle-aware update)
84
+ methods.push(generateEvolveMethod(modelName, prismaModel, model));
85
+
86
+ // Delete method
87
+ methods.push(generateDeleteMethod(modelName, prismaModel, model));
88
+
89
+ // List method (bonus)
90
+ methods.push(generateListMethod(modelName, prismaModel, model));
91
+
92
+ return methods.join('\n\n');
93
+ }
94
+
95
+ /**
96
+ * Generate create method
97
+ */
98
+ function generateCreateMethod(
99
+ modelName: string,
100
+ prismaModel: string,
101
+ model: any
102
+ ): string {
103
+ return ` /**
104
+ * Create a new ${modelName}
105
+ */
106
+ async create(data: Omit<${modelName}, 'id' | 'createdAt' | 'updatedAt'>): Promise<${modelName}> {
107
+ // Validate before creating
108
+ const validationResult = this.validate(data, { operation: 'create' });
109
+ if (!validationResult.valid) {
110
+ throw new Error(\`Validation failed: \${validationResult.errors.join(', ')}\`);
111
+ }
112
+
113
+ return await this.prisma.${prismaModel}.create({
114
+ data: data as any
115
+ });
116
+ }`;
117
+ }
118
+
119
+ /**
120
+ * Generate retrieve method
121
+ */
122
+ function generateRetrieveMethod(
123
+ modelName: string,
124
+ prismaModel: string,
125
+ model: any
126
+ ): string {
127
+ return ` /**
128
+ * Retrieve a ${modelName} by ID
129
+ */
130
+ async retrieve(id: string): Promise<${modelName} | null> {
131
+ return await this.prisma.${prismaModel}.findUnique({
132
+ where: { id }
133
+ });
134
+ }`;
135
+ }
136
+
137
+ /**
138
+ * Generate update method
139
+ */
140
+ function generateUpdateMethod(
141
+ modelName: string,
142
+ prismaModel: string,
143
+ model: any
144
+ ): string {
145
+ return ` /**
146
+ * Update a ${modelName}
147
+ */
148
+ async update(id: string, data: Partial<${modelName}>): Promise<${modelName}> {
149
+ // Validate before updating
150
+ const validationResult = this.validate(data, { operation: 'update' });
151
+ if (!validationResult.valid) {
152
+ throw new Error(\`Validation failed: \${validationResult.errors.join(', ')}\`);
153
+ }
154
+
155
+ return await this.prisma.${prismaModel}.update({
156
+ where: { id },
157
+ data: data as any
158
+ });
159
+ }`;
160
+ }
161
+
162
+ /**
163
+ * Generate evolve method (lifecycle-aware)
164
+ */
165
+ function generateEvolveMethod(
166
+ modelName: string,
167
+ prismaModel: string,
168
+ model: any
169
+ ): string {
170
+ const hasLifecycle = model.lifecycle && model.lifecycle.length > 0;
171
+
172
+ if (hasLifecycle) {
173
+ return ` /**
174
+ * Evolve a ${modelName} (lifecycle-aware update)
175
+ * Handles state transitions according to lifecycle rules
176
+ */
177
+ async evolve(id: string, data: Partial<${modelName}>): Promise<${modelName}> {
178
+ // Get current instance to check state
179
+ const current = await this.retrieve(id);
180
+ if (!current) {
181
+ throw new Error('${modelName} not found');
182
+ }
183
+
184
+ // Validate state transition if status is being changed
185
+ if (data.status && data.status !== current.status) {
186
+ // TODO: Add lifecycle validation based on model.lifecycle
187
+ // For now, allow any transition
188
+ }
189
+
190
+ // Validate data
191
+ const validationResult = this.validate(data, { operation: 'evolve' });
192
+ if (!validationResult.valid) {
193
+ throw new Error(\`Validation failed: \${validationResult.errors.join(', ')}\`);
194
+ }
195
+
196
+ return await this.prisma.${prismaModel}.update({
197
+ where: { id },
198
+ data: data as any
199
+ });
200
+ }`;
201
+ } else {
202
+ return ` /**
203
+ * Evolve a ${modelName} (same as update for models without lifecycle)
204
+ */
205
+ async evolve(id: string, data: Partial<${modelName}>): Promise<${modelName}> {
206
+ return this.update(id, data);
207
+ }`;
208
+ }
209
+ }
210
+
211
+ /**
212
+ * Generate delete method
213
+ */
214
+ function generateDeleteMethod(
215
+ modelName: string,
216
+ prismaModel: string,
217
+ model: any
218
+ ): string {
219
+ const hasSoftDelete = model.metadata?.softDelete;
220
+
221
+ if (hasSoftDelete) {
222
+ return ` /**
223
+ * Delete a ${modelName} (soft delete)
224
+ */
225
+ async delete(id: string): Promise<void> {
226
+ await this.prisma.${prismaModel}.update({
227
+ where: { id },
228
+ data: {
229
+ deletedAt: new Date(),
230
+ isDeleted: true
231
+ }
232
+ });
233
+ }`;
234
+ } else {
235
+ return ` /**
236
+ * Delete a ${modelName}
237
+ */
238
+ async delete(id: string): Promise<void> {
239
+ await this.prisma.${prismaModel}.delete({
240
+ where: { id }
241
+ });
242
+ }`;
243
+ }
244
+ }
245
+
246
+ /**
247
+ * Generate list method
248
+ */
249
+ function generateListMethod(
250
+ modelName: string,
251
+ prismaModel: string,
252
+ model: any
253
+ ): string {
254
+ const hasSoftDelete = model.metadata?.softDelete;
255
+
256
+ const whereClause = hasSoftDelete
257
+ ? `\n where: { isDeleted: false },`
258
+ : '';
259
+
260
+ return ` /**
261
+ * List all ${modelName}s
262
+ */
263
+ async list(): Promise<${modelName}[]> {
264
+ return await this.prisma.${prismaModel}.findMany({${whereClause}
265
+ orderBy: { createdAt: 'desc' }
266
+ });
267
+ }`;
268
+ }
269
+
270
+ /**
271
+ * Generate validation method
272
+ */
273
+ function generateValidationMethod(
274
+ modelName: string,
275
+ model: any,
276
+ implType: any
277
+ ): string {
278
+ return ` /**
279
+ * Validate ${modelName} data
280
+ * Unified validation method for all operations
281
+ */
282
+ validate(
283
+ data: any,
284
+ context: { operation: 'create' | 'update' | 'evolve' }
285
+ ): { valid: boolean; errors: string[] } {
286
+ const errors: string[] = [];
287
+
288
+ // Required field validation (for create operation)
289
+ if (context.operation === 'create') {
290
+ ${generateRequiredFieldValidation(model)}
291
+ }
292
+
293
+ // Type validation
294
+ ${generateTypeValidation(model)}
295
+
296
+ // Constraint validation
297
+ ${generateConstraintValidation(model)}
298
+
299
+ return {
300
+ valid: errors.length === 0,
301
+ errors
302
+ };
303
+ }`;
304
+ }
305
+
306
+ /**
307
+ * Generate required field validation
308
+ */
309
+ function generateRequiredFieldValidation(model: any): string {
310
+ const requiredFields = model.attributes?.filter((attr: any) =>
311
+ attr.constraints?.required &&
312
+ !['id', 'createdAt', 'updatedAt'].includes(attr.name)
313
+ ) || [];
314
+
315
+ if (requiredFields.length === 0) {
316
+ return '// No required fields';
317
+ }
318
+
319
+ const validations = requiredFields.map((field: any) =>
320
+ `if (data.${field.name} === undefined || data.${field.name} === null) {
321
+ errors.push('${field.name} is required');
322
+ }`
323
+ ).join('\n ');
324
+
325
+ return validations;
326
+ }
327
+
328
+ /**
329
+ * Generate type validation
330
+ */
331
+ function generateTypeValidation(model: any): string {
332
+ const fields = model.attributes || [];
333
+
334
+ if (fields.length === 0) {
335
+ return '// No type validation';
336
+ }
337
+
338
+ const validations = fields
339
+ .filter((field: any) => !['id', 'createdAt', 'updatedAt'].includes(field.name))
340
+ .map((field: any) => {
341
+ const typeName = inferJsType(field.type);
342
+ if (typeName === 'string' || typeName === 'number' || typeName === 'boolean') {
343
+ return `if (data.${field.name} !== undefined && typeof data.${field.name} !== '${typeName}') {
344
+ errors.push('${field.name} must be a ${typeName}');
345
+ }`;
346
+ }
347
+ return '';
348
+ })
349
+ .filter(v => v)
350
+ .join('\n ');
351
+
352
+ return validations || '// No type validation needed';
353
+ }
354
+
355
+ /**
356
+ * Generate constraint validation
357
+ */
358
+ function generateConstraintValidation(model: any): string {
359
+ const fields = model.attributes?.filter((attr: any) =>
360
+ attr.constraints && Object.keys(attr.constraints).length > 0
361
+ ) || [];
362
+
363
+ if (fields.length === 0) {
364
+ return '// No constraint validation';
365
+ }
366
+
367
+ const validations = fields.map((field: any) => {
368
+ const constraints: string[] = [];
369
+
370
+ if (field.constraints.unique) {
371
+ constraints.push(`// TODO: Check uniqueness of ${field.name}`);
372
+ }
373
+
374
+ if (field.constraints.min !== undefined) {
375
+ constraints.push(
376
+ `if (data.${field.name} !== undefined && data.${field.name} < ${field.constraints.min}) {
377
+ errors.push('${field.name} must be at least ${field.constraints.min}');
378
+ }`
379
+ );
380
+ }
381
+
382
+ if (field.constraints.max !== undefined) {
383
+ constraints.push(
384
+ `if (data.${field.name} !== undefined && data.${field.name} > ${field.constraints.max}) {
385
+ errors.push('${field.name} must be at most ${field.constraints.max}');
386
+ }`
387
+ );
388
+ }
389
+
390
+ return constraints.join('\n ');
391
+ }).filter(v => v).join('\n ');
392
+
393
+ return validations || '// No constraint validation needed';
394
+ }
395
+
396
+ /**
397
+ * Infer JavaScript type from SpecVerse type
398
+ */
399
+ function inferJsType(type: string): string {
400
+ const typeLower = type.toLowerCase();
401
+
402
+ if (typeLower.includes('string') || typeLower.includes('text')) return 'string';
403
+ if (typeLower.includes('int') || typeLower.includes('number')) return 'number';
404
+ if (typeLower.includes('bool')) return 'boolean';
405
+ if (typeLower.includes('date')) return 'object'; // Date objects
406
+
407
+ return 'any';
408
+ }
@@ -0,0 +1,65 @@
1
+ name: GenericScaffold
2
+ version: "1.0.0"
3
+ category: scaffolding
4
+ description: "Generic project scaffolding that adapts to manifest choices"
5
+
6
+ metadata:
7
+ author: "SpecVerse Team"
8
+ license: "MIT"
9
+ tags: [scaffolding, project-setup, generic]
10
+
11
+ compatibility:
12
+ specverse: "^3.3.0"
13
+ node: ">=18.0.0"
14
+
15
+ capabilities:
16
+ provides:
17
+ - "project.scaffold"
18
+ - "project.package.json"
19
+ - "project.tsconfig"
20
+ - "project.gitignore"
21
+ - "project.env"
22
+
23
+ technology:
24
+ runtime: "node"
25
+ language: "typescript"
26
+
27
+ codeTemplates:
28
+ packageJson:
29
+ engine: typescript
30
+ generator: "libs/instance-factories/scaffolding/templates/generic/package-json-generator.ts"
31
+ outputPattern: "package.json"
32
+
33
+ tsconfig:
34
+ engine: typescript
35
+ generator: "libs/instance-factories/scaffolding/templates/generic/tsconfig-generator.ts"
36
+ outputPattern: "tsconfig.json"
37
+
38
+ tsconfigReact:
39
+ engine: typescript
40
+ generator: "libs/instance-factories/scaffolding/templates/generic/tsconfig-react-generator.ts"
41
+ outputPattern: "tsconfig.react.json"
42
+
43
+ env:
44
+ engine: typescript
45
+ generator: "libs/instance-factories/scaffolding/templates/generic/env-generator.ts"
46
+ outputPattern: ".env"
47
+
48
+ envExample:
49
+ engine: typescript
50
+ generator: "libs/instance-factories/scaffolding/templates/generic/env-example-generator.ts"
51
+ outputPattern: ".env.example"
52
+
53
+ gitignore:
54
+ engine: typescript
55
+ generator: "libs/instance-factories/scaffolding/templates/generic/gitignore-generator.ts"
56
+ outputPattern: ".gitignore"
57
+
58
+ readme:
59
+ engine: typescript
60
+ generator: "libs/instance-factories/scaffolding/templates/generic/readme-generator.ts"
61
+ outputPattern: "README.md"
62
+
63
+ configuration:
64
+ defaultNodeVersion: "18.0.0"
65
+ defaultLicense: "MIT"
@@ -0,0 +1,73 @@
1
+ /**
2
+ * Generic .env.example Generator
3
+ *
4
+ * Same as .env but for version control
5
+ */
6
+
7
+ import type { TemplateContext } from '@specverse/engine-realize';
8
+
9
+ export default function generateEnvExample(context: TemplateContext): string {
10
+ const { manifest } = context;
11
+
12
+ const envVars = aggregateEnvironmentVariables(context.implementationTypes || []);
13
+
14
+ // Group by category
15
+ const byCategory: Record<string, any[]> = {};
16
+ for (const envVar of envVars) {
17
+ const category = envVar.category || 'Configuration';
18
+ if (!byCategory[category]) {
19
+ byCategory[category] = [];
20
+ }
21
+ byCategory[category].push(envVar);
22
+ }
23
+
24
+ // Generate .env.example content
25
+ const lines: string[] = [
26
+ '# Environment Configuration',
27
+ '# Copy this file to .env and fill in your values',
28
+ ''
29
+ ];
30
+
31
+ for (const [category, vars] of Object.entries(byCategory)) {
32
+ lines.push(`# ${category}`);
33
+
34
+ for (const envVar of vars) {
35
+ if (envVar.description) {
36
+ lines.push(`# ${envVar.description}`);
37
+ }
38
+
39
+ if (envVar.required) {
40
+ lines.push(`# REQUIRED`);
41
+ }
42
+
43
+ // Use example value or empty
44
+ const value = envVar.example || '';
45
+ lines.push(`${envVar.name}="${value}"`);
46
+ }
47
+
48
+ lines.push(''); // Empty line between categories
49
+ }
50
+
51
+ return lines.join('\n');
52
+ }
53
+
54
+ function aggregateEnvironmentVariables(implementationTypes: any[]): any[] {
55
+ const envVarsMap = new Map<string, any>();
56
+
57
+ if (!implementationTypes || implementationTypes.length === 0) {
58
+ return [];
59
+ }
60
+
61
+ // Deduplicate by environment variable name (keep first occurrence)
62
+ for (const implType of implementationTypes) {
63
+ if (implType.requirements?.environment) {
64
+ for (const envVar of implType.requirements.environment) {
65
+ if (!envVarsMap.has(envVar.name)) {
66
+ envVarsMap.set(envVar.name, envVar);
67
+ }
68
+ }
69
+ }
70
+ }
71
+
72
+ return Array.from(envVarsMap.values());
73
+ }
@@ -0,0 +1,85 @@
1
+ /**
2
+ * Generic .env Generator
3
+ *
4
+ * Aggregates environment variables from all implementation types
5
+ */
6
+
7
+ import { readFileSync, existsSync } from 'fs';
8
+ import { join } from 'path';
9
+ import type { TemplateContext } from '@specverse/engine-realize';
10
+
11
+ export default function generateEnv(context: TemplateContext): string {
12
+ const { manifest } = context;
13
+
14
+ const envVars = aggregateEnvironmentVariables(context.implementationTypes || []);
15
+
16
+ // Try to read parent .env file for DATABASE_URL
17
+ let parentDatabaseUrl: string | undefined;
18
+ try {
19
+ const parentEnvPath = join(process.cwd(), '.env');
20
+ if (existsSync(parentEnvPath)) {
21
+ const parentEnvContent = readFileSync(parentEnvPath, 'utf-8');
22
+ const match = parentEnvContent.match(/DATABASE_URL=["']?([^"'\n]+)["']?/);
23
+ if (match) {
24
+ parentDatabaseUrl = match[1];
25
+ }
26
+ }
27
+ } catch (err) {
28
+ // Ignore errors, will use default
29
+ }
30
+
31
+ // Group by category
32
+ const byCategory: Record<string, any[]> = {};
33
+ for (const envVar of envVars) {
34
+ const category = envVar.category || 'Configuration';
35
+ if (!byCategory[category]) {
36
+ byCategory[category] = [];
37
+ }
38
+ byCategory[category].push(envVar);
39
+ }
40
+
41
+ // Generate .env content
42
+ const lines: string[] = [];
43
+
44
+ for (const [category, vars] of Object.entries(byCategory)) {
45
+ lines.push(`# ${category}`);
46
+
47
+ for (const envVar of vars) {
48
+ if (envVar.description) {
49
+ lines.push(`# ${envVar.description}`);
50
+ }
51
+
52
+ // Use parent DATABASE_URL if available, otherwise use example value
53
+ let value = envVar.example || '';
54
+ if (envVar.name === 'DATABASE_URL' && parentDatabaseUrl) {
55
+ value = parentDatabaseUrl;
56
+ }
57
+ lines.push(`${envVar.name}="${value}"`);
58
+ }
59
+
60
+ lines.push(''); // Empty line between categories
61
+ }
62
+
63
+ return lines.join('\n');
64
+ }
65
+
66
+ function aggregateEnvironmentVariables(implementationTypes: any[]): any[] {
67
+ const envVarsMap = new Map<string, any>();
68
+
69
+ if (!implementationTypes || implementationTypes.length === 0) {
70
+ return [];
71
+ }
72
+
73
+ // Deduplicate by environment variable name (keep first occurrence)
74
+ for (const implType of implementationTypes) {
75
+ if (implType.requirements?.environment) {
76
+ for (const envVar of implType.requirements.environment) {
77
+ if (!envVarsMap.has(envVar.name)) {
78
+ envVarsMap.set(envVar.name, envVar);
79
+ }
80
+ }
81
+ }
82
+ }
83
+
84
+ return Array.from(envVarsMap.values());
85
+ }
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Generic .gitignore Generator
3
+ */
4
+
5
+ import type { TemplateContext } from '@specverse/engine-realize';
6
+
7
+ export default function generateGitIgnore(context: TemplateContext): string {
8
+ const { manifest } = context;
9
+
10
+ const ignorePatterns = [
11
+ '# Dependencies',
12
+ 'node_modules/',
13
+ '',
14
+ '# Build output',
15
+ 'dist/',
16
+ 'build/',
17
+ '',
18
+ '# Environment',
19
+ '.env',
20
+ '.env.local',
21
+ '.env.*.local',
22
+ '',
23
+ '# TypeScript',
24
+ '*.tsbuildinfo',
25
+ '',
26
+ '# Logs',
27
+ 'logs/',
28
+ '*.log',
29
+ 'npm-debug.log*',
30
+ '',
31
+ ];
32
+
33
+ // Add Prisma specific ignores if using Prisma
34
+ if (usesPrisma(manifest)) {
35
+ ignorePatterns.push(
36
+ '# Prisma',
37
+ 'prisma/migrations/',
38
+ '',
39
+ );
40
+ }
41
+
42
+ ignorePatterns.push(
43
+ '# IDE',
44
+ '.vscode/',
45
+ '.idea/',
46
+ '*.swp',
47
+ '*.swo',
48
+ '',
49
+ '# OS',
50
+ '.DS_Store',
51
+ 'Thumbs.db',
52
+ '',
53
+ '# Testing',
54
+ 'coverage/',
55
+ '.nyc_output/'
56
+ );
57
+
58
+ return ignorePatterns.join('\n');
59
+ }
60
+
61
+ function usesPrisma(manifest: any): boolean {
62
+ if (!manifest || !manifest.capabilityMappings) {
63
+ return false;
64
+ }
65
+
66
+ return manifest.capabilityMappings.some((m: any) =>
67
+ m.instanceFactory?.toLowerCase().includes('prisma')
68
+ );
69
+ }