@intentius/chant-lexicon-pulumi 0.0.0-stage → 0.124.55

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 (407) hide show
  1. package/README.md +99 -2
  2. package/dist/adopt.d.ts +68 -0
  3. package/dist/adopt.d.ts.map +1 -0
  4. package/dist/adopt.js +162 -0
  5. package/dist/capability-plugin.d.ts +6 -0
  6. package/dist/capability-plugin.d.ts.map +1 -0
  7. package/dist/capability-plugin.js +21 -0
  8. package/dist/change-set.d.ts +182 -0
  9. package/dist/change-set.d.ts.map +1 -0
  10. package/dist/change-set.js +357 -0
  11. package/dist/ci-setup.d.ts +53 -0
  12. package/dist/ci-setup.d.ts.map +1 -0
  13. package/dist/ci-setup.js +146 -0
  14. package/dist/codegen/docs-cli.d.ts +3 -0
  15. package/dist/codegen/docs-cli.d.ts.map +1 -0
  16. package/dist/codegen/docs-cli.js +3 -0
  17. package/dist/codegen/docs.d.ts +9 -0
  18. package/dist/codegen/docs.d.ts.map +1 -0
  19. package/dist/codegen/docs.js +52 -0
  20. package/dist/codegen/package.d.ts +8 -0
  21. package/dist/codegen/package.d.ts.map +1 -0
  22. package/dist/codegen/package.js +56 -0
  23. package/dist/composites/pulumi-adopt-op.d.ts +106 -0
  24. package/dist/composites/pulumi-adopt-op.d.ts.map +1 -0
  25. package/dist/composites/pulumi-adopt-op.js +132 -0
  26. package/dist/composites/pulumi-watch-op.d.ts +60 -0
  27. package/dist/composites/pulumi-watch-op.d.ts.map +1 -0
  28. package/dist/composites/pulumi-watch-op.js +58 -0
  29. package/dist/config.d.ts +59 -0
  30. package/dist/config.d.ts.map +1 -0
  31. package/dist/config.js +29 -0
  32. package/dist/describe-resources.d.ts +24 -0
  33. package/dist/describe-resources.d.ts.map +1 -0
  34. package/dist/describe-resources.js +97 -0
  35. package/dist/drift-read.d.ts +35 -0
  36. package/dist/drift-read.d.ts.map +1 -0
  37. package/dist/drift-read.js +41 -0
  38. package/dist/drift-record.d.ts +128 -0
  39. package/dist/drift-record.d.ts.map +1 -0
  40. package/dist/drift-record.js +270 -0
  41. package/dist/engine-events.d.ts +222 -0
  42. package/dist/engine-events.d.ts.map +1 -0
  43. package/dist/engine-events.js +280 -0
  44. package/dist/engine-graph.d.ts +75 -0
  45. package/dist/engine-graph.d.ts.map +1 -0
  46. package/dist/engine-graph.js +100 -0
  47. package/dist/exit-codes.d.ts +53 -0
  48. package/dist/exit-codes.d.ts.map +1 -0
  49. package/dist/exit-codes.js +67 -0
  50. package/dist/index.d.ts +26 -0
  51. package/dist/index.d.ts.map +1 -0
  52. package/dist/index.js +29 -0
  53. package/dist/init-templates.d.ts +23 -0
  54. package/dist/init-templates.d.ts.map +1 -0
  55. package/dist/init-templates.js +60 -0
  56. package/dist/integrity.json +29 -0
  57. package/dist/lint/audit-catalog.d.ts +21 -0
  58. package/dist/lint/audit-catalog.d.ts.map +1 -0
  59. package/dist/lint/audit-catalog.js +139 -0
  60. package/dist/lint/post-synth/index.d.ts +3 -0
  61. package/dist/lint/post-synth/index.d.ts.map +1 -0
  62. package/dist/lint/post-synth/index.js +32 -0
  63. package/dist/lint/post-synth/member-read-helpers.d.ts +45 -0
  64. package/dist/lint/post-synth/member-read-helpers.d.ts.map +1 -0
  65. package/dist/lint/post-synth/member-read-helpers.js +103 -0
  66. package/dist/lint/post-synth/pul001.d.ts +18 -0
  67. package/dist/lint/post-synth/pul001.d.ts.map +1 -0
  68. package/dist/lint/post-synth/pul001.js +20 -0
  69. package/dist/lint/post-synth/pul002.d.ts +18 -0
  70. package/dist/lint/post-synth/pul002.d.ts.map +1 -0
  71. package/dist/lint/post-synth/pul002.js +20 -0
  72. package/dist/lint/post-synth/pul003.d.ts +17 -0
  73. package/dist/lint/post-synth/pul003.d.ts.map +1 -0
  74. package/dist/lint/post-synth/pul003.js +21 -0
  75. package/dist/lint/post-synth/pul004.d.ts +13 -0
  76. package/dist/lint/post-synth/pul004.d.ts.map +1 -0
  77. package/dist/lint/post-synth/pul004.js +13 -0
  78. package/dist/lint/post-synth/pul005.d.ts +12 -0
  79. package/dist/lint/post-synth/pul005.d.ts.map +1 -0
  80. package/dist/lint/post-synth/pul005.js +13 -0
  81. package/dist/lint/post-synth/pul006.d.ts +12 -0
  82. package/dist/lint/post-synth/pul006.d.ts.map +1 -0
  83. package/dist/lint/post-synth/pul006.js +13 -0
  84. package/dist/lint/post-synth/pul007.d.ts +13 -0
  85. package/dist/lint/post-synth/pul007.d.ts.map +1 -0
  86. package/dist/lint/post-synth/pul007.js +20 -0
  87. package/dist/lint/post-synth/pul008.d.ts +12 -0
  88. package/dist/lint/post-synth/pul008.d.ts.map +1 -0
  89. package/dist/lint/post-synth/pul008.js +23 -0
  90. package/dist/lint/post-synth/pul009.d.ts +11 -0
  91. package/dist/lint/post-synth/pul009.d.ts.map +1 -0
  92. package/dist/lint/post-synth/pul009.js +19 -0
  93. package/dist/lint/post-synth/pul010.d.ts +13 -0
  94. package/dist/lint/post-synth/pul010.d.ts.map +1 -0
  95. package/dist/lint/post-synth/pul010.js +22 -0
  96. package/dist/lint/post-synth/pul011.d.ts +12 -0
  97. package/dist/lint/post-synth/pul011.d.ts.map +1 -0
  98. package/dist/lint/post-synth/pul011.js +21 -0
  99. package/dist/lint/post-synth/pul012.d.ts +13 -0
  100. package/dist/lint/post-synth/pul012.d.ts.map +1 -0
  101. package/dist/lint/post-synth/pul012.js +20 -0
  102. package/dist/lint/post-synth/pul013.d.ts +14 -0
  103. package/dist/lint/post-synth/pul013.d.ts.map +1 -0
  104. package/dist/lint/post-synth/pul013.js +20 -0
  105. package/dist/lint/post-synth/pul014.d.ts +12 -0
  106. package/dist/lint/post-synth/pul014.d.ts.map +1 -0
  107. package/dist/lint/post-synth/pul014.js +18 -0
  108. package/dist/lint/post-synth/pul015.d.ts +17 -0
  109. package/dist/lint/post-synth/pul015.d.ts.map +1 -0
  110. package/dist/lint/post-synth/pul015.js +19 -0
  111. package/dist/lint/rules/index.d.ts +5 -0
  112. package/dist/lint/rules/index.d.ts.map +1 -0
  113. package/dist/lint/rules/index.js +4 -0
  114. package/dist/lint/rules/member-dir-absolute.d.ts +22 -0
  115. package/dist/lint/rules/member-dir-absolute.d.ts.map +1 -0
  116. package/dist/lint/rules/member-dir-absolute.js +81 -0
  117. package/dist/lock-rows.d.ts +32 -0
  118. package/dist/lock-rows.d.ts.map +1 -0
  119. package/dist/lock-rows.js +36 -0
  120. package/dist/lsp/completions.d.ts +5 -0
  121. package/dist/lsp/completions.d.ts.map +1 -0
  122. package/dist/lsp/completions.js +120 -0
  123. package/dist/lsp/documents.d.ts +32 -0
  124. package/dist/lsp/documents.d.ts.map +1 -0
  125. package/dist/lsp/documents.js +44 -0
  126. package/dist/lsp/hover.d.ts +11 -0
  127. package/dist/lsp/hover.d.ts.map +1 -0
  128. package/dist/lsp/hover.js +76 -0
  129. package/dist/lsp/keys.d.ts +35 -0
  130. package/dist/lsp/keys.d.ts.map +1 -0
  131. package/dist/lsp/keys.js +146 -0
  132. package/dist/lsp/object-path.d.ts +16 -0
  133. package/dist/lsp/object-path.d.ts.map +1 -0
  134. package/dist/lsp/object-path.js +76 -0
  135. package/dist/lsp/yaml-cursor.d.ts +29 -0
  136. package/dist/lsp/yaml-cursor.d.ts.map +1 -0
  137. package/dist/lsp/yaml-cursor.js +70 -0
  138. package/dist/manifest.json +6 -0
  139. package/dist/member-engine.d.ts +33 -0
  140. package/dist/member-engine.d.ts.map +1 -0
  141. package/dist/member-engine.js +80 -0
  142. package/dist/member-outputs.d.ts +43 -0
  143. package/dist/member-outputs.d.ts.map +1 -0
  144. package/dist/member-outputs.js +82 -0
  145. package/dist/meta.json +1 -0
  146. package/dist/okf/index.md +22 -0
  147. package/dist/okf/rules/PUL001.md +11 -0
  148. package/dist/okf/rules/PUL002.md +11 -0
  149. package/dist/okf/rules/PUL003.md +11 -0
  150. package/dist/okf/rules/PUL004.md +11 -0
  151. package/dist/okf/rules/PUL005.md +11 -0
  152. package/dist/okf/rules/PUL006.md +11 -0
  153. package/dist/okf/rules/PUL007.md +11 -0
  154. package/dist/okf/rules/PUL008.md +11 -0
  155. package/dist/okf/rules/PUL009.md +11 -0
  156. package/dist/okf/rules/PUL010.md +11 -0
  157. package/dist/okf/rules/PUL011.md +11 -0
  158. package/dist/okf/rules/PUL012.md +11 -0
  159. package/dist/okf/rules/PUL013.md +11 -0
  160. package/dist/okf/rules/PUL014.md +11 -0
  161. package/dist/okf/rules/PUL015.md +11 -0
  162. package/dist/okf/rules/PUL101.md +11 -0
  163. package/dist/op/activities/index.d.ts +27 -0
  164. package/dist/op/activities/index.d.ts.map +1 -0
  165. package/dist/op/activities/index.js +24 -0
  166. package/dist/op/activities/pulumi-adopt.d.ts +104 -0
  167. package/dist/op/activities/pulumi-adopt.d.ts.map +1 -0
  168. package/dist/op/activities/pulumi-adopt.js +216 -0
  169. package/dist/op/activities/pulumi.d.ts +62 -0
  170. package/dist/op/activities/pulumi.d.ts.map +1 -0
  171. package/dist/op/activities/pulumi.js +81 -0
  172. package/dist/op/activity-contracts.d.ts +107 -0
  173. package/dist/op/activity-contracts.d.ts.map +1 -0
  174. package/dist/op/activity-contracts.js +89 -0
  175. package/dist/op/builders.d.ts +29 -0
  176. package/dist/op/builders.d.ts.map +1 -0
  177. package/dist/op/builders.js +39 -0
  178. package/dist/package-cli.d.ts +3 -0
  179. package/dist/package-cli.d.ts.map +1 -0
  180. package/dist/package-cli.js +12 -0
  181. package/dist/plan-shape.d.ts +47 -0
  182. package/dist/plan-shape.d.ts.map +1 -0
  183. package/dist/plan-shape.js +94 -0
  184. package/dist/plugin.d.ts +3 -0
  185. package/dist/plugin.d.ts.map +1 -0
  186. package/dist/plugin.js +222 -0
  187. package/dist/plunge-timings.d.ts +43 -0
  188. package/dist/plunge-timings.d.ts.map +1 -0
  189. package/dist/plunge-timings.js +106 -0
  190. package/dist/pulumi-up.d.ts +376 -0
  191. package/dist/pulumi-up.d.ts.map +1 -0
  192. package/dist/pulumi-up.js +823 -0
  193. package/dist/release-copy.d.ts +47 -0
  194. package/dist/release-copy.d.ts.map +1 -0
  195. package/dist/release-copy.js +131 -0
  196. package/dist/review-stack.d.ts +92 -0
  197. package/dist/review-stack.d.ts.map +1 -0
  198. package/dist/review-stack.js +222 -0
  199. package/dist/rules/member-dir-absolute.ts +83 -0
  200. package/dist/rules/member-read-helpers.ts +122 -0
  201. package/dist/rules/pul001.ts +38 -0
  202. package/dist/rules/pul002.ts +38 -0
  203. package/dist/rules/pul003.ts +43 -0
  204. package/dist/rules/pul004.ts +32 -0
  205. package/dist/rules/pul005.ts +31 -0
  206. package/dist/rules/pul006.ts +31 -0
  207. package/dist/rules/pul007.ts +35 -0
  208. package/dist/rules/pul008.ts +35 -0
  209. package/dist/rules/pul009.ts +32 -0
  210. package/dist/rules/pul010.ts +42 -0
  211. package/dist/rules/pul011.ts +38 -0
  212. package/dist/rules/pul012.ts +35 -0
  213. package/dist/rules/pul013.ts +35 -0
  214. package/dist/rules/pul014.ts +32 -0
  215. package/dist/rules/pul015.ts +38 -0
  216. package/dist/run.d.ts +444 -0
  217. package/dist/run.d.ts.map +1 -0
  218. package/dist/run.js +843 -0
  219. package/dist/serializer.d.ts +8 -0
  220. package/dist/serializer.d.ts.map +1 -0
  221. package/dist/serializer.js +12 -0
  222. package/dist/skills/chant-pulumi-plunge.md +51 -0
  223. package/dist/skills/chant-pulumi-stack-export.md +54 -0
  224. package/dist/skills/chant-pulumi.md +83 -0
  225. package/dist/stack-export-snapshot.d.ts +125 -0
  226. package/dist/stack-export-snapshot.d.ts.map +1 -0
  227. package/dist/stack-export-snapshot.js +233 -0
  228. package/dist/stack-ops.d.ts +175 -0
  229. package/dist/stack-ops.d.ts.map +1 -0
  230. package/dist/stack-ops.js +400 -0
  231. package/dist/stack-outputs.d.ts +18 -0
  232. package/dist/stack-outputs.d.ts.map +1 -0
  233. package/dist/stack-outputs.js +55 -0
  234. package/dist/stack-references.d.ts +46 -0
  235. package/dist/stack-references.d.ts.map +1 -0
  236. package/dist/stack-references.js +88 -0
  237. package/dist/trace-facts.d.ts +34 -0
  238. package/dist/trace-facts.d.ts.map +1 -0
  239. package/dist/trace-facts.js +81 -0
  240. package/dist/types/index.d.ts +3 -0
  241. package/dist/values.d.ts +58 -0
  242. package/dist/values.d.ts.map +1 -0
  243. package/dist/values.js +155 -0
  244. package/dist/workspace-member.d.ts +98 -0
  245. package/dist/workspace-member.d.ts.map +1 -0
  246. package/dist/workspace-member.js +202 -0
  247. package/package.json +74 -4
  248. package/schemas/pulumi.schema.json +34 -0
  249. package/src/adopt.ts +202 -0
  250. package/src/capability-plugin.ts +34 -0
  251. package/src/change-set.test.ts +235 -0
  252. package/src/change-set.ts +429 -0
  253. package/src/ci-setup.test.ts +123 -0
  254. package/src/ci-setup.ts +176 -0
  255. package/src/codegen/docs-cli.ts +4 -0
  256. package/src/codegen/docs.ts +58 -0
  257. package/src/codegen/package.ts +63 -0
  258. package/src/composites/pulumi-adopt-op.test.ts +223 -0
  259. package/src/composites/pulumi-adopt-op.ts +191 -0
  260. package/src/composites/pulumi-watch-op.test.ts +42 -0
  261. package/src/composites/pulumi-watch-op.ts +85 -0
  262. package/src/config.ts +43 -0
  263. package/src/describe-resources.test.ts +112 -0
  264. package/src/describe-resources.ts +118 -0
  265. package/src/drift-read.test.ts +106 -0
  266. package/src/drift-read.ts +73 -0
  267. package/src/drift-record.test.ts +197 -0
  268. package/src/drift-record.ts +326 -0
  269. package/src/engine-events.test.ts +134 -0
  270. package/src/engine-events.ts +390 -0
  271. package/src/engine-graph.test.ts +141 -0
  272. package/src/engine-graph.ts +149 -0
  273. package/src/exit-codes.test.ts +21 -0
  274. package/src/exit-codes.ts +71 -0
  275. package/src/index.ts +134 -0
  276. package/src/init-templates.ts +85 -0
  277. package/src/lint/audit-catalog.test.ts +33 -0
  278. package/src/lint/audit-catalog.ts +174 -0
  279. package/src/lint/post-synth/index.ts +35 -0
  280. package/src/lint/post-synth/member-read-helpers.ts +122 -0
  281. package/src/lint/post-synth/post-synth.test.ts +199 -0
  282. package/src/lint/post-synth/pul001.ts +38 -0
  283. package/src/lint/post-synth/pul002.ts +38 -0
  284. package/src/lint/post-synth/pul003.ts +43 -0
  285. package/src/lint/post-synth/pul004.ts +32 -0
  286. package/src/lint/post-synth/pul005.ts +31 -0
  287. package/src/lint/post-synth/pul006.ts +31 -0
  288. package/src/lint/post-synth/pul007.ts +35 -0
  289. package/src/lint/post-synth/pul008.ts +35 -0
  290. package/src/lint/post-synth/pul009.ts +32 -0
  291. package/src/lint/post-synth/pul010.ts +42 -0
  292. package/src/lint/post-synth/pul011.ts +38 -0
  293. package/src/lint/post-synth/pul012.ts +35 -0
  294. package/src/lint/post-synth/pul013.ts +35 -0
  295. package/src/lint/post-synth/pul014.ts +32 -0
  296. package/src/lint/post-synth/pul015.ts +38 -0
  297. package/src/lint/rules/index.ts +7 -0
  298. package/src/lint/rules/member-dir-absolute.test.ts +37 -0
  299. package/src/lint/rules/member-dir-absolute.ts +83 -0
  300. package/src/lock-rows.test.ts +60 -0
  301. package/src/lock-rows.ts +56 -0
  302. package/src/lsp/completions.test.ts +69 -0
  303. package/src/lsp/completions.ts +119 -0
  304. package/src/lsp/documents.ts +48 -0
  305. package/src/lsp/hover.test.ts +56 -0
  306. package/src/lsp/hover.ts +83 -0
  307. package/src/lsp/keys.ts +169 -0
  308. package/src/lsp/object-path.ts +71 -0
  309. package/src/lsp/yaml-cursor.ts +85 -0
  310. package/src/member-engine.test.ts +112 -0
  311. package/src/member-engine.ts +97 -0
  312. package/src/member-outputs.test.ts +317 -0
  313. package/src/member-outputs.ts +139 -0
  314. package/src/op/activities/index.ts +36 -0
  315. package/src/op/activities/pulumi-adopt.ts +334 -0
  316. package/src/op/activities/pulumi.ts +136 -0
  317. package/src/op/activity-contracts.ts +129 -0
  318. package/src/op/builders.ts +67 -0
  319. package/src/package-cli.ts +14 -0
  320. package/src/plan-shape.test.ts +91 -0
  321. package/src/plan-shape.ts +105 -0
  322. package/src/plugin.test.ts +96 -0
  323. package/src/plugin.ts +246 -0
  324. package/src/plunge-timings.test.ts +241 -0
  325. package/src/plunge-timings.ts +115 -0
  326. package/src/plunge-up-failed.test.ts +54 -0
  327. package/src/pr-note.test.ts +87 -0
  328. package/src/pulumi-up.test.ts +470 -0
  329. package/src/pulumi-up.ts +1032 -0
  330. package/src/pulumi-urn-node.test.ts +94 -0
  331. package/src/release-copy.test.ts +74 -0
  332. package/src/release-copy.ts +142 -0
  333. package/src/review-stack.test.ts +254 -0
  334. package/src/review-stack.ts +266 -0
  335. package/src/run.test.ts +500 -0
  336. package/src/run.ts +1013 -0
  337. package/src/serializer.test.ts +9 -0
  338. package/src/serializer.ts +15 -0
  339. package/src/skills/chant-pulumi-plunge.md +51 -0
  340. package/src/skills/chant-pulumi-stack-export.md +54 -0
  341. package/src/skills/chant-pulumi.md +83 -0
  342. package/src/stack-export-snapshot.test.ts +190 -0
  343. package/src/stack-export-snapshot.ts +312 -0
  344. package/src/stack-ops.test.ts +286 -0
  345. package/src/stack-ops.ts +552 -0
  346. package/src/stack-outputs.ts +66 -0
  347. package/src/stack-references.test.ts +96 -0
  348. package/src/stack-references.ts +110 -0
  349. package/src/testdata/plunge-drift/README.md +10 -0
  350. package/src/testdata/plunge-drift/assets-drifted.ndjson +3 -0
  351. package/src/testdata/plunge-drift/component-unsupported.ndjson +3 -0
  352. package/src/testdata/plunge-drift/role-in-sync.ndjson +3 -0
  353. package/src/testdata/plunge-drift/settled-empty.ndjson +2 -0
  354. package/src/testdata/plunge-graph/Pulumi.yaml +4 -0
  355. package/src/testdata/plunge-graph/README.md +12 -0
  356. package/src/testdata/plunge-graph/engine-graph.json +158 -0
  357. package/src/testdata/plunge-graph/stack-export.json +49 -0
  358. package/src/testdata/plunge-member/Pulumi.yaml +4 -0
  359. package/src/testdata/plunge-member/README.md +3 -0
  360. package/src/testdata/plunge-member/stack-export.json +480 -0
  361. package/src/testdata/plunge-outputs/Pulumi.yaml +9 -0
  362. package/src/testdata/plunge-outputs/README.md +7 -0
  363. package/src/testdata/plunge-outputs/stack-export.json +2003 -0
  364. package/src/testdata/plunge-outputs/stack-output.json +19 -0
  365. package/src/testdata/pulumi-member/Pulumi.yaml +2 -0
  366. package/src/testdata/pulumi-member/README.md +50 -0
  367. package/src/testdata/pulumi-member/recording/Pulumi.dev.yaml +19 -0
  368. package/src/testdata/pulumi-member/recording/Pulumi.yaml +7 -0
  369. package/src/testdata/pulumi-member/recording/index.js +47 -0
  370. package/src/testdata/pulumi-member/recording/package-lock.json +2707 -0
  371. package/src/testdata/pulumi-member/recording/package.json +9 -0
  372. package/src/testdata/pulumi-member/stack-export.json +746 -0
  373. package/src/testdata/pulumi-outputs/Pulumi.yaml +7 -0
  374. package/src/testdata/pulumi-outputs/README.md +9 -0
  375. package/src/testdata/pulumi-outputs/preview-replaced.json +2894 -0
  376. package/src/testdata/pulumi-outputs/preview-settled.json +2894 -0
  377. package/src/testdata/pulumi-outputs/stack-export.json +1919 -0
  378. package/src/testdata/pulumi-outputs/stack-output.json +19 -0
  379. package/src/testdata/pulumi-preview/Pulumi.yaml +7 -0
  380. package/src/testdata/pulumi-preview/README.md +9 -0
  381. package/src/testdata/pulumi-preview/preview-create.json +992 -0
  382. package/src/testdata/pulumi-preview/preview.json +2894 -0
  383. package/src/testdata/pulumi-preview/stack-export.json +1919 -0
  384. package/src/testdata/pulumi-refresh/Pulumi.yaml +7 -0
  385. package/src/testdata/pulumi-refresh/README.md +14 -0
  386. package/src/testdata/pulumi-refresh/all.json +3742 -0
  387. package/src/testdata/pulumi-refresh/bucket-edited.json +468 -0
  388. package/src/testdata/pulumi-refresh/policy-deleted.json +95 -0
  389. package/src/testdata/pulumi-refresh/queue-edited.json +250 -0
  390. package/src/testdata/pulumi-refresh/role-same.json +242 -0
  391. package/src/testdata/pulumi-refresh/secret-edited.json +247 -0
  392. package/src/testdata/pulumi-refresh/stack-export.json +1907 -0
  393. package/src/testdata/pulumi-stream/README.md +16 -0
  394. package/src/testdata/pulumi-stream/preview-stream.ndjson +42 -0
  395. package/src/testdata/pulumi-stream/up-failed-plunge.ndjson +5 -0
  396. package/src/testdata/pulumi-unexported/Pulumi.yaml +2 -0
  397. package/src/testdata/pulumi-urn-node/Pulumi.yaml +7 -0
  398. package/src/testdata/pulumi-urn-node/README.md +9 -0
  399. package/src/testdata/pulumi-urn-node/preview.json +2894 -0
  400. package/src/testdata/pulumi-urn-node/stack-export.json +1919 -0
  401. package/src/trace-facts.test.ts +38 -0
  402. package/src/trace-facts.ts +83 -0
  403. package/src/values.ts +147 -0
  404. package/src/workspace-kinds.test.ts +47 -0
  405. package/src/workspace-member.test.ts +127 -0
  406. package/src/workspace-member.ts +304 -0
  407. package/workspace-kinds.json +29 -0
