@msn-control/liftoff 0.10.4 → 0.11.2

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 (700) hide show
  1. package/DEVELOPER.md +238 -77
  2. package/README.md +38 -33
  3. package/assets/supported-stack.json +3 -136
  4. package/dist/adapters/azure/governance-assessment.d.ts +2 -0
  5. package/dist/adapters/azure/governance-assessment.js +21 -0
  6. package/dist/adapters/azure/governance-assessment.js.map +1 -0
  7. package/dist/adapters/filesystem/atomic-write.d.ts +2 -0
  8. package/dist/adapters/filesystem/atomic-write.js +74 -0
  9. package/dist/adapters/filesystem/atomic-write.js.map +1 -0
  10. package/dist/adapters/filesystem/errors.d.ts +2 -0
  11. package/dist/adapters/filesystem/errors.js +8 -0
  12. package/dist/adapters/filesystem/errors.js.map +1 -0
  13. package/dist/adapters/filesystem/manifest-file.d.ts +1 -0
  14. package/dist/adapters/filesystem/manifest-file.js +21 -0
  15. package/dist/adapters/filesystem/manifest-file.js.map +1 -0
  16. package/dist/adapters/filesystem/project-config.d.ts +4 -0
  17. package/dist/adapters/filesystem/project-config.js +157 -0
  18. package/dist/adapters/filesystem/project-config.js.map +1 -0
  19. package/dist/adapters/filesystem/project-discovery.d.ts +2 -0
  20. package/dist/adapters/filesystem/project-discovery.js +30 -0
  21. package/dist/adapters/filesystem/project-discovery.js.map +1 -0
  22. package/dist/adapters/filesystem/project-files.d.ts +6 -0
  23. package/dist/adapters/filesystem/project-files.js +68 -0
  24. package/dist/adapters/filesystem/project-files.js.map +1 -0
  25. package/dist/adapters/filesystem/project-lock.d.ts +8 -0
  26. package/dist/adapters/filesystem/project-lock.js +164 -0
  27. package/dist/adapters/filesystem/project-lock.js.map +1 -0
  28. package/dist/adapters/filesystem/project-paths.d.ts +2 -0
  29. package/dist/adapters/filesystem/project-paths.js +60 -0
  30. package/dist/adapters/filesystem/project-paths.js.map +1 -0
  31. package/dist/adapters/filesystem/project-transaction.d.ts +24 -0
  32. package/dist/adapters/filesystem/project-transaction.js +177 -0
  33. package/dist/adapters/filesystem/project-transaction.js.map +1 -0
  34. package/dist/adapters/filesystem/reviewed-update-transaction.d.ts +53 -0
  35. package/dist/adapters/filesystem/reviewed-update-transaction.js +864 -0
  36. package/dist/adapters/filesystem/reviewed-update-transaction.js.map +1 -0
  37. package/dist/adapters/filesystem/update-previews.d.ts +50 -0
  38. package/dist/adapters/filesystem/update-previews.js +613 -0
  39. package/dist/adapters/filesystem/update-previews.js.map +1 -0
  40. package/dist/adapters/git/governance-assessment.d.ts +22 -0
  41. package/dist/adapters/git/governance-assessment.js +161 -0
  42. package/dist/adapters/git/governance-assessment.js.map +1 -0
  43. package/dist/adapters/github/governance-assessment.d.ts +2 -0
  44. package/dist/adapters/github/governance-assessment.js +18 -0
  45. package/dist/adapters/github/governance-assessment.js.map +1 -0
  46. package/dist/adapters/packaged-assets/package-root.d.ts +3 -0
  47. package/dist/adapters/packaged-assets/package-root.js +21 -0
  48. package/dist/adapters/packaged-assets/package-root.js.map +1 -0
  49. package/dist/adapters/packaged-assets/supported-stack.d.ts +4 -0
  50. package/dist/adapters/packaged-assets/supported-stack.js +18 -0
  51. package/dist/adapters/packaged-assets/supported-stack.js.map +1 -0
  52. package/dist/adapters/packaged-assets/template-assets.d.ts +23 -0
  53. package/dist/adapters/packaged-assets/template-assets.js +36 -0
  54. package/dist/adapters/packaged-assets/template-assets.js.map +1 -0
  55. package/dist/adapters/process/shell-command.d.ts +6 -0
  56. package/dist/adapters/process/shell-command.js +27 -0
  57. package/dist/adapters/process/shell-command.js.map +1 -0
  58. package/dist/application/context.d.ts +25 -0
  59. package/dist/application/context.js +2 -0
  60. package/dist/application/context.js.map +1 -0
  61. package/dist/application/diagnose/doctor.d.ts +21 -0
  62. package/dist/application/diagnose/doctor.js +580 -0
  63. package/dist/application/diagnose/doctor.js.map +1 -0
  64. package/dist/application/diagnose/generated-project.d.ts +1 -0
  65. package/dist/application/diagnose/generated-project.js +105 -0
  66. package/dist/application/diagnose/generated-project.js.map +1 -0
  67. package/dist/application/diagnose/validate.d.ts +6 -0
  68. package/dist/application/diagnose/validate.js +27 -0
  69. package/dist/application/diagnose/validate.js.map +1 -0
  70. package/dist/application/initialize/fixture.d.ts +2 -0
  71. package/dist/application/initialize/fixture.js +39 -0
  72. package/dist/application/initialize/fixture.js.map +1 -0
  73. package/dist/application/initialize/inputs.d.ts +3 -0
  74. package/dist/application/initialize/inputs.js +35 -0
  75. package/dist/application/initialize/inputs.js.map +1 -0
  76. package/dist/application/initialize/use-case.d.ts +23 -0
  77. package/dist/application/initialize/use-case.js +360 -0
  78. package/dist/application/initialize/use-case.js.map +1 -0
  79. package/dist/application/migrate/use-case.d.ts +7 -0
  80. package/dist/application/migrate/use-case.js +378 -0
  81. package/dist/application/migrate/use-case.js.map +1 -0
  82. package/dist/application/project/catalog.d.ts +46 -0
  83. package/dist/application/project/catalog.js +12 -0
  84. package/dist/application/project/catalog.js.map +1 -0
  85. package/dist/application/project/manifest.d.ts +2 -0
  86. package/dist/application/project/manifest.js +29 -0
  87. package/dist/application/project/manifest.js.map +1 -0
  88. package/dist/application/project/planning.d.ts +6 -0
  89. package/dist/application/project/planning.js +12 -0
  90. package/dist/application/project/planning.js.map +1 -0
  91. package/dist/application/update/approval.d.ts +39 -0
  92. package/dist/application/update/approval.js +54 -0
  93. package/dist/application/update/approval.js.map +1 -0
  94. package/dist/application/update/command-guidance.d.ts +2 -0
  95. package/dist/application/update/command-guidance.js +14 -0
  96. package/dist/application/update/command-guidance.js.map +1 -0
  97. package/dist/application/update/inspection.d.ts +37 -0
  98. package/dist/application/update/inspection.js +235 -0
  99. package/dist/application/update/inspection.js.map +1 -0
  100. package/dist/application/update/migration-runtime.d.ts +14 -0
  101. package/dist/application/update/migration-runtime.js +178 -0
  102. package/dist/application/update/migration-runtime.js.map +1 -0
  103. package/dist/application/update/output.d.ts +134 -0
  104. package/dist/application/update/output.js +182 -0
  105. package/dist/application/update/output.js.map +1 -0
  106. package/dist/application/update/planning.d.ts +40 -0
  107. package/dist/application/update/planning.js +293 -0
  108. package/dist/application/update/planning.js.map +1 -0
  109. package/dist/application/update/preview.d.ts +49 -0
  110. package/dist/application/update/preview.js +220 -0
  111. package/dist/application/update/preview.js.map +1 -0
  112. package/dist/application/update/protected-source.d.ts +25 -0
  113. package/dist/application/update/protected-source.js +81 -0
  114. package/dist/application/update/protected-source.js.map +1 -0
  115. package/dist/application/update/reporting.d.ts +42 -0
  116. package/dist/application/update/reporting.js +326 -0
  117. package/dist/application/update/reporting.js.map +1 -0
  118. package/dist/application/update/revalidation-plan.d.ts +22 -0
  119. package/dist/application/update/revalidation-plan.js +108 -0
  120. package/dist/application/update/revalidation-plan.js.map +1 -0
  121. package/dist/application/update/revalidation.d.ts +70 -0
  122. package/dist/application/update/revalidation.js +337 -0
  123. package/dist/application/update/revalidation.js.map +1 -0
  124. package/dist/application/update/review-plan.d.ts +25 -0
  125. package/dist/application/update/review-plan.js +89 -0
  126. package/dist/application/update/review-plan.js.map +1 -0
  127. package/dist/application/update/transaction-approval.d.ts +29 -0
  128. package/dist/application/update/transaction-approval.js +82 -0
  129. package/dist/application/update/transaction-approval.js.map +1 -0
  130. package/dist/application/update/use-case.d.ts +9 -0
  131. package/dist/application/update/use-case.js +271 -0
  132. package/dist/application/update/use-case.js.map +1 -0
  133. package/dist/application/update/write-plan.d.ts +15 -0
  134. package/dist/application/update/write-plan.js +115 -0
  135. package/dist/application/update/write-plan.js.map +1 -0
  136. package/dist/application/upgrade/use-case.d.ts +6 -0
  137. package/dist/application/upgrade/use-case.js +82 -0
  138. package/dist/application/upgrade/use-case.js.map +1 -0
  139. package/dist/args.d.ts +5 -65
  140. package/dist/args.js +4 -472
  141. package/dist/args.js.map +1 -1
  142. package/dist/artifact-lifecycle.d.ts +1 -21
  143. package/dist/artifact-lifecycle.js +1 -75
  144. package/dist/artifact-lifecycle.js.map +1 -1
  145. package/dist/catalogs.d.ts +1 -50
  146. package/dist/catalogs.js +1 -472
  147. package/dist/catalogs.js.map +1 -1
  148. package/dist/cli/args/contracts.d.ts +51 -0
  149. package/dist/cli/args/contracts.js +2 -0
  150. package/dist/cli/args/contracts.js.map +1 -0
  151. package/dist/cli/args/definitions.d.ts +6 -0
  152. package/dist/cli/args/definitions.js +188 -0
  153. package/dist/cli/args/definitions.js.map +1 -0
  154. package/dist/cli/args/help.d.ts +5 -0
  155. package/dist/cli/args/help.js +142 -0
  156. package/dist/cli/args/help.js.map +1 -0
  157. package/dist/cli/args/parser.d.ts +5 -0
  158. package/dist/cli/args/parser.js +160 -0
  159. package/dist/cli/args/parser.js.map +1 -0
  160. package/dist/cli/args/readers.d.ts +4 -0
  161. package/dist/cli/args/readers.js +19 -0
  162. package/dist/cli/args/readers.js.map +1 -0
  163. package/dist/cli/commands/diagnose.d.ts +4 -0
  164. package/dist/cli/commands/diagnose.js +12 -0
  165. package/dist/cli/commands/diagnose.js.map +1 -0
  166. package/dist/cli/commands/dispatch.d.ts +3 -0
  167. package/dist/cli/commands/dispatch.js +94 -0
  168. package/dist/cli/commands/dispatch.js.map +1 -0
  169. package/dist/cli/commands/help.d.ts +3 -0
  170. package/dist/cli/commands/help.js +32 -0
  171. package/dist/cli/commands/help.js.map +1 -0
  172. package/dist/cli/commands/helpers.d.ts +8 -0
  173. package/dist/cli/commands/helpers.js +97 -0
  174. package/dist/cli/commands/helpers.js.map +1 -0
  175. package/dist/cli/commands/initialize.d.ts +3 -0
  176. package/dist/cli/commands/initialize.js +7 -0
  177. package/dist/cli/commands/initialize.js.map +1 -0
  178. package/dist/cli/commands/migrate.d.ts +3 -0
  179. package/dist/cli/commands/migrate.js +8 -0
  180. package/dist/cli/commands/migrate.js.map +1 -0
  181. package/dist/cli/commands/plan.d.ts +3 -0
  182. package/dist/cli/commands/plan.js +34 -0
  183. package/dist/cli/commands/plan.js.map +1 -0
  184. package/dist/cli/commands/reference.d.ts +5 -0
  185. package/dist/cli/commands/reference.js +43 -0
  186. package/dist/cli/commands/reference.js.map +1 -0
  187. package/dist/cli/commands/update.d.ts +3 -0
  188. package/dist/cli/commands/update.js +10 -0
  189. package/dist/cli/commands/update.js.map +1 -0
  190. package/dist/cli/commands/upgrade.d.ts +3 -0
  191. package/dist/cli/commands/upgrade.js +7 -0
  192. package/dist/cli/commands/upgrade.js.map +1 -0
  193. package/dist/cli/context.d.ts +1 -0
  194. package/dist/cli/context.js +2 -0
  195. package/dist/cli/context.js.map +1 -0
  196. package/dist/cli/project-options.d.ts +3 -0
  197. package/dist/cli/project-options.js +41 -0
  198. package/dist/cli/project-options.js.map +1 -0
  199. package/dist/cli.d.ts +3 -3
  200. package/dist/cli.js +2 -2
  201. package/dist/cli.js.map +1 -1
  202. package/dist/commands.d.ts +4 -35
  203. package/dist/commands.js +3 -2969
  204. package/dist/commands.js.map +1 -1
  205. package/dist/container-validation.d.ts +1 -1
  206. package/dist/domain/governance/activation/approvals.d.ts +351 -0
  207. package/dist/domain/governance/activation/approvals.js +528 -0
  208. package/dist/domain/governance/activation/approvals.js.map +1 -0
  209. package/dist/domain/governance/activation/canonical-json.d.ts +4 -0
  210. package/dist/domain/governance/activation/canonical-json.js +39 -0
  211. package/dist/domain/governance/activation/canonical-json.js.map +1 -0
  212. package/dist/domain/governance/activation/capabilities.d.ts +7 -0
  213. package/dist/domain/governance/activation/capabilities.js +33 -0
  214. package/dist/domain/governance/activation/capabilities.js.map +1 -0
  215. package/dist/domain/governance/activation/evidence.d.ts +63 -0
  216. package/dist/domain/governance/activation/evidence.js +444 -0
  217. package/dist/domain/governance/activation/evidence.js.map +1 -0
  218. package/dist/domain/governance/activation/graph.d.ts +397 -0
  219. package/dist/domain/governance/activation/graph.js +441 -0
  220. package/dist/domain/governance/activation/graph.js.map +1 -0
  221. package/dist/domain/governance/activation/inputs.d.ts +25 -0
  222. package/dist/domain/governance/activation/inputs.js +63 -0
  223. package/dist/domain/governance/activation/inputs.js.map +1 -0
  224. package/dist/domain/governance/activation/operations.d.ts +19 -0
  225. package/dist/domain/governance/activation/operations.js +181 -0
  226. package/dist/domain/governance/activation/operations.js.map +1 -0
  227. package/dist/domain/governance/activation/readiness.d.ts +27 -0
  228. package/dist/domain/governance/activation/readiness.js +269 -0
  229. package/dist/domain/governance/activation/readiness.js.map +1 -0
  230. package/dist/domain/governance/activation/types.d.ts +399 -0
  231. package/dist/domain/governance/activation/types.js +109 -0
  232. package/dist/domain/governance/activation/types.js.map +1 -0
  233. package/dist/domain/governance/activation/validators.d.ts +22 -0
  234. package/dist/domain/governance/activation/validators.js +1347 -0
  235. package/dist/domain/governance/activation/validators.js.map +1 -0
  236. package/dist/domain/governance/assessment/catalog.d.ts +14 -0
  237. package/dist/domain/governance/assessment/catalog.js +105 -0
  238. package/dist/domain/governance/assessment/catalog.js.map +1 -0
  239. package/dist/domain/governance/assessment/errors.d.ts +10 -0
  240. package/dist/domain/governance/assessment/errors.js +22 -0
  241. package/dist/domain/governance/assessment/errors.js.map +1 -0
  242. package/dist/domain/governance/assessment/index.d.ts +8 -0
  243. package/dist/domain/governance/assessment/index.js +9 -0
  244. package/dist/domain/governance/assessment/index.js.map +1 -0
  245. package/dist/domain/governance/assessment/live-normalize.d.ts +19 -0
  246. package/dist/domain/governance/assessment/live-normalize.js +403 -0
  247. package/dist/domain/governance/assessment/live-normalize.js.map +1 -0
  248. package/dist/domain/governance/assessment/predicates.d.ts +36 -0
  249. package/dist/domain/governance/assessment/predicates.js +545 -0
  250. package/dist/domain/governance/assessment/predicates.js.map +1 -0
  251. package/dist/domain/governance/assessment/report.d.ts +23 -0
  252. package/dist/domain/governance/assessment/report.js +266 -0
  253. package/dist/domain/governance/assessment/report.js.map +1 -0
  254. package/dist/domain/governance/assessment/sanitize.d.ts +8 -0
  255. package/dist/domain/governance/assessment/sanitize.js +60 -0
  256. package/dist/domain/governance/assessment/sanitize.js.map +1 -0
  257. package/dist/domain/governance/assessment/types.d.ts +174 -0
  258. package/dist/domain/governance/assessment/types.js +13 -0
  259. package/dist/domain/governance/assessment/types.js.map +1 -0
  260. package/dist/domain/governance/assessment/yaml.d.ts +6 -0
  261. package/dist/domain/governance/assessment/yaml.js +30 -0
  262. package/dist/domain/governance/assessment/yaml.js.map +1 -0
  263. package/dist/domain/governance/policy/identity.d.ts +64 -0
  264. package/dist/domain/governance/policy/identity.js +112 -0
  265. package/dist/domain/governance/policy/identity.js.map +1 -0
  266. package/dist/domain/migration/dependencies.d.ts +7 -0
  267. package/dist/domain/migration/dependencies.js +221 -0
  268. package/dist/domain/migration/dependencies.js.map +1 -0
  269. package/dist/domain/migration/inventory.d.ts +3 -0
  270. package/dist/domain/migration/inventory.js +15 -0
  271. package/dist/domain/migration/inventory.js.map +1 -0
  272. package/dist/domain/project/artifact-lifecycle.d.ts +69 -0
  273. package/dist/domain/project/artifact-lifecycle.js +137 -0
  274. package/dist/domain/project/artifact-lifecycle.js.map +1 -0
  275. package/dist/domain/project/catalog.d.ts +48 -0
  276. package/dist/domain/project/catalog.js +507 -0
  277. package/dist/domain/project/catalog.js.map +1 -0
  278. package/dist/domain/project/contracts.d.ts +247 -0
  279. package/dist/domain/project/contracts.js +2 -0
  280. package/dist/domain/project/contracts.js.map +1 -0
  281. package/dist/domain/project/errors.d.ts +3 -0
  282. package/dist/domain/project/errors.js +7 -0
  283. package/dist/domain/project/errors.js.map +1 -0
  284. package/dist/domain/project/infrastructure-layout.d.ts +26 -0
  285. package/dist/domain/project/infrastructure-layout.js +125 -0
  286. package/dist/domain/project/infrastructure-layout.js.map +1 -0
  287. package/dist/domain/project/inputs.d.ts +21 -0
  288. package/dist/domain/project/inputs.js +41 -0
  289. package/dist/domain/project/inputs.js.map +1 -0
  290. package/dist/domain/project/manifest/artifacts.d.ts +8 -0
  291. package/dist/domain/project/manifest/artifacts.js +150 -0
  292. package/dist/domain/project/manifest/artifacts.js.map +1 -0
  293. package/dist/domain/project/manifest/context.d.ts +13 -0
  294. package/dist/domain/project/manifest/context.js +2 -0
  295. package/dist/domain/project/manifest/context.js.map +1 -0
  296. package/dist/domain/project/manifest/fields.d.ts +6 -0
  297. package/dist/domain/project/manifest/fields.js +36 -0
  298. package/dist/domain/project/manifest/fields.js.map +1 -0
  299. package/dist/domain/project/manifest/governance.d.ts +8 -0
  300. package/dist/domain/project/manifest/governance.js +161 -0
  301. package/dist/domain/project/manifest/governance.js.map +1 -0
  302. package/dist/domain/project/manifest/project-identity.d.ts +6 -0
  303. package/dist/domain/project/manifest/project-identity.js +273 -0
  304. package/dist/domain/project/manifest/project-identity.js.map +1 -0
  305. package/dist/domain/project/manifest/reader.d.ts +9 -0
  306. package/dist/domain/project/manifest/reader.js +141 -0
  307. package/dist/domain/project/manifest/reader.js.map +1 -0
  308. package/dist/domain/project/paths.d.ts +2 -0
  309. package/dist/domain/project/paths.js +29 -0
  310. package/dist/domain/project/paths.js.map +1 -0
  311. package/dist/domain/project/planning.d.ts +19 -0
  312. package/dist/domain/project/planning.js +329 -0
  313. package/dist/domain/project/planning.js.map +1 -0
  314. package/dist/domain/project/retired-workload.d.ts +4 -0
  315. package/dist/domain/project/retired-workload.js +18 -0
  316. package/dist/domain/project/retired-workload.js.map +1 -0
  317. package/dist/domain/project/reviewed-update-artifacts.d.ts +2 -0
  318. package/dist/domain/project/reviewed-update-artifacts.js +3 -0
  319. package/dist/domain/project/reviewed-update-artifacts.js.map +1 -0
  320. package/dist/domain/project/supported-stack.d.ts +113 -0
  321. package/dist/domain/project/supported-stack.js +426 -0
  322. package/dist/domain/project/supported-stack.js.map +1 -0
  323. package/dist/domain/workstation/constraints.d.ts +6 -0
  324. package/dist/domain/workstation/constraints.js +8 -0
  325. package/dist/domain/workstation/constraints.js.map +1 -0
  326. package/dist/file-system.d.ts +10 -44
  327. package/dist/file-system.js +9 -1245
  328. package/dist/file-system.js.map +1 -1
  329. package/dist/framework-adapters.d.ts +1 -1
  330. package/dist/framework-validation.d.ts +1 -1
  331. package/dist/framework-validation.js +1 -1
  332. package/dist/framework-validation.js.map +1 -1
  333. package/dist/genai-templates.d.ts +2 -9
  334. package/dist/genai-templates.js +4 -5
  335. package/dist/genai-templates.js.map +1 -1
  336. package/dist/generators/common/artifacts.d.ts +6 -0
  337. package/dist/generators/common/artifacts.js +30 -0
  338. package/dist/generators/common/artifacts.js.map +1 -0
  339. package/dist/generators/common/base.d.ts +17 -0
  340. package/dist/generators/common/base.js +425 -0
  341. package/dist/generators/common/base.js.map +1 -0
  342. package/dist/generators/common/dotenv-validation.d.ts +2 -0
  343. package/dist/generators/common/dotenv-validation.js +80 -0
  344. package/dist/generators/common/dotenv-validation.js.map +1 -0
  345. package/dist/generators/common/environments.d.ts +3 -0
  346. package/dist/generators/common/environments.js +15 -0
  347. package/dist/generators/common/environments.js.map +1 -0
  348. package/dist/generators/common/frontend.d.ts +15 -0
  349. package/dist/generators/common/frontend.js +166 -0
  350. package/dist/generators/common/frontend.js.map +1 -0
  351. package/dist/generators/common/python-settings.d.ts +2 -0
  352. package/dist/generators/common/python-settings.js +70 -0
  353. package/dist/generators/common/python-settings.js.map +1 -0
  354. package/dist/generators/common/spec-workflow.d.ts +28 -0
  355. package/dist/generators/common/spec-workflow.js +567 -0
  356. package/dist/generators/common/spec-workflow.js.map +1 -0
  357. package/dist/generators/common/values.d.ts +13 -0
  358. package/dist/generators/common/values.js +16 -0
  359. package/dist/generators/common/values.js.map +1 -0
  360. package/dist/generators/containers/compose.d.ts +7 -0
  361. package/dist/generators/containers/compose.js +196 -0
  362. package/dist/generators/containers/compose.js.map +1 -0
  363. package/dist/generators/containers/context.d.ts +1 -0
  364. package/dist/generators/containers/context.js +43 -0
  365. package/dist/generators/containers/context.js.map +1 -0
  366. package/dist/generators/containers/images.d.ts +7 -0
  367. package/dist/generators/containers/images.js +119 -0
  368. package/dist/generators/containers/images.js.map +1 -0
  369. package/dist/generators/context.d.ts +42 -0
  370. package/dist/generators/context.js +38 -0
  371. package/dist/generators/context.js.map +1 -0
  372. package/dist/generators/genai/backend.d.ts +20 -0
  373. package/dist/generators/genai/backend.js +667 -0
  374. package/dist/generators/genai/backend.js.map +1 -0
  375. package/dist/generators/genai/configuration.d.ts +3 -0
  376. package/dist/generators/genai/configuration.js +43 -0
  377. package/dist/generators/genai/configuration.js.map +1 -0
  378. package/dist/generators/genai/database.d.ts +7 -0
  379. package/dist/generators/genai/database.js +71 -0
  380. package/dist/generators/genai/database.js.map +1 -0
  381. package/dist/generators/genai/functions.d.ts +15 -0
  382. package/dist/generators/genai/functions.js +156 -0
  383. package/dist/generators/genai/functions.js.map +1 -0
  384. package/dist/generators/genai/index.d.ts +8 -0
  385. package/dist/generators/genai/index.js +11 -0
  386. package/dist/generators/genai/index.js.map +1 -0
  387. package/dist/generators/genai/patterns.d.ts +9 -0
  388. package/dist/generators/genai/patterns.js +309 -0
  389. package/dist/generators/genai/patterns.js.map +1 -0
  390. package/dist/generators/infrastructure/azure.d.ts +18 -0
  391. package/dist/generators/infrastructure/azure.js +655 -0
  392. package/dist/generators/infrastructure/azure.js.map +1 -0
  393. package/dist/generators/infrastructure/names.d.ts +23 -0
  394. package/dist/generators/infrastructure/names.js +51 -0
  395. package/dist/generators/infrastructure/names.js.map +1 -0
  396. package/dist/generators/standard/configuration.d.ts +3 -0
  397. package/dist/generators/standard/configuration.js +26 -0
  398. package/dist/generators/standard/configuration.js.map +1 -0
  399. package/dist/generators/standard/go.d.ts +17 -0
  400. package/dist/generators/standard/go.js +338 -0
  401. package/dist/generators/standard/go.js.map +1 -0
  402. package/dist/generators/standard/index.d.ts +12 -0
  403. package/dist/generators/standard/index.js +12 -0
  404. package/dist/generators/standard/index.js.map +1 -0
  405. package/dist/generators/standard/node.d.ts +20 -0
  406. package/dist/generators/standard/node.js +314 -0
  407. package/dist/generators/standard/node.js.map +1 -0
  408. package/dist/generators/standard/python.d.ts +18 -0
  409. package/dist/generators/standard/python.js +191 -0
  410. package/dist/generators/standard/python.js.map +1 -0
  411. package/dist/go-template-assets.js +3 -3
  412. package/dist/go-template-assets.js.map +1 -1
  413. package/dist/governance-activation/activation-state.d.ts +1 -1
  414. package/dist/governance-activation/activation-state.js +49 -9
  415. package/dist/governance-activation/activation-state.js.map +1 -1
  416. package/dist/governance-activation/approvals.d.ts +1 -188
  417. package/dist/governance-activation/approvals.js +1 -507
  418. package/dist/governance-activation/approvals.js.map +1 -1
  419. package/dist/governance-activation/canonical-json.d.ts +1 -3
  420. package/dist/governance-activation/canonical-json.js +1 -35
  421. package/dist/governance-activation/canonical-json.js.map +1 -1
  422. package/dist/governance-activation/commands.d.ts +6 -1
  423. package/dist/governance-activation/commands.js +135 -107
  424. package/dist/governance-activation/commands.js.map +1 -1
  425. package/dist/governance-activation/compatibility.d.ts +30 -5
  426. package/dist/governance-activation/compatibility.js +74 -8
  427. package/dist/governance-activation/compatibility.js.map +1 -1
  428. package/dist/governance-activation/credentials.d.ts +3 -3
  429. package/dist/governance-activation/credentials.js +5 -5
  430. package/dist/governance-activation/credentials.js.map +1 -1
  431. package/dist/governance-activation/doctor.d.ts +1 -1
  432. package/dist/governance-activation/doctor.js +59 -100
  433. package/dist/governance-activation/doctor.js.map +1 -1
  434. package/dist/governance-activation/evidence.d.ts +1 -49
  435. package/dist/governance-activation/evidence.js +1 -245
  436. package/dist/governance-activation/evidence.js.map +1 -1
  437. package/dist/governance-activation/git-ignore.d.ts +9 -0
  438. package/dist/governance-activation/git-ignore.js +76 -0
  439. package/dist/governance-activation/git-ignore.js.map +1 -0
  440. package/dist/governance-activation/graph.d.ts +1 -397
  441. package/dist/governance-activation/graph.js +1 -440
  442. package/dist/governance-activation/graph.js.map +1 -1
  443. package/dist/governance-activation/historical-state.d.ts +81 -0
  444. package/dist/governance-activation/historical-state.js +817 -0
  445. package/dist/governance-activation/historical-state.js.map +1 -0
  446. package/dist/governance-activation/history-contracts.d.ts +109 -0
  447. package/dist/governance-activation/history-contracts.js +303 -0
  448. package/dist/governance-activation/history-contracts.js.map +1 -0
  449. package/dist/governance-activation/identity.d.ts +1 -35
  450. package/dist/governance-activation/identity.js +1 -88
  451. package/dist/governance-activation/identity.js.map +1 -1
  452. package/dist/governance-activation/index.d.ts +3 -0
  453. package/dist/governance-activation/index.js +3 -0
  454. package/dist/governance-activation/index.js.map +1 -1
  455. package/dist/governance-activation/inputs.d.ts +10 -0
  456. package/dist/governance-activation/inputs.js +158 -0
  457. package/dist/governance-activation/inputs.js.map +1 -0
  458. package/dist/governance-activation/migration-history.d.ts +97 -0
  459. package/dist/governance-activation/migration-history.js +388 -0
  460. package/dist/governance-activation/migration-history.js.map +1 -0
  461. package/dist/governance-activation/migration.d.ts +4 -3
  462. package/dist/governance-activation/migration.js +14 -6
  463. package/dist/governance-activation/migration.js.map +1 -1
  464. package/dist/governance-activation/phase-bootstrap-state.d.ts +3 -0
  465. package/dist/governance-activation/phase-bootstrap-state.js +128 -0
  466. package/dist/governance-activation/phase-bootstrap-state.js.map +1 -0
  467. package/dist/governance-activation/phase-discovery.d.ts +2 -0
  468. package/dist/governance-activation/phase-discovery.js +88 -0
  469. package/dist/governance-activation/phase-discovery.js.map +1 -0
  470. package/dist/governance-activation/phase-governance.d.ts +4 -0
  471. package/dist/governance-activation/phase-governance.js +141 -0
  472. package/dist/governance-activation/phase-governance.js.map +1 -0
  473. package/dist/governance-activation/phase-publication.d.ts +8 -0
  474. package/dist/governance-activation/phase-publication.js +318 -0
  475. package/dist/governance-activation/phase-publication.js.map +1 -0
  476. package/dist/governance-activation/proof-records.d.ts +3 -0
  477. package/dist/governance-activation/proof-records.js +78 -0
  478. package/dist/governance-activation/proof-records.js.map +1 -0
  479. package/dist/governance-activation/read-only.d.ts +30 -0
  480. package/dist/governance-activation/read-only.js +33 -0
  481. package/dist/governance-activation/read-only.js.map +1 -0
  482. package/dist/governance-activation/readiness.d.ts +1 -25
  483. package/dist/governance-activation/readiness.js +1 -222
  484. package/dist/governance-activation/readiness.js.map +1 -1
  485. package/dist/governance-activation/reconciliation.d.ts +1 -1
  486. package/dist/governance-activation/reconciliation.js +3 -3
  487. package/dist/governance-activation/reconciliation.js.map +1 -1
  488. package/dist/governance-activation/release-integrity.d.ts +1 -1
  489. package/dist/governance-activation/release-integrity.js +2 -2
  490. package/dist/governance-activation/release-integrity.js.map +1 -1
  491. package/dist/governance-activation/seed-lifecycle.d.ts +36 -6
  492. package/dist/governance-activation/seed-lifecycle.js +444 -77
  493. package/dist/governance-activation/seed-lifecycle.js.map +1 -1
  494. package/dist/governance-activation/source-of-truth.d.ts +5 -3
  495. package/dist/governance-activation/source-of-truth.js +32 -52
  496. package/dist/governance-activation/source-of-truth.js.map +1 -1
  497. package/dist/governance-activation/spec-kit-seed.d.ts +9 -0
  498. package/dist/governance-activation/spec-kit-seed.js +43 -0
  499. package/dist/governance-activation/spec-kit-seed.js.map +1 -0
  500. package/dist/governance-activation/task-projection.d.ts +1 -1
  501. package/dist/governance-activation/transition-planning.d.ts +17 -0
  502. package/dist/governance-activation/transition-planning.js +259 -0
  503. package/dist/governance-activation/transition-planning.js.map +1 -0
  504. package/dist/governance-activation/transition-ports.d.ts +150 -0
  505. package/dist/governance-activation/transition-ports.js +2 -0
  506. package/dist/governance-activation/transition-ports.js.map +1 -0
  507. package/dist/governance-activation/transition-process.d.ts +7 -0
  508. package/dist/governance-activation/transition-process.js +21 -0
  509. package/dist/governance-activation/transition-process.js.map +1 -0
  510. package/dist/governance-activation/transition-records.d.ts +56 -0
  511. package/dist/governance-activation/transition-records.js +208 -0
  512. package/dist/governance-activation/transition-records.js.map +1 -0
  513. package/dist/governance-activation/transitions.d.ts +14 -167
  514. package/dist/governance-activation/transitions.js +173 -2061
  515. package/dist/governance-activation/transitions.js.map +1 -1
  516. package/dist/governance-activation/types.d.ts +1 -390
  517. package/dist/governance-activation/types.js +1 -107
  518. package/dist/governance-activation/types.js.map +1 -1
  519. package/dist/governance-activation/validators.d.ts +1 -17
  520. package/dist/governance-activation/validators.js +1 -1304
  521. package/dist/governance-activation/validators.js.map +1 -1
  522. package/dist/governance-assessment/catalog.d.ts +1 -2
  523. package/dist/governance-assessment/catalog.js +18 -85
  524. package/dist/governance-assessment/catalog.js.map +1 -1
  525. package/dist/governance-assessment/command.d.ts +1 -1
  526. package/dist/governance-assessment/command.js +8 -12
  527. package/dist/governance-assessment/command.js.map +1 -1
  528. package/dist/governance-assessment/engine.d.ts +6 -11
  529. package/dist/governance-assessment/engine.js +490 -114
  530. package/dist/governance-assessment/engine.js.map +1 -1
  531. package/dist/governance-assessment/live-normalize.d.ts +1 -19
  532. package/dist/governance-assessment/live-normalize.js +1 -402
  533. package/dist/governance-assessment/live-normalize.js.map +1 -1
  534. package/dist/governance-assessment/live-transport.d.ts +2 -6
  535. package/dist/governance-assessment/live-transport.js +10 -22
  536. package/dist/governance-assessment/live-transport.js.map +1 -1
  537. package/dist/governance-assessment/live.js +55 -5
  538. package/dist/governance-assessment/live.js.map +1 -1
  539. package/dist/governance-assessment/predicates.d.ts +1 -27
  540. package/dist/governance-assessment/predicates.js +1 -329
  541. package/dist/governance-assessment/predicates.js.map +1 -1
  542. package/dist/governance-assessment/project.d.ts +20 -17
  543. package/dist/governance-assessment/project.js +101 -151
  544. package/dist/governance-assessment/project.js.map +1 -1
  545. package/dist/governance-assessment/readers.d.ts +1 -5
  546. package/dist/governance-assessment/readers.js +5 -13
  547. package/dist/governance-assessment/readers.js.map +1 -1
  548. package/dist/governance-assessment/report.d.ts +1 -23
  549. package/dist/governance-assessment/report.js +1 -265
  550. package/dist/governance-assessment/report.js.map +1 -1
  551. package/dist/governance-assessment/sanitize.d.ts +1 -8
  552. package/dist/governance-assessment/sanitize.js +1 -56
  553. package/dist/governance-assessment/sanitize.js.map +1 -1
  554. package/dist/governance-assessment/types.d.ts +1 -173
  555. package/dist/governance-assessment/types.js +1 -12
  556. package/dist/governance-assessment/types.js.map +1 -1
  557. package/dist/governance-assessment/yaml.d.ts +1 -6
  558. package/dist/governance-assessment/yaml.js +1 -29
  559. package/dist/governance-assessment/yaml.js.map +1 -1
  560. package/dist/init-filesystem.d.ts +1 -1
  561. package/dist/init-filesystem.js +126 -174
  562. package/dist/init-filesystem.js.map +1 -1
  563. package/dist/interactive.d.ts +2 -2
  564. package/dist/interactive.js +42 -41
  565. package/dist/interactive.js.map +1 -1
  566. package/dist/migrate-plan.d.ts +1 -1
  567. package/dist/migrate-plan.js +14 -8
  568. package/dist/migrate-plan.js.map +1 -1
  569. package/dist/npm-template-assets.js +5 -4
  570. package/dist/npm-template-assets.js.map +1 -1
  571. package/dist/openspec-profile.d.ts +1 -1
  572. package/dist/opentofu-template-assets.js +3 -3
  573. package/dist/opentofu-template-assets.js.map +1 -1
  574. package/dist/package-identity.d.ts +3 -0
  575. package/dist/package-identity.js +13 -2
  576. package/dist/package-identity.js.map +1 -1
  577. package/dist/planner.d.ts +1 -19
  578. package/dist/planner.js +1 -565
  579. package/dist/planner.js.map +1 -1
  580. package/dist/process-runner.d.ts +1 -1
  581. package/dist/project-dependencies.d.ts +5 -3
  582. package/dist/project-dependencies.js +74 -63
  583. package/dist/project-dependencies.js.map +1 -1
  584. package/dist/published-verifier.js +61 -30
  585. package/dist/published-verifier.js.map +1 -1
  586. package/dist/python-template-assets.js +6 -9
  587. package/dist/python-template-assets.js.map +1 -1
  588. package/dist/reconcile.d.ts +1 -1
  589. package/dist/reconcile.js +2 -2
  590. package/dist/reconcile.js.map +1 -1
  591. package/dist/repository-governance.d.ts +5 -2
  592. package/dist/repository-governance.js +140 -113
  593. package/dist/repository-governance.js.map +1 -1
  594. package/dist/runtime.js +1 -1
  595. package/dist/runtime.js.map +1 -1
  596. package/dist/scan.d.ts +6 -2
  597. package/dist/scan.js +78 -30
  598. package/dist/scan.js.map +1 -1
  599. package/dist/self-upgrade.d.ts +1 -1
  600. package/dist/self-upgrade.js +20 -7
  601. package/dist/self-upgrade.js.map +1 -1
  602. package/dist/stable-release.js +7 -1
  603. package/dist/stable-release.js.map +1 -1
  604. package/dist/standard-templates.d.ts +2 -2
  605. package/dist/standard-templates.js +6 -841
  606. package/dist/standard-templates.js.map +1 -1
  607. package/dist/supported-stack.d.ts +3 -115
  608. package/dist/supported-stack.js +4 -438
  609. package/dist/supported-stack.js.map +1 -1
  610. package/dist/telemetry/index.d.ts +1 -1
  611. package/dist/templates.d.ts +10 -20
  612. package/dist/templates.js +52 -3261
  613. package/dist/templates.js.map +1 -1
  614. package/dist/types.d.ts +1 -263
  615. package/dist/types.js +1 -1
  616. package/dist/types.js.map +1 -1
  617. package/dist/version.js +2 -6
  618. package/dist/version.js.map +1 -1
  619. package/dist/workstation-catalog.d.ts +5 -2
  620. package/dist/workstation-catalog.js +33 -2
  621. package/dist/workstation-catalog.js.map +1 -1
  622. package/dist/workstation.d.ts +4 -3
  623. package/dist/workstation.js +86 -32
  624. package/dist/workstation.js.map +1 -1
  625. package/docs/assets/liftoff-terminal.svg +3 -3
  626. package/docs/azure-deployment.md +107 -10
  627. package/docs/cli-reference.md +144 -35
  628. package/docs/configuration-and-manifests.md +152 -35
  629. package/docs/existing-repositories.md +48 -12
  630. package/docs/getting-started.md +44 -31
  631. package/docs/prerequisites.md +34 -35
  632. package/docs/project-structure.md +39 -46
  633. package/docs/repository-governance.md +96 -26
  634. package/docs/safety-and-consent.md +90 -28
  635. package/docs/spec-workflows-and-agents.md +31 -28
  636. package/docs/supported-stack.md +11 -9
  637. package/docs/troubleshooting.md +114 -54
  638. package/docs/workloads.md +52 -67
  639. package/package.json +4 -7
  640. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/UPSTREAM_LICENSE.txt +0 -21
  641. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/catalog.json +0 -520
  642. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/packaged/gitignore +0 -27
  643. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/README.md +0 -25
  644. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/components.json +0 -22
  645. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/eslint.config.js +0 -23
  646. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/index.html +0 -13
  647. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/package-lock.json +0 -6156
  648. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/package.json +0 -60
  649. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/public/power-apps.svg +0 -55
  650. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/App.tsx +0 -17
  651. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/assets/react.svg +0 -1
  652. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/mode-toggle.tsx +0 -37
  653. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/badge.tsx +0 -46
  654. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/button.tsx +0 -60
  655. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/calendar.tsx +0 -211
  656. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/card.tsx +0 -92
  657. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/chart.tsx +0 -355
  658. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/checkbox.tsx +0 -32
  659. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/command.tsx +0 -184
  660. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/dialog.tsx +0 -141
  661. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/dropdown-menu.tsx +0 -257
  662. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/input.tsx +0 -21
  663. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/label.tsx +0 -22
  664. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/popover.tsx +0 -46
  665. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/progress.tsx +0 -29
  666. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/select.tsx +0 -185
  667. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/separator.tsx +0 -26
  668. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/skeleton.tsx +0 -13
  669. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/table.tsx +0 -114
  670. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/tabs.tsx +0 -66
  671. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/textarea.tsx +0 -18
  672. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/tooltip.tsx +0 -61
  673. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/hooks/use-theme.ts +0 -11
  674. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/index.css +0 -131
  675. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/lib/utils.ts +0 -6
  676. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/main.tsx +0 -10
  677. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/pages/_layout.tsx +0 -31
  678. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/pages/home.tsx +0 -59
  679. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/pages/not-found.tsx +0 -14
  680. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/providers/query-provider.tsx +0 -26
  681. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/providers/sonner-provider.tsx +0 -23
  682. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/providers/theme-provider.tsx +0 -64
  683. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/router.tsx +0 -24
  684. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/tsconfig.app.json +0 -34
  685. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/tsconfig.json +0 -13
  686. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/tsconfig.node.json +0 -26
  687. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/vite.config.ts +0 -19
  688. package/assets/power-apps-code-app/README.md +0 -27
  689. package/dist/code-apps-plugin.d.ts +0 -13
  690. package/dist/code-apps-plugin.js +0 -69
  691. package/dist/code-apps-plugin.js.map +0 -1
  692. package/dist/power-apps-assets.d.ts +0 -30
  693. package/dist/power-apps-assets.js +0 -131
  694. package/dist/power-apps-assets.js.map +0 -1
  695. package/dist/power-apps-templates.d.ts +0 -3
  696. package/dist/power-apps-templates.js +0 -177
  697. package/dist/power-apps-templates.js.map +0 -1
  698. package/dist/power-apps-validation.d.ts +0 -1
  699. package/dist/power-apps-validation.js +0 -79
  700. package/dist/power-apps-validation.js.map +0 -1
