@msn-control/liftoff 0.10.3 → 0.11.1

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 (656) hide show
  1. package/DEVELOPER.md +364 -20
  2. package/README.md +29 -29
  3. package/assets/governance/single-maintainer-gitflow/assessment-controls.json +39 -0
  4. package/assets/supported-stack.json +7 -138
  5. package/dist/adapters/azure/governance-assessment.d.ts +2 -0
  6. package/dist/adapters/azure/governance-assessment.js +21 -0
  7. package/dist/adapters/azure/governance-assessment.js.map +1 -0
  8. package/dist/adapters/filesystem/atomic-write.d.ts +2 -0
  9. package/dist/adapters/filesystem/atomic-write.js +74 -0
  10. package/dist/adapters/filesystem/atomic-write.js.map +1 -0
  11. package/dist/adapters/filesystem/errors.d.ts +2 -0
  12. package/dist/adapters/filesystem/errors.js +8 -0
  13. package/dist/adapters/filesystem/errors.js.map +1 -0
  14. package/dist/adapters/filesystem/manifest-file.d.ts +1 -0
  15. package/dist/adapters/filesystem/manifest-file.js +21 -0
  16. package/dist/adapters/filesystem/manifest-file.js.map +1 -0
  17. package/dist/adapters/filesystem/project-config.d.ts +4 -0
  18. package/dist/adapters/filesystem/project-config.js +157 -0
  19. package/dist/adapters/filesystem/project-config.js.map +1 -0
  20. package/dist/adapters/filesystem/project-discovery.d.ts +2 -0
  21. package/dist/adapters/filesystem/project-discovery.js +30 -0
  22. package/dist/adapters/filesystem/project-discovery.js.map +1 -0
  23. package/dist/adapters/filesystem/project-files.d.ts +6 -0
  24. package/dist/adapters/filesystem/project-files.js +68 -0
  25. package/dist/adapters/filesystem/project-files.js.map +1 -0
  26. package/dist/adapters/filesystem/project-lock.d.ts +8 -0
  27. package/dist/adapters/filesystem/project-lock.js +164 -0
  28. package/dist/adapters/filesystem/project-lock.js.map +1 -0
  29. package/dist/adapters/filesystem/project-paths.d.ts +2 -0
  30. package/dist/adapters/filesystem/project-paths.js +60 -0
  31. package/dist/adapters/filesystem/project-paths.js.map +1 -0
  32. package/dist/adapters/filesystem/project-transaction.d.ts +23 -0
  33. package/dist/adapters/filesystem/project-transaction.js +158 -0
  34. package/dist/adapters/filesystem/project-transaction.js.map +1 -0
  35. package/dist/adapters/git/governance-assessment.d.ts +22 -0
  36. package/dist/adapters/git/governance-assessment.js +161 -0
  37. package/dist/adapters/git/governance-assessment.js.map +1 -0
  38. package/dist/adapters/github/governance-assessment.d.ts +2 -0
  39. package/dist/adapters/github/governance-assessment.js +18 -0
  40. package/dist/adapters/github/governance-assessment.js.map +1 -0
  41. package/dist/adapters/packaged-assets/package-root.d.ts +3 -0
  42. package/dist/adapters/packaged-assets/package-root.js +21 -0
  43. package/dist/adapters/packaged-assets/package-root.js.map +1 -0
  44. package/dist/adapters/packaged-assets/supported-stack.d.ts +4 -0
  45. package/dist/adapters/packaged-assets/supported-stack.js +18 -0
  46. package/dist/adapters/packaged-assets/supported-stack.js.map +1 -0
  47. package/dist/adapters/packaged-assets/template-assets.d.ts +23 -0
  48. package/dist/adapters/packaged-assets/template-assets.js +36 -0
  49. package/dist/adapters/packaged-assets/template-assets.js.map +1 -0
  50. package/dist/adapters/process/shell-command.d.ts +5 -0
  51. package/dist/adapters/process/shell-command.js +21 -0
  52. package/dist/adapters/process/shell-command.js.map +1 -0
  53. package/dist/application/context.d.ts +20 -0
  54. package/dist/application/context.js +2 -0
  55. package/dist/application/context.js.map +1 -0
  56. package/dist/application/diagnose/doctor.d.ts +21 -0
  57. package/dist/application/diagnose/doctor.js +586 -0
  58. package/dist/application/diagnose/doctor.js.map +1 -0
  59. package/dist/application/diagnose/generated-project.d.ts +1 -0
  60. package/dist/application/diagnose/generated-project.js +105 -0
  61. package/dist/application/diagnose/generated-project.js.map +1 -0
  62. package/dist/application/diagnose/validate.d.ts +6 -0
  63. package/dist/application/diagnose/validate.js +27 -0
  64. package/dist/application/diagnose/validate.js.map +1 -0
  65. package/dist/application/initialize/fixture.d.ts +2 -0
  66. package/dist/application/initialize/fixture.js +39 -0
  67. package/dist/application/initialize/fixture.js.map +1 -0
  68. package/dist/application/initialize/inputs.d.ts +3 -0
  69. package/dist/application/initialize/inputs.js +35 -0
  70. package/dist/application/initialize/inputs.js.map +1 -0
  71. package/dist/application/initialize/use-case.d.ts +23 -0
  72. package/dist/application/initialize/use-case.js +360 -0
  73. package/dist/application/initialize/use-case.js.map +1 -0
  74. package/dist/application/migrate/use-case.d.ts +7 -0
  75. package/dist/application/migrate/use-case.js +378 -0
  76. package/dist/application/migrate/use-case.js.map +1 -0
  77. package/dist/application/project/catalog.d.ts +46 -0
  78. package/dist/application/project/catalog.js +12 -0
  79. package/dist/application/project/catalog.js.map +1 -0
  80. package/dist/application/project/manifest.d.ts +2 -0
  81. package/dist/application/project/manifest.js +29 -0
  82. package/dist/application/project/manifest.js.map +1 -0
  83. package/dist/application/project/planning.d.ts +6 -0
  84. package/dist/application/project/planning.js +12 -0
  85. package/dist/application/project/planning.js.map +1 -0
  86. package/dist/application/update/planning.d.ts +40 -0
  87. package/dist/application/update/planning.js +293 -0
  88. package/dist/application/update/planning.js.map +1 -0
  89. package/dist/application/update/reporting.d.ts +42 -0
  90. package/dist/application/update/reporting.js +325 -0
  91. package/dist/application/update/reporting.js.map +1 -0
  92. package/dist/application/update/use-case.d.ts +8 -0
  93. package/dist/application/update/use-case.js +600 -0
  94. package/dist/application/update/use-case.js.map +1 -0
  95. package/dist/application/upgrade/use-case.d.ts +6 -0
  96. package/dist/application/upgrade/use-case.js +82 -0
  97. package/dist/application/upgrade/use-case.js.map +1 -0
  98. package/dist/args.d.ts +5 -65
  99. package/dist/args.js +4 -441
  100. package/dist/args.js.map +1 -1
  101. package/dist/artifact-lifecycle.d.ts +1 -21
  102. package/dist/artifact-lifecycle.js +1 -73
  103. package/dist/artifact-lifecycle.js.map +1 -1
  104. package/dist/catalogs.d.ts +1 -50
  105. package/dist/catalogs.js +1 -472
  106. package/dist/catalogs.js.map +1 -1
  107. package/dist/cli/args/contracts.d.ts +51 -0
  108. package/dist/cli/args/contracts.js +2 -0
  109. package/dist/cli/args/contracts.js.map +1 -0
  110. package/dist/cli/args/definitions.d.ts +6 -0
  111. package/dist/cli/args/definitions.js +187 -0
  112. package/dist/cli/args/definitions.js.map +1 -0
  113. package/dist/cli/args/help.d.ts +5 -0
  114. package/dist/cli/args/help.js +130 -0
  115. package/dist/cli/args/help.js.map +1 -0
  116. package/dist/cli/args/parser.d.ts +5 -0
  117. package/dist/cli/args/parser.js +145 -0
  118. package/dist/cli/args/parser.js.map +1 -0
  119. package/dist/cli/args/readers.d.ts +4 -0
  120. package/dist/cli/args/readers.js +19 -0
  121. package/dist/cli/args/readers.js.map +1 -0
  122. package/dist/cli/commands/diagnose.d.ts +4 -0
  123. package/dist/cli/commands/diagnose.js +12 -0
  124. package/dist/cli/commands/diagnose.js.map +1 -0
  125. package/dist/cli/commands/dispatch.d.ts +3 -0
  126. package/dist/cli/commands/dispatch.js +94 -0
  127. package/dist/cli/commands/dispatch.js.map +1 -0
  128. package/dist/cli/commands/help.d.ts +3 -0
  129. package/dist/cli/commands/help.js +32 -0
  130. package/dist/cli/commands/help.js.map +1 -0
  131. package/dist/cli/commands/helpers.d.ts +8 -0
  132. package/dist/cli/commands/helpers.js +97 -0
  133. package/dist/cli/commands/helpers.js.map +1 -0
  134. package/dist/cli/commands/initialize.d.ts +3 -0
  135. package/dist/cli/commands/initialize.js +7 -0
  136. package/dist/cli/commands/initialize.js.map +1 -0
  137. package/dist/cli/commands/migrate.d.ts +3 -0
  138. package/dist/cli/commands/migrate.js +8 -0
  139. package/dist/cli/commands/migrate.js.map +1 -0
  140. package/dist/cli/commands/plan.d.ts +3 -0
  141. package/dist/cli/commands/plan.js +34 -0
  142. package/dist/cli/commands/plan.js.map +1 -0
  143. package/dist/cli/commands/reference.d.ts +5 -0
  144. package/dist/cli/commands/reference.js +43 -0
  145. package/dist/cli/commands/reference.js.map +1 -0
  146. package/dist/cli/commands/update.d.ts +3 -0
  147. package/dist/cli/commands/update.js +9 -0
  148. package/dist/cli/commands/update.js.map +1 -0
  149. package/dist/cli/commands/upgrade.d.ts +3 -0
  150. package/dist/cli/commands/upgrade.js +7 -0
  151. package/dist/cli/commands/upgrade.js.map +1 -0
  152. package/dist/cli/context.d.ts +1 -0
  153. package/dist/cli/context.js +2 -0
  154. package/dist/cli/context.js.map +1 -0
  155. package/dist/cli/project-options.d.ts +3 -0
  156. package/dist/cli/project-options.js +41 -0
  157. package/dist/cli/project-options.js.map +1 -0
  158. package/dist/cli.d.ts +3 -3
  159. package/dist/cli.js +4 -3
  160. package/dist/cli.js.map +1 -1
  161. package/dist/commands.d.ts +4 -35
  162. package/dist/commands.js +3 -2812
  163. package/dist/commands.js.map +1 -1
  164. package/dist/container-validation.d.ts +1 -1
  165. package/dist/domain/governance/activation/approvals.d.ts +351 -0
  166. package/dist/domain/governance/activation/approvals.js +528 -0
  167. package/dist/domain/governance/activation/approvals.js.map +1 -0
  168. package/dist/domain/governance/activation/canonical-json.d.ts +4 -0
  169. package/dist/domain/governance/activation/canonical-json.js +39 -0
  170. package/dist/domain/governance/activation/canonical-json.js.map +1 -0
  171. package/dist/domain/governance/activation/capabilities.d.ts +7 -0
  172. package/dist/domain/governance/activation/capabilities.js +33 -0
  173. package/dist/domain/governance/activation/capabilities.js.map +1 -0
  174. package/dist/domain/governance/activation/evidence.d.ts +63 -0
  175. package/dist/domain/governance/activation/evidence.js +444 -0
  176. package/dist/domain/governance/activation/evidence.js.map +1 -0
  177. package/dist/domain/governance/activation/graph.d.ts +397 -0
  178. package/dist/domain/governance/activation/graph.js +441 -0
  179. package/dist/domain/governance/activation/graph.js.map +1 -0
  180. package/dist/domain/governance/activation/inputs.d.ts +25 -0
  181. package/dist/domain/governance/activation/inputs.js +63 -0
  182. package/dist/domain/governance/activation/inputs.js.map +1 -0
  183. package/dist/domain/governance/activation/operations.d.ts +19 -0
  184. package/dist/domain/governance/activation/operations.js +181 -0
  185. package/dist/domain/governance/activation/operations.js.map +1 -0
  186. package/dist/domain/governance/activation/readiness.d.ts +27 -0
  187. package/dist/domain/governance/activation/readiness.js +269 -0
  188. package/dist/domain/governance/activation/readiness.js.map +1 -0
  189. package/dist/domain/governance/activation/types.d.ts +399 -0
  190. package/dist/domain/governance/activation/types.js +109 -0
  191. package/dist/domain/governance/activation/types.js.map +1 -0
  192. package/dist/domain/governance/activation/validators.d.ts +22 -0
  193. package/dist/domain/governance/activation/validators.js +1347 -0
  194. package/dist/domain/governance/activation/validators.js.map +1 -0
  195. package/dist/domain/governance/assessment/catalog.d.ts +14 -0
  196. package/dist/domain/governance/assessment/catalog.js +105 -0
  197. package/dist/domain/governance/assessment/catalog.js.map +1 -0
  198. package/dist/domain/governance/assessment/errors.d.ts +10 -0
  199. package/dist/domain/governance/assessment/errors.js +22 -0
  200. package/dist/domain/governance/assessment/errors.js.map +1 -0
  201. package/dist/domain/governance/assessment/index.d.ts +8 -0
  202. package/dist/domain/governance/assessment/index.js +9 -0
  203. package/dist/domain/governance/assessment/index.js.map +1 -0
  204. package/dist/domain/governance/assessment/live-normalize.d.ts +19 -0
  205. package/dist/domain/governance/assessment/live-normalize.js +403 -0
  206. package/dist/domain/governance/assessment/live-normalize.js.map +1 -0
  207. package/dist/domain/governance/assessment/predicates.d.ts +36 -0
  208. package/dist/domain/governance/assessment/predicates.js +545 -0
  209. package/dist/domain/governance/assessment/predicates.js.map +1 -0
  210. package/dist/domain/governance/assessment/report.d.ts +23 -0
  211. package/dist/domain/governance/assessment/report.js +266 -0
  212. package/dist/domain/governance/assessment/report.js.map +1 -0
  213. package/dist/domain/governance/assessment/sanitize.d.ts +8 -0
  214. package/dist/domain/governance/assessment/sanitize.js +60 -0
  215. package/dist/domain/governance/assessment/sanitize.js.map +1 -0
  216. package/dist/domain/governance/assessment/types.d.ts +174 -0
  217. package/dist/domain/governance/assessment/types.js +13 -0
  218. package/dist/domain/governance/assessment/types.js.map +1 -0
  219. package/dist/domain/governance/assessment/yaml.d.ts +6 -0
  220. package/dist/domain/governance/assessment/yaml.js +30 -0
  221. package/dist/domain/governance/assessment/yaml.js.map +1 -0
  222. package/dist/domain/governance/policy/identity.d.ts +64 -0
  223. package/dist/domain/governance/policy/identity.js +112 -0
  224. package/dist/domain/governance/policy/identity.js.map +1 -0
  225. package/dist/domain/migration/dependencies.d.ts +7 -0
  226. package/dist/domain/migration/dependencies.js +221 -0
  227. package/dist/domain/migration/dependencies.js.map +1 -0
  228. package/dist/domain/migration/inventory.d.ts +3 -0
  229. package/dist/domain/migration/inventory.js +15 -0
  230. package/dist/domain/migration/inventory.js.map +1 -0
  231. package/dist/domain/project/artifact-lifecycle.d.ts +69 -0
  232. package/dist/domain/project/artifact-lifecycle.js +137 -0
  233. package/dist/domain/project/artifact-lifecycle.js.map +1 -0
  234. package/dist/domain/project/catalog.d.ts +48 -0
  235. package/dist/domain/project/catalog.js +507 -0
  236. package/dist/domain/project/catalog.js.map +1 -0
  237. package/dist/domain/project/contracts.d.ts +247 -0
  238. package/dist/domain/project/contracts.js +2 -0
  239. package/dist/domain/project/contracts.js.map +1 -0
  240. package/dist/domain/project/errors.d.ts +3 -0
  241. package/dist/domain/project/errors.js +7 -0
  242. package/dist/domain/project/errors.js.map +1 -0
  243. package/dist/domain/project/infrastructure-layout.d.ts +26 -0
  244. package/dist/domain/project/infrastructure-layout.js +124 -0
  245. package/dist/domain/project/infrastructure-layout.js.map +1 -0
  246. package/dist/domain/project/inputs.d.ts +21 -0
  247. package/dist/domain/project/inputs.js +41 -0
  248. package/dist/domain/project/inputs.js.map +1 -0
  249. package/dist/domain/project/manifest/artifacts.d.ts +8 -0
  250. package/dist/domain/project/manifest/artifacts.js +150 -0
  251. package/dist/domain/project/manifest/artifacts.js.map +1 -0
  252. package/dist/domain/project/manifest/context.d.ts +13 -0
  253. package/dist/domain/project/manifest/context.js +2 -0
  254. package/dist/domain/project/manifest/context.js.map +1 -0
  255. package/dist/domain/project/manifest/fields.d.ts +6 -0
  256. package/dist/domain/project/manifest/fields.js +36 -0
  257. package/dist/domain/project/manifest/fields.js.map +1 -0
  258. package/dist/domain/project/manifest/governance.d.ts +8 -0
  259. package/dist/domain/project/manifest/governance.js +161 -0
  260. package/dist/domain/project/manifest/governance.js.map +1 -0
  261. package/dist/domain/project/manifest/project-identity.d.ts +6 -0
  262. package/dist/domain/project/manifest/project-identity.js +273 -0
  263. package/dist/domain/project/manifest/project-identity.js.map +1 -0
  264. package/dist/domain/project/manifest/reader.d.ts +9 -0
  265. package/dist/domain/project/manifest/reader.js +141 -0
  266. package/dist/domain/project/manifest/reader.js.map +1 -0
  267. package/dist/domain/project/paths.d.ts +2 -0
  268. package/dist/domain/project/paths.js +29 -0
  269. package/dist/domain/project/paths.js.map +1 -0
  270. package/dist/domain/project/planning.d.ts +19 -0
  271. package/dist/domain/project/planning.js +329 -0
  272. package/dist/domain/project/planning.js.map +1 -0
  273. package/dist/domain/project/retired-workload.d.ts +4 -0
  274. package/dist/domain/project/retired-workload.js +18 -0
  275. package/dist/domain/project/retired-workload.js.map +1 -0
  276. package/dist/domain/project/supported-stack.d.ts +113 -0
  277. package/dist/domain/project/supported-stack.js +426 -0
  278. package/dist/domain/project/supported-stack.js.map +1 -0
  279. package/dist/domain/workstation/constraints.d.ts +6 -0
  280. package/dist/domain/workstation/constraints.js +8 -0
  281. package/dist/domain/workstation/constraints.js.map +1 -0
  282. package/dist/file-system.d.ts +10 -41
  283. package/dist/file-system.js +9 -1204
  284. package/dist/file-system.js.map +1 -1
  285. package/dist/framework-adapters.d.ts +1 -1
  286. package/dist/framework-validation.d.ts +1 -1
  287. package/dist/framework-validation.js +1 -1
  288. package/dist/framework-validation.js.map +1 -1
  289. package/dist/genai-templates.d.ts +2 -9
  290. package/dist/genai-templates.js +4 -5
  291. package/dist/genai-templates.js.map +1 -1
  292. package/dist/generators/common/artifacts.d.ts +6 -0
  293. package/dist/generators/common/artifacts.js +30 -0
  294. package/dist/generators/common/artifacts.js.map +1 -0
  295. package/dist/generators/common/base.d.ts +17 -0
  296. package/dist/generators/common/base.js +421 -0
  297. package/dist/generators/common/base.js.map +1 -0
  298. package/dist/generators/common/dotenv-validation.d.ts +2 -0
  299. package/dist/generators/common/dotenv-validation.js +80 -0
  300. package/dist/generators/common/dotenv-validation.js.map +1 -0
  301. package/dist/generators/common/environments.d.ts +3 -0
  302. package/dist/generators/common/environments.js +15 -0
  303. package/dist/generators/common/environments.js.map +1 -0
  304. package/dist/generators/common/frontend.d.ts +15 -0
  305. package/dist/generators/common/frontend.js +166 -0
  306. package/dist/generators/common/frontend.js.map +1 -0
  307. package/dist/generators/common/python-settings.d.ts +2 -0
  308. package/dist/generators/common/python-settings.js +70 -0
  309. package/dist/generators/common/python-settings.js.map +1 -0
  310. package/dist/generators/common/spec-workflow.d.ts +28 -0
  311. package/dist/generators/common/spec-workflow.js +567 -0
  312. package/dist/generators/common/spec-workflow.js.map +1 -0
  313. package/dist/generators/common/values.d.ts +13 -0
  314. package/dist/generators/common/values.js +16 -0
  315. package/dist/generators/common/values.js.map +1 -0
  316. package/dist/generators/containers/compose.d.ts +7 -0
  317. package/dist/generators/containers/compose.js +196 -0
  318. package/dist/generators/containers/compose.js.map +1 -0
  319. package/dist/generators/containers/context.d.ts +1 -0
  320. package/dist/generators/containers/context.js +43 -0
  321. package/dist/generators/containers/context.js.map +1 -0
  322. package/dist/generators/containers/images.d.ts +7 -0
  323. package/dist/generators/containers/images.js +119 -0
  324. package/dist/generators/containers/images.js.map +1 -0
  325. package/dist/generators/context.d.ts +42 -0
  326. package/dist/generators/context.js +38 -0
  327. package/dist/generators/context.js.map +1 -0
  328. package/dist/generators/genai/backend.d.ts +20 -0
  329. package/dist/generators/genai/backend.js +667 -0
  330. package/dist/generators/genai/backend.js.map +1 -0
  331. package/dist/generators/genai/configuration.d.ts +3 -0
  332. package/dist/generators/genai/configuration.js +43 -0
  333. package/dist/generators/genai/configuration.js.map +1 -0
  334. package/dist/generators/genai/database.d.ts +7 -0
  335. package/dist/generators/genai/database.js +71 -0
  336. package/dist/generators/genai/database.js.map +1 -0
  337. package/dist/generators/genai/functions.d.ts +15 -0
  338. package/dist/generators/genai/functions.js +156 -0
  339. package/dist/generators/genai/functions.js.map +1 -0
  340. package/dist/generators/genai/index.d.ts +8 -0
  341. package/dist/generators/genai/index.js +11 -0
  342. package/dist/generators/genai/index.js.map +1 -0
  343. package/dist/generators/genai/patterns.d.ts +9 -0
  344. package/dist/generators/genai/patterns.js +309 -0
  345. package/dist/generators/genai/patterns.js.map +1 -0
  346. package/dist/generators/infrastructure/azure.d.ts +18 -0
  347. package/dist/generators/infrastructure/azure.js +655 -0
  348. package/dist/generators/infrastructure/azure.js.map +1 -0
  349. package/dist/generators/infrastructure/names.d.ts +23 -0
  350. package/dist/generators/infrastructure/names.js +51 -0
  351. package/dist/generators/infrastructure/names.js.map +1 -0
  352. package/dist/generators/standard/configuration.d.ts +3 -0
  353. package/dist/generators/standard/configuration.js +26 -0
  354. package/dist/generators/standard/configuration.js.map +1 -0
  355. package/dist/generators/standard/go.d.ts +17 -0
  356. package/dist/generators/standard/go.js +338 -0
  357. package/dist/generators/standard/go.js.map +1 -0
  358. package/dist/generators/standard/index.d.ts +12 -0
  359. package/dist/generators/standard/index.js +12 -0
  360. package/dist/generators/standard/index.js.map +1 -0
  361. package/dist/generators/standard/node.d.ts +20 -0
  362. package/dist/generators/standard/node.js +314 -0
  363. package/dist/generators/standard/node.js.map +1 -0
  364. package/dist/generators/standard/python.d.ts +18 -0
  365. package/dist/generators/standard/python.js +191 -0
  366. package/dist/generators/standard/python.js.map +1 -0
  367. package/dist/go-template-assets.js +3 -3
  368. package/dist/go-template-assets.js.map +1 -1
  369. package/dist/governance-activation/activation-state.d.ts +1 -1
  370. package/dist/governance-activation/activation-state.js +46 -9
  371. package/dist/governance-activation/activation-state.js.map +1 -1
  372. package/dist/governance-activation/approvals.d.ts +1 -188
  373. package/dist/governance-activation/approvals.js +1 -507
  374. package/dist/governance-activation/approvals.js.map +1 -1
  375. package/dist/governance-activation/canonical-json.d.ts +1 -3
  376. package/dist/governance-activation/canonical-json.js +1 -35
  377. package/dist/governance-activation/canonical-json.js.map +1 -1
  378. package/dist/governance-activation/commands.d.ts +1 -1
  379. package/dist/governance-activation/commands.js +107 -103
  380. package/dist/governance-activation/commands.js.map +1 -1
  381. package/dist/governance-activation/compatibility.d.ts +11 -3
  382. package/dist/governance-activation/compatibility.js +31 -4
  383. package/dist/governance-activation/compatibility.js.map +1 -1
  384. package/dist/governance-activation/credentials.d.ts +3 -3
  385. package/dist/governance-activation/credentials.js +5 -5
  386. package/dist/governance-activation/credentials.js.map +1 -1
  387. package/dist/governance-activation/doctor.d.ts +1 -1
  388. package/dist/governance-activation/doctor.js +28 -96
  389. package/dist/governance-activation/doctor.js.map +1 -1
  390. package/dist/governance-activation/evidence.d.ts +1 -49
  391. package/dist/governance-activation/evidence.js +1 -245
  392. package/dist/governance-activation/evidence.js.map +1 -1
  393. package/dist/governance-activation/git-ignore.d.ts +9 -0
  394. package/dist/governance-activation/git-ignore.js +76 -0
  395. package/dist/governance-activation/git-ignore.js.map +1 -0
  396. package/dist/governance-activation/graph.d.ts +1 -397
  397. package/dist/governance-activation/graph.js +1 -440
  398. package/dist/governance-activation/graph.js.map +1 -1
  399. package/dist/governance-activation/identity.d.ts +1 -35
  400. package/dist/governance-activation/identity.js +1 -88
  401. package/dist/governance-activation/identity.js.map +1 -1
  402. package/dist/governance-activation/index.d.ts +3 -0
  403. package/dist/governance-activation/index.js +3 -0
  404. package/dist/governance-activation/index.js.map +1 -1
  405. package/dist/governance-activation/inputs.d.ts +8 -0
  406. package/dist/governance-activation/inputs.js +146 -0
  407. package/dist/governance-activation/inputs.js.map +1 -0
  408. package/dist/governance-activation/migration.d.ts +4 -3
  409. package/dist/governance-activation/migration.js +14 -6
  410. package/dist/governance-activation/migration.js.map +1 -1
  411. package/dist/governance-activation/phase-bootstrap-state.d.ts +3 -0
  412. package/dist/governance-activation/phase-bootstrap-state.js +128 -0
  413. package/dist/governance-activation/phase-bootstrap-state.js.map +1 -0
  414. package/dist/governance-activation/phase-discovery.d.ts +2 -0
  415. package/dist/governance-activation/phase-discovery.js +88 -0
  416. package/dist/governance-activation/phase-discovery.js.map +1 -0
  417. package/dist/governance-activation/phase-governance.d.ts +4 -0
  418. package/dist/governance-activation/phase-governance.js +141 -0
  419. package/dist/governance-activation/phase-governance.js.map +1 -0
  420. package/dist/governance-activation/phase-publication.d.ts +8 -0
  421. package/dist/governance-activation/phase-publication.js +318 -0
  422. package/dist/governance-activation/phase-publication.js.map +1 -0
  423. package/dist/governance-activation/read-only.d.ts +30 -0
  424. package/dist/governance-activation/read-only.js +93 -0
  425. package/dist/governance-activation/read-only.js.map +1 -0
  426. package/dist/governance-activation/readiness.d.ts +1 -24
  427. package/dist/governance-activation/readiness.js +1 -220
  428. package/dist/governance-activation/readiness.js.map +1 -1
  429. package/dist/governance-activation/reconciliation.d.ts +1 -1
  430. package/dist/governance-activation/reconciliation.js +3 -3
  431. package/dist/governance-activation/reconciliation.js.map +1 -1
  432. package/dist/governance-activation/release-integrity.d.ts +1 -1
  433. package/dist/governance-activation/release-integrity.js +2 -2
  434. package/dist/governance-activation/release-integrity.js.map +1 -1
  435. package/dist/governance-activation/seed-lifecycle.d.ts +10 -2
  436. package/dist/governance-activation/seed-lifecycle.js +244 -66
  437. package/dist/governance-activation/seed-lifecycle.js.map +1 -1
  438. package/dist/governance-activation/source-of-truth.d.ts +5 -3
  439. package/dist/governance-activation/source-of-truth.js +32 -52
  440. package/dist/governance-activation/source-of-truth.js.map +1 -1
  441. package/dist/governance-activation/spec-kit-seed.d.ts +9 -0
  442. package/dist/governance-activation/spec-kit-seed.js +43 -0
  443. package/dist/governance-activation/spec-kit-seed.js.map +1 -0
  444. package/dist/governance-activation/task-projection.d.ts +1 -1
  445. package/dist/governance-activation/transition-planning.d.ts +15 -0
  446. package/dist/governance-activation/transition-planning.js +250 -0
  447. package/dist/governance-activation/transition-planning.js.map +1 -0
  448. package/dist/governance-activation/transition-ports.d.ts +150 -0
  449. package/dist/governance-activation/transition-ports.js +2 -0
  450. package/dist/governance-activation/transition-ports.js.map +1 -0
  451. package/dist/governance-activation/transition-process.d.ts +7 -0
  452. package/dist/governance-activation/transition-process.js +21 -0
  453. package/dist/governance-activation/transition-process.js.map +1 -0
  454. package/dist/governance-activation/transition-records.d.ts +56 -0
  455. package/dist/governance-activation/transition-records.js +208 -0
  456. package/dist/governance-activation/transition-records.js.map +1 -0
  457. package/dist/governance-activation/transitions.d.ts +6 -157
  458. package/dist/governance-activation/transitions.js +143 -2045
  459. package/dist/governance-activation/transitions.js.map +1 -1
  460. package/dist/governance-activation/types.d.ts +1 -390
  461. package/dist/governance-activation/types.js +1 -107
  462. package/dist/governance-activation/types.js.map +1 -1
  463. package/dist/governance-activation/validators.d.ts +1 -17
  464. package/dist/governance-activation/validators.js +1 -1304
  465. package/dist/governance-activation/validators.js.map +1 -1
  466. package/dist/governance-assessment/catalog.d.ts +7 -0
  467. package/dist/governance-assessment/catalog.js +31 -0
  468. package/dist/governance-assessment/catalog.js.map +1 -0
  469. package/dist/governance-assessment/command.d.ts +10 -0
  470. package/dist/governance-assessment/command.js +77 -0
  471. package/dist/governance-assessment/command.js.map +1 -0
  472. package/dist/governance-assessment/engine.d.ts +14 -0
  473. package/dist/governance-assessment/engine.js +935 -0
  474. package/dist/governance-assessment/engine.js.map +1 -0
  475. package/dist/governance-assessment/index.d.ts +5 -0
  476. package/dist/governance-assessment/index.js +6 -0
  477. package/dist/governance-assessment/index.js.map +1 -0
  478. package/dist/governance-assessment/live-normalize.d.ts +1 -0
  479. package/dist/governance-assessment/live-normalize.js +2 -0
  480. package/dist/governance-assessment/live-normalize.js.map +1 -0
  481. package/dist/governance-assessment/live-transport.d.ts +34 -0
  482. package/dist/governance-assessment/live-transport.js +455 -0
  483. package/dist/governance-assessment/live-transport.js.map +1 -0
  484. package/dist/governance-assessment/live.d.ts +2 -0
  485. package/dist/governance-assessment/live.js +689 -0
  486. package/dist/governance-assessment/live.js.map +1 -0
  487. package/dist/governance-assessment/predicates.d.ts +1 -0
  488. package/dist/governance-assessment/predicates.js +2 -0
  489. package/dist/governance-assessment/predicates.js.map +1 -0
  490. package/dist/governance-assessment/project.d.ts +33 -0
  491. package/dist/governance-assessment/project.js +178 -0
  492. package/dist/governance-assessment/project.js.map +1 -0
  493. package/dist/governance-assessment/readers.d.ts +14 -0
  494. package/dist/governance-assessment/readers.js +122 -0
  495. package/dist/governance-assessment/readers.js.map +1 -0
  496. package/dist/governance-assessment/report.d.ts +1 -0
  497. package/dist/governance-assessment/report.js +2 -0
  498. package/dist/governance-assessment/report.js.map +1 -0
  499. package/dist/governance-assessment/sanitize.d.ts +1 -0
  500. package/dist/governance-assessment/sanitize.js +2 -0
  501. package/dist/governance-assessment/sanitize.js.map +1 -0
  502. package/dist/governance-assessment/types.d.ts +6 -0
  503. package/dist/governance-assessment/types.js +2 -0
  504. package/dist/governance-assessment/types.js.map +1 -0
  505. package/dist/governance-assessment/yaml.d.ts +1 -0
  506. package/dist/governance-assessment/yaml.js +2 -0
  507. package/dist/governance-assessment/yaml.js.map +1 -0
  508. package/dist/init-filesystem.d.ts +1 -1
  509. package/dist/init-filesystem.js +126 -174
  510. package/dist/init-filesystem.js.map +1 -1
  511. package/dist/interactive.d.ts +2 -2
  512. package/dist/interactive.js +42 -41
  513. package/dist/interactive.js.map +1 -1
  514. package/dist/migrate-plan.d.ts +5 -1
  515. package/dist/migrate-plan.js +87 -10
  516. package/dist/migrate-plan.js.map +1 -1
  517. package/dist/npm-template-assets.js +5 -4
  518. package/dist/npm-template-assets.js.map +1 -1
  519. package/dist/openspec-profile.d.ts +1 -1
  520. package/dist/opentofu-template-assets.js +3 -3
  521. package/dist/opentofu-template-assets.js.map +1 -1
  522. package/dist/package-identity.d.ts +3 -0
  523. package/dist/package-identity.js +13 -2
  524. package/dist/package-identity.js.map +1 -1
  525. package/dist/planner.d.ts +1 -19
  526. package/dist/planner.js +1 -565
  527. package/dist/planner.js.map +1 -1
  528. package/dist/process-runner.d.ts +5 -1
  529. package/dist/process-runner.js +164 -8
  530. package/dist/process-runner.js.map +1 -1
  531. package/dist/project-dependencies.d.ts +5 -3
  532. package/dist/project-dependencies.js +74 -63
  533. package/dist/project-dependencies.js.map +1 -1
  534. package/dist/published-verifier.js +67 -30
  535. package/dist/published-verifier.js.map +1 -1
  536. package/dist/python-template-assets.js +6 -9
  537. package/dist/python-template-assets.js.map +1 -1
  538. package/dist/reconcile.d.ts +1 -1
  539. package/dist/reconcile.js +2 -2
  540. package/dist/reconcile.js.map +1 -1
  541. package/dist/release-identity.js +19 -0
  542. package/dist/release-identity.js.map +1 -1
  543. package/dist/repository-governance.d.ts +10 -2
  544. package/dist/repository-governance.js +240 -99
  545. package/dist/repository-governance.js.map +1 -1
  546. package/dist/runtime.js +1 -1
  547. package/dist/runtime.js.map +1 -1
  548. package/dist/scan.d.ts +6 -2
  549. package/dist/scan.js +78 -30
  550. package/dist/scan.js.map +1 -1
  551. package/dist/self-upgrade.d.ts +1 -1
  552. package/dist/self-upgrade.js +20 -7
  553. package/dist/self-upgrade.js.map +1 -1
  554. package/dist/stable-release.js +7 -1
  555. package/dist/stable-release.js.map +1 -1
  556. package/dist/standard-templates.d.ts +2 -2
  557. package/dist/standard-templates.js +6 -841
  558. package/dist/standard-templates.js.map +1 -1
  559. package/dist/supported-stack.d.ts +3 -115
  560. package/dist/supported-stack.js +4 -438
  561. package/dist/supported-stack.js.map +1 -1
  562. package/dist/telemetry/contract.d.ts +2 -0
  563. package/dist/telemetry/contract.js +7 -0
  564. package/dist/telemetry/contract.js.map +1 -1
  565. package/dist/telemetry/index.d.ts +1 -1
  566. package/dist/templates.d.ts +10 -20
  567. package/dist/templates.js +52 -3238
  568. package/dist/templates.js.map +1 -1
  569. package/dist/types.d.ts +1 -263
  570. package/dist/types.js +1 -1
  571. package/dist/types.js.map +1 -1
  572. package/dist/version.js +2 -6
  573. package/dist/version.js.map +1 -1
  574. package/dist/workstation-catalog.d.ts +5 -2
  575. package/dist/workstation-catalog.js +33 -2
  576. package/dist/workstation-catalog.js.map +1 -1
  577. package/dist/workstation.d.ts +4 -3
  578. package/dist/workstation.js +86 -32
  579. package/dist/workstation.js.map +1 -1
  580. package/docs/assets/liftoff-terminal.svg +3 -3
  581. package/docs/azure-deployment.md +107 -10
  582. package/docs/cli-reference.md +127 -11
  583. package/docs/configuration-and-manifests.md +150 -35
  584. package/docs/existing-repositories.md +33 -6
  585. package/docs/getting-started.md +44 -31
  586. package/docs/prerequisites.md +34 -35
  587. package/docs/project-structure.md +45 -47
  588. package/docs/repository-governance.md +207 -24
  589. package/docs/safety-and-consent.md +65 -12
  590. package/docs/spec-workflows-and-agents.md +31 -28
  591. package/docs/supported-stack.md +11 -9
  592. package/docs/telemetry.md +9 -3
  593. package/docs/troubleshooting.md +107 -49
  594. package/docs/workloads.md +53 -62
  595. package/package.json +6 -8
  596. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/UPSTREAM_LICENSE.txt +0 -21
  597. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/catalog.json +0 -520
  598. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/packaged/gitignore +0 -27
  599. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/README.md +0 -25
  600. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/components.json +0 -22
  601. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/eslint.config.js +0 -23
  602. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/index.html +0 -13
  603. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/package-lock.json +0 -6156
  604. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/package.json +0 -60
  605. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/public/power-apps.svg +0 -55
  606. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/App.tsx +0 -17
  607. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/assets/react.svg +0 -1
  608. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/mode-toggle.tsx +0 -37
  609. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/badge.tsx +0 -46
  610. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/button.tsx +0 -60
  611. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/calendar.tsx +0 -211
  612. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/card.tsx +0 -92
  613. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/chart.tsx +0 -355
  614. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/checkbox.tsx +0 -32
  615. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/command.tsx +0 -184
  616. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/dialog.tsx +0 -141
  617. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/dropdown-menu.tsx +0 -257
  618. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/input.tsx +0 -21
  619. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/label.tsx +0 -22
  620. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/popover.tsx +0 -46
  621. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/progress.tsx +0 -29
  622. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/select.tsx +0 -185
  623. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/separator.tsx +0 -26
  624. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/skeleton.tsx +0 -13
  625. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/table.tsx +0 -114
  626. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/tabs.tsx +0 -66
  627. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/textarea.tsx +0 -18
  628. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/tooltip.tsx +0 -61
  629. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/hooks/use-theme.ts +0 -11
  630. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/index.css +0 -131
  631. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/lib/utils.ts +0 -6
  632. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/main.tsx +0 -10
  633. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/pages/_layout.tsx +0 -31
  634. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/pages/home.tsx +0 -59
  635. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/pages/not-found.tsx +0 -14
  636. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/providers/query-provider.tsx +0 -26
  637. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/providers/sonner-provider.tsx +0 -23
  638. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/providers/theme-provider.tsx +0 -64
  639. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/router.tsx +0 -24
  640. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/tsconfig.app.json +0 -34
  641. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/tsconfig.json +0 -13
  642. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/tsconfig.node.json +0 -26
  643. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/vite.config.ts +0 -19
  644. package/assets/power-apps-code-app/README.md +0 -27
  645. package/dist/code-apps-plugin.d.ts +0 -13
  646. package/dist/code-apps-plugin.js +0 -69
  647. package/dist/code-apps-plugin.js.map +0 -1
  648. package/dist/power-apps-assets.d.ts +0 -30
  649. package/dist/power-apps-assets.js +0 -131
  650. package/dist/power-apps-assets.js.map +0 -1
  651. package/dist/power-apps-templates.d.ts +0 -3
  652. package/dist/power-apps-templates.js +0 -173
  653. package/dist/power-apps-templates.js.map +0 -1
  654. package/dist/power-apps-validation.d.ts +0 -1
  655. package/dist/power-apps-validation.js +0 -79
  656. package/dist/power-apps-validation.js.map +0 -1