package/README.md CHANGED
@@ -1,3 +1,100 @@
1
- # Temporary Holding Version
1
+ # @intentius/chant-lexicon-pulumi
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ Pulumi lexicon for [chant](https://intentius.io/chant/). It adds your Pulumi program to a chant workspace as it is, on stock Pulumi or on [plunge](https://github.com/INTENTIUS/plunge), a Pulumi fork that keeps chant's ownership markers on each resource. It declares no resource types. It supplies the `pulumi` workspace member kind and reads a Pulumi program four ways:
4
+
5
+ | Read | Source | Module |
6
+ |---|---|---|
7
+ | the member's graph | the `pulumi stack export` the last `pulumi-up` apply wrote to `refs/chant/snapshots`, else the one checked in as `stack-export.json` | `src/workspace-member.ts`, `src/stack-export-snapshot.ts` |
8
+ | its change-set part | `pulumi preview --json` | `src/change-set.ts` |
9
+ | its drift records | `pulumi refresh --preview-only --json --target <urn>`, one resource at a time | `src/drift-record.ts`, `src/drift-read.ts` |
10
+ | its stack outputs, for another member's parameters | `pulumi stack output --json --show-secrets=false` (applied) and `pulumi preview --json` (planned) | `src/stack-outputs.ts`, `src/member-outputs.ts` |
11
+ | engine facts, for a member on plunge | `plunge graph --json --stack <stack>` (`describeResources`), or the checked-in `engine-graph.json` (the graph read) | `src/describe-resources.ts`, `src/engine-graph.ts` |
12
+
13
+ The graph read never runs `pulumi`. The change set and drift run `preview` and `refresh --preview-only`, and the outputs read adds `stack output --json --show-secrets=false`. A member on plunge runs `plunge preview`, `plunge stack output --json --show-secrets=false` and `plunge drift --resource <urn> --stream`. For its engine facts it runs one of exactly four argv: `plunge graph --json`, `plunge graph --json --stack <stack>`, `plunge graph --json --versions` and `plunge graph --json --stack <stack> --versions` ([#4529](https://github.com/INTENTIUS/chant/issues/4529)). An outputs or secrets flag on `plunge graph` is refused. That is the whole list, as ruled on [#4476](https://github.com/INTENTIUS/chant/issues/4476) (2026-10-25), which widened the [#4450](https://github.com/INTENTIUS/chant/issues/4450) ruling's `preview` and `refresh --preview-only` to keep the outputs read and the plunge commands. Nothing else runs on a read (`runAllowedPulumi` and `runAllowedPlunge` refuse any other argv, and a preview with `--show-secrets` or `--import-file`), so no read changes a stack. With `CHANT_PULUMI_APPLIED_OUTPUTS=export`, the outputs read runs nothing either.
14
+
15
+ ## Applies: the `pulumi-up` capability
16
+
17
+ A stack can be a component step, `{ kind: "pulumi-up", dir, stack }`, that plans in a pull request and applies on merge like a `terraform-apply` root ([#4541](https://github.com/INTENTIUS/chant/issues/4541), `src/pulumi-up.ts`). The ruling on INTENTIUS/plywood#1 widened #4450 and #4476 for it alone, from an apply job holding the apply identity. Its `up` goes through `runApplyPulumi` or `runApplyPlunge`, each of which takes one fixed argv (`PULUMI_APPLY_COMMANDS` in `src/run.ts`):
18
+
19
+ | Engine | Argv |
20
+ |---|---|
21
+ | plunge | `plunge preview --json --show-sames --stack <s> --save-plan <file>`, then `plunge up --plan <file> --yes --json --stack <s>` |
22
+ | stock Pulumi | `pulumi preview --json --show-sames --stack <s>`, then `pulumi up --yes --json --stack <s>` |
23
+
24
+ Both forms may add `--config-file <file>`, then `--target <urn>` for each target, then `--policy-pack <dir>` with an optional `--policy-pack-config <file>`, in that order. Any other flag on `up` is refused.
25
+
26
+ A step pinned to its own engine release sets `engineVersion` (and `engineRoot` when its image keeps engines elsewhere than `/opt/chant`). Every run of that step, preview, `up`, stack output and export, then uses `<engineRoot>/<engine>-<engineVersion>/<engine>`, the path `pulumiInstallLine` and `plungeInstallLine` install to ([#4592](https://github.com/INTENTIUS/chant/issues/4592), `src/ci-setup.ts`). The argv is checked against the same forms, and a step without `engineVersion` runs the binary on PATH.
27
+
28
+ The CI install lines take a version, download the release's Linux archive and its checksums file, and fail unless the archive matches its line there. For the default releases (Pulumi 3.272.0, plunge 0.1.0) the line must also hold the sha256 the lexicon records per architecture. Each release goes under its own versioned directory and is linked into `/usr/local/bin`, and a line skips the download when that directory already holds the binary, or for Pulumi when the `pulumi` on PATH is that version.
29
+
30
+ The preview streams its engine events (`PULUMI_ENABLE_STREAMING_JSON_PREVIEW=true`, `src/engine-events.ts`), so one run gives the change set and CrossGuard's findings. A mandatory violation denies the plan. On plunge the saved plan's stamp refuses a plan whose records moved (plunge exit 40, chant's moved code 4). On stock Pulumi the apply previews again, then compares the steps in `up`'s event stream with the approved shape (`src/plan-shape.ts`), and a step outside it fails the apply. A member on the resource lock grain, the default on plunge, leaves `same` and `read` steps out of its digest. The step's `config` is written into a scratch copy of `Pulumi.<stack>.yaml` and passed with `--config-file`, never `--config`, which writes the working tree's file. A release cut records the stack's directory (`releaseInputs`), unless its backend is a file path relative to that directory. Under a release, a promote or rollback previews and applies the recorded copy, after `pulumi install` (or `plunge install`) in the copy when its runtime needs one (`src/release-copy.ts`); a Node copy with no recorded lockfile is refused by name.
31
+
32
+ After `up`, the capability runs `stack export --stack <s>`, replaces every secret with `[secret]`, drops the secrets provider's state, and writes the export through chant's index store as `<env>/<stack>__pulumi-export` ([#4546](https://github.com/INTENTIUS/chant/issues/4546), `refs/chant/snapshots` by default). The graph, the preview's prior state and the drift read take that export first, so a stack chant applies needs no checked-in `stack-export.json`. A failed export leaves the apply standing and says why in the step's `exportSnapshot` output.
33
+
34
+ A program that reads another stack through `StackReference` orders its stack after that one ([#4547](https://github.com/INTENTIUS/chant/issues/4547), `src/stack-references.ts`). The capability's `declaredReads` reads each step's export for `pulumi:pulumi:StackReference` resources, matches each `name` to the other `pulumi-up` step with that `Pulumi.yaml` name and stack, and reports a read of each output the export recorded that is not secret. Core writes those reads into the step's `stackReferences` input and adds a `dependsOn`, so the waves put the referenced stack first, a failed upstream holds the reader, and a reader waits while the upstream's plan cannot say a value it reads. A reference to a stack no step applies adds no edge, and the plan's artifact names it under `stackReferences.outside`.
35
+
36
+ ## Adoption: `PulumiAdoptOp`
37
+
38
+ `PulumiAdoptOp` (`src/composites/pulumi-adopt-op.ts`, [#4562](https://github.com/INTENTIUS/chant/issues/4562)) adopts stock stacks onto plunge's per-resource records, the pulumi twin of `TerraformAdoptOp`. Its phases are Check (the shared bucket check on the backend's bucket), Export (`pulumi stack export --stack <s>` into a scratch file), then per stack Preview (`plunge stack adopt --json`), a gate bound to the preview's digest, and Adopt (`plunge stack adopt --json --yes`, through `runAdoptPlunge`). `from: { backend }` or `from: { file }` adopts an export with `--file`, the route from Pulumi Cloud. Gates and the run are recorded on the workspace ledger.
39
+
40
+ ## Gated stack operations
41
+
42
+ `src/stack-ops.ts` ([#4578](https://github.com/INTENTIUS/chant/issues/4578)) runs three stack operations, each only after its gated request (#4551) is approved on the workspace ledger by someone other than the requester, under the op `pulumi-stack-ops`. The first call records the request and returns the `chant approve` command; the same call after the approval spends it, runs once, and records how it ended.
43
+
44
+ | Function | Request | What runs after approval |
45
+ |---|---|---|
46
+ | `gatedStackExport` | `stack-export` of `<stack>` | `pulumi stack export --stack <s>` (or plunge's), written mode 600 to a file outside every git working tree; refused in CI |
47
+ | `gatedStackCancel` | `stack-cancel` of `<stack>` with its lock id | `pulumi cancel --yes --stack <s>`, once the lock is still the approved one (read from a `file://` backend's lock directory); refused on plunge, which has no stack lock |
48
+ | `gatedStackMove` | `stack-move` of `move:<source>:<dest>` with the URNs | `pulumi state move --source <s> --dest <d> --yes <urn>...`, or `plunge stack move --stack <s> --dest <d> <urn>... --json --yes` after plunge's plan; both stacks preview first, and the move runs only when the previews change nothing but the moved resources |
49
+
50
+ `pulumiStackLockIds({ dir, stack })` ([#4615](https://github.com/INTENTIUS/chant/issues/4615)) reads the lock ids a stack holds now, the same read `gatedStackCancel` checks with, so a product can offer the id to approve. It answers `checked: false` on a backend other than `file://`, and no ids for a plunge stack.
51
+
52
+ The writes go through `runGatedPulumi` and `runGatedPlunge` in `src/run.ts`, whose fixed forms (`PULUMI_GATED_COMMANDS`, `PLUNGE_GATED_COMMANDS`) are the only ones allowed.
53
+
54
+ ## Drift: `chant workspace drift`
55
+
56
+ `chant workspace drift --member <pulumi member> [--resource <urn>] [--stream]` runs `chant lifecycle drift` in the member's reader project, which calls this lexicon's `readDrift`. A stock member is read with one `pulumi refresh --preview-only --json --target <urn>` per resource in its checked-in `stack-export.json`. A member on plunge is read with `plunge drift --resource <urn> --stream` per resource. `--resource` reads one URN. The only read is `refresh`.
57
+
58
+ A member runs on plunge when its config says `engine: "plunge"`, or when `Pulumi.yaml` names a backend URL starting with `plunge` (`plunge+file://...`, `plunge://...`). Only `Pulumi.yaml` is read, never `PULUMI_BACKEND_URL` or login state.
59
+
60
+ ## Engine facts for a member on plunge
61
+
62
+ plunge keeps a record per resource, and `plunge graph --json` prints the stack's graph from those records in the engine graph document chant#4520 designed. It makes no provider call and prints no output value. chant reads it two ways ([#4529](https://github.com/INTENTIUS/chant/issues/4529)):
63
+
64
+ - `describeResources` runs `plunge graph --json --stack <stack>` once per member, with the stack the other reads use. Each node becomes a resource keyed like the member graph's node, with plunge's facts on `ResourceMetadata.facts`. Every resource has `ownership: "unknown"` and no marker, so no change set or teardown decides from it.
65
+ - The graph read takes a checked-in `engine-graph.json` beside `stack-export.json`. Its facts go on the nodes (`nodes[].facts`) and its `property` edges join the graph with `grain: "property"`. The export's `dependencies` and `parent` edges carry `grain: "instance"`.
66
+
67
+ plunge's markers say `source: "record"`: what its record says it wrote, not a read of the object. A stock member gets neither read, and chant runs nothing new for it. Record versions (`--versions`) cost one listing per record, so `describeResources` leaves them off.
68
+
69
+ ## Outputs into another member's parameters
70
+
71
+ A chant member reads a Pulumi member's outputs with core's `member-outputs` verb (chant#4455):
72
+
73
+ ```ts
74
+ import { memberOutputsComponent } from "@intentius/chant/components/verbs/member-outputs";
75
+
76
+ export const aws = memberOutputsComponent("aws");
77
+ export const records: Component = {
78
+ name: "records",
79
+ dependsOn: ["aws"],
80
+ deploy: [phase("Apply", [cfnDeploy({ template: "dist/dns.json", inputs: { awsEndpoint: stackOutput("aws", "awsEndpoint") } })])],
81
+ };
82
+ ```
83
+
84
+ The consumer lists `pulumi` among its lexicons, which brings `pulumiCapabilityPlugin` and its source, `pulumiOutputSource`, for members of kind `pulumi`.
85
+
86
+ - Applied values come from `pulumi stack output --json --show-secrets=false` in the member's directory. With `CHANT_PULUMI_APPLIED_OUTPUTS=export`, chant runs nothing and reads them from the checked-in `stack-export.json`.
87
+ - Planned values come from `pulumi preview --json --show-sames`. A real preview carries no outputs on the stack's `pulumi:pulumi:Stack` step (recorded, #4475), so a preview with nothing to apply gives the checked-in export's outputs and one with changes leaves every output unknown. An output a stack step does carry is read, and one holding Pulumi's unknown sentinel is unknown. The consumer is planned without an unknown output, gets a hole on `aws#outputs` naming it, and is held back on merge until the member applied, then planned again.
88
+ - The plan digest is the member part's `pulumi-preview` digest, so a preview that moves after review moves the consumer's digest.
89
+ - While the preview still has changes, `run` refuses and the consumer is blocked behind the member.
90
+ - Secret outputs are left out of both reads. chant never carries or prints their values.
91
+ - A member on plunge runs the same commands under `plunge`.
92
+ - Both commands run against the member's selected stack.
93
+
94
+ ```bash
95
+ npm install --save-dev @intentius/chant @intentius/chant-lexicon-pulumi
96
+ ```
97
+
98
+ ## License
99
+
100
+ See the main project LICENSE file.
@@ -0,0 +1,68 @@
1
+ import type { BucketTarget } from "@intentius/chant/bucket-check";
2
+ /** `AdoptView.status`. */
3
+ export type PlungeAdoptStatus = "would-adopt" | "adopted" | "already-adopted" | "refused";
4
+ export interface PlungeAdoptRefusal {
5
+ code: string;
6
+ urn?: string;
7
+ reason: string;
8
+ }
9
+ export interface PlungeAdoptResource {
10
+ urn: string;
11
+ type: string;
12
+ id: string;
13
+ /** `marker`, `record`, `pending` or `already-adopted`. */
14
+ fate: string;
15
+ adoptedAs?: string;
16
+ marked?: boolean;
17
+ reason?: string;
18
+ }
19
+ /** The parts of plunge's `AdoptView` chant reads. */
20
+ export interface PlungeAdoptView {
21
+ stack: string;
22
+ status: PlungeAdoptStatus;
23
+ checkpoint: {
24
+ source?: string;
25
+ digest?: string;
26
+ };
27
+ resources: PlungeAdoptResource[];
28
+ refusals: PlungeAdoptRefusal[];
29
+ }
30
+ /** The adopt document, or undefined when `text` is not one. */
31
+ export declare function parsePlungeAdoptView(text: string | undefined): PlungeAdoptView | undefined;
32
+ /** The gate's digest over an adopt document (see the module comment). */
33
+ export declare function pulumiAdoptDigest(view: PlungeAdoptView): string;
34
+ /** Counts by fate. */
35
+ export declare function adoptFates(view: PlungeAdoptView): Record<string, number>;
36
+ /** The stack's backend URL and where it came from, first that answers: the step's, `plywood.yml`'s, `PULUMI_BACKEND_URL`, `Pulumi.yaml`'s. */
37
+ export declare function pulumiStackBackend(dir: string, opts?: {
38
+ configured?: string;
39
+ env?: Record<string, string | undefined>;
40
+ }): {
41
+ url: string;
42
+ source: string;
43
+ } | undefined;
44
+ /** The stock backend at the same root: the URL without plunge's `plunge+` prefix. */
45
+ export declare function stockBackendUrl(url: string): string;
46
+ /** What the bucket check reads for a backend, or why it does not run. */
47
+ export type AdoptBucketTarget = {
48
+ target: BucketTarget;
49
+ namespaces: string[];
50
+ waived: string[];
51
+ } | {
52
+ skip: string;
53
+ } | {
54
+ refuse: string;
55
+ };
56
+ /**
57
+ * The bucket behind a DIY backend URL, for the shared check (#4558). An
58
+ * `s3://` URL gives the bucket, its `region` (else `AWS_REGION`), its
59
+ * `endpoint` with static keys from the environment, and the path as the
60
+ * namespace a lifecycle rule must cover; `gs://` gives the bucket. A
61
+ * `file://` backend has no bucket, and the check is skipped with that
62
+ * reason. An `azblob://` URL does not name the subscription and resource
63
+ * group the check reads, so it is refused unless the step names the bucket
64
+ * itself. `allow_insecure` on the URL and `PLUNGE_ALLOW_INSECURE` are read as
65
+ * plunge reads them.
66
+ */
67
+ export declare function adoptBucketTarget(url: string, env?: Record<string, string | undefined>): AdoptBucketTarget;
68
+ //# sourceMappingURL=adopt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adopt.d.ts","sourceRoot":"","sources":["../src/adopt.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAMlE,0BAA0B;AAC1B,MAAM,MAAM,iBAAiB,GAAG,aAAa,GAAG,SAAS,GAAG,iBAAiB,GAAG,SAAS,CAAC;AAE1F,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,mBAAmB;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,0DAA0D;IAC1D,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qDAAqD;AACrD,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,iBAAiB,CAAC;IAC1B,UAAU,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACjD,SAAS,EAAE,mBAAmB,EAAE,CAAC;IACjC,QAAQ,EAAE,kBAAkB,EAAE,CAAC;CAChC;AAMD,+DAA+D;AAC/D,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,eAAe,GAAG,SAAS,CA+B1F;AAED,yEAAyE;AACzE,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,eAAe,GAAG,MAAM,CAK/D;AAED,sBAAsB;AACtB,wBAAgB,UAAU,CAAC,IAAI,EAAE,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAIxE;AAED,8IAA8I;AAC9I,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,MAAM,EACX,IAAI,GAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAA;CAAO,GAC3E;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAgB7C;AAED,qFAAqF;AACrF,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,yEAAyE;AACzE,MAAM,MAAM,iBAAiB,GACzB;IAAE,MAAM,EAAE,YAAY,CAAC;IAAC,UAAU,EAAE,MAAM,EAAE,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,GAChE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvB;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAe,GAAG,iBAAiB,CAkDvH"}
package/dist/adopt.js ADDED
@@ -0,0 +1,162 @@
1
+ /**
2
+ * Adopting a stock Pulumi stack onto plunge's per-resource records (#4562):
3
+ * the pieces `PulumiAdoptOp` (`./composites/pulumi-adopt-op.ts`) and its
4
+ * activities (`./op/activities/pulumi-adopt.ts`) share.
5
+ *
6
+ * - {@link parsePlungeAdoptView}: the document `plunge stack adopt --json`
7
+ * prints (plunge `pkg/backend/plunge` `AdoptView`, its site's
8
+ * reference/adopt-json page): `status` is `would-adopt`, `adopted`,
9
+ * `already-adopted` or `refused`, with each resource's fate and every
10
+ * refusal.
11
+ * - {@link pulumiAdoptDigest}: what the Op's gate binds. It covers the
12
+ * stack, the checkpoint's digest and source, and each resource's URN,
13
+ * type, ID and fate, and leaves `status` out, so the preview an approver
14
+ * saw and the `--yes` run that follows digest the same when nothing moved.
15
+ * - {@link pulumiStackBackend} and {@link adoptBucketTarget}: the stack's
16
+ * backend URL, and the bucket the shared check (#4558) reads from it.
17
+ */
18
+ import { existsSync, readFileSync } from "node:fs";
19
+ import { join } from "node:path";
20
+ import { computePlanDigest } from "@intentius/chant/lifecycle/plan-digest";
21
+ import { parseYAML } from "@intentius/chant/yaml";
22
+ import { readPlywoodEngine } from "./member-engine.js";
23
+ import { isObject } from "./values.js";
24
+ const STATUSES = new Set(["would-adopt", "adopted", "already-adopted", "refused"]);
25
+ const str = (v) => (typeof v === "string" ? v : undefined);
26
+ /** The adopt document, or undefined when `text` is not one. */
27
+ export function parsePlungeAdoptView(text) {
28
+ if (!text)
29
+ return undefined;
30
+ let doc;
31
+ try {
32
+ doc = JSON.parse(text);
33
+ }
34
+ catch {
35
+ return undefined;
36
+ }
37
+ if (!isObject(doc) || typeof doc.status !== "string" || !STATUSES.has(doc.status))
38
+ return undefined;
39
+ const checkpoint = isObject(doc.checkpoint) ? doc.checkpoint : {};
40
+ const resources = (Array.isArray(doc.resources) ? doc.resources : []).filter(isObject).map((r) => ({
41
+ urn: str(r.urn) ?? "",
42
+ type: str(r.type) ?? "",
43
+ id: str(r.id) ?? "",
44
+ fate: str(r.fate) ?? "",
45
+ ...(str(r.adoptedAs) ? { adoptedAs: str(r.adoptedAs) } : {}),
46
+ ...(typeof r.marked === "boolean" ? { marked: r.marked } : {}),
47
+ ...(str(r.reason) ? { reason: str(r.reason) } : {}),
48
+ }));
49
+ const refusals = (Array.isArray(doc.refusals) ? doc.refusals : []).filter(isObject).map((r) => ({ code: str(r.code) ?? "", ...(str(r.urn) ? { urn: str(r.urn) } : {}), reason: str(r.reason) ?? "" }));
50
+ return {
51
+ stack: str(doc.stack) ?? "",
52
+ status: doc.status,
53
+ checkpoint: { ...(str(checkpoint.source) ? { source: str(checkpoint.source) } : {}), ...(str(checkpoint.digest) ? { digest: str(checkpoint.digest) } : {}) },
54
+ resources,
55
+ refusals,
56
+ };
57
+ }
58
+ /** The gate's digest over an adopt document (see the module comment). */
59
+ export function pulumiAdoptDigest(view) {
60
+ const resources = view.resources
61
+ .map((r) => ({ urn: r.urn, type: r.type, id: r.id, fate: r.fate === "already-adopted" ? (r.adoptedAs ?? r.fate) : r.fate }))
62
+ .sort((a, b) => (a.urn < b.urn ? -1 : a.urn > b.urn ? 1 : 0));
63
+ return computePlanDigest("plunge-adopt", { stack: view.stack, checkpoint: view.checkpoint.digest ?? null, resources });
64
+ }
65
+ /** Counts by fate. */
66
+ export function adoptFates(view) {
67
+ const out = {};
68
+ for (const r of view.resources)
69
+ out[r.fate] = (out[r.fate] ?? 0) + 1;
70
+ return out;
71
+ }
72
+ /** The stack's backend URL and where it came from, first that answers: the step's, `plywood.yml`'s, `PULUMI_BACKEND_URL`, `Pulumi.yaml`'s. */
73
+ export function pulumiStackBackend(dir, opts = {}) {
74
+ if (opts.configured)
75
+ return { url: opts.configured, source: "the step's backend" };
76
+ const plywood = readPlywoodEngine(dir);
77
+ if (plywood?.backend)
78
+ return { url: plywood.backend, source: plywood.file };
79
+ const env = (opts.env ?? process.env).PULUMI_BACKEND_URL;
80
+ if (env)
81
+ return { url: env, source: "PULUMI_BACKEND_URL" };
82
+ const file = join(dir, "Pulumi.yaml");
83
+ if (existsSync(file)) {
84
+ try {
85
+ const url = parseYAML(readFileSync(file, "utf-8")).backend?.url;
86
+ if (typeof url === "string")
87
+ return { url, source: "Pulumi.yaml" };
88
+ }
89
+ catch {
90
+ // No backend named.
91
+ }
92
+ }
93
+ return undefined;
94
+ }
95
+ /** The stock backend at the same root: the URL without plunge's `plunge+` prefix. */
96
+ export function stockBackendUrl(url) {
97
+ return url.replace(/^plunge\+/, "");
98
+ }
99
+ /**
100
+ * The bucket behind a DIY backend URL, for the shared check (#4558). An
101
+ * `s3://` URL gives the bucket, its `region` (else `AWS_REGION`), its
102
+ * `endpoint` with static keys from the environment, and the path as the
103
+ * namespace a lifecycle rule must cover; `gs://` gives the bucket. A
104
+ * `file://` backend has no bucket, and the check is skipped with that
105
+ * reason. An `azblob://` URL does not name the subscription and resource
106
+ * group the check reads, so it is refused unless the step names the bucket
107
+ * itself. `allow_insecure` on the URL and `PLUNGE_ALLOW_INSECURE` are read as
108
+ * plunge reads them.
109
+ */
110
+ export function adoptBucketTarget(url, env = process.env) {
111
+ const stock = stockBackendUrl(url);
112
+ let u;
113
+ try {
114
+ u = new URL(stock);
115
+ }
116
+ catch {
117
+ return { refuse: `the backend ${url} is not a URL the bucket check can read` };
118
+ }
119
+ const waived = [
120
+ ...(u.searchParams.get("allow_insecure") ?? "").split(","),
121
+ ...(env.PLUNGE_ALLOW_INSECURE ?? "").split(","),
122
+ ]
123
+ .map((s) => s.trim())
124
+ .filter(Boolean);
125
+ const prefix = u.pathname.replace(/^\/+/, "");
126
+ const namespaces = prefix ? [prefix.endsWith("/") ? prefix : `${prefix}/`] : [];
127
+ switch (u.protocol) {
128
+ case "file:":
129
+ return { skip: `the backend ${url} is a local file path, which has no bucket to check` };
130
+ case "s3:": {
131
+ const region = u.searchParams.get("region") ?? env.AWS_REGION ?? env.AWS_DEFAULT_REGION;
132
+ if (!region)
133
+ return { refuse: `the backend ${url} names no region and AWS_REGION is not set, so the bucket check cannot read ${u.hostname}` };
134
+ const endpoint = u.searchParams.get("endpoint") ?? undefined;
135
+ if (endpoint && !(env.AWS_ACCESS_KEY_ID && env.AWS_SECRET_ACCESS_KEY)) {
136
+ return { refuse: `the backend ${url} names the endpoint ${endpoint}, and the bucket check reads an endpoint only with static keys (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY)` };
137
+ }
138
+ const target = {
139
+ store: "s3",
140
+ bucket: u.hostname,
141
+ region,
142
+ ...(endpoint
143
+ ? {
144
+ endpoint: /^[a-z]+:\/\//.test(endpoint) ? endpoint : `https://${endpoint}`,
145
+ credentials: {
146
+ accessKeyId: env.AWS_ACCESS_KEY_ID,
147
+ secretAccessKey: env.AWS_SECRET_ACCESS_KEY,
148
+ ...(env.AWS_SESSION_TOKEN ? { sessionToken: env.AWS_SESSION_TOKEN } : {}),
149
+ },
150
+ }
151
+ : {}),
152
+ };
153
+ return { target, namespaces, waived };
154
+ }
155
+ case "gs:":
156
+ return { target: { store: "gcs", bucket: u.hostname }, namespaces, waived };
157
+ case "azblob:":
158
+ return { refuse: `the backend ${url} does not name the storage account's subscription and resource group; set the step's bucket to the azblob target` };
159
+ default:
160
+ return { refuse: `the backend ${url} is not a bucket plunge stores records in (s3, gs, azblob or file)` };
161
+ }
162
+ }
@@ -0,0 +1,6 @@
1
+ import { type CapabilityPlugin } from "@intentius/chant/components/capability-plugin";
2
+ export declare const PULUMI_VERB_FAMILIES: {
3
+ readonly apply: readonly ["pulumi-up"];
4
+ };
5
+ export declare const pulumiCapabilityPlugin: CapabilityPlugin;
6
+ //# sourceMappingURL=capability-plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capability-plugin.d.ts","sourceRoot":"","sources":["../src/capability-plugin.ts"],"names":[],"mappings":"AAUA,OAAO,EAAqB,KAAK,gBAAgB,EAAE,MAAM,+CAA+C,CAAC;AAKzG,eAAO,MAAM,oBAAoB;aAC/B,KAAK,YAAG,WAAW;CACX,CAAC;AAEX,eAAO,MAAM,sBAAsB,EAAE,gBAcpC,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { ownPackageVersion } from "@intentius/chant/components/capability-plugin";
2
+ import { pulumiStackOutputSource } from "./member-outputs.js";
3
+ import { pulumiUpCapability } from "./pulumi-up.js";
4
+ export const PULUMI_VERB_FAMILIES = {
5
+ apply: ["pulumi-up"],
6
+ };
7
+ export const pulumiCapabilityPlugin = {
8
+ name: "pulumi",
9
+ get version() {
10
+ return ownPackageVersion(import.meta.url);
11
+ },
12
+ capabilities() {
13
+ return [pulumiUpCapability];
14
+ },
15
+ families() {
16
+ return PULUMI_VERB_FAMILIES;
17
+ },
18
+ engineOutputSources() {
19
+ return [pulumiStackOutputSource];
20
+ },
21
+ };
@@ -0,0 +1,182 @@
1
+ /**
2
+ * The change-set adapter for a Pulumi member (#4453): `pulumi preview --json`
3
+ * into an `@intentius/chant/change-set` part, planner `pulumi`.
4
+ *
5
+ * ## Steps to entries
6
+ *
7
+ * The preview prints one step per resource the program registered, `same`
8
+ * included, and a replace as two or three steps on one URN
9
+ * (`create-replacement`, `replace`, `delete-replaced`). The adapter keeps one
10
+ * entry per URN, at the URN, so `node` comes from the one URN rule
11
+ * (`@intentius/chant/pulumi-urn`, #4456):
12
+ *
13
+ * | step op | action | disruption |
14
+ * |---|---|---|
15
+ * | `create` | create | |
16
+ * | `update` | update | in-place |
17
+ * | `delete` | delete | destroy |
18
+ * | `replace`, `create-replacement`, `delete-replaced` | replace | replace, or destroy when the delete comes first (`deleteBeforeReplace`) |
19
+ * | `same` | no-op | |
20
+ * | `read`, `read-replacement`, `refresh` | read | |
21
+ * | `import` | no-op, importing | |
22
+ * | `import-replacement` | replace, importing | replace |
23
+ * | `discard`, `remove-pending-replace` | forget | |
24
+ *
25
+ * An op the table does not hold is a hole on the member, never a guess.
26
+ *
27
+ * Attributes are top-level inputs, as the change set wants them. A create
28
+ * writes every input. An update or replace writes the keys `detailedDiff`
29
+ * and `diffReasons` name, and every input whose new value holds an unknown.
30
+ * `replaceReasons` and a `detailedDiff` kind ending in `-replace` mark
31
+ * `forcesReplacement`. An input that holds Pulumi's unknown sentinel is
32
+ * `unknown: true` with no `after`: a resource that reads an output of one
33
+ * being created shows its dependent input as unknown. A value that holds a
34
+ * secret is `sensitive: true` with neither side.
35
+ *
36
+ * ## What preview cannot list: `mayAppear`
37
+ *
38
+ * A program may register resources inside an `apply()`. At preview an
39
+ * `apply()` whose input is unknown does not run, so what it would register
40
+ * is never in the steps. Dropping it would make the set look smaller than
41
+ * the apply, so the adapter marks it `mayAppear` instead, on two signals:
42
+ *
43
+ * 1. A component (a step whose state is `custom: false`, not the root stack)
44
+ * whose subtree in the preview holds an unknown, in any input or output,
45
+ * or a create or replace, whose outputs are unknown until apply. Its code
46
+ * may be waiting on that value to register children. It gets one entry
47
+ * at `pulumiMayAppearAddress(<component urn>)`, action `create`, type
48
+ * `unknown`, no attributes, on the component's node.
49
+ * 2. With the last deployment's `pulumi stack export` (`prior`): a resource
50
+ * the export holds and the preview has no step for gets an `update`
51
+ * entry with disruption `unknown`, since a full preview lists every
52
+ * registered resource and only an `apply()` that did not run leaves one
53
+ * out. A `delete` step for a resource under a component signal 1 marks
54
+ * keeps its `delete` and gets `mayAppear`, since the `apply()` may
55
+ * register it again. A preview narrowed with `--target` (`targeted`)
56
+ * lists only its targets, and a failed one stops part way, so signal 2's
57
+ * first half is off for both.
58
+ *
59
+ * A resource registered inside an `apply()` directly under the stack, with
60
+ * no export that holds it, has no component to stand under and is not
61
+ * detected. When the export does hold it and its input is unknown, the
62
+ * preview prints a `delete` for it, which reads as a plain delete. Those are
63
+ * the two cases left out.
64
+ *
65
+ * ## The digest
66
+ *
67
+ * {@link pulumiPreviewDigest}: `computePlanDigest("pulumi-preview", …)` over
68
+ * each step's op, URN, provider, id, inputs before and after, `diffReasons`,
69
+ * `replaceReasons` and `detailedDiff`, sorted by URN and op. It leaves out
70
+ * `config`, `duration`, `diagnostics` and `changeSummary`, and the states'
71
+ * outputs, which at preview are the last deployment's or unknown. For a
72
+ * member on the resource lock grain the `pulumi-up` capability passes
73
+ * `changedOnly` (#4541, ruling B), which leaves `same` and `read` steps out.
74
+ *
75
+ * The fixtures under `testdata/pulumi-preview` are recorded from pulumi
76
+ * 3.272.0 against the plunge corpus's aws-ts program on floci (#4475). What
77
+ * the recording showed: `preview --json` lists no unchanged resource unless
78
+ * `--show-sames` is passed, which chant's argv does, since signal 2 reads a
79
+ * missing resource as one an `apply()` may register; a replace is one
80
+ * `replace` step at preview, not three; the stack's step carries no planned
81
+ * outputs; a secret is the blinded string `"[secret]"`; and a resource
82
+ * registered inside an `apply()` directly under the stack whose input is
83
+ * unknown (the corpus's `vpc-id` parameter, named after a VPC being
84
+ * replaced) is printed as a `delete`, which this adapter keeps as a plain
85
+ * delete since nothing tells it apart from a removed resource.
86
+ *
87
+ * ## The import graph
88
+ *
89
+ * Like the terraform lexicon's `change-set`, this imports chant's
90
+ * `change-set` types, `lifecycle/plan-digest`, `pulumi-urn` and `./values`,
91
+ * so it bundles without TypeScript, node's process modules or zod (#3421).
92
+ */
93
+ import type { ChangeSetAction, ChangeSetDisruption, ChangeSetPart } from "@intentius/chant/change-set";
94
+ import { type Json } from "./values.js";
95
+ /** One resource state on a preview step, `apitype.ResourceV3`, as far as the adapter reads it. */
96
+ export interface PulumiStepState {
97
+ urn?: string;
98
+ custom?: boolean;
99
+ delete?: boolean;
100
+ id?: string;
101
+ type?: string;
102
+ parent?: string;
103
+ inputs?: Json;
104
+ outputs?: Json;
105
+ }
106
+ /** One step of `pulumi preview --json` or `pulumi refresh --preview-only --json`. */
107
+ export interface PulumiStep {
108
+ op?: string;
109
+ urn?: string;
110
+ provider?: string;
111
+ oldState?: PulumiStepState;
112
+ newState?: PulumiStepState;
113
+ diffReasons?: string[];
114
+ replaceReasons?: string[];
115
+ detailedDiff?: Record<string, {
116
+ kind?: string;
117
+ inputDiff?: boolean;
118
+ }> | null;
119
+ }
120
+ /** The steps of a preview or refresh document, or undefined when it has none. */
121
+ export declare function pulumiSteps(doc: unknown): PulumiStep[] | undefined;
122
+ /** One resource of a `pulumi stack export`, as far as the adapter reads it. */
123
+ export interface PulumiExportedResource {
124
+ urn: string;
125
+ type: string;
126
+ custom?: boolean;
127
+ id?: string;
128
+ parent?: string;
129
+ }
130
+ /** The resources of a `pulumi stack export` document (`deployment.resources`). Not one: an empty list. */
131
+ export declare function pulumiExportResources(doc: unknown): PulumiExportedResource[];
132
+ /** Step ops that change nothing: what {@link PulumiPreviewDigestOptions.changedOnly} leaves out of the digest. */
133
+ export declare const PULUMI_UNCHANGED_OPS: ReadonlySet<string>;
134
+ export interface PulumiPreviewDigestOptions {
135
+ /**
136
+ * Leave `same` and `read` steps out (#4541, ruling B): set for a member on
137
+ * the resource lock grain, so a pull request that lands on other resources
138
+ * of the stack does not move this one's digest. plunge's plan stamp still
139
+ * refuses a moved record among the steps that change.
140
+ */
141
+ changedOnly?: boolean;
142
+ }
143
+ /**
144
+ * The member's plan digest: `computePlanDigest("pulumi-preview", …)` over
145
+ * what each step proposes, sorted by URN and op, so two renderings of one
146
+ * preview agree. See the module comment for what it leaves out. With
147
+ * `changedOnly`, `same` and `read` steps are left out too, under the label
148
+ * `pulumi-preview-changed`, so the two digests never collide.
149
+ */
150
+ export declare function pulumiPreviewDigest(preview: unknown, opts?: PulumiPreviewDigestOptions): string;
151
+ /** The action and disruption one URN's steps mean, or undefined for an op the change set has no action for. */
152
+ export declare function pulumiStepsAction(steps: PulumiStep[]): {
153
+ action: ChangeSetAction;
154
+ disruption?: ChangeSetDisruption;
155
+ importing?: true;
156
+ } | undefined;
157
+ export interface PulumiPreviewPartInput {
158
+ /** The workspace member's name, which names its graph nodes (`<member>/<key>`). */
159
+ member: string;
160
+ /** `pulumi preview --json`, parsed. */
161
+ preview: unknown;
162
+ /** The stack the preview ran against, recorded as `scope`. */
163
+ stack?: string;
164
+ /**
165
+ * The last deployment, as `pulumi stack export` prints it: the member's
166
+ * checked-in `stack-export.json`. With it, a resource the preview leaves
167
+ * out is a `mayAppear` entry rather than silence.
168
+ */
169
+ prior?: unknown;
170
+ /** The preview was narrowed with `--target`, so it lists only its targets. */
171
+ targeted?: boolean;
172
+ /** The preview failed: the member is failed with this error, and keeps whatever steps it printed. */
173
+ error?: string;
174
+ /** Digest options (#4541, ruling B): `changedOnly` for a member on the resource lock grain. */
175
+ digest?: PulumiPreviewDigestOptions;
176
+ }
177
+ /**
178
+ * A Pulumi member's part, from its `pulumi preview --json`. Throws when the
179
+ * document has no `steps` and no `error` says why.
180
+ */
181
+ export declare function pulumiPreviewPart(input: PulumiPreviewPartInput): ChangeSetPart;
182
+ //# sourceMappingURL=change-set.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"change-set.d.ts","sourceRoot":"","sources":["../src/change-set.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2FG;AAEH,OAAO,KAAK,EACV,eAAe,EAEf,mBAAmB,EAGnB,aAAa,EACd,MAAM,6BAA6B,CAAC;AAGrC,OAAO,EAA6E,KAAK,IAAI,EAAE,MAAM,UAAU,CAAC;AAEhH,kGAAkG;AAClG,MAAM,WAAW,eAAe;IAC9B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,IAAI,CAAC;IACd,OAAO,CAAC,EAAE,IAAI,CAAC;CAChB;AAED,qFAAqF;AACrF,MAAM,WAAW,UAAU;IACzB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,GAAG,IAAI,CAAC;CAC9E;AAED,iFAAiF;AACjF,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,UAAU,EAAE,GAAG,SAAS,CAGlE;AAED,+EAA+E;AAC/E,MAAM,WAAW,sBAAsB;IACrC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,0GAA0G;AAC1G,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,OAAO,GAAG,sBAAsB,EAAE,CAI5E;AAID,kHAAkH;AAClH,eAAO,MAAM,oBAAoB,EAAE,WAAW,CAAC,MAAM,CAA6B,CAAC;AAEnF,MAAM,WAAW,0BAA0B;IACzC;;;;;OAKG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,GAAE,0BAA+B,GAAG,MAAM,CAgBnG;AAID,+GAA+G;AAC/G,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG;IAAE,MAAM,EAAE,eAAe,CAAC;IAAC,UAAU,CAAC,EAAE,mBAAmB,CAAC;IAAC,SAAS,CAAC,EAAE,IAAI,CAAA;CAAE,GAAG,SAAS,CAElJ;AAsFD,MAAM,WAAW,sBAAsB;IACrC,mFAAmF;IACnF,MAAM,EAAE,MAAM,CAAC;IACf,uCAAuC;IACvC,OAAO,EAAE,OAAO,CAAC;IACjB,8DAA8D;IAC9D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,qGAAqG;IACrG,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+FAA+F;IAC/F,MAAM,CAAC,EAAE,0BAA0B,CAAC;CACrC;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,sBAAsB,GAAG,aAAa,CAyH9E"}