@@ -0,0 +1,43 @@
1
+ import { DEFAULT_FUNCTION_WORKER_QUEUE_NAME } from '../common/values.js';
2
+ import { genAiPattern } from '../common/values.js';
3
+ export function renderBackendEnv(plan, environment) {
4
+ const pattern = genAiPattern(plan);
5
+ const transport = environment === 'dev' ? 'redis-streams' : 'azure-service-bus';
6
+ return `APP_ENV=${environment}
7
+ APP_NAME=${plan.safeProjectName}
8
+ GENAI_PATTERN=${pattern.id}
9
+ CLOUD_PROVIDER=${plan.provider.id}
10
+ AZURE_REGION=${plan.region.slug}
11
+ DATABASE_URL=postgresql+asyncpg://postgres:postgres@postgres:5432/${plan.safeProjectName.replace(/-/g, '_')}
12
+ REDIS_URL=redis://redis:6379/0
13
+ REDIS_STREAM_NAME=liftoff-events
14
+ MESSAGING_TRANSPORT=${transport}
15
+ SERVICE_BUS_QUEUE_NAME=${DEFAULT_FUNCTION_WORKER_QUEUE_NAME}
16
+ SERVICE_BUS_AUTH_MODE=managed-identity
17
+ SERVICE_BUS_CONNECTION_STRING=
18
+ SERVICE_BUS_FULLY_QUALIFIED_NAMESPACE=
19
+ AZURE_CLIENT_ID=
20
+ BLOB_ENDPOINT=
21
+ CORS_ALLOWED_ORIGINS=http://localhost:5173
22
+ PYDANTIC_AI_MODEL=
23
+ OPENAI_API_KEY=
24
+ OPENAI_BASE_URL=https://api.openai.com/v1
25
+ LANGFUSE_HOST=${environment === 'dev' ? 'http://langfuse:3000' : ''}
26
+ LANGFUSE_PUBLIC_KEY=
27
+ LANGFUSE_SECRET_KEY=
28
+ `;
29
+ }
30
+ export function renderFunctionsEnv(plan, environment) {
31
+ const pattern = genAiPattern(plan);
32
+ return `APP_ENV=${environment}
33
+ APP_NAME=${plan.safeProjectName}
34
+ GENAI_PATTERN=${pattern.id}
35
+ FUNCTIONS_WORKER_RUNTIME=python
36
+ SERVICEBUS_QUEUE_NAME=${DEFAULT_FUNCTION_WORKER_QUEUE_NAME}
37
+ ServiceBusConnection__fullyQualifiedNamespace=<service-bus-namespace>.servicebus.windows.net
38
+ ServiceBusConnection__clientId=<managed-identity-client-id>
39
+ AzureWebJobsStorage=<storage-connection-string>
40
+ SHARED_ORCHESTRATION_ROOT=../../backend
41
+ `;
42
+ }
43
+ //# sourceMappingURL=configuration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configuration.js","sourceRoot":"","sources":["../../../src/generators/genai/configuration.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kCAAkC,EAAE,MAAM,qBAAqB,CAAC;AACzE,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGnD,MAAM,UAAU,gBAAgB,CAAC,IAAsB,EAAE,WAAmB;IAC1E,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,SAAS,GAAG,WAAW,KAAK,KAAK,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,mBAAmB,CAAC;IAChF,OAAO,WAAW,WAAW;WACpB,IAAI,CAAC,eAAe;gBACf,OAAO,CAAC,EAAE;iBACT,IAAI,CAAC,QAAQ,CAAC,EAAE;eAClB,IAAI,CAAC,MAAM,CAAC,IAAI;oEACqC,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;;;sBAGrF,SAAS;yBACN,kCAAkC;;;;;;;;;;gBAU3C,WAAW,KAAK,KAAK,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,EAAE;;;CAGlE,CAAC;AACF,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAsB,EAAE,WAAmB;IAC5E,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACnC,OAAO,WAAW,WAAW;WACpB,IAAI,CAAC,eAAe;gBACf,OAAO,CAAC,EAAE;;wBAEF,kCAAkC;;;;;CAKzD,CAAC;AACF,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { AddArtifact } from '../../template-types.js';
2
+ import type { GenAiProjectPlan } from '../../domain/project/contracts.js';
3
+ export declare function addDatabaseArtifacts(add: AddArtifact, plan: GenAiProjectPlan): void;
4
+ export declare function renderAlembicIni(): string;
5
+ export declare function renderAlembicEnv(): string;
6
+ export declare function renderInitialMigration(plan: GenAiProjectPlan): string;
7
+ export declare function renderDatabaseSchema(plan: GenAiProjectPlan): string;
@@ -0,0 +1,71 @@
1
+ import { genAiPattern } from '../common/values.js';
2
+ export function addDatabaseArtifacts(add, plan) {
3
+ add('database-alembic-ini', 'database', ['database', 'alembic.ini'], renderAlembicIni());
4
+ add('database-alembic-env', 'database', ['database', 'migrations', 'env.py'], renderAlembicEnv());
5
+ add('database-initial-migration', 'database', ['database', 'migrations', 'versions', '0001_initial.py'], renderInitialMigration(plan));
6
+ add('database-schema', 'database', ['database', 'models', 'schema.sql'], renderDatabaseSchema(plan));
7
+ }
8
+ export function renderAlembicIni() {
9
+ return `[alembic]
10
+ script_location = %(here)s/migrations
11
+ sqlalchemy.url = driver://user:pass@localhost/dbname
12
+ `;
13
+ }
14
+ export function renderAlembicEnv() {
15
+ return `from alembic import context
16
+ from sqlalchemy import create_engine
17
+
18
+ from backend.config.settings import get_settings
19
+
20
+
21
+ def run_migrations_online():
22
+ database_url = get_settings().database_url
23
+ if not database_url:
24
+ raise RuntimeError("DATABASE_URL is required to run migrations")
25
+ database_url = database_url.replace("postgresql+asyncpg://", "postgresql+psycopg://", 1)
26
+ database_url = database_url.replace("postgresql://", "postgresql+psycopg://", 1)
27
+ connectable = create_engine(database_url)
28
+ with connectable.connect() as connection:
29
+ context.configure(connection=connection, target_metadata=None)
30
+ with context.begin_transaction():
31
+ context.run_migrations()
32
+
33
+
34
+ run_migrations_online()
35
+ `;
36
+ }
37
+ export function renderInitialMigration(plan) {
38
+ const vectorExtension = genAiPattern(plan).id === 'rag' ? ' op.execute("CREATE EXTENSION IF NOT EXISTS vector")\n' : '';
39
+ return `from alembic import op
40
+ import sqlalchemy as sa
41
+
42
+ revision = "0001_initial"
43
+ down_revision = None
44
+ branch_labels = None
45
+ depends_on = None
46
+
47
+
48
+ def upgrade():
49
+ ${vectorExtension} op.create_table(
50
+ "events",
51
+ sa.Column("id", sa.Integer(), primary_key=True),
52
+ sa.Column("event_type", sa.String(length=120), nullable=False),
53
+ sa.Column("payload", sa.JSON(), nullable=False),
54
+ sa.Column("created_at", sa.DateTime(), server_default=sa.func.now(), nullable=False),
55
+ )
56
+
57
+
58
+ def downgrade():
59
+ op.drop_table("events")
60
+ `;
61
+ }
62
+ export function renderDatabaseSchema(plan) {
63
+ return `CREATE TABLE IF NOT EXISTS events (
64
+ id SERIAL PRIMARY KEY,
65
+ event_type VARCHAR(120) NOT NULL,
66
+ payload JSONB NOT NULL,
67
+ created_at TIMESTAMPTZ NOT NULL DEFAULT now()
68
+ );
69
+ ${genAiPattern(plan).id === 'rag' ? '\nCREATE EXTENSION IF NOT EXISTS vector;\n' : ''}`;
70
+ }
71
+ //# sourceMappingURL=database.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database.js","sourceRoot":"","sources":["../../../src/generators/genai/database.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGnD,MAAM,UAAU,oBAAoB,CAAC,GAAgB,EAAE,IAAsB;IAC3E,GAAG,CAAC,sBAAsB,EAAE,UAAU,EAAE,CAAC,UAAU,EAAE,aAAa,CAAC,EAAE,gBAAgB,EAAE,CAAC,CAAC;IACzF,GAAG,CAAC,sBAAsB,EAAE,UAAU,EAAE,CAAC,UAAU,EAAE,YAAY,EAAE,QAAQ,CAAC,EAAE,gBAAgB,EAAE,CAAC,CAAC;IAClG,GAAG,CAAC,4BAA4B,EAAE,UAAU,EAAE,CAAC,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,iBAAiB,CAAC,EAAE,sBAAsB,CAAC,IAAI,CAAC,CAAC,CAAC;IACvI,GAAG,CAAC,iBAAiB,EAAE,UAAU,EAAE,CAAC,UAAU,EAAE,QAAQ,EAAE,YAAY,CAAC,EAAE,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC;AACvG,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,OAAO;;;CAGR,CAAC;AACF,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,OAAO;;;;;;;;;;;;;;;;;;;;CAoBR,CAAC;AACF,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,IAAsB;IAC3D,MAAM,eAAe,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,2DAA2D,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3H,OAAO;;;;;;;;;;EAUP,eAAe;;;;;;;;;;;CAWhB,CAAC;AACF,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,IAAsB;IACzD,OAAO;;;;;;EAMP,YAAY,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,4CAA4C,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;AACxF,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { GeneratorContext as ResolvedGeneratorContext } from '../context.js';
2
+ type GeneratorContext = Pick<ResolvedGeneratorContext, 'functionsRequirements'>;
3
+ import type { AddArtifact } from '../../template-types.js';
4
+ import type { GenAiProjectPlan } from '../../domain/project/contracts.js';
5
+ export declare function addFunctionArtifacts(add: AddArtifact, plan: GenAiProjectPlan, context: GeneratorContext): void;
6
+ export declare function renderFunctionsReadme(): string;
7
+ export declare function renderFunctionWorkerReadme(plan: GenAiProjectPlan): string;
8
+ export declare function renderFunctionHostJson(): string;
9
+ export declare function renderFunctionLocalSettings(plan: GenAiProjectPlan): string;
10
+ export declare function renderFunctionRequirements(context: GeneratorContext): string;
11
+ export declare function renderFunctionApp(plan: GenAiProjectPlan): string;
12
+ export declare function renderFunctionTest(): string;
13
+ export declare function renderFunctionFuncIgnore(): string;
14
+ export declare function renderFunctionGitIgnore(): string;
15
+ export {};
@@ -0,0 +1,156 @@
1
+ import { DEFAULT_FUNCTION_WORKER_QUEUE_NAME } from '../common/values.js';
2
+ import { functionWorkerName } from '../common/values.js';
3
+ import { genAiPattern } from '../common/values.js';
4
+ import { hasFunctionWorker } from '../common/values.js';
5
+ import { pyModule } from '../common/values.js';
6
+ export function addFunctionArtifacts(add, plan, context) {
7
+ if (!hasFunctionWorker(plan)) {
8
+ return;
9
+ }
10
+ const workerName = functionWorkerName(plan);
11
+ const workerBase = ['functions', workerName];
12
+ add('functions-readme', 'functions', ['functions', 'README.md'], renderFunctionsReadme());
13
+ add('function-worker-readme', 'functions', [...workerBase, 'README.md'], renderFunctionWorkerReadme(plan));
14
+ add('function-worker-host', 'functions', [...workerBase, 'host.json'], renderFunctionHostJson());
15
+ add('function-worker-local-settings', 'functions', [...workerBase, 'local.settings.example.json'], renderFunctionLocalSettings(plan));
16
+ add('function-worker-requirements', 'functions', [...workerBase, 'requirements.txt'], renderFunctionRequirements(context));
17
+ add('function-worker-app', 'functions', [...workerBase, 'function_app.py'], renderFunctionApp(plan));
18
+ add('function-worker-test', 'functions-test', [...workerBase, 'tests', 'test_function_app.py'], renderFunctionTest());
19
+ add('function-worker-funcignore', 'functions', [...workerBase, '.funcignore'], renderFunctionFuncIgnore());
20
+ add('function-worker-gitignore', 'functions', [...workerBase, '.gitignore'], renderFunctionGitIgnore());
21
+ }
22
+ export function renderFunctionsReadme() {
23
+ return `# Azure Functions Workers
24
+
25
+ Azure Functions trigger adapters live under \`functions/<worker-name>\`.
26
+
27
+ Keep reusable GenAI orchestration, model configuration, prompt handling, and domain logic under \`backend/orchestration\`. Use \`backend/workers\` for backend-adjacent or containerized workers; use this folder for Azure Functions runtime files such as \`host.json\`, trigger bindings, local settings, and Function app tests.
28
+ `;
29
+ }
30
+ export function renderFunctionWorkerReadme(plan) {
31
+ const workerName = functionWorkerName(plan);
32
+ const pattern = genAiPattern(plan);
33
+ return `# ${workerName}
34
+
35
+ Azure Functions worker scaffold for ${pattern.label}.
36
+
37
+ This Function app uses the Python v2 decorator programming model and a Service Bus queue trigger. The trigger adapter should stay thin: decode the message, validate the envelope, and call shared code from \`backend/orchestration\` after that shared code is packaged with the Function app.
38
+
39
+ The generated trigger currently decodes and logs message keys, then returns. It does not index documents,
40
+ invoke orchestration, or execute workflow stages. A successfully published message is not proof of
41
+ completed processing; implement and test a real consumer before using this scaffold for production work.
42
+
43
+ Deployed triggers use \`ServiceBusConnection__fullyQualifiedNamespace\` and \`ServiceBusConnection__clientId\` to select the same user-assigned identity that OpenTofu grants the Service Bus Data Receiver role. \`SERVICEBUS_QUEUE_NAME\` is populated from \`function_worker_queue_name\`. Function host storage uses the complete \`AzureWebJobsStorage\` connection setting.
44
+
45
+ ## Local Development
46
+
47
+ \`\`\`bash
48
+ uv sync --frozen --project ../../backend --extra test --extra functions
49
+ cp local.settings.example.json local.settings.json
50
+ uv run --project ../../backend --directory . python -m pytest -q
51
+ func start
52
+ \`\`\`
53
+ `;
54
+ }
55
+ export function renderFunctionHostJson() {
56
+ return JSON.stringify({
57
+ version: '2.0',
58
+ extensionBundle: {
59
+ id: 'Microsoft.Azure.Functions.ExtensionBundle',
60
+ version: '[4.*, 5.0.0)'
61
+ }
62
+ }, null, 2);
63
+ }
64
+ export function renderFunctionLocalSettings(plan) {
65
+ const pattern = genAiPattern(plan);
66
+ return JSON.stringify({
67
+ IsEncrypted: false,
68
+ Values: {
69
+ AzureWebJobsStorage: 'UseDevelopmentStorage=true',
70
+ FUNCTIONS_WORKER_RUNTIME: 'python',
71
+ SERVICEBUS_QUEUE_NAME: DEFAULT_FUNCTION_WORKER_QUEUE_NAME,
72
+ ServiceBusConnection__fullyQualifiedNamespace: '<service-bus-namespace>.servicebus.windows.net',
73
+ GENAI_PATTERN: pattern.id,
74
+ SHARED_ORCHESTRATION_ROOT: '../../backend'
75
+ }
76
+ }, null, 2);
77
+ }
78
+ export function renderFunctionRequirements(context) {
79
+ return context.functionsRequirements;
80
+ }
81
+ export function renderFunctionApp(plan) {
82
+ const pattern = genAiPattern(plan);
83
+ const moduleName = pyModule(pattern.id);
84
+ return `import json
85
+ import logging
86
+
87
+ import azure.functions as func
88
+
89
+
90
+ app = func.FunctionApp()
91
+
92
+
93
+ def decode_message_payload(body: str) -> dict:
94
+ try:
95
+ value = json.loads(body)
96
+ except json.JSONDecodeError:
97
+ return {"raw": body}
98
+ if isinstance(value, dict):
99
+ return value
100
+ return {"value": value}
101
+
102
+
103
+ @app.service_bus_queue_trigger(
104
+ arg_name="message",
105
+ queue_name="%SERVICEBUS_QUEUE_NAME%",
106
+ connection="ServiceBusConnection",
107
+ )
108
+ def process_${moduleName}_work(message: func.ServiceBusMessage) -> None:
109
+ payload = decode_message_payload(message.get_body().decode("utf-8"))
110
+ logging.info("Received ${pattern.id} worker message with keys: %s", sorted(payload.keys()))
111
+ # Keep this adapter thin; call backend.orchestration code from packaged shared modules.
112
+ `;
113
+ }
114
+ export function renderFunctionTest() {
115
+ return `from function_app import decode_message_payload
116
+
117
+
118
+ def test_decode_message_payload_for_json_object():
119
+ assert decode_message_payload('{"source_uri":"az://documents/example.pdf"}') == {
120
+ "source_uri": "az://documents/example.pdf"
121
+ }
122
+
123
+
124
+ def test_decode_message_payload_for_plain_text():
125
+ assert decode_message_payload("plain text") == {"raw": "plain text"}
126
+ `;
127
+ }
128
+ export function renderFunctionFuncIgnore() {
129
+ return `.venv/
130
+ node_modules/
131
+ dist/
132
+ build/
133
+ .git/
134
+ .liftoff/
135
+ .terraform/
136
+ __pycache__/
137
+ .pytest_cache/
138
+ .env
139
+ .env.*
140
+ *.env
141
+ *.pem
142
+ *.key
143
+ *.pfx
144
+ *.tfstate*
145
+ local.settings.json
146
+ tests/
147
+ `;
148
+ }
149
+ export function renderFunctionGitIgnore() {
150
+ return `.venv/
151
+ __pycache__/
152
+ .pytest_cache/
153
+ local.settings.json
154
+ `;
155
+ }
156
+ //# sourceMappingURL=functions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"functions.js","sourceRoot":"","sources":["../../../src/generators/genai/functions.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,kCAAkC,EAAE,MAAM,qBAAqB,CAAC;AACzE,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAG/C,MAAM,UAAU,oBAAoB,CAAC,GAAgB,EAAE,IAAsB,EAAE,OAAyB;IACtG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7B,OAAO;IACT,CAAC;IAED,MAAM,UAAU,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAC5C,MAAM,UAAU,GAAG,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;IAC7C,GAAG,CAAC,kBAAkB,EAAE,WAAW,EAAE,CAAC,WAAW,EAAE,WAAW,CAAC,EAAE,qBAAqB,EAAE,CAAC,CAAC;IAC1F,GAAG,CAAC,wBAAwB,EAAE,WAAW,EAAE,CAAC,GAAG,UAAU,EAAE,WAAW,CAAC,EAAE,0BAA0B,CAAC,IAAI,CAAC,CAAC,CAAC;IAC3G,GAAG,CAAC,sBAAsB,EAAE,WAAW,EAAE,CAAC,GAAG,UAAU,EAAE,WAAW,CAAC,EAAE,sBAAsB,EAAE,CAAC,CAAC;IACjG,GAAG,CAAC,gCAAgC,EAAE,WAAW,EAAE,CAAC,GAAG,UAAU,EAAE,6BAA6B,CAAC,EAAE,2BAA2B,CAAC,IAAI,CAAC,CAAC,CAAC;IACtI,GAAG,CAAC,8BAA8B,EAAE,WAAW,EAAE,CAAC,GAAG,UAAU,EAAE,kBAAkB,CAAC,EAAE,0BAA0B,CAAC,OAAO,CAAC,CAAC,CAAC;IAC3H,GAAG,CAAC,qBAAqB,EAAE,WAAW,EAAE,CAAC,GAAG,UAAU,EAAE,iBAAiB,CAAC,EAAE,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC;IACrG,GAAG,CAAC,sBAAsB,EAAE,gBAAgB,EAAE,CAAC,GAAG,UAAU,EAAE,OAAO,EAAE,sBAAsB,CAAC,EAAE,kBAAkB,EAAE,CAAC,CAAC;IACtH,GAAG,CAAC,4BAA4B,EAAE,WAAW,EAAE,CAAC,GAAG,UAAU,EAAE,aAAa,CAAC,EAAE,wBAAwB,EAAE,CAAC,CAAC;IAC3G,GAAG,CAAC,2BAA2B,EAAE,WAAW,EAAE,CAAC,GAAG,UAAU,EAAE,YAAY,CAAC,EAAE,uBAAuB,EAAE,CAAC,CAAC;AAC1G,CAAC;AAED,MAAM,UAAU,qBAAqB;IACnC,OAAO;;;;;CAKR,CAAC;AACF,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,IAAsB;IAC/D,MAAM,UAAU,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAC5C,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACnC,OAAO,KAAK,UAAU;;sCAEc,OAAO,CAAC,KAAK;;;;;;;;;;;;;;;;;;CAkBlD,CAAC;AACF,CAAC;AAED,MAAM,UAAU,sBAAsB;IACpC,OAAO,IAAI,CAAC,SAAS,CAAC;QACpB,OAAO,EAAE,KAAK;QACd,eAAe,EAAE;YACf,EAAE,EAAE,2CAA2C;YAC/C,OAAO,EAAE,cAAc;SACxB;KACF,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACd,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,IAAsB;IAChE,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACnC,OAAO,IAAI,CAAC,SAAS,CAAC;QACpB,WAAW,EAAE,KAAK;QAClB,MAAM,EAAE;YACN,mBAAmB,EAAE,4BAA4B;YACjD,wBAAwB,EAAE,QAAQ;YAClC,qBAAqB,EAAE,kCAAkC;YACzD,6CAA6C,EAAE,gDAAgD;YAC/F,aAAa,EAAE,OAAO,CAAC,EAAE;YACzB,yBAAyB,EAAE,eAAe;SAC3C;KACF,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACd,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,OAAyB;IAClE,OAAO,OAAO,CAAC,qBAAqB,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAsB;IACtD,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACxC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;cAwBK,UAAU;;6BAEK,OAAO,CAAC,EAAE;;CAEtC,CAAC;AACF,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,OAAO;;;;;;;;;;;CAWR,CAAC;AACF,CAAC;AAED,MAAM,UAAU,wBAAwB;IACtC,OAAO;;;;;;;;;;;;;;;;;;CAkBR,CAAC;AACF,CAAC;AAED,MAAM,UAAU,uBAAuB;IACrC,OAAO;;;;CAIR,CAAC;AACF,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { GeneratorContext as ResolvedGeneratorContext } from '../context.js';
2
+ type GeneratorContext = Pick<ResolvedGeneratorContext, 'functionsRequirements'> & {
3
+ python: Pick<ResolvedGeneratorContext['python'], 'genai'>;
4
+ };
5
+ import type { AddArtifact } from '../../template-types.js';
6
+ import type { GenAiProjectPlan } from '../../domain/project/contracts.js';
7
+ export declare function addGenAiExtensionArtifacts(add: AddArtifact, plan: GenAiProjectPlan, context: GeneratorContext): void;
8
+ export {};
@@ -0,0 +1,11 @@
1
+ import { addBackendArtifacts } from './backend.js';
2
+ import { addDatabaseArtifacts } from './database.js';
3
+ import { addPatternArtifacts } from './patterns.js';
4
+ import { addFunctionArtifacts } from './functions.js';
5
+ export function addGenAiExtensionArtifacts(add, plan, context) {
6
+ addBackendArtifacts(add, plan, context);
7
+ addDatabaseArtifacts(add, plan);
8
+ addPatternArtifacts(add, plan);
9
+ addFunctionArtifacts(add, plan, context);
10
+ }
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/generators/genai/index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAEtD,MAAM,UAAU,0BAA0B,CAAC,GAAgB,EAAE,IAAsB,EAAE,OAAyB;IAC5G,mBAAmB,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IACxC,oBAAoB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAChC,mBAAmB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC/B,oBAAoB,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;AAC3C,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { AddArtifact } from '../../template-types.js';
2
+ import type { GenAiProjectPlan } from '../../domain/project/contracts.js';
3
+ export declare function addPatternArtifacts(add: AddArtifact, plan: GenAiProjectPlan): void;
4
+ export declare function renderPatternAgent(plan: GenAiProjectPlan): string;
5
+ export declare function renderPatternAgentTest(plan: GenAiProjectPlan): string;
6
+ export declare function renderPromptTemplate(plan: GenAiProjectPlan): string;
7
+ export declare function renderPromptReadme(): string;
8
+ export declare function renderVectorStore(): string;
9
+ export declare function renderPatternWorker(plan: GenAiProjectPlan): string;
@@ -0,0 +1,309 @@
1
+ import { genAiPattern } from '../common/values.js';
2
+ import { pyModule } from '../common/values.js';
3
+ export function addPatternArtifacts(add, plan) {
4
+ const pattern = genAiPattern(plan);
5
+ const routeModule = pyModule(pattern.id);
6
+ add('pattern-agent', 'pattern', ['backend', 'orchestration', 'agents', `${routeModule}_agent.py`], renderPatternAgent(plan));
7
+ add('pattern-agent-test', 'backend-test', ['backend', 'tests', `test_${routeModule}_orchestration.py`], renderPatternAgentTest(plan));
8
+ add('pattern-prompt', 'pattern', ['backend', 'orchestration', 'prompts', `${pattern.id}.md`], renderPromptTemplate(plan));
9
+ add('pattern-agent-package', 'pattern', ['backend', 'orchestration', 'agents', '__init__.py'], '');
10
+ add('pattern-prompt-readme', 'pattern', ['backend', 'orchestration', 'prompts', 'README.md'], renderPromptReadme());
11
+ if (pattern.id === 'rag') {
12
+ add('rag-vector-store', 'pattern', ['backend', 'orchestration', 'retrieval', 'vector_store.py'], renderVectorStore());
13
+ add('rag-retrieval-package', 'pattern', ['backend', 'orchestration', 'retrieval', '__init__.py'], '');
14
+ }
15
+ if (pattern.worker) {
16
+ add('pattern-worker', 'pattern', ['backend', 'workers', `${routeModule}_worker.py`], renderPatternWorker(plan));
17
+ add('backend-workers-package', 'pattern', ['backend', 'workers', '__init__.py'], '');
18
+ }
19
+ if (pattern.id === 'fine-tuned') {
20
+ add('fine-tuned-eval-dataset', 'pattern', ['backend', 'evaluation', 'datasets', 'sample.jsonl'], '{"input":"Example request","expected":"Expected response placeholder"}');
21
+ }
22
+ }
23
+ export function renderPatternAgent(plan) {
24
+ const pattern = genAiPattern(plan);
25
+ const moduleName = pyModule(pattern.id);
26
+ if (pattern.id === 'rag') {
27
+ return `from backend.observability.tracing import Tracer, build_tracer
28
+ from backend.orchestration.model_config import AgentRunner, build_agent_runner
29
+ from backend.orchestration.tools.messaging import MessagePublisher, build_message_publisher
30
+
31
+
32
+ async def _run_agent(
33
+ operation: str,
34
+ prompt: str,
35
+ runner: AgentRunner | None,
36
+ tracer: Tracer | None,
37
+ ) -> str:
38
+ selected_runner = runner or build_agent_runner()
39
+ selected_tracer = tracer or build_tracer()
40
+ async with selected_tracer.trace(operation, {"prompt": prompt}) as trace:
41
+ output = await selected_runner.run(prompt)
42
+ trace.set_output({"text": output})
43
+ return output
44
+
45
+
46
+ async def answer_question(
47
+ question: str,
48
+ *,
49
+ runner: AgentRunner | None = None,
50
+ tracer: Tracer | None = None,
51
+ ) -> dict:
52
+ answer = await _run_agent(
53
+ "rag.query",
54
+ f"Answer this question without claiming retrieval or citations.\\nQuestion: {question}",
55
+ runner,
56
+ tracer,
57
+ )
58
+ return {
59
+ "answer": answer,
60
+ "question": question,
61
+ "citations": [],
62
+ }
63
+
64
+
65
+ async def enqueue_ingestion(
66
+ source_uri: str,
67
+ *,
68
+ publisher: MessagePublisher | None = None,
69
+ ) -> dict:
70
+ selected_publisher = publisher or build_message_publisher()
71
+ await selected_publisher.publish("rag.ingest", {"source_uri": source_uri})
72
+ return {"status": "queued", "source_uri": source_uri}
73
+ `;
74
+ }
75
+ if (pattern.id === 'streaming') {
76
+ return `import json
77
+
78
+ from backend.observability.tracing import Tracer, build_tracer
79
+ from backend.orchestration.model_config import AgentRunner, build_agent_runner
80
+
81
+
82
+ async def stream_response(
83
+ prompt: str,
84
+ *,
85
+ runner: AgentRunner | None = None,
86
+ tracer: Tracer | None = None,
87
+ ):
88
+ selected_runner = runner or build_agent_runner()
89
+ selected_tracer = tracer or build_tracer()
90
+ async with selected_tracer.trace("streaming.run", {"prompt": prompt}) as trace:
91
+ output = await selected_runner.run(
92
+ f"Respond concisely and safely to this request:\\n{prompt}"
93
+ )
94
+ trace.set_output({"text": output})
95
+ yield f"data: {json.dumps({'text': output})}\\n\\n"
96
+ `;
97
+ }
98
+ const instruction = pattern.id === 'generic'
99
+ ? 'Respond safely and usefully to this general-purpose AI request:'
100
+ : `Respond to this ${pattern.id} starter input; no specialized orchestration is implemented:`;
101
+ return `from backend.observability.tracing import Tracer, build_tracer
102
+ from backend.orchestration.model_config import AgentRunner, build_agent_runner
103
+
104
+
105
+ async def run_${moduleName}(
106
+ input_text: str,
107
+ *,
108
+ runner: AgentRunner | None = None,
109
+ tracer: Tracer | None = None,
110
+ ) -> dict:
111
+ selected_runner = runner or build_agent_runner()
112
+ selected_tracer = tracer or build_tracer()
113
+ prompt = (
114
+ "${instruction}\\n"
115
+ f"{input_text}"
116
+ )
117
+ async with selected_tracer.trace("${pattern.id}.run", {"input": input_text}) as trace:
118
+ output = await selected_runner.run(prompt)
119
+ trace.set_output({"result": output})
120
+ return {
121
+ "result": output,
122
+ "input": input_text,
123
+ }
124
+ `;
125
+ }
126
+ export function renderPatternAgentTest(plan) {
127
+ const pattern = genAiPattern(plan);
128
+ const moduleName = pyModule(pattern.id);
129
+ const agentModule = `backend.orchestration.agents.${moduleName}_agent`;
130
+ if (pattern.id === 'rag') {
131
+ return `import asyncio
132
+
133
+ import pytest
134
+
135
+ from ${agentModule} import answer_question, enqueue_ingestion
136
+ from backend.observability.tracing import DisabledTracer
137
+ from backend.orchestration.model_config import ModelConfigurationError
138
+
139
+
140
+ class FakeRunner:
141
+ async def run(self, prompt):
142
+ assert "Question: What is Liftoff?" in prompt
143
+ return "Liftoff is the generated orchestration starter."
144
+
145
+
146
+ class FakePublisher:
147
+ def __init__(self):
148
+ self.messages = []
149
+
150
+ async def publish(self, topic, payload):
151
+ self.messages.append((topic, payload))
152
+
153
+
154
+ def test_rag_query_uses_injected_runner_without_network():
155
+ result = asyncio.run(
156
+ answer_question(
157
+ "What is Liftoff?",
158
+ runner=FakeRunner(),
159
+ tracer=DisabledTracer(),
160
+ )
161
+ )
162
+ assert result == {
163
+ "answer": "Liftoff is the generated orchestration starter.",
164
+ "question": "What is Liftoff?",
165
+ "citations": [],
166
+ }
167
+
168
+
169
+ def test_rag_ingestion_uses_injected_publisher():
170
+ publisher = FakePublisher()
171
+ result = asyncio.run(
172
+ enqueue_ingestion("az://documents/one.pdf", publisher=publisher)
173
+ )
174
+ assert result == {
175
+ "status": "queued",
176
+ "source_uri": "az://documents/one.pdf",
177
+ }
178
+ assert publisher.messages == [
179
+ ("rag.ingest", {"source_uri": "az://documents/one.pdf"})
180
+ ]
181
+
182
+
183
+ def test_missing_model_configuration_is_explicit(monkeypatch):
184
+ monkeypatch.delenv("PYDANTIC_AI_MODEL", raising=False)
185
+ with pytest.raises(ModelConfigurationError, match="PYDANTIC_AI_MODEL is required"):
186
+ asyncio.run(answer_question("unconfigured"))
187
+ `;
188
+ }
189
+ if (pattern.id === 'streaming') {
190
+ return `import asyncio
191
+
192
+ import pytest
193
+
194
+ from ${agentModule} import stream_response
195
+ from backend.observability.tracing import DisabledTracer
196
+ from backend.orchestration.model_config import ModelConfigurationError
197
+
198
+
199
+ class FakeRunner:
200
+ async def run(self, prompt):
201
+ assert "stream this" in prompt
202
+ return "offline streamed answer"
203
+
204
+
205
+ def test_streaming_uses_injected_runner_without_network():
206
+ async def collect():
207
+ return [
208
+ chunk
209
+ async for chunk in stream_response(
210
+ "stream this",
211
+ runner=FakeRunner(),
212
+ tracer=DisabledTracer(),
213
+ )
214
+ ]
215
+
216
+ chunks = asyncio.run(collect())
217
+ assert chunks == ['data: {"text": "offline streamed answer"}\\n\\n']
218
+
219
+
220
+ def test_missing_model_configuration_is_explicit(monkeypatch):
221
+ monkeypatch.delenv("PYDANTIC_AI_MODEL", raising=False)
222
+
223
+ async def collect():
224
+ return [chunk async for chunk in stream_response("unconfigured")]
225
+
226
+ with pytest.raises(ModelConfigurationError, match="PYDANTIC_AI_MODEL is required"):
227
+ asyncio.run(collect())
228
+ `;
229
+ }
230
+ return `import asyncio
231
+
232
+ import pytest
233
+
234
+ from ${agentModule} import run_${moduleName}
235
+ from backend.observability.tracing import DisabledTracer
236
+ from backend.orchestration.model_config import ModelConfigurationError
237
+
238
+
239
+ class FakeRunner:
240
+ async def run(self, prompt):
241
+ assert "offline input" in prompt
242
+ return "offline ${pattern.id} result"
243
+
244
+
245
+ def test_${moduleName}_uses_injected_runner_without_network():
246
+ result = asyncio.run(
247
+ run_${moduleName}(
248
+ "offline input",
249
+ runner=FakeRunner(),
250
+ tracer=DisabledTracer(),
251
+ )
252
+ )
253
+ assert result == {
254
+ "result": "offline ${pattern.id} result",
255
+ "input": "offline input",
256
+ }
257
+
258
+
259
+ def test_missing_model_configuration_is_explicit(monkeypatch):
260
+ monkeypatch.delenv("PYDANTIC_AI_MODEL", raising=False)
261
+ with pytest.raises(ModelConfigurationError, match="PYDANTIC_AI_MODEL is required"):
262
+ asyncio.run(run_${moduleName}("unconfigured"))
263
+ `;
264
+ }
265
+ export function renderPromptTemplate(plan) {
266
+ const pattern = genAiPattern(plan);
267
+ if (pattern.id === 'generic') {
268
+ return `# Generic GenAI System Prompt
269
+
270
+ Respond safely and usefully to the general-purpose request.
271
+
272
+ Do not assume retrieval, conversation memory, tools, streaming, fine-tuning, multi-agent coordination, or workflow behavior unless the project explicitly adds it.
273
+ `;
274
+ }
275
+ return `# ${pattern.label} Prompt
276
+
277
+ You are implementing a ${pattern.label} generated by Mission Control Liftoff.
278
+
279
+ Use PydanticAI orchestration and return outputs that match the API contract.
280
+ `;
281
+ }
282
+ export function renderPromptReadme() {
283
+ return `# Prompt Templates
284
+
285
+ These project-owned prompt files are editable design seeds. The generated runner does not load them.
286
+ Implement and test prompt loading in a separate reviewed project change before relying on their contents.
287
+ `;
288
+ }
289
+ export function renderVectorStore() {
290
+ return `from typing import Protocol
291
+
292
+
293
+ class VectorStore(Protocol):
294
+ async def search(self, query: str, limit: int = 5) -> list[dict]:
295
+ ...
296
+
297
+
298
+ class PgVectorStore:
299
+ async def search(self, query: str, limit: int = 5) -> list[dict]:
300
+ raise NotImplementedError("pgvector retrieval is not implemented by this starter.")
301
+ `;
302
+ }
303
+ export function renderPatternWorker(plan) {
304
+ const pattern = genAiPattern(plan);
305
+ return `async def run_worker() -> None:
306
+ raise NotImplementedError("${pattern.id} job processing is a deferred project integration.")
307
+ `;
308
+ }
309
+ //# sourceMappingURL=patterns.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patterns.js","sourceRoot":"","sources":["../../../src/generators/genai/patterns.ts"],"names":[],"mappings":"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"}