@@ -0,0 +1,39 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "profile": "single-maintainer-gitflow",
4
+ "policyVersion": "6",
5
+ "policyDigest": "9444e7339ea7747e49b8c11bada6ebc2f52e3e53cee7e1e8fd593353ce1ab149",
6
+ "families": ["azure", "deployment", "documentation", "dora", "environments", "evidence", "gitflow", "governance", "health", "identity", "monitoring", "promotion", "release", "retention", "rollback", "runner", "security"],
7
+ "controls": [
8
+ {"id":"identity.activation","title":"Recorded activation identity","policySection":"Liftoff activation protocol","severity":"warning","applicability":"always","evaluator":"identity","proofLayers":["recorded"],"expected":"installed-activation-identity","phaseIds":[],"supported":true,"exceptionAllowed":false,"ownership":"managed-core","recommendation":"Inspect the found and installed identities. Use a release with an explicit compatibility mapping; assessment cannot migrate state."},
9
+ {"id":"identity.managed-core","title":"Managed governance file drift","policySection":"Liftoff activation protocol","severity":"warning","applicability":"always","evaluator":"managed-core","proofLayers":["recorded","declared"],"expected":"installed-managed-artifacts","phaseIds":[],"supported":true,"exceptionAllowed":false,"ownership":"managed-core","recommendation":"Run liftoff update --check and review exact managed-core drift. Force cannot acquire unowned files or bypass compatibility."},
10
+ {"id":"gitflow.default-branch","title":"Default integration branch","policySection":"Phase 1 - Branching model","severity":"error","applicability":"always","evaluator":"default-branch","proofLayers":["live"],"expected":"develop","phaseIds":["phase-0-complete"],"supported":true,"exceptionAllowed":false,"ownership":"remote","recommendation":"Review the repository default branch through a separately approved governance change."},
11
+ {"id":"gitflow.protected-refs","title":"Protected GitFlow refs","policySection":"Phase 5 - Governance as code","severity":"error","applicability":"always","evaluator":"protected-refs","proofLayers":["declared","live"],"expected":true,"phaseIds":["rulesets-applied","live-readback"],"supported":true,"exceptionAllowed":false,"ownership":"remote","recommendation":"Review repository rulesets for develop, main, release/** and hotfix/** with deletion and force-push protection, strict checks, and no bypass actors."},
12
+ {"id":"governance.single-maintainer","title":"Single-maintainer pull request rules","policySection":"Fixed context - Single-maintainer repositories","severity":"error","applicability":"always","evaluator":"single-maintainer","proofLayers":["declared","live"],"expected":true,"phaseIds":["rulesets-applied"],"supported":true,"exceptionAllowed":false,"ownership":"remote","recommendation":"Keep required approving reviews at zero, code-owner review false, and last-push approval false. Automated checks remain the gate."},
13
+ {"id":"governance.no-codeowners","title":"No CODEOWNERS approval dependency","policySection":"Fixed context - Do not require human approval","severity":"warning","applicability":"always","evaluator":"no-codeowners","proofLayers":["declared"],"expected":false,"phaseIds":["workflow-source-ready"],"supported":true,"exceptionAllowed":false,"ownership":"project-owned","recommendation":"Review CODEOWNERS usage without introducing another human merge or deployment gate."},
14
+ {"id":"release.tag-controls","title":"Separate release tag creation and immutability rules","policySection":"Phase 5 - Governance as code","severity":"error","applicability":"always","evaluator":"tag-controls","proofLayers":["declared","live"],"expected":true,"phaseIds":["rulesets-applied"],"supported":true,"exceptionAllowed":false,"ownership":"remote","recommendation":"Review separate v* creation and immutable-tag rules; only the verified GitHub Actions application may bypass creation."},
15
+ {"id":"governance.required-contexts","title":"Observed exact required check contexts","policySection":"Phase 5 - Fail-closed sequencing","severity":"error","applicability":"always","evaluator":"required-contexts","proofLayers":["declared","live"],"expected":true,"phaseIds":["green-red-proof","rulesets-applied"],"supported":true,"exceptionAllowed":false,"ownership":"remote","recommendation":"Bind required check names and application identities to observed runs on the exact assessed commit. Review missing or skipped contexts before ruleset changes."},
16
+ {"id":"security.push-protection","title":"GitHub Secret Protection","policySection":"Phase 4 - Security pipeline","severity":"error","applicability":"always","evaluator":"push-protection","proofLayers":["live"],"expected":true,"phaseIds":["green-red-proof"],"supported":true,"exceptionAllowed":false,"ownership":"remote","recommendation":"Review GitHub secret scanning and push-protection settings using existing licensed capability; do not substitute duplicate scanners."},
17
+ {"id":"security.workflow-permissions","title":"Explicit bounded workflow permissions","policySection":"Fixed context - Automation identity","severity":"warning","applicability":"always","evaluator":"workflow-permissions","proofLayers":["declared"],"expected":true,"phaseIds":["workflow-source-ready"],"supported":true,"exceptionAllowed":false,"ownership":"project-owned","recommendation":"Review explicit least-privilege workflow and job permissions; broad write-all permissions are not a safe default."},
18
+ {"id":"security.action-pinning","title":"Immutable action references","policySection":"Phase 4 - SLSA L3 generator exception","severity":"warning","applicability":"always","evaluator":"action-pinning","proofLayers":["declared"],"expected":true,"phaseIds":["workflow-source-ready"],"supported":true,"exceptionAllowed":true,"ownership":"project-owned","recommendation":"Review immutable action references. The only permitted action-reference exception is the exact official SLSA generator with scoped, expiring approval."},
19
+ {"id":"security.fail-open-flags","title":"Required-job fail-open configuration","policySection":"Phase 5 - No required check may fail open","severity":"error","applicability":"always","evaluator":"fail-open-flags","proofLayers":["declared"],"expected":false,"phaseIds":["workflow-source-ready","green-red-proof"],"supported":true,"exceptionAllowed":false,"ownership":"project-owned","recommendation":"Review continue-on-error and unresolved conditions on required jobs. Static inspection does not establish full script failure semantics."},
20
+ {"id":"security.pipeline","title":"Declared security stage and tool inventory","policySection":"Phase 4 - Security pipeline","severity":"warning","applicability":"always","evaluator":"pipeline","proofLayers":["declared","live"],"expected":true,"phaseIds":["workflow-source-ready","green-red-proof"],"supported":true,"exceptionAllowed":false,"ownership":"project-owned","recommendation":"Review the canonical GitHub, Checkov, Trivy, report-only Grype, ZAP, attestation and Scorecard roles. Unresolved reusable workflows or scripts need separate evidence."},
21
+ {"id":"environments.configuration","title":"Applicable deployment environments and review gates","policySection":"Phase 3 - Promotion","severity":"error","applicability":"api","evaluator":"environments","proofLayers":["live"],"expected":"project-environments-without-reviewers","phaseIds":["staging-qualified","production-rehearsed"],"supported":true,"exceptionAllowed":false,"ownership":"remote","recommendation":"Review the project's declared environments and GitHub environment restrictions without human reviewer gates."},
22
+ {"id":"runner.private-assignment","title":"Repository-bound private runner assignment","policySection":"Private Staging runner provisioning contract","severity":"error","applicability":"private-dast","evaluator":"runner","proofLayers":["recorded","live"],"expected":true,"phaseIds":["runner-ready"],"supported":true,"exceptionAllowed":false,"ownership":"remote","recommendation":"Review the exact hosted-runner, group, network, labels and selected-repository bindings. Assessment does not create or broaden assignments."},
23
+ {"id":"azure.providers","title":"Required provider registration states","policySection":"Private Staging runner provisioning contract","severity":"error","applicability":"api","evaluator":"providers","proofLayers":["live"],"expected":"Registered","phaseIds":["provider-ready"],"supported":true,"exceptionAllowed":false,"ownership":"remote","recommendation":"Review only the namespaces needed by explicitly bound resources. Provider registration requires a separately approved execution plan."},
24
+ {"id":"azure.storage-redundancy","title":"Bound storage redundancy","policySection":"Pre-answered platform defaults","severity":"error","applicability":"api","evaluator":"storage","proofLayers":["live"],"expected":{"state":"ZRS in every environment","application":{"dev":"LRS","staging":"ZRS","prod":"ZRS"}},"phaseIds":["remote-ready","application-foundation"],"supported":true,"exceptionAllowed":false,"ownership":"remote","recommendation":"Compare the explicitly bound storage role and environment before planning redundancy changes; never provision an unused service."},
25
+ {"id":"azure.network-egress","title":"Explicit private runner egress","policySection":"Private Staging runner provisioning contract - explicit outbound mode","severity":"error","applicability":"private-dast","evaluator":"network","proofLayers":["recorded","live"],"expected":true,"phaseIds":["bootstrap-local","runner-ready"],"supported":true,"exceptionAllowed":false,"ownership":"remote","recommendation":"Review explicit outbound access and mutually exclusive NAT/Firewall routing using validated Staging bindings; never share another repository's firewall."},
26
+ {"id":"evidence.governance","title":"Current authoritative governance evidence","policySection":"Liftoff activation protocol","severity":"warning","applicability":"always","evaluator":"evidence","proofLayers":["evidence"],"expected":true,"phaseIds":[],"supported":true,"exceptionAllowed":false,"ownership":"project-owned","recommendation":"Refresh missing or stale proof through supported setup operations after reviewing blockers; reports and task checkboxes are not phase evidence."},
27
+ {"id":"documentation.inventory","title":"Required operational and security documentation","policySection":"Phase 6 - Documentation","severity":"warning","applicability":"always","evaluator":"documentation","proofLayers":["declared"],"expected":true,"phaseIds":["workflow-source-ready"],"supported":true,"exceptionAllowed":false,"ownership":"project-owned","recommendation":"Review missing governance, scanning, alerting, health, audit-evidence, acceptable-use and rollback runbook documents in a separate project change."},
28
+ {"id":"release.provenance","title":"Release version and verified attestation binding","policySection":"Phase 2 - Release versioning on main","severity":"warning","applicability":"always","evaluator":"unsupported","proofLayers":["evidence"],"expected":"verified version, candidate SHA, deployed digest and signer binding","phaseIds":["production-rehearsed"],"supported":false,"exceptionAllowed":false,"ownership":"project-owned","recommendation":"Supply independently verifiable release and attestation evidence; file or asset presence alone does not verify provenance."},
29
+ {"id":"promotion.identical-artifact","title":"Build-once identical artifact promotion","policySection":"Phase 3 - Promotion","severity":"warning","applicability":"always","evaluator":"unsupported","proofLayers":["evidence"],"expected":"same qualified digest across environments","phaseIds":["staging-qualified","production-rehearsed"],"supported":false,"exceptionAllowed":false,"ownership":"project-owned","recommendation":"Verify immutable candidate and deployed digest records. Assessment does not build, scan, dispatch, or deploy artifacts."},
30
+ {"id":"deployment.blue-green-canary","title":"Blue-green and canary execution proof","policySection":"Deployment strategy - blue-green mechanism, canary exposure","severity":"warning","applicability":"api","evaluator":"unsupported","proofLayers":["evidence"],"expected":"validated rollout observations","phaseIds":["production-rehearsed"],"supported":false,"exceptionAllowed":false,"ownership":"project-owned","recommendation":"Review real rollout and traffic evidence; declarative files alone do not prove behavior."},
31
+ {"id":"rollback.rehearsal","title":"Ungated rollback rehearsal","policySection":"Roll back first, debug later","severity":"warning","applicability":"always","evaluator":"unsupported","proofLayers":["evidence"],"expected":"dated successful rollback by prior digest","phaseIds":["production-rehearsed"],"supported":false,"exceptionAllowed":false,"ownership":"project-owned","recommendation":"Provide rollback rehearsal evidence; assessment never triggers a rollback or adds a reviewer gate."},
32
+ {"id":"monitoring.alert-delivery","title":"Runtime monitoring and end-to-end alerts","policySection":"Runtime monitoring and alerting","severity":"warning","applicability":"always","evaluator":"unsupported","proofLayers":["evidence"],"expected":"observed health signals and alert delivery","phaseIds":["production-rehearsed"],"supported":false,"exceptionAllowed":false,"ownership":"project-owned","recommendation":"Supply verified alert delivery and monitoring evidence without exposing webhook or credential values."},
33
+ {"id":"health.deep-checks","title":"Deep dependency health and recovery order","policySection":"Service health model","severity":"warning","applicability":"api","evaluator":"unsupported","proofLayers":["evidence"],"expected":"validated component and dependency health","phaseIds":["application-foundation"],"supported":false,"exceptionAllowed":false,"ownership":"project-owned","recommendation":"Review observed deep health and dependency recovery evidence; do not infer it from endpoint names."},
34
+ {"id":"dora.measurements","title":"Delivery performance measurements","policySection":"Delivery performance - DORA four keys","severity":"info","applicability":"always","evaluator":"unsupported","proofLayers":["evidence"],"expected":"source-bound delivery metrics","phaseIds":[],"supported":false,"exceptionAllowed":false,"ownership":"project-owned","recommendation":"Review measured delivery outcomes; no DORA measurement adapter is available in this assessment version."},
35
+ {"id":"runner.private-reachability","title":"Private DNS and Staging reachability proof","policySection":"Private Staging runner provisioning contract - Prove isolation and the private path","severity":"warning","applicability":"private-dast","evaluator":"unsupported","proofLayers":["evidence"],"expected":"live private path proof from the assigned runner","phaseIds":["private-backend-proof","staging-qualified"],"supported":false,"exceptionAllowed":false,"ownership":"project-owned","recommendation":"Provide current runner-origin private reachability evidence; assessment does not schedule DAST or infer reachability from a VNet."},
36
+ {"id":"retention.bootstrap-disposal","title":"Bootstrap state custody and day-30 disposal","policySection":"Pre-answered platform defaults","severity":"warning","applicability":"state-path","evaluator":"unsupported","proofLayers":["evidence"],"expected":"validated encrypted custody and disposal evidence","phaseIds":["bootstrap-state-disposed"],"supported":false,"exceptionAllowed":false,"ownership":"project-owned","recommendation":"Review non-secret retention and deletion evidence. Assessment never reads state payloads or encryption keys."},
37
+ {"id":"security.fail-closed-execution","title":"Deliberate negative required-check proof","policySection":"Phase 5 - Prove each check fails","severity":"warning","applicability":"always","evaluator":"unsupported","proofLayers":["evidence"],"expected":"green and deliberate red proof for exact required contexts","phaseIds":["green-red-proof"],"supported":false,"exceptionAllowed":false,"ownership":"project-owned","recommendation":"Use existing authoritative negative-test evidence; assessment must not plant violations or trigger validation workflows."}
38
+ ]
39
+ }
@@ -84,7 +84,9 @@
84
84
  "dependencies": {
85
85
  "@inquirer/prompts": "^8.6.0",
86
86
  "cross-spawn": "^7.0.6",
87
- "picocolors": "^1.1.1"
87
+ "picocolors": "^1.1.1",
88
+ "smol-toml": "1.8.0",
89
+ "yaml": "^2.9.0"
88
90
  },
