@mannyc1/ts-release 0.0.7 → 0.3.0

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 (695) hide show
  1. package/ARCHITECTURE.md +184 -92
  2. package/CHANGELOG.md +197 -0
  3. package/LICENSE +21 -0
  4. package/README.md +404 -327
  5. package/SPEC.md +257 -310
  6. package/apps/release-ts/README.md +39 -0
  7. package/apps/release-ts/src/cli/command.ts +164 -0
  8. package/apps/release-ts/src/cli/commands.ts +351 -0
  9. package/apps/release-ts/src/cli/main.ts +43 -0
  10. package/apps/release-ts/src/cli/node-main.ts +49 -0
  11. package/apps/ts-release-agents/LICENSE +21 -0
  12. package/apps/ts-release-agents/README.md +21 -0
  13. package/apps/ts-release-agents/evals/cases.json +11 -0
  14. package/apps/ts-release-agents/manifests/claude.json +5 -0
  15. package/apps/ts-release-agents/manifests/codex.json +5 -0
  16. package/apps/ts-release-agents/package.json +11 -0
  17. package/apps/ts-release-agents/skills/release/SKILL.md +48 -0
  18. package/apps/ts-release-agents/skills/release/references/configuration.md +18 -0
  19. package/apps/ts-release-agents/skills/release/references/recovery.md +10 -0
  20. package/apps/ts-release-agents/skills/release/references/staged-workflow.md +12 -0
  21. package/apps/ts-release-agents/skills/release/references/target-selection.md +13 -0
  22. package/apps/ts-release-agents/skills/release/references/verification.md +14 -0
  23. package/apps/ts-release-agents/src/build.ts +105 -0
  24. package/apps/ts-release-agents/src/check.ts +122 -0
  25. package/apps/ts-release-agents/src/install.ts +121 -0
  26. package/apps/ts-release-agents/test/contract.test.ts +56 -0
  27. package/apps/ts-release-agents/tsconfig.json +5 -0
  28. package/dist/api/api.d.ts +15 -0
  29. package/dist/api/api.d.ts.map +1 -0
  30. package/dist/api/api.js +244 -0
  31. package/dist/api/api.js.map +1 -0
  32. package/dist/api/errors.d.ts +39 -0
  33. package/dist/api/errors.d.ts.map +1 -0
  34. package/dist/api/errors.js +32 -0
  35. package/dist/api/errors.js.map +1 -0
  36. package/dist/api/input.d.ts +10 -0
  37. package/dist/api/input.d.ts.map +1 -0
  38. package/dist/api/input.js +73 -0
  39. package/dist/api/input.js.map +1 -0
  40. package/dist/api/runtime.d.ts +18 -0
  41. package/dist/api/runtime.d.ts.map +1 -0
  42. package/dist/api/runtime.js +7 -0
  43. package/dist/api/runtime.js.map +1 -0
  44. package/dist/api/types.d.ts +76 -0
  45. package/dist/api/types.d.ts.map +1 -0
  46. package/dist/api/types.js +17 -0
  47. package/dist/api/types.js.map +1 -0
  48. package/dist/bin/ts-release.js +39346 -0
  49. package/dist/capabilities/bun-targets.d.ts +3 -0
  50. package/dist/capabilities/bun-targets.d.ts.map +1 -0
  51. package/dist/capabilities/bun-targets.js +3 -0
  52. package/dist/capabilities/bun-targets.js.map +1 -0
  53. package/dist/capabilities/field-ownership.d.ts +17 -0
  54. package/dist/capabilities/field-ownership.d.ts.map +1 -0
  55. package/dist/capabilities/field-ownership.js +40 -0
  56. package/dist/capabilities/field-ownership.js.map +1 -0
  57. package/dist/capabilities/module.d.ts +91 -0
  58. package/dist/capabilities/module.d.ts.map +1 -0
  59. package/dist/capabilities/module.js +2 -0
  60. package/dist/capabilities/module.js.map +1 -0
  61. package/dist/capabilities/registry.d.ts +829 -0
  62. package/dist/capabilities/registry.d.ts.map +1 -0
  63. package/dist/capabilities/registry.js +291 -0
  64. package/dist/capabilities/registry.js.map +1 -0
  65. package/dist/config/config.d.ts +6 -0
  66. package/dist/config/config.d.ts.map +1 -0
  67. package/dist/config/config.js +42 -0
  68. package/dist/config/config.js.map +1 -0
  69. package/dist/correction/coordinator.d.ts +248 -0
  70. package/dist/correction/coordinator.d.ts.map +1 -0
  71. package/dist/correction/coordinator.js +274 -0
  72. package/dist/correction/coordinator.js.map +1 -0
  73. package/dist/correction/index.d.ts +3 -0
  74. package/dist/correction/index.d.ts.map +1 -0
  75. package/dist/correction/index.js +3 -0
  76. package/dist/correction/index.js.map +1 -0
  77. package/dist/correction/intent.d.ts +111 -0
  78. package/dist/correction/intent.d.ts.map +1 -0
  79. package/dist/correction/intent.js +146 -0
  80. package/dist/correction/intent.js.map +1 -0
  81. package/dist/drivers/archive.d.ts +9 -0
  82. package/dist/drivers/archive.d.ts.map +1 -0
  83. package/dist/drivers/archive.js +105 -0
  84. package/dist/drivers/archive.js.map +1 -0
  85. package/dist/drivers/contain.d.ts +6 -0
  86. package/dist/drivers/contain.d.ts.map +1 -0
  87. package/dist/drivers/contain.js +17 -0
  88. package/dist/drivers/contain.js.map +1 -0
  89. package/dist/drivers/environment.d.ts +4 -0
  90. package/dist/drivers/environment.d.ts.map +1 -0
  91. package/dist/drivers/environment.js +18 -0
  92. package/dist/drivers/environment.js.map +1 -0
  93. package/dist/drivers/errors.d.ts +9 -0
  94. package/dist/drivers/errors.d.ts.map +1 -0
  95. package/dist/drivers/errors.js +6 -0
  96. package/dist/drivers/errors.js.map +1 -0
  97. package/dist/drivers/glob.d.ts +2 -0
  98. package/dist/drivers/glob.d.ts.map +1 -0
  99. package/dist/drivers/glob.js +162 -0
  100. package/dist/drivers/glob.js.map +1 -0
  101. package/dist/drivers/process.d.ts +48 -0
  102. package/dist/drivers/process.d.ts.map +1 -0
  103. package/dist/drivers/process.js +257 -0
  104. package/dist/drivers/process.js.map +1 -0
  105. package/dist/drivers/python-wheel.d.ts +21 -0
  106. package/dist/drivers/python-wheel.d.ts.map +1 -0
  107. package/dist/drivers/python-wheel.js +109 -0
  108. package/dist/drivers/python-wheel.js.map +1 -0
  109. package/dist/drivers/redact.d.ts +4 -0
  110. package/dist/drivers/redact.d.ts.map +1 -0
  111. package/dist/drivers/redact.js +24 -0
  112. package/dist/drivers/redact.js.map +1 -0
  113. package/dist/drivers/seccomp-helper-source.d.ts +7 -0
  114. package/dist/drivers/seccomp-helper-source.d.ts.map +1 -0
  115. package/dist/drivers/seccomp-helper-source.js +121 -0
  116. package/dist/drivers/seccomp-helper-source.js.map +1 -0
  117. package/dist/drivers/utils.d.ts +4 -0
  118. package/dist/drivers/utils.d.ts.map +1 -0
  119. package/dist/drivers/utils.js +5 -0
  120. package/dist/drivers/utils.js.map +1 -0
  121. package/dist/drivers/workspace.d.ts +9 -0
  122. package/dist/drivers/workspace.d.ts.map +1 -0
  123. package/dist/drivers/workspace.js +53 -0
  124. package/dist/drivers/workspace.js.map +1 -0
  125. package/dist/extensions/provider-adapter.d.ts +48 -0
  126. package/dist/extensions/provider-adapter.d.ts.map +1 -0
  127. package/dist/extensions/provider-adapter.js +64 -0
  128. package/dist/extensions/provider-adapter.js.map +1 -0
  129. package/dist/host.d.ts +33 -0
  130. package/dist/host.d.ts.map +1 -0
  131. package/dist/host.js +20 -0
  132. package/dist/host.js.map +1 -0
  133. package/dist/index.d.ts +19 -1
  134. package/dist/index.d.ts.map +1 -1
  135. package/dist/index.js +12 -1
  136. package/dist/index.js.map +1 -1
  137. package/dist/model/artifact-collection.d.ts +84 -0
  138. package/dist/model/artifact-collection.d.ts.map +1 -0
  139. package/dist/model/artifact-collection.js +185 -0
  140. package/dist/model/artifact-collection.js.map +1 -0
  141. package/dist/model/authority.d.ts +89 -0
  142. package/dist/model/authority.d.ts.map +1 -0
  143. package/dist/model/authority.js +80 -0
  144. package/dist/model/authority.js.map +1 -0
  145. package/dist/model/bun-targets.d.ts +34 -0
  146. package/dist/model/bun-targets.d.ts.map +1 -0
  147. package/dist/model/bun-targets.js +17 -0
  148. package/dist/model/bun-targets.js.map +1 -0
  149. package/dist/model/canonical.d.ts +8 -0
  150. package/dist/model/canonical.d.ts.map +1 -0
  151. package/dist/model/canonical.js +205 -0
  152. package/dist/model/canonical.js.map +1 -0
  153. package/dist/model/catalog.d.ts +76 -0
  154. package/dist/model/catalog.d.ts.map +1 -0
  155. package/dist/model/catalog.js +174 -0
  156. package/dist/model/catalog.js.map +1 -0
  157. package/dist/model/digest.d.ts +53 -0
  158. package/dist/model/digest.d.ts.map +1 -0
  159. package/dist/model/digest.js +127 -0
  160. package/dist/model/digest.js.map +1 -0
  161. package/dist/model/errors.d.ts +14 -0
  162. package/dist/model/errors.d.ts.map +1 -0
  163. package/dist/model/errors.js +8 -0
  164. package/dist/model/errors.js.map +1 -0
  165. package/dist/model/primitives.d.ts +19 -0
  166. package/dist/model/primitives.d.ts.map +1 -0
  167. package/dist/model/primitives.js +18 -0
  168. package/dist/model/primitives.js.map +1 -0
  169. package/dist/model/pypi.d.ts +12 -0
  170. package/dist/model/pypi.d.ts.map +1 -0
  171. package/dist/model/pypi.js +20 -0
  172. package/dist/model/pypi.js.map +1 -0
  173. package/dist/model/python-distribution.d.ts +33 -0
  174. package/dist/model/python-distribution.d.ts.map +1 -0
  175. package/dist/model/python-distribution.js +367 -0
  176. package/dist/model/python-distribution.js.map +1 -0
  177. package/dist/model/secret-patterns.d.ts +2 -0
  178. package/dist/model/secret-patterns.d.ts.map +1 -0
  179. package/dist/model/secret-patterns.js +12 -0
  180. package/dist/model/secret-patterns.js.map +1 -0
  181. package/dist/operation-journal/authority.d.ts +3 -0
  182. package/dist/operation-journal/authority.d.ts.map +1 -0
  183. package/dist/operation-journal/authority.js +147 -0
  184. package/dist/operation-journal/authority.js.map +1 -0
  185. package/dist/operation-journal/aws/deadline.d.ts +12 -0
  186. package/dist/operation-journal/aws/deadline.d.ts.map +1 -0
  187. package/dist/operation-journal/aws/deadline.js +38 -0
  188. package/dist/operation-journal/aws/deadline.js.map +1 -0
  189. package/dist/operation-journal/aws/oidc.d.ts +27 -0
  190. package/dist/operation-journal/aws/oidc.d.ts.map +1 -0
  191. package/dist/operation-journal/aws/oidc.js +361 -0
  192. package/dist/operation-journal/aws/oidc.js.map +1 -0
  193. package/dist/operation-journal/aws/policy.d.ts +42 -0
  194. package/dist/operation-journal/aws/policy.d.ts.map +1 -0
  195. package/dist/operation-journal/aws/policy.js +404 -0
  196. package/dist/operation-journal/aws/policy.js.map +1 -0
  197. package/dist/operation-journal/aws/s3-boundary.d.ts +17 -0
  198. package/dist/operation-journal/aws/s3-boundary.d.ts.map +1 -0
  199. package/dist/operation-journal/aws/s3-boundary.js +417 -0
  200. package/dist/operation-journal/aws/s3-boundary.js.map +1 -0
  201. package/dist/operation-journal/aws.d.ts +11 -0
  202. package/dist/operation-journal/aws.d.ts.map +1 -0
  203. package/dist/operation-journal/aws.js +50 -0
  204. package/dist/operation-journal/aws.js.map +1 -0
  205. package/dist/operation-journal/canonical.d.ts +52 -0
  206. package/dist/operation-journal/canonical.d.ts.map +1 -0
  207. package/dist/operation-journal/canonical.js +282 -0
  208. package/dist/operation-journal/canonical.js.map +1 -0
  209. package/dist/operation-journal/model.d.ts +251 -0
  210. package/dist/operation-journal/model.d.ts.map +1 -0
  211. package/dist/operation-journal/model.js +56 -0
  212. package/dist/operation-journal/model.js.map +1 -0
  213. package/dist/operation-journal/reducer.d.ts +28 -0
  214. package/dist/operation-journal/reducer.d.ts.map +1 -0
  215. package/dist/operation-journal/reducer.js +73 -0
  216. package/dist/operation-journal/reducer.js.map +1 -0
  217. package/dist/operation-journal/s3.d.ts +7 -0
  218. package/dist/operation-journal/s3.d.ts.map +1 -0
  219. package/dist/operation-journal/s3.js +667 -0
  220. package/dist/operation-journal/s3.js.map +1 -0
  221. package/dist/operation-journal.d.ts +14 -0
  222. package/dist/operation-journal.d.ts.map +1 -0
  223. package/dist/operation-journal.js +12 -0
  224. package/dist/operation-journal.js.map +1 -0
  225. package/dist/platform/bun.d.ts +7 -0
  226. package/dist/platform/bun.d.ts.map +1 -0
  227. package/dist/platform/bun.js +15 -0
  228. package/dist/platform/bun.js.map +1 -0
  229. package/dist/platform/credentials.d.ts +32 -0
  230. package/dist/platform/credentials.d.ts.map +1 -0
  231. package/dist/platform/credentials.js +834 -0
  232. package/dist/platform/credentials.js.map +1 -0
  233. package/dist/platform/host-support.d.ts +2 -0
  234. package/dist/platform/host-support.d.ts.map +1 -0
  235. package/dist/platform/host-support.js +4 -0
  236. package/dist/platform/host-support.js.map +1 -0
  237. package/dist/platform/node.d.ts +7 -0
  238. package/dist/platform/node.d.ts.map +1 -0
  239. package/dist/platform/node.js +15 -0
  240. package/dist/platform/node.js.map +1 -0
  241. package/dist/platform/release-runtime.d.ts +11 -0
  242. package/dist/platform/release-runtime.d.ts.map +1 -0
  243. package/dist/platform/release-runtime.js +34 -0
  244. package/dist/platform/release-runtime.js.map +1 -0
  245. package/dist/platform/services.d.ts +15 -0
  246. package/dist/platform/services.d.ts.map +1 -0
  247. package/dist/platform/services.js +30 -0
  248. package/dist/platform/services.js.map +1 -0
  249. package/dist/platform/source-observer.d.ts +5 -0
  250. package/dist/platform/source-observer.d.ts.map +1 -0
  251. package/dist/platform/source-observer.js +159 -0
  252. package/dist/platform/source-observer.js.map +1 -0
  253. package/dist/provider-sdk.d.ts +14 -0
  254. package/dist/provider-sdk.d.ts.map +1 -0
  255. package/dist/provider-sdk.js +10 -0
  256. package/dist/provider-sdk.js.map +1 -0
  257. package/dist/publication/adapter.d.ts +212 -0
  258. package/dist/publication/adapter.d.ts.map +1 -0
  259. package/dist/publication/adapter.js +83 -0
  260. package/dist/publication/adapter.js.map +1 -0
  261. package/dist/publication/authority.d.ts +137 -0
  262. package/dist/publication/authority.d.ts.map +1 -0
  263. package/dist/publication/authority.js +233 -0
  264. package/dist/publication/authority.js.map +1 -0
  265. package/dist/publication/catalog-git.d.ts +37 -0
  266. package/dist/publication/catalog-git.d.ts.map +1 -0
  267. package/dist/publication/catalog-git.js +451 -0
  268. package/dist/publication/catalog-git.js.map +1 -0
  269. package/dist/publication/claim.d.ts +39 -0
  270. package/dist/publication/claim.d.ts.map +1 -0
  271. package/dist/publication/claim.js +31 -0
  272. package/dist/publication/claim.js.map +1 -0
  273. package/dist/publication/coordinator.d.ts +246 -0
  274. package/dist/publication/coordinator.d.ts.map +1 -0
  275. package/dist/publication/coordinator.js +370 -0
  276. package/dist/publication/coordinator.js.map +1 -0
  277. package/dist/publication/github.d.ts +36 -0
  278. package/dist/publication/github.d.ts.map +1 -0
  279. package/dist/publication/github.js +695 -0
  280. package/dist/publication/github.js.map +1 -0
  281. package/dist/publication/http.d.ts +69 -0
  282. package/dist/publication/http.d.ts.map +1 -0
  283. package/dist/publication/http.js +29 -0
  284. package/dist/publication/http.js.map +1 -0
  285. package/dist/publication/index.d.ts +5 -0
  286. package/dist/publication/index.d.ts.map +1 -0
  287. package/dist/publication/index.js +5 -0
  288. package/dist/publication/index.js.map +1 -0
  289. package/dist/publication/npm.d.ts +40 -0
  290. package/dist/publication/npm.d.ts.map +1 -0
  291. package/dist/publication/npm.js +359 -0
  292. package/dist/publication/npm.js.map +1 -0
  293. package/dist/publication/profiles.d.ts +136 -0
  294. package/dist/publication/profiles.d.ts.map +1 -0
  295. package/dist/publication/profiles.js +90 -0
  296. package/dist/publication/profiles.js.map +1 -0
  297. package/dist/publication/publisher.d.ts +82 -0
  298. package/dist/publication/publisher.d.ts.map +1 -0
  299. package/dist/publication/publisher.js +53 -0
  300. package/dist/publication/publisher.js.map +1 -0
  301. package/dist/publication/pypi.d.ts +45 -0
  302. package/dist/publication/pypi.d.ts.map +1 -0
  303. package/dist/publication/pypi.js +369 -0
  304. package/dist/publication/pypi.js.map +1 -0
  305. package/dist/publication/recovery.d.ts +663 -0
  306. package/dist/publication/recovery.d.ts.map +1 -0
  307. package/dist/publication/recovery.js +252 -0
  308. package/dist/publication/recovery.js.map +1 -0
  309. package/dist/publication/report.d.ts +1061 -0
  310. package/dist/publication/report.d.ts.map +1 -0
  311. package/dist/publication/report.js +441 -0
  312. package/dist/publication/report.js.map +1 -0
  313. package/dist/recipes/config.d.ts +296 -0
  314. package/dist/recipes/config.d.ts.map +1 -0
  315. package/dist/recipes/config.js +325 -0
  316. package/dist/recipes/config.js.map +1 -0
  317. package/dist/release/capabilities.d.ts +12 -0
  318. package/dist/release/capabilities.d.ts.map +1 -0
  319. package/dist/release/capabilities.js +395 -0
  320. package/dist/release/capabilities.js.map +1 -0
  321. package/dist/release/compiler.d.ts +5 -0
  322. package/dist/release/compiler.d.ts.map +1 -0
  323. package/dist/release/compiler.js +19 -0
  324. package/dist/release/compiler.js.map +1 -0
  325. package/dist/release/config.d.ts +5 -0
  326. package/dist/release/config.d.ts.map +1 -0
  327. package/dist/release/config.js +10 -0
  328. package/dist/release/config.js.map +1 -0
  329. package/dist/release/context.d.ts +96 -0
  330. package/dist/release/context.d.ts.map +1 -0
  331. package/dist/release/context.js +168 -0
  332. package/dist/release/context.js.map +1 -0
  333. package/dist/release/graph.d.ts +271 -0
  334. package/dist/release/graph.d.ts.map +1 -0
  335. package/dist/release/graph.js +766 -0
  336. package/dist/release/graph.js.map +1 -0
  337. package/dist/release/inspect.d.ts +88 -0
  338. package/dist/release/inspect.d.ts.map +1 -0
  339. package/dist/release/inspect.js +75 -0
  340. package/dist/release/inspect.js.map +1 -0
  341. package/dist/release/prepare.d.ts +24 -0
  342. package/dist/release/prepare.d.ts.map +1 -0
  343. package/dist/release/prepare.js +1115 -0
  344. package/dist/release/prepare.js.map +1 -0
  345. package/dist/release/prepared-ref.d.ts +60 -0
  346. package/dist/release/prepared-ref.d.ts.map +1 -0
  347. package/dist/release/prepared-ref.js +131 -0
  348. package/dist/release/prepared-ref.js.map +1 -0
  349. package/dist/release/prepared-store.d.ts +90 -0
  350. package/dist/release/prepared-store.d.ts.map +1 -0
  351. package/dist/release/prepared-store.js +339 -0
  352. package/dist/release/prepared-store.js.map +1 -0
  353. package/dist/release/prepared.d.ts +172 -0
  354. package/dist/release/prepared.d.ts.map +1 -0
  355. package/dist/release/prepared.js +268 -0
  356. package/dist/release/prepared.js.map +1 -0
  357. package/dist/release/staging.d.ts +31 -0
  358. package/dist/release/staging.d.ts.map +1 -0
  359. package/dist/release/staging.js +218 -0
  360. package/dist/release/staging.js.map +1 -0
  361. package/dist/resolve/authored.d.ts +53 -0
  362. package/dist/resolve/authored.d.ts.map +1 -0
  363. package/dist/resolve/authored.js +55 -0
  364. package/dist/resolve/authored.js.map +1 -0
  365. package/dist/resolve/encode.d.ts +3 -0
  366. package/dist/resolve/encode.d.ts.map +1 -0
  367. package/dist/resolve/encode.js +21 -0
  368. package/dist/resolve/encode.js.map +1 -0
  369. package/dist/resolve/errors.d.ts +7 -0
  370. package/dist/resolve/errors.d.ts.map +1 -0
  371. package/dist/resolve/errors.js +17 -0
  372. package/dist/resolve/errors.js.map +1 -0
  373. package/dist/resolve/facts.d.ts +12 -0
  374. package/dist/resolve/facts.d.ts.map +1 -0
  375. package/dist/resolve/facts.js +18 -0
  376. package/dist/resolve/facts.js.map +1 -0
  377. package/dist/resolve/resolve.d.ts +10 -0
  378. package/dist/resolve/resolve.d.ts.map +1 -0
  379. package/dist/resolve/resolve.js +242 -0
  380. package/dist/resolve/resolve.js.map +1 -0
  381. package/dist/store.d.ts +11 -0
  382. package/dist/store.d.ts.map +1 -0
  383. package/dist/store.js +9 -0
  384. package/dist/store.js.map +1 -0
  385. package/examples/README.md +20 -30
  386. package/examples/github-release/release.config.json +11 -18
  387. package/examples/homebrew-tap/README.md +11 -0
  388. package/examples/homebrew-tap/release.config.json +40 -28
  389. package/examples/multi-target/release.config.json +28 -53
  390. package/examples/npm-first-publish/release.config.json +23 -25
  391. package/examples/npm-only/release.config.json +22 -30
  392. package/examples/portable-cli/README.md +17 -0
  393. package/examples/portable-cli/artifacts/portable-example-0.1.0-darwin-arm64 +1 -0
  394. package/examples/portable-cli/artifacts/portable-example-0.1.0-darwin-x64 +1 -0
  395. package/examples/portable-cli/artifacts/portable-example-0.1.0-linux-arm64 +1 -0
  396. package/examples/portable-cli/artifacts/portable-example-0.1.0-linux-x64 +1 -0
  397. package/examples/portable-cli/artifacts/portable-example-0.1.0-windows-x64.exe +1 -0
  398. package/examples/portable-cli/artifacts/portable_example-0.1.0-py3-none-macosx_10_15_x86_64.whl +1 -0
  399. package/examples/portable-cli/artifacts/portable_example-0.1.0-py3-none-macosx_11_0_arm64.whl +1 -0
  400. package/examples/portable-cli/artifacts/portable_example-0.1.0-py3-none-manylinux2014_aarch64.whl +1 -0
  401. package/examples/portable-cli/artifacts/portable_example-0.1.0-py3-none-manylinux2014_x86_64.whl +1 -0
  402. package/examples/portable-cli/artifacts/portable_example-0.1.0-py3-none-win_amd64.whl +1 -0
  403. package/examples/portable-cli/package.json +9 -0
  404. package/examples/portable-cli/release.config.json +53 -0
  405. package/examples/portable-cli/src/cli.ts +3 -0
  406. package/examples/pypi-registry/README.md +8 -0
  407. package/examples/scoop-bucket/README.md +10 -0
  408. package/examples/scoop-bucket/release.config.json +40 -30
  409. package/package.json +73 -154
  410. package/src/api/api.ts +365 -0
  411. package/src/api/errors.ts +36 -0
  412. package/src/api/input.ts +92 -0
  413. package/src/api/runtime.ts +14 -0
  414. package/src/api/types.ts +103 -0
  415. package/src/capabilities/bun-targets.ts +2 -0
  416. package/src/capabilities/field-ownership.ts +60 -0
  417. package/src/capabilities/module.ts +158 -0
  418. package/src/capabilities/registry.ts +333 -0
  419. package/src/config/config.ts +48 -0
  420. package/src/correction/coordinator.ts +336 -0
  421. package/src/correction/index.ts +2 -0
  422. package/src/correction/intent.ts +172 -0
  423. package/src/drivers/archive.ts +111 -0
  424. package/src/drivers/contain.ts +20 -0
  425. package/src/drivers/environment.ts +28 -0
  426. package/src/drivers/errors.ts +6 -0
  427. package/src/drivers/glob.ts +137 -0
  428. package/src/drivers/process.ts +339 -0
  429. package/src/drivers/python-wheel.ts +145 -0
  430. package/src/drivers/redact.ts +31 -0
  431. package/src/drivers/seccomp-helper-source.ts +121 -0
  432. package/src/drivers/utils.ts +10 -0
  433. package/src/drivers/workspace.ts +46 -0
  434. package/src/extensions/provider-adapter.ts +99 -0
  435. package/src/host.ts +140 -0
  436. package/src/index.ts +64 -0
  437. package/src/model/artifact-collection.ts +237 -0
  438. package/src/model/authority.ts +116 -0
  439. package/src/model/bun-targets.ts +34 -0
  440. package/src/model/canonical.ts +205 -0
  441. package/src/model/catalog.ts +220 -0
  442. package/src/model/digest.ts +172 -0
  443. package/src/model/errors.ts +6 -0
  444. package/src/model/primitives.ts +37 -0
  445. package/src/model/pypi.ts +30 -0
  446. package/src/model/python-distribution.ts +360 -0
  447. package/src/model/secret-patterns.ts +11 -0
  448. package/src/operation-journal/authority.ts +162 -0
  449. package/src/operation-journal/aws/deadline.ts +41 -0
  450. package/src/operation-journal/aws/oidc.ts +439 -0
  451. package/src/operation-journal/aws/policy.ts +491 -0
  452. package/src/operation-journal/aws/s3-boundary.ts +562 -0
  453. package/src/operation-journal/aws.ts +60 -0
  454. package/src/operation-journal/canonical.ts +373 -0
  455. package/src/operation-journal/model.ts +301 -0
  456. package/src/operation-journal/reducer.ts +112 -0
  457. package/src/operation-journal/s3.ts +884 -0
  458. package/src/operation-journal.ts +51 -0
  459. package/src/platform/bun.ts +38 -0
  460. package/src/platform/credentials.ts +1151 -0
  461. package/src/platform/host-support.ts +4 -0
  462. package/src/platform/node.ts +38 -0
  463. package/src/platform/release-runtime.ts +47 -0
  464. package/src/platform/services.ts +57 -0
  465. package/src/platform/source-observer.ts +193 -0
  466. package/src/provider-sdk.ts +48 -0
  467. package/src/publication/adapter.ts +132 -0
  468. package/src/publication/authority.ts +397 -0
  469. package/src/publication/catalog-git.ts +603 -0
  470. package/src/publication/claim.ts +51 -0
  471. package/src/publication/coordinator.ts +578 -0
  472. package/src/publication/github.ts +1022 -0
  473. package/src/publication/http.ts +101 -0
  474. package/src/publication/index.ts +4 -0
  475. package/src/publication/npm.ts +525 -0
  476. package/src/publication/profiles.ts +94 -0
  477. package/src/publication/publisher.ts +130 -0
  478. package/src/publication/pypi.ts +463 -0
  479. package/src/publication/recovery.ts +349 -0
  480. package/src/publication/report.ts +628 -0
  481. package/src/recipes/config.ts +395 -0
  482. package/src/release/capabilities.ts +460 -0
  483. package/src/release/compiler.ts +28 -0
  484. package/src/release/config.ts +12 -0
  485. package/src/release/context.ts +223 -0
  486. package/src/release/graph.ts +866 -0
  487. package/src/release/inspect.ts +83 -0
  488. package/src/release/prepare.ts +1329 -0
  489. package/src/release/prepared-ref.ts +193 -0
  490. package/src/release/prepared-store.ts +378 -0
  491. package/src/release/prepared.ts +299 -0
  492. package/src/release/staging.ts +257 -0
  493. package/src/resolve/authored.ts +64 -0
  494. package/src/resolve/encode.ts +22 -0
  495. package/src/resolve/errors.ts +15 -0
  496. package/src/resolve/facts.ts +18 -0
  497. package/src/resolve/resolve.ts +328 -0
  498. package/src/store.ts +28 -0
  499. package/templates/README.md +55 -72
  500. package/templates/bun-cli-github/README.md +7 -9
  501. package/templates/bun-cli-github/release.config.json +35 -73
  502. package/templates/github-actions/release.yml +74 -0
  503. package/templates/github-actions/reviewed-release.yml +115 -0
  504. package/templates/multi-target-homebrew/README.md +10 -0
  505. package/templates/multi-target-homebrew/release.config.json +43 -60
  506. package/templates/multi-target-scoop/README.md +10 -0
  507. package/templates/multi-target-scoop/release.config.json +43 -62
  508. package/templates/npm-github/release.config.json +25 -38
  509. package/templates/npm-github/reviewed-release.config.json +37 -0
  510. package/templates/npm-only/README.md +10 -0
  511. package/templates/npm-only/release.config.json +15 -30
  512. package/templates/portable-cli/README.md +13 -0
  513. package/templates/portable-cli/release.config.json +53 -0
  514. package/dist/artifacts/adapter.d.ts +0 -39
  515. package/dist/artifacts/adapter.d.ts.map +0 -1
  516. package/dist/artifacts/adapter.js +0 -23
  517. package/dist/artifacts/adapter.js.map +0 -1
  518. package/dist/artifacts/registry.d.ts +0 -21
  519. package/dist/artifacts/registry.d.ts.map +0 -1
  520. package/dist/artifacts/registry.js +0 -21
  521. package/dist/artifacts/registry.js.map +0 -1
  522. package/dist/config/errors.d.ts +0 -24
  523. package/dist/config/errors.d.ts.map +0 -1
  524. package/dist/config/errors.js +0 -19
  525. package/dist/config/errors.js.map +0 -1
  526. package/dist/config/load.d.ts +0 -9
  527. package/dist/config/load.d.ts.map +0 -1
  528. package/dist/config/load.js +0 -29
  529. package/dist/config/load.js.map +0 -1
  530. package/dist/config/schema.d.ts +0 -12
  531. package/dist/config/schema.d.ts.map +0 -1
  532. package/dist/config/schema.js +0 -19
  533. package/dist/config/schema.js.map +0 -1
  534. package/dist/domain/artifact.d.ts +0 -118
  535. package/dist/domain/artifact.d.ts.map +0 -1
  536. package/dist/domain/artifact.js +0 -197
  537. package/dist/domain/artifact.js.map +0 -1
  538. package/dist/domain/evidence.d.ts +0 -59
  539. package/dist/domain/evidence.d.ts.map +0 -1
  540. package/dist/domain/evidence.js +0 -51
  541. package/dist/domain/evidence.js.map +0 -1
  542. package/dist/domain/operation.d.ts +0 -143
  543. package/dist/domain/operation.d.ts.map +0 -1
  544. package/dist/domain/operation.js +0 -198
  545. package/dist/domain/operation.js.map +0 -1
  546. package/dist/domain/release.d.ts +0 -93
  547. package/dist/domain/release.d.ts.map +0 -1
  548. package/dist/domain/release.js +0 -82
  549. package/dist/domain/release.js.map +0 -1
  550. package/dist/domain/remote-state.d.ts +0 -58
  551. package/dist/domain/remote-state.d.ts.map +0 -1
  552. package/dist/domain/remote-state.js +0 -55
  553. package/dist/domain/remote-state.js.map +0 -1
  554. package/dist/domain/target.d.ts +0 -148
  555. package/dist/domain/target.d.ts.map +0 -1
  556. package/dist/domain/target.js +0 -151
  557. package/dist/domain/target.js.map +0 -1
  558. package/dist/host/host.d.ts +0 -32
  559. package/dist/host/host.d.ts.map +0 -1
  560. package/dist/host/host.js +0 -24
  561. package/dist/host/host.js.map +0 -1
  562. package/dist/host/http-live.d.ts +0 -6
  563. package/dist/host/http-live.d.ts.map +0 -1
  564. package/dist/host/http-live.js +0 -86
  565. package/dist/host/http-live.js.map +0 -1
  566. package/dist/host/http.d.ts +0 -43
  567. package/dist/host/http.d.ts.map +0 -1
  568. package/dist/host/http.js +0 -59
  569. package/dist/host/http.js.map +0 -1
  570. package/dist/host/platform.d.ts +0 -10
  571. package/dist/host/platform.d.ts.map +0 -1
  572. package/dist/host/platform.js +0 -114
  573. package/dist/host/platform.js.map +0 -1
  574. package/dist/host/test.d.ts +0 -23
  575. package/dist/host/test.d.ts.map +0 -1
  576. package/dist/host/test.js +0 -222
  577. package/dist/host/test.js.map +0 -1
  578. package/dist/internal/workspace-path.d.ts +0 -15
  579. package/dist/internal/workspace-path.d.ts.map +0 -1
  580. package/dist/internal/workspace-path.js +0 -36
  581. package/dist/internal/workspace-path.js.map +0 -1
  582. package/dist/planner/artifact-inventory.d.ts +0 -9
  583. package/dist/planner/artifact-inventory.d.ts.map +0 -1
  584. package/dist/planner/artifact-inventory.js +0 -86
  585. package/dist/planner/artifact-inventory.js.map +0 -1
  586. package/dist/planner/create-release-plan.d.ts +0 -5
  587. package/dist/planner/create-release-plan.d.ts.map +0 -1
  588. package/dist/planner/create-release-plan.js +0 -25
  589. package/dist/planner/create-release-plan.js.map +0 -1
  590. package/dist/planner/errors.d.ts +0 -67
  591. package/dist/planner/errors.d.ts.map +0 -1
  592. package/dist/planner/errors.js +0 -58
  593. package/dist/planner/errors.js.map +0 -1
  594. package/dist/planner/evidence-recorder.d.ts +0 -28
  595. package/dist/planner/evidence-recorder.d.ts.map +0 -1
  596. package/dist/planner/evidence-recorder.js +0 -362
  597. package/dist/planner/evidence-recorder.js.map +0 -1
  598. package/dist/planner/executor.d.ts +0 -58
  599. package/dist/planner/executor.d.ts.map +0 -1
  600. package/dist/planner/executor.js +0 -147
  601. package/dist/planner/executor.js.map +0 -1
  602. package/dist/planner/normalize-release.d.ts +0 -19
  603. package/dist/planner/normalize-release.d.ts.map +0 -1
  604. package/dist/planner/normalize-release.js +0 -342
  605. package/dist/planner/normalize-release.js.map +0 -1
  606. package/dist/planner/reconcile.d.ts +0 -17
  607. package/dist/planner/reconcile.d.ts.map +0 -1
  608. package/dist/planner/reconcile.js +0 -259
  609. package/dist/planner/reconcile.js.map +0 -1
  610. package/dist/planner/render-plan.d.ts +0 -15
  611. package/dist/planner/render-plan.d.ts.map +0 -1
  612. package/dist/planner/render-plan.js +0 -231
  613. package/dist/planner/render-plan.js.map +0 -1
  614. package/dist/targets/adapter-helpers.d.ts +0 -79
  615. package/dist/targets/adapter-helpers.d.ts.map +0 -1
  616. package/dist/targets/adapter-helpers.js +0 -194
  617. package/dist/targets/adapter-helpers.js.map +0 -1
  618. package/dist/targets/adapter.d.ts +0 -17
  619. package/dist/targets/adapter.d.ts.map +0 -1
  620. package/dist/targets/adapter.js +0 -2
  621. package/dist/targets/adapter.js.map +0 -1
  622. package/dist/targets/github-release.d.ts +0 -25
  623. package/dist/targets/github-release.d.ts.map +0 -1
  624. package/dist/targets/github-release.js +0 -82
  625. package/dist/targets/github-release.js.map +0 -1
  626. package/dist/targets/github.d.ts +0 -11
  627. package/dist/targets/github.d.ts.map +0 -1
  628. package/dist/targets/github.js +0 -117
  629. package/dist/targets/github.js.map +0 -1
  630. package/dist/targets/homebrew.d.ts +0 -11
  631. package/dist/targets/homebrew.d.ts.map +0 -1
  632. package/dist/targets/homebrew.js +0 -210
  633. package/dist/targets/homebrew.js.map +0 -1
  634. package/dist/targets/live.d.ts +0 -5
  635. package/dist/targets/live.d.ts.map +0 -1
  636. package/dist/targets/live.js +0 -50
  637. package/dist/targets/live.js.map +0 -1
  638. package/dist/targets/npm.d.ts +0 -10
  639. package/dist/targets/npm.d.ts.map +0 -1
  640. package/dist/targets/npm.js +0 -112
  641. package/dist/targets/npm.js.map +0 -1
  642. package/dist/targets/pypi.d.ts +0 -11
  643. package/dist/targets/pypi.d.ts.map +0 -1
  644. package/dist/targets/pypi.js +0 -141
  645. package/dist/targets/pypi.js.map +0 -1
  646. package/dist/targets/registry.d.ts +0 -25
  647. package/dist/targets/registry.d.ts.map +0 -1
  648. package/dist/targets/registry.js +0 -34
  649. package/dist/targets/registry.js.map +0 -1
  650. package/dist/targets/scoop.d.ts +0 -11
  651. package/dist/targets/scoop.d.ts.map +0 -1
  652. package/dist/targets/scoop.js +0 -88
  653. package/dist/targets/scoop.js.map +0 -1
  654. package/dist/types/effect-internal.d.ts +0 -5
  655. package/dist/types/effect-internal.d.ts.map +0 -1
  656. package/dist/types/effect-internal.js +0 -2
  657. package/dist/types/effect-internal.js.map +0 -1
  658. package/dist/workflows/config.d.ts +0 -202
  659. package/dist/workflows/config.d.ts.map +0 -1
  660. package/dist/workflows/config.js +0 -420
  661. package/dist/workflows/config.js.map +0 -1
  662. package/dist/workflows/diagnostics.d.ts +0 -62
  663. package/dist/workflows/diagnostics.d.ts.map +0 -1
  664. package/dist/workflows/diagnostics.js +0 -530
  665. package/dist/workflows/diagnostics.js.map +0 -1
  666. package/dist/workflows/distribution.d.ts +0 -25
  667. package/dist/workflows/distribution.d.ts.map +0 -1
  668. package/dist/workflows/distribution.js +0 -24
  669. package/dist/workflows/distribution.js.map +0 -1
  670. package/dist/workflows/evidence.d.ts +0 -17
  671. package/dist/workflows/evidence.d.ts.map +0 -1
  672. package/dist/workflows/evidence.js +0 -32
  673. package/dist/workflows/evidence.js.map +0 -1
  674. package/dist/workflows/index.d.ts +0 -8
  675. package/dist/workflows/index.d.ts.map +0 -1
  676. package/dist/workflows/index.js +0 -7
  677. package/dist/workflows/index.js.map +0 -1
  678. package/dist/workflows/init.d.ts +0 -84
  679. package/dist/workflows/init.d.ts.map +0 -1
  680. package/dist/workflows/init.js +0 -487
  681. package/dist/workflows/init.js.map +0 -1
  682. package/dist/workflows/live.d.ts +0 -9
  683. package/dist/workflows/live.d.ts.map +0 -1
  684. package/dist/workflows/live.js +0 -7
  685. package/dist/workflows/live.js.map +0 -1
  686. package/dist/workflows/options.d.ts +0 -30
  687. package/dist/workflows/options.d.ts.map +0 -1
  688. package/dist/workflows/options.js +0 -16
  689. package/dist/workflows/options.js.map +0 -1
  690. package/examples/non-strict-skips/artifacts/release-example-skips-0.1.0.tgz +0 -1
  691. package/examples/non-strict-skips/release.config.json +0 -31
  692. package/examples/pypi-registry/release.config.json +0 -31
  693. package/templates/github-actions/plan-and-approved-execute.yml +0 -58
  694. package/templates/github-actions/plan-only.yml +0 -33
  695. package/templates/github-actions/trusted-publishing.yml +0 -61