89
91
  "devDependencies": {
90
92
  "@types/cross-spawn": "^6.0.6",
@@ -98,7 +100,9 @@
98
100
  "dependencies": {
99
101
  "@inquirer/prompts": "8.7.0",
100
102
  "cross-spawn": "7.0.6",
101
- "picocolors": "1.1.1"
103
+ "picocolors": "1.1.1",
104
+ "smol-toml": "1.8.0",
105
+ "yaml": "2.9.0"
102
106
  },
103
107
  "devDependencies": {
104
108
  "@types/cross-spawn": "6.0.6",
@@ -231,130 +235,6 @@
231
235
  },
232
236
  "devDependencies": {}
233
237
  }
234
- },
235
- "power-apps-code-app": {
236
- "manifestPathParts": [
237
- "assets",
238
- "power-apps-code-app",
239
- "3438c352483e40982f6c5c0fc36fd71f8e7adbbb",
240
- "starter",
241
- "package.json"
242
- ],
243
- "lockPathParts": [
244
- "assets",
245
- "power-apps-code-app",
246
- "3438c352483e40982f6c5c0fc36fd71f8e7adbbb",
247
- "starter",
248
- "package-lock.json"
249
- ],
250
- "freshnessPolicy": "declared-range",
251
- "requirements": {
252
- "dependencies": {
253
- "@microsoft/power-apps": "^1.2.5",
254
- "@radix-ui/react-checkbox": "^1.3.3",
255
- "@radix-ui/react-dialog": "^1.1.15",
256
- "@radix-ui/react-dropdown-menu": "^2.1.16",
257
- "@radix-ui/react-label": "^2.1.7",
258
- "@radix-ui/react-popover": "^1.1.15",
259
- "@radix-ui/react-progress": "^1.1.7",
260
- "@radix-ui/react-select": "^2.2.6",
261
- "@radix-ui/react-separator": "^1.1.7",
262
- "@radix-ui/react-slot": "^1.2.3",
263
- "@radix-ui/react-tabs": "^1.1.13",
264
- "@radix-ui/react-tooltip": "^1.2.8",
265
- "@tailwindcss/vite": "^4.1.16",
266
- "@tanstack/react-query": "^5.90.5",
267
- "@tanstack/react-table": "^8.21.3",
268
- "class-variance-authority": "^0.7.1",
269
- "clsx": "^2.1.1",
270
- "cmdk": "^1.1.1",
271
- "date-fns": "^4.1.0",
272
- "lucide-react": "^0.546.0",
273
- "react": "^19.1.1",
274
- "react-day-picker": "^9.11.1",
275
- "react-dom": "^19.1.1",
276
- "react-router-dom": "^7.9.4",
277
- "recharts": "^2.15.4",
278
- "sonner": "^2.0.7",
279
- "tailwind-merge": "^3.3.1",
280
- "tailwindcss": "^4.1.16",
281
- "zustand": "^5.0.10"
282
- },
283
- "devDependencies": {
284
- "@eslint/js": "^9.36.0",
285
- "@microsoft/power-apps-vite": "^1.0.2",
286
- "@types/node": "^24.6.0",
287
- "@types/react": "^19.1.16",
288
- "@types/react-dom": "^19.1.9",
289
- "@vitejs/plugin-react": "^5.0.4",
290
- "eslint": "^9.36.0",
291
- "eslint-plugin-react-hooks": "^5.2.0",
292
- "eslint-plugin-react-refresh": "^0.4.22",
293
- "globals": "^16.4.0",
294
- "picocolors": "^1.1.1",
295
- "tw-animate-css": "^1.4.0",
296
- "typescript": "~5.9.3",
297
- "typescript-eslint": "^8.45.0",
298
- "vite": "^7.1.7"
299
- }
300
- },
301
- "resolved": {
302
- "dependencies": {
303
- "@microsoft/power-apps": "1.2.7",
304
- "@radix-ui/react-checkbox": "1.3.11",
305
- "@radix-ui/react-dialog": "1.1.23",
306
- "@radix-ui/react-dropdown-menu": "2.1.24",
307
- "@radix-ui/react-label": "2.1.15",
308
- "@radix-ui/react-popover": "1.1.23",
309
- "@radix-ui/react-progress": "1.1.16",
310
- "@radix-ui/react-select": "2.3.7",
311
- "@radix-ui/react-separator": "1.1.15",
312
- "@radix-ui/react-slot": "1.3.3",
313
- "@radix-ui/react-tabs": "1.1.21",
314
- "@radix-ui/react-tooltip": "1.2.16",
315
- "@tailwindcss/vite": "4.3.3",
316
- "@tanstack/react-query": "5.102.2",
317
- "@tanstack/react-table": "8.21.3",
318
- "class-variance-authority": "0.7.1",
319
- "clsx": "2.1.1",
320
- "cmdk": "1.1.1",
321
- "date-fns": "4.4.0",
322
- "lucide-react": "0.546.0",
323
- "react": "19.2.8",
324
- "react-day-picker": "9.14.0",
325
- "react-dom": "19.2.8",
326
- "react-router-dom": "7.18.2",
327
- "recharts": "2.15.4",
328
- "sonner": "2.0.8",
329
- "tailwind-merge": "3.6.0",
330
- "tailwindcss": "4.3.3",
331
- "zustand": "5.0.15"
332
- },
333
- "devDependencies": {
334
- "@eslint/js": "9.39.5",
335
- "@microsoft/power-apps-vite": "1.0.2",
336
- "@types/node": "24.13.3",
337
- "@types/react": "19.2.18",
338
- "@types/react-dom": "19.2.5",
339
- "@vitejs/plugin-react": "5.2.0",
340
- "eslint": "9.39.5",
341
- "eslint-plugin-react-hooks": "5.2.0",
342
- "eslint-plugin-react-refresh": "0.4.26",
343
- "globals": "16.5.0",
344
- "picocolors": "1.1.1",
345
- "tw-animate-css": "1.4.0",
346
- "typescript": "5.9.3",
347
- "typescript-eslint": "8.67.0",
348
- "vite": "7.3.6"
349
- }
350
- },
351
- "selectionExceptions": {
352
- "@microsoft/power-apps": {
353
- "selectedVersion": "1.2.7",
354
- "reviewedCandidateVersion": "1.3.0",
355
- "reason": "Power Apps SDK 1.2.12 and newer remove the project-local power-apps CLI required by the current Liftoff workload contract; adopting the new global pa CLI requires a separate reviewed workload migration."
356
- }
357
- }
358
238
  }