@@ -0,0 +1,628 @@
1
+ import * as Schema from "effect/Schema"
2
+ import * as Result from "effect/Result"
3
+ import {
4
+ CanonicalAudience,
5
+ CredentialPurpose,
6
+ ProviderId,
7
+ SubjectId
8
+ } from "../model/authority.js"
9
+ import { NonEmptyName } from "../model/primitives.js"
10
+ import { secretPatterns } from "../model/secret-patterns.js"
11
+
12
+ export const SafeReason = Schema.String.check(
13
+ Schema.makeFilter((value: string) => {
14
+ const length = [...value].length
15
+ if (length === 0 || length > 2048) return "SafeReason must contain between 1 and 2048 code points."
16
+ if (![...value].every((character) => {
17
+ const codePoint = character.codePointAt(0) ?? 0
18
+ return codePoint === 9 || codePoint === 10 || codePoint === 13 || codePoint >= 0x20
19
+ })) return "SafeReason must not contain control characters."
20
+ if (secretPatterns.some((pattern) => pattern.test(value))) return "SafeReason must not contain token-shaped material."
21
+ return undefined
22
+ })
23
+ ).pipe(Schema.brand("SafeReason"))
24
+ export type SafeReason = typeof SafeReason.Type
25
+
26
+ export class Difference extends Schema.Class<Difference>("Difference")({
27
+ field: NonEmptyName,
28
+ expected: SafeReason,
29
+ observed: SafeReason
30
+ }) {}
31
+
32
+ export class AbsenceBasis extends Schema.Class<AbsenceBasis>("AbsenceBasis")({
33
+ kind: NonEmptyName,
34
+ detail: SafeReason
35
+ }) {}
36
+
37
+ export class VisibilityBasis extends Schema.Class<VisibilityBasis>("VisibilityBasis")({
38
+ kind: NonEmptyName,
39
+ detail: SafeReason
40
+ }) {}
41
+
42
+ export class PresentEquivalent
43
+ extends Schema.TaggedClass<PresentEquivalent>()("PresentEquivalent", {
44
+ subject: SubjectId
45
+ }) {}
46
+
47
+ export class PresentDifferent
48
+ extends Schema.TaggedClass<PresentDifferent>()("PresentDifferent", {
49
+ subject: SubjectId,
50
+ differences: Schema.NonEmptyArray(Difference)
51
+ }) {}
52
+
53
+ export class AuthoritativelyAbsent
54
+ extends Schema.TaggedClass<AuthoritativelyAbsent>()("AuthoritativelyAbsent", {
55
+ subject: SubjectId,
56
+ basis: AbsenceBasis
57
+ }) {}
58
+
59
+ export class VisibilityPending
60
+ extends Schema.TaggedClass<VisibilityPending>()("VisibilityPending", {
61
+ subject: SubjectId,
62
+ expectation: SafeReason,
63
+ basis: VisibilityBasis
64
+ }) {}
65
+
66
+ const CredentialFailureStrategy = Schema.Literals(["anonymous", "token", "trusted-publishing"])
67
+
68
+ /** Secret-free durable projection of a transient credential acquisition failure. */
69
+ export class CredentialUnavailableCause
70
+ extends Schema.TaggedClass<CredentialUnavailableCause>()("CredentialUnavailable", {
71
+ provider: ProviderId,
72
+ purpose: CredentialPurpose,
73
+ strategy: CredentialFailureStrategy
74
+ }) {}
75
+
76
+ /** Secret-free durable projection of an unsupported prepared authentication strategy. */
77
+ export class CredentialStrategyUnsupportedCause
78
+ extends Schema.TaggedClass<CredentialStrategyUnsupportedCause>()("CredentialStrategyUnsupported", {
79
+ provider: ProviderId,
80
+ purpose: CredentialPurpose,
81
+ strategy: CredentialFailureStrategy
82
+ }) {}
83
+
84
+ export const CredentialFailureCause = Schema.Union([
85
+ CredentialUnavailableCause,
86
+ CredentialStrategyUnsupportedCause
87
+ ])
88
+ export type CredentialFailureCause = typeof CredentialFailureCause.Type
89
+
90
+ export class InconclusiveObservation
91
+ extends Schema.TaggedClass<InconclusiveObservation>()("Inconclusive", {
92
+ subject: SubjectId,
93
+ reason: SafeReason,
94
+ cause: Schema.optionalKey(CredentialFailureCause)
95
+ }) {}
96
+
97
+ export const Observation = Schema.Union([
98
+ PresentEquivalent,
99
+ PresentDifferent,
100
+ AuthoritativelyAbsent,
101
+ VisibilityPending,
102
+ InconclusiveObservation
103
+ ])
104
+ export type Observation = typeof Observation.Type
105
+
106
+ export class MutationPrecondition
107
+ extends Schema.Class<MutationPrecondition>("MutationPrecondition")({
108
+ kind: NonEmptyName
109
+ }) {}
110
+
111
+ export class CreateAuthorizationProof
112
+ extends Schema.Class<CreateAuthorizationProof>("CreateAuthorizationProof")({
113
+ kind: NonEmptyName
114
+ }) {}
115
+
116
+ export class NeedsMutation
117
+ extends Schema.TaggedClass<NeedsMutation>()("NeedsMutation", {
118
+ subject: SubjectId,
119
+ precondition: MutationPrecondition
120
+ }) {}
121
+
122
+ export class ProviderAuthorizedCreate
123
+ extends Schema.TaggedClass<ProviderAuthorizedCreate>()("ProviderAuthorizedCreate", {
124
+ subject: SubjectId,
125
+ proof: CreateAuthorizationProof
126
+ }) {}
127
+
128
+ export const MutationDecision = Schema.Union([NeedsMutation, ProviderAuthorizedCreate])
129
+ export type MutationDecision = typeof MutationDecision.Type
130
+
131
+ export class ProviderAlreadyEquivalent
132
+ extends Schema.TaggedClass<ProviderAlreadyEquivalent>()("AlreadyEquivalent", {
133
+ subject: SubjectId
134
+ }) {}
135
+
136
+ export class Conflict
137
+ extends Schema.TaggedClass<Conflict>()("Conflict", {
138
+ subject: SubjectId,
139
+ differences: Schema.NonEmptyArray(Difference)
140
+ }) {}
141
+
142
+ export class ProviderBlocked
143
+ extends Schema.TaggedClass<ProviderBlocked>()("Blocked", {
144
+ subject: SubjectId,
145
+ reason: SafeReason,
146
+ cause: Schema.optionalKey(CredentialFailureCause)
147
+ }) {}
148
+
149
+ export const ProviderDecision = Schema.Union([
150
+ ProviderAlreadyEquivalent,
151
+ NeedsMutation,
152
+ ProviderAuthorizedCreate,
153
+ Conflict,
154
+ ProviderBlocked
155
+ ])
156
+ export type ProviderDecision = typeof ProviderDecision.Type
157
+
158
+ export class ProviderRejectionFact extends Schema.Class<ProviderRejectionFact>("ProviderRejectionFact")({
159
+ subject: SubjectId,
160
+ code: NonEmptyName,
161
+ detail: SafeReason
162
+ }) {}
163
+
164
+ export class ProviderMutationFact extends Schema.Class<ProviderMutationFact>("ProviderMutationFact")({
165
+ subject: SubjectId,
166
+ detail: SafeReason
167
+ }) {}
168
+
169
+ export class RejectedBeforeDispatch
170
+ extends Schema.TaggedClass<RejectedBeforeDispatch>()("RejectedBeforeDispatch", {
171
+ subject: SubjectId,
172
+ reason: SafeReason
173
+ }) {}
174
+
175
+ export class Started
176
+ extends Schema.TaggedClass<Started>()("Started", {
177
+ subject: SubjectId
178
+ }) {}
179
+
180
+ export class RejectedByProvider
181
+ extends Schema.TaggedClass<RejectedByProvider>()("RejectedByProvider", {
182
+ subject: SubjectId,
183
+ fact: ProviderRejectionFact
184
+ }) {}
185
+
186
+ export class Applied
187
+ extends Schema.TaggedClass<Applied>()("Applied", {
188
+ subject: SubjectId,
189
+ fact: ProviderMutationFact
190
+ }) {}
191
+
192
+ export class OutcomeUnknown
193
+ extends Schema.TaggedClass<OutcomeUnknown>()("OutcomeUnknown", {
194
+ subject: SubjectId,
195
+ reason: SafeReason
196
+ }) {}
197
+
198
+ export const MutationAttempt = Schema.Union([
199
+ RejectedBeforeDispatch,
200
+ Started,
201
+ RejectedByProvider,
202
+ Applied,
203
+ OutcomeUnknown
204
+ ])
205
+ export type MutationAttempt = typeof MutationAttempt.Type
206
+
207
+ export const AuthorityGrantKind = Schema.Literals(["AnonymousAccess", "ScopedSecret", "WorkloadIdentity"])
208
+ export type AuthorityGrantKind = typeof AuthorityGrantKind.Type
209
+
210
+ class AuthorityAcquiredRecord
211
+ extends Schema.TaggedClass<AuthorityAcquiredRecord>()("AuthorityAcquired", {
212
+ subject: SubjectId,
213
+ provider: ProviderId,
214
+ audience: CanonicalAudience,
215
+ requestedPurpose: CredentialPurpose,
216
+ grantKind: AuthorityGrantKind,
217
+ purposes: Schema.NonEmptyArray(CredentialPurpose)
218
+ }) {}
219
+
220
+ const authorityAcquiredIssue = (value: AuthorityAcquiredRecord): string | undefined => {
221
+ const purposes = new Set(value.purposes)
222
+ if (purposes.size !== value.purposes.length) return "Acquired authority purposes must be unique."
223
+ if (!purposes.has(value.requestedPurpose)) {
224
+ return "Acquired authority must include the purpose requested when it was acquired."
225
+ }
226
+ if (value.grantKind === "AnonymousAccess" &&
227
+ (value.requestedPurpose !== "observe" || purposes.size !== 1 || !purposes.has("observe"))) {
228
+ return "Anonymous authority must be acquired for observation with exactly the observe purpose."
229
+ }
230
+ return undefined
231
+ }
232
+
233
+ export const AuthorityAcquired = AuthorityAcquiredRecord.pipe(Schema.check(
234
+ Schema.makeFilter((value) => authorityAcquiredIssue(value))
235
+ ))
236
+ export type AuthorityAcquired = typeof AuthorityAcquired.Type
237
+
238
+ const observationAuthorityIssue = (value: AuthorityAcquired): string | undefined =>
239
+ authorityAcquiredIssue(value) ??
240
+ (value.requestedPurpose === "observe" && value.purposes.includes("observe")
241
+ ? undefined
242
+ : "Observation authority must be acquired for and include the observe purpose.")
243
+
244
+ const mutationAuthorityIssue = (value: AuthorityAcquired): string | undefined =>
245
+ authorityAcquiredIssue(value) ??
246
+ (value.requestedPurpose === "publish" || value.requestedPurpose === "correct"
247
+ ? undefined
248
+ : "Mutation authority must be acquired for publish or correct.")
249
+
250
+ class AuthorityAcquiredButMutationNotDispatchedRecord
251
+ extends Schema.TaggedClass<AuthorityAcquiredButMutationNotDispatchedRecord>()(
252
+ "AuthorityAcquiredButMutationNotDispatched",
253
+ {
254
+ subject: SubjectId,
255
+ authority: AuthorityAcquired,
256
+ attempt: RejectedBeforeDispatch
257
+ }
258
+ ) {}
259
+
260
+ const authorityNotDispatchedIssue = (
261
+ value: AuthorityAcquiredButMutationNotDispatchedRecord
262
+ ): string | undefined => {
263
+ const mutationIssue = mutationAuthorityIssue(value.authority)
264
+ if (mutationIssue !== undefined) return mutationIssue
265
+ return value.subject === value.authority.subject && value.subject === value.attempt.subject
266
+ ? undefined
267
+ : "Acquired authority and rejected attempt must describe the same subject."
268
+ }
269
+
270
+ export const AuthorityAcquiredButMutationNotDispatched =
271
+ AuthorityAcquiredButMutationNotDispatchedRecord.pipe(Schema.check(
272
+ Schema.makeFilter((value) => authorityNotDispatchedIssue(value))
273
+ ))
274
+ export type AuthorityAcquiredButMutationNotDispatched =
275
+ typeof AuthorityAcquiredButMutationNotDispatched.Type
276
+
277
+ export const AuthorityEvidence = Schema.Union([
278
+ AuthorityAcquired,
279
+ AuthorityAcquiredButMutationNotDispatched
280
+ ])
281
+ export type AuthorityEvidence = typeof AuthorityEvidence.Type
282
+
283
+ export class DependencyBlocked
284
+ extends Schema.TaggedClass<DependencyBlocked>()("DependencyBlocked", {
285
+ prerequisite: SubjectId
286
+ }) {}
287
+
288
+ export class RunAborted
289
+ extends Schema.TaggedClass<RunAborted>()("RunAborted", {
290
+ cause: SafeReason
291
+ }) {}
292
+
293
+ export const NotReachedReason = Schema.Union([DependencyBlocked, RunAborted])
294
+ export type NotReachedReason = typeof NotReachedReason.Type
295
+
296
+ export class ConclusiveProviderRejection
297
+ extends Schema.TaggedClass<ConclusiveProviderRejection>()("ConclusiveProviderRejection", {
298
+ subject: SubjectId,
299
+ fact: ProviderRejectionFact,
300
+ postObservations: Schema.NonEmptyArray(Observation)
301
+ }) {}
302
+
303
+ export const BlockedSubjectCause = Schema.Union([
304
+ Conflict,
305
+ ProviderBlocked,
306
+ RejectedBeforeDispatch,
307
+ AuthorityAcquiredButMutationNotDispatched,
308
+ ConclusiveProviderRejection
309
+ ])
310
+ export type BlockedSubjectCause = typeof BlockedSubjectCause.Type
311
+
312
+ class NotReachedRecord
313
+ extends Schema.TaggedClass<NotReachedRecord>()("NotReached", {
314
+ subject: SubjectId,
315
+ reason: NotReachedReason
316
+ }) {}
317
+
318
+ class AlreadyEquivalentRecord
319
+ extends Schema.TaggedClass<AlreadyEquivalentRecord>()("AlreadyEquivalent", {
320
+ subject: SubjectId,
321
+ observationAuthorities: Schema.Array(AuthorityAcquired),
322
+ observations: Schema.NonEmptyArray(Observation)
323
+ }) {}
324
+
325
+ class ConvergedAfterMutationRecord
326
+ extends Schema.TaggedClass<ConvergedAfterMutationRecord>()("ConvergedAfterMutation", {
327
+ subject: SubjectId,
328
+ observationAuthorities: Schema.Array(AuthorityAcquired),
329
+ preObservations: Schema.NonEmptyArray(Observation),
330
+ decision: MutationDecision,
331
+ authority: AuthorityAcquired,
332
+ attempt: Schema.Union([Applied, OutcomeUnknown, RejectedByProvider]),
333
+ postObservations: Schema.NonEmptyArray(Observation)
334
+ }) {}
335
+
336
+ class BlockedSubjectRecord
337
+ extends Schema.TaggedClass<BlockedSubjectRecord>()("BlockedSubject", {
338
+ subject: SubjectId,
339
+ observationAuthorities: Schema.Array(AuthorityAcquired),
340
+ observations: Schema.NonEmptyArray(Observation),
341
+ cause: BlockedSubjectCause
342
+ }) {}
343
+
344
+ class UncertainSubjectRecord
345
+ extends Schema.TaggedClass<UncertainSubjectRecord>()("UncertainSubject", {
346
+ subject: SubjectId,
347
+ observationAuthorities: Schema.Array(AuthorityAcquired),
348
+ observations: Schema.NonEmptyArray(Observation),
349
+ decision: Schema.optionalKey(ProviderDecision),
350
+ authority: AuthorityAcquired,
351
+ attempt: Schema.Union([Started, Applied, OutcomeUnknown, RejectedByProvider]),
352
+ trace: Schema.NonEmptyArray(Observation)
353
+ }) {}
354
+
355
+ export type NotReached = typeof NotReachedRecord.Type
356
+ export type AlreadyEquivalent = typeof AlreadyEquivalentRecord.Type
357
+ export type ConvergedAfterMutation = typeof ConvergedAfterMutationRecord.Type
358
+ export type BlockedSubject = typeof BlockedSubjectRecord.Type
359
+ export type UncertainSubject = typeof UncertainSubjectRecord.Type
360
+
361
+ const sameSubject = (
362
+ subject: SubjectId,
363
+ values: ReadonlyArray<{ readonly subject: SubjectId }>
364
+ ): boolean => values.every((value) => value.subject === subject)
365
+
366
+ const observationAuthoritiesIssue = (
367
+ subject: SubjectId,
368
+ authorities: ReadonlyArray<AuthorityAcquired>
369
+ ): string | undefined => {
370
+ if (!sameSubject(subject, authorities)) {
371
+ return "Observation authority must describe the report subject."
372
+ }
373
+ return authorities.map(observationAuthorityIssue).find((issue) => issue !== undefined)
374
+ }
375
+
376
+ const subjectReportCorrelation = (
377
+ value: NotReached | AlreadyEquivalent | ConvergedAfterMutation | BlockedSubject | UncertainSubject
378
+ ): string | undefined => {
379
+ switch (value._tag) {
380
+ case "NotReached":
381
+ return undefined
382
+ case "AlreadyEquivalent": {
383
+ const observationIssue = observationAuthoritiesIssue(value.subject, value.observationAuthorities)
384
+ return observationIssue === undefined && sameSubject(value.subject, value.observations) &&
385
+ value.observations.at(-1)?._tag === "PresentEquivalent"
386
+ ? undefined
387
+ : observationIssue ?? "AlreadyEquivalent requires same-subject observations ending in PresentEquivalent."
388
+ }
389
+ case "ConvergedAfterMutation": {
390
+ const observationIssue = observationAuthoritiesIssue(value.subject, value.observationAuthorities)
391
+ const mutationIssue = mutationAuthorityIssue(value.authority)
392
+ return sameSubject(value.subject, [
393
+ ...value.preObservations,
394
+ value.decision,
395
+ value.authority,
396
+ value.attempt,
397
+ ...value.postObservations
398
+ ]) && observationIssue === undefined && mutationIssue === undefined &&
399
+ value.postObservations.at(-1)?._tag === "PresentEquivalent"
400
+ ? undefined
401
+ : observationIssue ?? mutationIssue ??
402
+ "ConvergedAfterMutation requires one subject and a final PresentEquivalent observation."
403
+ }
404
+ case "BlockedSubject": {
405
+ const nested = value.cause._tag === "ConclusiveProviderRejection"
406
+ ? [value.cause, value.cause.fact, ...value.cause.postObservations]
407
+ : value.cause._tag === "AuthorityAcquiredButMutationNotDispatched"
408
+ ? [value.cause, value.cause.authority, value.cause.attempt]
409
+ : value.cause._tag === "Conflict"
410
+ ? [value.cause]
411
+ : [value.cause]
412
+ const evidenceIssue = value.cause._tag === "AuthorityAcquiredButMutationNotDispatched"
413
+ ? authorityNotDispatchedIssue(value.cause)
414
+ : undefined
415
+ const observationIssue = observationAuthoritiesIssue(value.subject, value.observationAuthorities)
416
+ return sameSubject(value.subject, [...value.observations, ...nested]) && evidenceIssue === undefined &&
417
+ observationIssue === undefined
418
+ ? undefined
419
+ : observationIssue ?? evidenceIssue ?? "BlockedSubject evidence must describe the report subject."
420
+ }
421
+ case "UncertainSubject": {
422
+ const observationIssue = observationAuthoritiesIssue(value.subject, value.observationAuthorities)
423
+ const mutationIssue = mutationAuthorityIssue(value.authority)
424
+ return sameSubject(value.subject, [
425
+ ...value.observations,
426
+ ...(value.decision === undefined ? [] : [value.decision]),
427
+ value.authority,
428
+ value.attempt,
429
+ ...value.trace
430
+ ]) && observationIssue === undefined && mutationIssue === undefined
431
+ ? undefined
432
+ : observationIssue ?? mutationIssue ?? "UncertainSubject evidence must describe the report subject."
433
+ }
434
+ }
435
+ }
436
+
437
+ const SubjectReportVariants = Schema.Union([
438
+ NotReachedRecord,
439
+ AlreadyEquivalentRecord,
440
+ ConvergedAfterMutationRecord,
441
+ BlockedSubjectRecord,
442
+ UncertainSubjectRecord
443
+ ])
444
+
445
+ export const SubjectReport = SubjectReportVariants.pipe(Schema.check(
446
+ Schema.makeFilter((value) => subjectReportCorrelation(value))
447
+ ))
448
+ export type SubjectReport = typeof SubjectReport.Type
449
+
450
+ export class ReportConstructionError
451
+ extends Schema.TaggedErrorClass<ReportConstructionError>()("ReportConstructionError", {
452
+ reason: SafeReason
453
+ }) {}
454
+
455
+ const invalid = <A>(reason: SafeReason): Result.Result<A, ReportConstructionError> =>
456
+ Result.fail(new ReportConstructionError({ reason }))
457
+
458
+ const validateSubjectReport = <A extends SubjectReport>(value: A): Result.Result<A, ReportConstructionError> => {
459
+ const issue = subjectReportCorrelation(value)
460
+ return issue === undefined ? Result.succeed(value) : invalid(SafeReason.make(issue))
461
+ }
462
+
463
+ export const makeAuthorityAcquired = (input: {
464
+ readonly subject: SubjectId
465
+ readonly provider: ProviderId
466
+ readonly audience: CanonicalAudience
467
+ readonly requestedPurpose: CredentialPurpose
468
+ readonly grantKind: AuthorityGrantKind
469
+ readonly purposes: readonly [CredentialPurpose, ...Array<CredentialPurpose>]
470
+ }): Result.Result<AuthorityAcquired, ReportConstructionError> => {
471
+ const value = new AuthorityAcquiredRecord(input)
472
+ const issue = authorityAcquiredIssue(value)
473
+ return issue === undefined ? Result.succeed(value) : invalid(SafeReason.make(issue))
474
+ }
475
+
476
+ export const makeAuthorityAcquiredButMutationNotDispatched = (input: {
477
+ readonly subject: SubjectId
478
+ readonly authority: AuthorityAcquired
479
+ readonly attempt: RejectedBeforeDispatch
480
+ }): Result.Result<AuthorityAcquiredButMutationNotDispatched, ReportConstructionError> => {
481
+ const value = new AuthorityAcquiredButMutationNotDispatchedRecord(input)
482
+ const issue = authorityAcquiredIssue(value.authority) ?? authorityNotDispatchedIssue(value)
483
+ return issue === undefined ? Result.succeed(value) : invalid(SafeReason.make(issue))
484
+ }
485
+
486
+ export const makeNotReached = (
487
+ subject: SubjectId,
488
+ reason: NotReachedReason
489
+ ): Result.Result<NotReached, ReportConstructionError> =>
490
+ validateSubjectReport(new NotReachedRecord({ subject, reason }))
491
+
492
+ export const makeAlreadyEquivalent = (
493
+ subject: SubjectId,
494
+ observations: readonly [Observation, ...Array<Observation>],
495
+ observationAuthorities: ReadonlyArray<AuthorityAcquired>
496
+ ): Result.Result<AlreadyEquivalent, ReportConstructionError> =>
497
+ validateSubjectReport(new AlreadyEquivalentRecord({ subject, observationAuthorities, observations }))
498
+
499
+ export const makeConvergedAfterMutation = (input: {
500
+ readonly subject: SubjectId
501
+ readonly observationAuthorities: ReadonlyArray<AuthorityAcquired>
502
+ readonly preObservations: readonly [Observation, ...Array<Observation>]
503
+ readonly decision: MutationDecision
504
+ readonly authority: AuthorityAcquired
505
+ readonly attempt: Applied | OutcomeUnknown | RejectedByProvider
506
+ readonly postObservations: readonly [Observation, ...Array<Observation>]
507
+ }): Result.Result<ConvergedAfterMutation, ReportConstructionError> =>
508
+ validateSubjectReport(new ConvergedAfterMutationRecord(input))
509
+
510
+ export const makeBlockedSubject = (input: {
511
+ readonly subject: SubjectId
512
+ readonly observationAuthorities: ReadonlyArray<AuthorityAcquired>
513
+ readonly observations: readonly [Observation, ...Array<Observation>]
514
+ readonly cause: BlockedSubjectCause
515
+ }): Result.Result<BlockedSubject, ReportConstructionError> =>
516
+ validateSubjectReport(new BlockedSubjectRecord(input))
517
+
518
+ export const makeUncertainSubject = (input: {
519
+ readonly subject: SubjectId
520
+ readonly observationAuthorities: ReadonlyArray<AuthorityAcquired>
521
+ readonly observations: readonly [Observation, ...Array<Observation>]
522
+ readonly decision?: ProviderDecision
523
+ readonly authority: AuthorityAcquired
524
+ readonly attempt: Started | Applied | OutcomeUnknown | RejectedByProvider
525
+ readonly trace: readonly [Observation, ...Array<Observation>]
526
+ }): Result.Result<UncertainSubject, ReportConstructionError> =>
527
+ validateSubjectReport(new UncertainSubjectRecord(input))
528
+
529
+ export const ReleaseStatus = Schema.Literals(["complete", "blocked", "uncertain"])
530
+ export type ReleaseStatus = typeof ReleaseStatus.Type
531
+
532
+ const deriveReleaseStatus = (
533
+ subjects: readonly [SubjectReport, ...Array<SubjectReport>]
534
+ ): ReleaseStatus => subjects.some((subject) => subject._tag === "UncertainSubject")
535
+ ? "uncertain"
536
+ : subjects.every((subject) => subject._tag === "AlreadyEquivalent" || subject._tag === "ConvergedAfterMutation")
537
+ ? "complete"
538
+ : "blocked"
539
+
540
+ const ReleaseReportRecord = Schema.Struct({
541
+ subjects: Schema.NonEmptyArray(SubjectReport),
542
+ status: ReleaseStatus
543
+ }).pipe(Schema.check(Schema.makeFilter((value) =>
544
+ value.status === deriveReleaseStatus(value.subjects)
545
+ ? undefined
546
+ : "ReleaseReport status must be derived from its subjects.")))
547
+
548
+ export const ReleaseReport = ReleaseReportRecord
549
+ export type ReleaseReport = typeof ReleaseReport.Type
550
+
551
+ export const makeReleaseReport = (
552
+ subjects: readonly [SubjectReport, ...Array<SubjectReport>]
553
+ ): ReleaseReport => ({ subjects, status: deriveReleaseStatus(subjects) })
554
+
555
+ class ReadOnlyEquivalent
556
+ extends Schema.TaggedClass<ReadOnlyEquivalent>()("Equivalent", {}) {}
557
+
558
+ class ReadOnlyDifferent
559
+ extends Schema.TaggedClass<ReadOnlyDifferent>()("Different", {
560
+ differences: Schema.NonEmptyArray(Difference)
561
+ }) {}
562
+
563
+ class ReadOnlyAbsent
564
+ extends Schema.TaggedClass<ReadOnlyAbsent>()("Absent", {
565
+ basis: AbsenceBasis
566
+ }) {}
567
+
568
+ class ReadOnlyInconclusive
569
+ extends Schema.TaggedClass<ReadOnlyInconclusive>()("Inconclusive", {
570
+ reason: SafeReason,
571
+ cause: Schema.optionalKey(CredentialFailureCause)
572
+ }) {}
573
+
574
+ export const ObservationClassification = Schema.Union([
575
+ ReadOnlyEquivalent,
576
+ ReadOnlyDifferent,
577
+ ReadOnlyAbsent,
578
+ ReadOnlyInconclusive
579
+ ])
580
+ export type ObservationClassification = typeof ObservationClassification.Type
581
+
582
+ export const equivalentObservation = (): ObservationClassification => new ReadOnlyEquivalent()
583
+ export const differentObservation = (
584
+ differences: readonly [Difference, ...Array<Difference>]
585
+ ): ObservationClassification => new ReadOnlyDifferent({ differences })
586
+ export const absentObservation = (basis: AbsenceBasis): ObservationClassification =>
587
+ new ReadOnlyAbsent({ basis })
588
+ export const inconclusiveObservation = (
589
+ reason: SafeReason,
590
+ cause?: CredentialFailureCause
591
+ ): ObservationClassification => new ReadOnlyInconclusive({
592
+ reason,
593
+ ...(cause === undefined ? {} : { cause })
594
+ })
595
+
596
+ export class ObservedSubject extends Schema.Class<ObservedSubject>("ObservedSubject")({
597
+ subject: SubjectId,
598
+ observationAuthorities: Schema.Array(AuthorityAcquired),
599
+ observation: ObservationClassification
600
+ }) {}
601
+
602
+ export const ObservationStatus = Schema.Literals(["equivalent", "different", "inconclusive"])
603
+ export type ObservationStatus = typeof ObservationStatus.Type
604
+
605
+ const deriveObservationStatus = (
606
+ subjects: readonly [ObservedSubject, ...Array<ObservedSubject>]
607
+ ): ObservationStatus => subjects.some(({ observation }) => observation._tag === "Inconclusive")
608
+ ? "inconclusive"
609
+ : subjects.every(({ observation }) => observation._tag === "Equivalent")
610
+ ? "equivalent"
611
+ : "different"
612
+
613
+ const observedSubjectIssue = (value: ObservedSubject): string | undefined =>
614
+ observationAuthoritiesIssue(value.subject, value.observationAuthorities)
615
+
616
+ export const ObservationReport = Schema.Struct({
617
+ subjects: Schema.NonEmptyArray(ObservedSubject),
618
+ status: ObservationStatus
619
+ }).pipe(Schema.check(Schema.makeFilter((value) =>
620
+ value.subjects.map(observedSubjectIssue).find((issue) => issue !== undefined) ??
621
+ (value.status === deriveObservationStatus(value.subjects)
622
+ ? undefined
623
+ : "ObservationReport status must be derived from its subjects."))))
624
+ export type ObservationReport = typeof ObservationReport.Type
625
+
626
+ export const makeObservationReport = (
627
+ subjects: readonly [ObservedSubject, ...Array<ObservedSubject>]
628
+ ): ObservationReport => ({ subjects, status: deriveObservationStatus(subjects) })