359
239
  },
360
240
  "pythonProjects": {
@@ -696,16 +576,5 @@
696
576
  "source": "https://hub.docker.com/_/node"
697
577
  }
698
578
  },
699
- "upstreams": {
700
- "power-apps-code-app": {
701
- "repository": "https://github.com/microsoft/PowerAppsCodeApps",
702
- "path": "templates/starter",
703
- "commit": "3438c352483e40982f6c5c0fc36fd71f8e7adbbb",
704
- "compatibleSourceCommits": [
705
- "3438c352483e40982f6c5c0fc36fd71f8e7adbbb",
706
- "22e5c0bc0ef7ba516d9ad6281d6b0c4eb114df55"
707
- ],
708
- "source": "https://github.com/microsoft/PowerAppsCodeApps/commit/3438c352483e40982f6c5c0fc36fd71f8e7adbbb"
709
- }
710
- }
579
+ "upstreams": {}
711
580
  }
@@ -0,0 +1,2 @@
1
+ import type { ExternalCommand } from '../../domain/project/contracts.js';
2
+ export declare function azureAssessmentGetCommand(url: string): ExternalCommand;
@@ -0,0 +1,21 @@
1
+ export function azureAssessmentGetCommand(url) {
2
+ const parsed = new URL(url);
3
+ if (parsed.origin !== 'https://management.azure.com' ||
4
+ !parsed.pathname.startsWith('/subscriptions/') ||
5
+ parsed.username ||
6
+ parsed.password ||
7
+ parsed.hash) {
8
+ throw new Error('Azure assessment URL must use an explicitly scoped ARM subscription path.');
9
+ }
10
+ return {
11
+ executable: 'az',
12
+ args: [
13
+ 'rest',
14
+ '--method', 'GET',
15
+ '--url', parsed.href,
16
+ '--output', 'json',
17
+ '--only-show-errors'
18
+ ]
19
+ };
20
+ }
21
+ //# sourceMappingURL=governance-assessment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"governance-assessment.js","sourceRoot":"","sources":["../../../src/adapters/azure/governance-assessment.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,yBAAyB,CAAC,GAAW;IACnD,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IAC5B,IACE,MAAM,CAAC,MAAM,KAAK,8BAA8B;QAChD,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,iBAAiB,CAAC;QAC9C,MAAM,CAAC,QAAQ;QACf,MAAM,CAAC,QAAQ;QACf,MAAM,CAAC,IAAI,EACX,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,2EAA2E,CAAC,CAAC;IAC/F,CAAC;IACD,OAAO;QACL,UAAU,EAAE,IAAI;QAChB,IAAI,EAAE;YACJ,MAAM;YACN,UAAU,EAAE,KAAK;YACjB,OAAO,EAAE,MAAM,CAAC,IAAI;YACpB,UAAU,EAAE,MAAM;YAClB,oBAAoB;SACrB;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function replaceFileAtomically(targetPath: string, content: string | Buffer): Promise<void>;
2
+ export declare function createFileAtomically(targetPath: string, content: string | Buffer, mode: number, onCreated?: () => void): Promise<void>;
@@ -0,0 +1,74 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { link, lstat, mkdir, open, rename, unlink } from 'node:fs/promises';
3
+ import path from 'node:path';
4
+ function errorCode(error) {
5
+ return typeof error === 'object' && error !== null && 'code' in error ? error.code : undefined;
6
+ }
7
+ function errorMessage(error) {
8
+ return error instanceof Error ? error.message : String(error);
9
+ }
10
+ export async function replaceFileAtomically(targetPath, content) {
11
+ let mode;
12
+ try {
13
+ const existing = await lstat(targetPath);
14
+ if (!existing.isFile())
15
+ throw new Error('Atomic replacement requires a regular-file destination.');
16
+ mode = existing.mode & 0o7777;
17
+ }
18
+ catch (error) {
19
+ if (errorCode(error) !== 'ENOENT')
20
+ throw error;
21
+ }
22
+ return writeAtomicFile(targetPath, content, mode, (temporary) => rename(temporary, targetPath), true);
23
+ }
24
+ export async function createFileAtomically(targetPath, content, mode, onCreated) {
25
+ return writeAtomicFile(targetPath, content, mode, async (temporary) => {
26
+ await link(temporary, targetPath);
27
+ // Track the destination even if the subsequent temporary-file cleanup fails.
28
+ onCreated?.();
29
+ await unlink(temporary);
30
+ });
31
+ }
32
+ async function writeAtomicFile(targetPath, content, mode, commit, createParents = false) {
33
+ const temporaryPath = path.join(path.dirname(targetPath), `.${path.basename(targetPath)}.liftoff-${process.pid}-${randomUUID()}.tmp`);
34
+ let handle;
35
+ let ownsTemporaryPath = false;
36
+ try {
37
+ if (createParents)
38
+ await mkdir(path.dirname(targetPath), { recursive: true });
39
+ handle = await open(temporaryPath, 'wx', mode);
40
+ ownsTemporaryPath = true;
41
+ if (mode !== undefined)
42
+ await handle.chmod(mode);
43
+ await handle.writeFile(content);
44
+ await handle.close();
45
+ handle = undefined;
46
+ await commit(temporaryPath);
47
+ }
48
+ catch (error) {
49
+ const cleanupFailures = [];
50
+ if (handle) {
51
+ try {
52
+ await handle.close();
53
+ }
54
+ catch (closeError) {
55
+ cleanupFailures.push(`close: ${errorMessage(closeError)}`);
56
+ }
57
+ }
58
+ if (ownsTemporaryPath) {
59
+ try {
60
+ await unlink(temporaryPath);
61
+ }
62
+ catch (cleanupError) {
63
+ if (errorCode(cleanupError) !== 'ENOENT') {
64
+ cleanupFailures.push(`unlink: ${errorMessage(cleanupError)}`);
65
+ }
66
+ }
67
+ }
68
+ const detail = cleanupFailures.length
69
+ ? ` Temporary-file cleanup also failed: ${cleanupFailures.join('; ')}`
70
+ : '';
71
+ throw new Error(`${errorMessage(error)}${detail}`, { cause: error });
72
+ }
73
+ }
74
+ //# sourceMappingURL=atomic-write.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"atomic-write.js","sourceRoot":"","sources":["../../../src/adapters/filesystem/atomic-write.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE5E,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,SAAS,SAAS,CAAC,KAAc;IAC/B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;AACjG,CAAC;AAED,SAAS,YAAY,CAAC,KAAc;IAClC,OAAO,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAChE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,UAAkB,EAAE,OAAwB;IACtF,IAAI,IAAwB,CAAC;IAC7B,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,CAAC;QACzC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;QACnG,IAAI,GAAG,QAAQ,CAAC,IAAI,GAAG,MAAM,CAAC;IAChC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,SAAS,CAAC,KAAK,CAAC,KAAK,QAAQ;YAAE,MAAM,KAAK,CAAC;IACjD,CAAC;IACD,OAAO,eAAe,CAAC,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,UAAU,CAAC,EAAE,IAAI,CAAC,CAAC;AACxG,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,UAAkB,EAClB,OAAwB,EACxB,IAAY,EACZ,SAAsB;IAEtB,OAAO,eAAe,CAAC,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE;QACpE,MAAM,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QAClC,6EAA6E;QAC7E,SAAS,EAAE,EAAE,CAAC;QACd,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,eAAe,CAC5B,UAAkB,EAClB,OAAwB,EACxB,IAAwB,EACxB,MAAgD,EAChD,aAAa,GAAG,KAAK;IAErB,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAC7B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EACxB,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,YAAY,OAAO,CAAC,GAAG,IAAI,UAAU,EAAE,MAAM,CAC3E,CAAC;IACF,IAAI,MAA8B,CAAC;IACnC,IAAI,iBAAiB,GAAG,KAAK,CAAC;IAC9B,IAAI,CAAC;QACH,IAAI,aAAa;YAAE,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9E,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAC/C,iBAAiB,GAAG,IAAI,CAAC;QACzB,IAAI,IAAI,KAAK,SAAS;YAAE,MAAM,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACjD,MAAM,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAChC,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACrB,MAAM,GAAG,SAAS,CAAC;QACnB,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;IAC9B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,eAAe,GAAa,EAAE,CAAC;QACrC,IAAI,MAAM,EAAE,CAAC;YACX,IAAI,CAAC;gBACH,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;YACvB,CAAC;YAAC,OAAO,UAAU,EAAE,CAAC;gBACpB,eAAe,CAAC,IAAI,CAAC,UAAU,YAAY,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC;QACD,IAAI,iBAAiB,EAAE,CAAC;YACtB,IAAI,CAAC;gBACH,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;YAC9B,CAAC;YAAC,OAAO,YAAY,EAAE,CAAC;gBACtB,IAAI,SAAS,CAAC,YAAY,CAAC,KAAK,QAAQ,EAAE,CAAC;oBACzC,eAAe,CAAC,IAAI,CAAC,WAAW,YAAY,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;gBAChE,CAAC;YACH,CAAC;QACH,CAAC;QACD,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM;YACnC,CAAC,CAAC,wCAAwC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YACtE,CAAC,CAAC,EAAE,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC,GAAG,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IACvE,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function errorCode(error: unknown): string | undefined;
2
+ export declare function errorMessage(error: unknown): string;
@@ -0,0 +1,8 @@
1
+ export function errorCode(error) {
2
+ return typeof error === 'object' && error !== null && 'code' in error &&
3
+ typeof error.code === 'string' ? error.code : undefined;
4
+ }
5
+ export function errorMessage(error) {
6
+ return error instanceof Error ? error.message : String(error);
7
+ }
8
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/adapters/filesystem/errors.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,SAAS,CAAC,KAAc;IACtC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,MAAM,IAAI,KAAK;QACnE,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAc;IACzC,OAAO,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAChE,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function readManifestFile(projectRoot: string): Promise<unknown>;
@@ -0,0 +1,21 @@
1
+ import { lstat } from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { FileSystemError } from '../../domain/project/errors.js';
4
+ import { errorMessage } from './errors.js';
5
+ import { readProjectFile } from './project-files.js';
6
+ export async function readManifestFile(projectRoot) {
7
+ try {
8
+ const marker = await lstat(path.join(projectRoot, 'liftoff.manifest.json'));
9
+ if (!marker.isFile()) {
10
+ throw new FileSystemError('liftoff.manifest.json must be a regular file, not a directory, symlink, or junction.');
11
+ }
12
+ const bytes = await readProjectFile(projectRoot, ['liftoff.manifest.json']);
13
+ if (bytes === undefined)
14
+ throw new Error('file does not exist');
15
+ return JSON.parse(bytes.toString('utf8'));
16
+ }
17
+ catch (error) {
18
+ throw new FileSystemError(`Unable to read liftoff.manifest.json: ${errorMessage(error)}`);
19
+ }
20
+ }
21
+ //# sourceMappingURL=manifest-file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest-file.js","sourceRoot":"","sources":["../../../src/adapters/filesystem/manifest-file.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,WAAmB;IACxD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,uBAAuB,CAAC,CAAC,CAAC;QAC5E,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;YACrB,MAAM,IAAI,eAAe,CAAC,sFAAsF,CAAC,CAAC;QACpH,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC,WAAW,EAAE,CAAC,uBAAuB,CAAC,CAAC,CAAC;QAC5E,IAAI,KAAK,KAAK,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;QAChE,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAY,CAAC;IACvD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,eAAe,CAAC,yCAAyC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC5F,CAAC;AACH,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { ProjectOptions } from '../../domain/project/contracts.js';
2
+ import type { ProjectCatalog } from '../../domain/project/catalog.js';
3
+ export type ProjectConfigCatalog = Pick<ProjectCatalog, 'canonicalizeCodingAgents' | 'getApiStack' | 'getCodingAgent' | 'getEnvironment' | 'getGovernanceProfile' | 'getPattern' | 'getProjectType' | 'getProvider' | 'getSpecWorkflow' | 'resolveRegion'>;
4
+ export declare function loadProjectConfigOptions(configPath: string, cwd: string, catalog: ProjectConfigCatalog): Promise<ProjectOptions>;
@@ -0,0 +1,157 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { PlanValidationError } from '../../domain/project/planning.js';
4
+ import { isRetiredPowerAppsWorkload, retiredPowerAppsMessage } from '../../domain/project/retired-workload.js';
5
+ const CONFIG_FIELDS = new Set([
6
+ 'projectName',
7
+ 'projectType',
8
+ 'apiStack',
9
+ 'pattern',
10
+ 'cloud',
11
+ 'region',
12
+ 'includeFrontend',
13
+ 'environments',
14
+ 'specWorkflow',
15
+ 'agents',
16
+ 'defaultAgent',
17
+ 'governanceProfile'
18
+ ]);
19
+ function isRecord(value) {
20
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
21
+ }
22
+ function optionalConfigString(config, field) {
23
+ const value = config[field];
24
+ if (value === undefined) {
25
+ return undefined;
26
+ }
27
+ if (typeof value !== 'string' || value.trim().length === 0) {
28
+ throw new PlanValidationError([`Configuration field ${field} must be a non-empty string.`]);
29
+ }
30
+ return value;
31
+ }
32
+ function resolveConfigCatalogValue(config, field, resolver) {
33
+ const value = optionalConfigString(config, field);
34
+ if (value === undefined) {
35
+ return undefined;
36
+ }
37
+ const resolved = resolver(value);
38
+ if (!resolved) {
39
+ throw new PlanValidationError([`Configuration field ${field} has unsupported value ${JSON.stringify(value)}.`]);
40
+ }
41
+ return resolved.id;
42
+ }
43
+ export async function loadProjectConfigOptions(configPath, cwd, catalog) {
44
+ const { canonicalizeCodingAgents, getApiStack, getCodingAgent, getEnvironment, getGovernanceProfile, getPattern, getProjectType, getProvider, getSpecWorkflow, resolveRegion } = catalog;
45
+ const resolvedPath = path.resolve(cwd, configPath);
46
+ let raw;
47
+ try {
48
+ raw = await readFile(resolvedPath, 'utf8');
49
+ }
50
+ catch (error) {
51
+ throw new PlanValidationError([
52
+ `Unable to read configuration ${resolvedPath}: ${error instanceof Error ? error.message : String(error)}`
53
+ ]);
54
+ }
55
+ let parsed;
56
+ try {
57
+ parsed = JSON.parse(raw);
58
+ }
59
+ catch (error) {
60
+ throw new PlanValidationError([
61
+ `Unable to parse configuration ${resolvedPath}: ${error instanceof Error ? error.message : String(error)}`
62
+ ]);
63
+ }
64
+ if (!isRecord(parsed)) {
65
+ throw new PlanValidationError(['Configuration root must be a JSON object.']);
66
+ }
67
+ if (isRetiredPowerAppsWorkload(parsed.projectType)) {
68
+ throw new PlanValidationError([retiredPowerAppsMessage(String(parsed.projectType))]);
69
+ }
70
+ if (Object.hasOwn(parsed, 'codeAppsPlugin')) {
71
+ throw new PlanValidationError([
72
+ 'Configuration field codeAppsPlugin was removed because Power Apps code apps are retired and unsupported.'
73
+ ]);
74
+ }
75
+ const unknownFields = Object.keys(parsed).filter((field) => !CONFIG_FIELDS.has(field));
76
+ if (unknownFields.length > 0) {
77
+ throw new PlanValidationError([`Unknown configuration field${unknownFields.length === 1 ? '' : 's'}: ${unknownFields.join(', ')}.`]);
78
+ }
79
+ const projectName = optionalConfigString(parsed, 'projectName');
80
+ const projectType = resolveConfigCatalogValue(parsed, 'projectType', getProjectType);
81
+ const apiStack = resolveConfigCatalogValue(parsed, 'apiStack', getApiStack);
82
+ const pattern = resolveConfigCatalogValue(parsed, 'pattern', getPattern);
83
+ const cloud = resolveConfigCatalogValue(parsed, 'cloud', getProvider);
84
+ const specWorkflow = resolveConfigCatalogValue(parsed, 'specWorkflow', getSpecWorkflow);
85
+ const defaultAgent = resolveConfigCatalogValue(parsed, 'defaultAgent', getCodingAgent);
86
+ const governanceProfile = resolveConfigCatalogValue(parsed, 'governanceProfile', getGovernanceProfile);
87
+ const includeFrontendValue = parsed.includeFrontend;
88
+ if (includeFrontendValue !== undefined && typeof includeFrontendValue !== 'boolean') {
89
+ throw new PlanValidationError(['Configuration field includeFrontend must be a boolean.']);
90
+ }
91
+ let selectedEnvironments;
92
+ if (parsed.environments !== undefined) {
93
+ if (!Array.isArray(parsed.environments) || parsed.environments.length === 0) {
94
+ throw new PlanValidationError(['Configuration field environments must be a non-empty string array.']);
95
+ }
96
+ selectedEnvironments = parsed.environments.map((value, index) => {
97
+ if (typeof value !== 'string') {
98
+ throw new PlanValidationError([`Configuration field environments[${index}] must be a string.`]);
99
+ }
100
+ const environment = getEnvironment(value);
101
+ if (!environment) {
102
+ throw new PlanValidationError([`Configuration field environments contains unsupported value ${JSON.stringify(value)}.`]);
103
+ }
104
+ return environment.id;
105
+ });
106
+ if (new Set(selectedEnvironments).size !== selectedEnvironments.length) {
107
+ throw new PlanValidationError(['Configuration field environments must not contain duplicates.']);
108
+ }
109
+ }
110
+ let selectedAgents;
111
+ if (parsed.agents !== undefined) {
112
+ if (!Array.isArray(parsed.agents) || parsed.agents.length === 0) {
113
+ throw new PlanValidationError(['Configuration field agents must be a non-empty string array.']);
114
+ }
115
+ const values = parsed.agents.map((value, index) => {
116
+ if (typeof value !== 'string') {
117
+ throw new PlanValidationError([`Configuration field agents[${index}] must be a string.`]);
118
+ }
119
+ return value;
120
+ });
121
+ const resolved = canonicalizeCodingAgents(values);
122
+ if (resolved.unknown.length > 0) {
123
+ throw new PlanValidationError([
124
+ `Configuration field agents contains unsupported value ${JSON.stringify(resolved.unknown[0])}.`
125
+ ]);
126
+ }
127
+ selectedAgents = resolved.agents.map((agent) => agent.id);
128
+ }
129
+ let region = optionalConfigString(parsed, 'region');
130
+ const provider = cloud ? getProvider(cloud) : getProvider('azure');
131
+ if (region && provider?.status === 'available') {
132
+ const resolution = resolveRegion(provider.id, region);
133
+ if (resolution.status !== 'resolved') {
134
+ throw new PlanValidationError([
135
+ resolution.status === 'ambiguous'
136
+ ? `Configuration field region ${JSON.stringify(region)} is ambiguous. Use one of: ${resolution.matches.map((match) => match.slug).join(', ')}.`
137
+ : `Configuration field region has unsupported value ${JSON.stringify(region)}.`
138
+ ]);
139
+ }
140
+ region = resolution.region.slug;
141
+ }
142
+ return {
143
+ projectName,
144
+ projectType,
145
+ apiStack,
146
+ pattern,
147
+ cloud,
148
+ region,
149
+ includeFrontend: includeFrontendValue,
150
+ environments: selectedEnvironments,
151
+ specWorkflow,
152
+ agents: selectedAgents,
153
+ defaultAgent,
154
+ governanceProfile
155
+ };
156
+ }
157
+ //# sourceMappingURL=project-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-config.js","sourceRoot":"","sources":["../../../src/adapters/filesystem/project-config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function resolveTargetRoot(cwd: string, projectName: string): string;
2
+ export declare function findProjectRoot(startDir: string): Promise<string | undefined>;
@@ -0,0 +1,30 @@
1
+ import { lstat } from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { FileSystemError } from '../../domain/project/errors.js';
4
+ import { errorCode, errorMessage } from './errors.js';
5
+ export function resolveTargetRoot(cwd, projectName) {
6
+ return path.resolve(cwd, projectName);
7
+ }
8
+ export async function findProjectRoot(startDir) {
9
+ let current = path.resolve(startDir);
10
+ while (true) {
11
+ try {
12
+ const marker = await lstat(path.join(current, 'liftoff.manifest.json'));
13
+ if (!marker.isFile()) {
14
+ throw new FileSystemError('liftoff.manifest.json must be a regular file, not a directory, symlink, or junction.');
15
+ }
16
+ return current;
17
+ }
18
+ catch (error) {
19
+ if (errorCode(error) !== 'ENOENT' && errorCode(error) !== 'ENOTDIR') {
20
+ throw new FileSystemError(`Unable to inspect ${current} for a Liftoff manifest: ${errorMessage(error)}`);
21
+ }
22
+ const parent = path.dirname(current);
23
+ if (parent === current) {
24
+ return undefined;
25
+ }
26
+ current = parent;
27
+ }
28
+ }
29
+ }
30
+ //# sourceMappingURL=project-discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-discovery.js","sourceRoot":"","sources":["../../../src/adapters/filesystem/project-discovery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEtD,MAAM,UAAU,iBAAiB,CAAC,GAAW,EAAE,WAAmB;IAChE,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,QAAgB;IACpD,IAAI,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACrC,OAAO,IAAI,EAAE,CAAC;QACZ,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,uBAAuB,CAAC,CAAC,CAAC;YACxE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;gBACrB,MAAM,IAAI,eAAe,CACvB,sFAAsF,CACvF,CAAC;YACJ,CAAC;YACD,OAAO,OAAO,CAAC;QACjB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,SAAS,CAAC,KAAK,CAAC,KAAK,QAAQ,IAAI,SAAS,CAAC,KAAK,CAAC,KAAK,SAAS,EAAE,CAAC;gBACpE,MAAM,IAAI,eAAe,CAAC,qBAAqB,OAAO,4BAA4B,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAC3G,CAAC;YACD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACrC,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;gBACvB,OAAO,SAAS,CAAC;YACnB,CAAC;YACD,OAAO,GAAG,MAAM,CAAC;QACnB,CAAC;IACH,CAAC;AACH,CAAC"}