@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
package/README.md CHANGED
@@ -1,382 +1,459 @@
1
- # @mannyc1/ts-release
1
+ # ts-release
2
2
 
3
- Portable artifact and package-manager distribution planning for TypeScript projects.
3
+ Automate multi-artifact releases and safely resume partial publication.
4
4
 
5
- `@mannyc1/ts-release` helps you declare the thing you want to distribute, stage
6
- platform-specific artifacts when needed, and feed those artifacts into
7
- target-specific package managers, catalogs, release hosts, and install surfaces.
8
- Publish operations still stay reviewable and approval-gated, but the product
9
- center is portable distribution data.
5
+ ## Release locally
10
6
 
11
- Use it when you need to answer:
12
-
13
- - Which binaries, archives, packages, or generated files make up this release?
14
- - Which package managers or install channels consume each artifact variant?
15
- - What target-specific files or commands will be generated?
16
- - Which operations are only rendering data, and which ones publish externally?
17
- - What evidence proves what was staged, rendered, validated, or executed?
18
-
19
- The root package is the reusable TypeScript library. This repo also contains the
20
- first-party Bun CLI app in `apps/release-ts` and the bundled GitHub Action in
21
- `apps/ts-release-action`.
22
-
23
- ## What It Does
24
-
25
- `ts-release` models distribution as data:
26
-
27
- ```text
28
- release config
29
- -> normalized release identity
30
- -> artifact recipes and inventory
31
- -> installable artifact variants
32
- -> target-specific distribution operations
33
- -> generated package-manager files
34
- -> explicit execution evidence
35
- -> verification or reconciliation
36
- ```
37
-
38
- The library currently plans, stages, and validates these distribution surfaces:
39
-
40
- | Surface | What ts-release models |
41
- |---|---|
42
- | npm | package publish, native dry-run validation, provenance, trusted publishing |
43
- | GitHub Releases | release creation, asset uploads, REST API verification, draft reconciliation |
44
- | Homebrew taps | generated formula files, macOS artifact variants, and approved tap pushes |
45
- | PyPI | already-built distributions and platform CLI wrapper wheels published through Twine |
46
- | Scoop buckets | generated manifest files, Windows binary shims, and approved bucket pushes |
47
- | Bun executables | optional binary artifact recipe staging before target planning |
48
-
49
- It is not a fake universal package manager and does not hide each ecosystem's
50
- manifest rules. It can stage declared artifacts through adapters, but it does
51
- not replace full build pipelines, compilers, signing, or installer toolchains.
52
- The job is to keep shared artifact inventory and target-specific distribution
53
- data in one typed plan.
54
-
55
- ## Quick Start
56
-
57
- Inside this repository, the CLI script runs the first-party Bun app:
58
-
59
- ```sh
60
- bun run cli init --template bun-cli-github --package @scope/pkg --repo owner/repo --github-actions --write
61
- bun run cli validate-config --config release.config.json
62
- bun run cli stage-artifacts --config release.config.json --format text
63
- bun run cli plan --config release.config.json --format text
64
- bun run cli render --config release.config.json
65
- ```
66
-
67
- The first useful path is artifact-first: write or scaffold a config, stage any
68
- declared artifact recipes, plan the target distribution work, then render
69
- package-manager files or release metadata. These commands do not publish
70
- anything unless an execution command receives explicit approval.
71
-
72
- To publish through the full ordered workflow, pass both execution approvals:
73
-
74
- ```sh
75
- bun run cli run --config release.config.json --execute --approve-irreversible
76
- ```
77
-
78
- `run` renders generated files, validates preflights, executes approved publish
79
- operations, and verifies remote state. The lower-level commands are available
80
- when you want a manual pause between phases:
7
+ The normal path is one command from a clean Git checkout:
81
8
 
82
9
  ```sh
83
- bun run cli render --config release.config.json --execute
84
- bun run cli validate --config release.config.json
85
- bun run cli print --config release.config.json
86
- bun run cli execute --config release.config.json --execute --approve-irreversible
87
- bun run cli verify --config release.config.json
88
- ```
89
-
90
- ## GitHub Actions
91
-
92
- The bundled action is the intended CI adapter:
93
-
94
- ```yaml
95
- - uses: mannyc2/ts-release-action@v1
96
- with:
97
- command: plan
98
- config: release.config.json
99
- format: markdown
100
- upload-evidence: true
10
+ ts-release release --config release.config.json
101
11
  ```
102
12
 
103
- Supported action commands are `plan`, `validate-config`, `doctor`, `check-auth`,
104
- `check-ci`, `validate`, `run`, and `reconcile`. Artifact recipe staging remains
105
- owned by the Bun CLI/runtime because the bundled action runs on Node.
13
+ `release` resolves observed package and Git facts, materializes the exact
14
+ verified commit, runs declared local preparation, commits one complete
15
+ `prepared-release/v2` bundle, observes every configured destination, and
16
+ publishes only after a provider-specific decision authorizes that exact
17
+ subject. The command prints the durable prepared reference and correlated
18
+ report. A blocked or uncertain report is preserved and exits nonzero.
106
19
 
107
- Publishing still needs explicit approval:
20
+ npm authentication is always explicit. A GitHub-hosted npm and GitHub release
21
+ can use this authored configuration:
108
22
 
109
- ```yaml
110
- - uses: mannyc2/ts-release-action@v1
111
- with:
112
- command: run
113
- config: release.config.json
114
- execute: "true"
115
- approve-irreversible: "true"
116
- upload-evidence: true
23
+ ```json
24
+ {
25
+ "project": { "repository": "owner/repo" },
26
+ "versionFrom": "manifest",
27
+ "npmPackage": { "path": "." },
28
+ "publish": {
29
+ "npm": {
30
+ "authentication": {
31
+ "strategy": "trusted-publishing",
32
+ "attestation": {
33
+ "provider": "github-actions",
34
+ "runner": "github-hosted",
35
+ "repository": "owner/repo",
36
+ "workflow": "release.yml",
37
+ "workflowRef": "refs/heads/main",
38
+ "allowedAction": "npm-publish-direct"
39
+ }
40
+ }
41
+ },
42
+ "github": {}
43
+ }
44
+ }
117
45
  ```
118
46
 
119
- For npm trusted publishing, configure npmjs for the GitHub repository and
120
- workflow, grant `id-token: write`, and keep `trustedPublishing` in the npm
121
- target. Trusted publishing uses OIDC during `npm publish`; it does not use
122
- `NPM_TOKEN`.
123
-
124
- For PyPI trusted publishing, configure a pending or existing PyPI Trusted
125
- Publisher for the GitHub repository, workflow, and release environment, then
126
- keep `trustedPublishing` in the PyPI target. Twine uses OIDC during
127
- `twine upload`; it does not require `TWINE_USERNAME` or `TWINE_PASSWORD` in CI.
128
-
129
- ## Config
130
-
131
- A release config declares identity, artifacts, target policy, and evidence
132
- location.
47
+ `workflow` and `workflowRef` are local host-admission constraints, not claims
48
+ about fields exposed by npm's trusted-publisher configuration. They must name
49
+ the workflow that actually invokes publication: use `release.yml` with the
50
+ automatic template and `reviewed-release.yml` with the reviewed template. The
51
+ host must observe that exact repository/path/ref on a GitHub-hosted runner
52
+ before it reads either OIDC request value. Public npm metadata reads are always
53
+ anonymous; private or custom-registry authenticated reads are unsupported
54
+ until configured with a distinct read credential.
55
+
56
+ The resolver fills package name, version, tag, commit, and repository only
57
+ when observed facts agree with authored intent. For a non-OIDC host, use
58
+ `{ "strategy": "token", "credential": "NPM_TOKEN" }` instead. The value of
59
+ that environment variable remains host-owned and never enters configuration,
60
+ prepared bytes, reports, or logs.
61
+
62
+ Prebuilt Python distributions can be published to the closed `pypi` or
63
+ `testpypi` destination. Each named artifact must be a valid wheel or gzip
64
+ sdist whose filename and embedded metadata agree with the configured project
65
+ and version:
133
66
 
134
67
  ```json
135
68
  {
136
- "$schema": "https://mannyc2.github.io/ts-release/schema/release-config.schema.json",
137
- "identity": {
138
- "_tag": "PackageManifestReleaseIdentitySource",
139
- "packagePath": "package.json",
140
- "commit": "HEAD",
141
- "tagTemplate": "v{version}"
142
- },
69
+ "project": { "name": "fixture", "version": "1.0.0", "tag": "v1.0.0" },
143
70
  "artifacts": [
144
- {
145
- "id": "package",
146
- "path": ".",
147
- "format": "directory",
148
- "consumers": ["npm"]
149
- }
71
+ { "id": "wheel", "path": "dist/fixture-1.0.0-py3-none-any.whl", "format": "file" }
150
72
  ],
151
- "targets": [
152
- {
153
- "_tag": "NpmRegistryTarget",
154
- "id": "npm",
155
- "registry": "https://registry.npmjs.org",
156
- "packageName": "@scope/pkg",
157
- "packagePath": ".",
158
- "trustedPublishing": {
159
- "provider": "github-actions",
160
- "workflow": "release.yml",
161
- "packageExists": true,
162
- "verifyPackageExists": true
163
- },
164
- "access": "public",
165
- "provenance": true,
166
- "dryRunSupport": "native",
167
- "mutability": "immutable",
168
- "recovery": "publish-new-version"
73
+ "publish": {
74
+ "pypi": {
75
+ "artifacts": ["wheel"],
76
+ "repository": "pypi",
77
+ "authentication": {
78
+ "strategy": "token",
79
+ "credential": "PYPI_TOKEN",
80
+ "scope": "project"
81
+ }
169
82
  }
170
- ],
171
- "strict": true,
172
- "evidenceDirectory": ".release/evidence/{version}"
83
+ }
173
84
  }
174
85
  ```
175
86
 
176
- Useful config commands:
87
+ PyPI token upload additionally requires the host to install a shared,
88
+ durable terminal `PublicationClaimStore`; runner-local files and memory do not
89
+ satisfy that contract. The stock CLI and Action deliberately fail closed
90
+ without one. Library hosts can pass it to `makeNodeReleaseLayer`,
91
+ `makeBunReleaseLayer`, or `makeCustomReleaseLayer`. The token is projected as
92
+ PyPI Basic authentication only inside the authorized HTTP sink. PyPI trusted
93
+ publishing is represented as an external, host-owned
94
+ `pypa/gh-action-pypi-publish@release/v1` path; the stock coordinator neither
95
+ exchanges its OIDC token nor claims to recover that external upload.
96
+
97
+ This repository's selected self-release shape is declared in
98
+ `apps/release-ts/pypi-release.config.json`. It deterministically embeds one
99
+ native executable in each of these `ts-release` wheels:
100
+
101
+ - `py3-none-manylinux_2_17_x86_64`
102
+ - `py3-none-manylinux_2_17_aarch64`
103
+ - `py3-none-macosx_13_0_x86_64`
104
+ - `py3-none-macosx_13_0_arm64`
105
+
106
+ `.github/workflows/pypi-release.yml` prepares the exact four-file set in a
107
+ read-only build job, transfers it with GitHub Actions artifact retention, and
108
+ gives only the separate `pypi` environment job `id-token: write`. That job has
109
+ no checkout or arbitrary command step; it downloads the prepared wheels and
110
+ invokes the official PyPA trusted-publishing Action. The PyPI publisher must
111
+ be configured for owner `mannyc2`, repository `ts-release`, workflow
112
+ `pypi-release.yml`, branch `main`, and environment `pypi` before dispatch.
113
+ The macOS wheel tags certify the cross-compiled artifact targets; they do not
114
+ expand the product's Linux-only execution-host claim.
115
+
116
+ With the canonical GitHub origin or package repository configured, `init` can
117
+ discover the exact owner/repository coordinate and write this explicit shape:
177
118
 
178
119
  ```sh
179
- bun run cli schema --out release-config.schema.json
180
- bun run cli validate-config --config release.config.json --format text
181
- bun run cli plan --config release.config.json --format summary
182
- bun run cli explain npm:npm-publish --config release.config.json
183
- ```
184
-
185
- Paths are release-workspace relative. Artifact paths can interpolate
186
- `{version}`, `{name}`, and `{normalizedName}`. Evidence directories can
187
- interpolate `{version}`.
188
-
189
- ## Artifact Variants
190
-
191
- Artifact recipes can produce installable variants for different operating
192
- systems and architectures. Bun executable recipes derive variant metadata from
193
- their compile target, so the release plan can carry facts such as `linux`/`x64`
194
- or `windows`/`x64` before any package-manager adapter consumes the artifact.
195
-
196
- ```json
197
- {
198
- "id": "cli-linux-x64",
199
- "target": "bun-linux-x64-baseline",
200
- "path": "artifacts/pkg-{version}-linux-x64",
201
- "consumers": ["github"]
202
- }
120
+ ts-release init --preset bun-npm-github
203
121
  ```
204
122
 
205
- The planned artifact inventory for that output includes an executable artifact
206
- with a variant like:
123
+ It refuses to guess when no repository coordinate is observable and strictly
124
+ inspects the exact generated configuration before writing it.
125
+
126
+ ## Repository 0.3 self-release
127
+
128
+ The checked-in `.github/workflows/release.yml` is a manual, fail-closed
129
+ five-mode workflow. `prepare-exact-sha` has read-only repository authority
130
+ and independently commits one GitHub-assets bundle and one npm-tarball bundle
131
+ to the content-addressed Actions store. `certify-npm-oidc` adopts the exact npm
132
+ bundle, proves one trusted-publisher exchange through pinned npm's dry-run, and
133
+ proves unchanged anonymous registry state without upload, provenance, or
134
+ publication. `create-tag` has only the separate
135
+ `github-tag` environment and creates or reobserves the lightweight `v0.3.0`
136
+ tag at the exact candidate; it creates no Release. `publish-npm` accepts only
137
+ the npm bundle under the `npm` environment with `id-token: write`, then
138
+ rereads the public registry to prove exact tarball bytes and the exact GitHub
139
+ SLSA provenance identity. The pinned npm archive's Sigstore 4.1.0 verifier
140
+ requires the exact Fulcio workflow SAN and GitHub OIDC issuer, then binds the
141
+ certificate's workflow/source SHA and run-invocation extensions to the same
142
+ candidate and provenance statement. Its repository-subject extension must be
143
+ the ID-qualified `repo:mannyc2@126291407/ts-release@1271545637:environment:npm`
144
+ identity issued for the protected npm environment; the historical ref-bound
145
+ subject is rejected. Generic signature validity is insufficient.
146
+ Only afterward, `publish-github` accepts the GitHub
147
+ bundle plus the already-published npm bundle under the `github-release`
148
+ environment with `contents: write`. Every boundary
149
+ reauthenticates the checkout against the current public `main` tip immediately
150
+ before it can adopt or mutate anything.
151
+
152
+ The npm client itself is fetched from the canonical npm 11.11.0 tarball,
153
+ checked against its fixed SHA-512 and SHA-1 registry digests, and freshly
154
+ rematerialized before every boundary. Any nonempty `npm_config_*`, `PREFIX`,
155
+ `DESTDIR`, token variable, project/user npmrc, or default global npmrc stops
156
+ before repository or provider work.
157
+
158
+ The exact order is preparation, no-upload npm OIDC certification, lightweight
159
+ tag creation, npm publication and report-bound public/provenance verification,
160
+ then GitHub publication. A fresh
161
+ npm mutation must carry provenance for that exact workflow run attempt. If a
162
+ prior run applied the bytes but lost its response, an exact `AlreadyEquivalent`
163
+ retry instead authenticates the earlier canonical publishing run named by the
164
+ public provenance; it never demands impossible same-run provenance from a
165
+ no-op retry. Any uncertain, blocked, malformed, or differently bound Action
166
+ report stops verification. The first
167
+ GitHub publication invocation creates or resumes a private draft and uploads
168
+ only missing exact assets. For a desired public Release that staging result is
169
+ deliberately `uncertain`, not success, and the Release remains nonpublic. A
170
+ fresh invocation with the same candidate and both exact `prepared:gha:`
171
+ references must fully reread draft metadata and every paginated asset, download
172
+ and hash any asset whose API digest is absent, and only then perform a
173
+ PATCH-only public transition. Extra, duplicate, missing, or different assets
174
+ stop that transition. On 2026-09-01, repository environments `github-tag`
175
+ (ID `20986778371`), `npm` (ID `20985327992`), and `github-release`
176
+ (ID `20985328229`) were observed with reviewer `mannyc2`, self-review allowed,
177
+ admin bypass disabled, a custom deployment policy selecting exactly `main`,
178
+ and no environment secrets or variables. Re-query those mutable facts before
179
+ every dispatch. Repository Release immutability was also observed enabled on
180
+ 2026-09-01; re-query it before GitHub staging or promotion. The repository OIDC
181
+ policy was observed on that date with the immutable ID-qualified subject
182
+ `repo:mannyc2@126291407/ts-release@1271545637:environment:npm`; re-query it
183
+ before certification or publication. That GitHub-side policy does not prove an
184
+ npm-side trusted-publisher record. The exact npm trusted-publisher subject
185
+ remains a separate prerequisite and is not inferred from an environment.
186
+
187
+ ## Automatic GitHub Actions template
188
+
189
+ The reusable automatic template is one job and one Action invocation. Copy the exact
190
+ [automatic workflow template](templates/github-actions/release.yml). It is
191
+ manual-only and requires `candidate_sha` to equal the current commit on
192
+ `refs/heads/main` before the job can reach checkout. Its
193
+ mutation job grants `contents: write` for the same-repository tag, release, and
194
+ assets, `id-token: write` for npm trusted publishing, and `actions: read` for
195
+ prepared-artifact recovery. It installs the publisher boundary explicitly,
196
+ uses the job-scoped `GITHUB_TOKEN`, and uploads the redacted report as a
197
+ recovery artifact.
207
198
 
208
- ```json
209
- {
210
- "os": "linux",
211
- "arch": "x64",
212
- "libc": "glibc",
213
- "targetTriple": "bun-linux-x64-baseline"
214
- }
215
- ```
216
-
217
- Direct artifact declarations can also include `variant` when an artifact was
218
- built outside `ts-release`. Homebrew formulas can consume macOS `darwin` x64
219
- and arm64 variants from one target, and Scoop manifests can derive a stable shim
220
- from a Windows executable variant. Future package-manager adapters should follow
221
- that pattern instead of guessing platform support from filenames.
222
-
223
- ## Diagnostics
224
-
225
- Static diagnostics help catch missing auth and unsafe workflow setup before an
226
- approved run:
227
-
228
- ```sh
229
- bun run cli doctor --config release.config.json --format text
230
- bun run cli check-auth --config release.config.json --target npm --format text
231
- bun run cli check-ci --config release.config.json --workflow .github/workflows/release.yml --format markdown
199
+ ```yaml
200
+ - id: release
201
+ uses: mannyc2/ts-release/apps/ts-release-action@v0.3.0
202
+ env:
203
+ GITHUB_TOKEN: ${{ github.token }}
204
+ with:
205
+ command: ${{ inputs.prepared_ref == '' && 'release' || 'publish' }}
206
+ config: ${{ inputs.prepared_ref == '' && 'release.config.json' || '' }}
207
+ prepared: ${{ inputs.prepared_ref }}
232
208
  ```
233
209
 
234
- Diagnostics report confidence levels instead of pretending local checks can
235
- prove provider-side setup. For example, npm trusted publishing can only be fully
236
- confirmed inside the configured GitHub Actions environment.
237
-
238
- ## Programmatic API
239
-
240
- Install the library and provide platform services at your application boundary:
210
+ Leave `prepared_ref` empty for a fresh release. To resume after durable
211
+ preparation, dispatch the same candidate with the exact emitted
212
+ `prepared:gha:` reference; the job selects `publish`, loads and verifies the
213
+ original bundle, and does not rebuild.
214
+
215
+ `v0.3.0` is the immutable monorepo-subpath coordinate intended for this
216
+ candidate. Packaging and release certification must stop unless that tag is
217
+ created from the exact certified result commit before consumers can see a
218
+ README that names it. A floating Action branch is never an alternative.
219
+
220
+ ## Optional environment-gated publication
221
+
222
+ When a host policy requires a protected environment, use the
223
+ [two-job workflow template](templates/github-actions/reviewed-release.yml).
224
+ Copy its paired
225
+ [reviewed configuration](templates/npm-github/reviewed-release.config.json)
226
+ to the repository root with the same filename; the workflow loads that exact
227
+ file.
228
+ Its prepare job has read-only repository authority and no OIDC permission. It
229
+ uploads one complete prepared bundle and passes only its content-addressed
230
+ hosted reference. The environment-gated publish job installs the publisher
231
+ toolchain, receives mutation permissions, reloads and verifies the bundle, and
232
+ then observes destinations before any write. The environment gate remains a workflow
233
+ fact; it is not release-engine identity or data.
234
+
235
+ The reviewed configuration attests `workflow: "reviewed-release.yml"` and
236
+ `workflowRef: "refs/heads/main"`. Keep the workflow filename and dispatch it
237
+ from that ref with `candidate_sha` equal to the current commit, or deliberately
238
+ update both constraints. Reusing an automatic configuration that attests
239
+ `release.yml` fails before OIDC acquisition. Recover a failed reviewed
240
+ publication by rerunning the publish job in the same workflow run, not by
241
+ preparing again.
242
+
243
+ ## Prepare without publication
244
+
245
+ Use the split local path for build-only work or when bytes must cross an
246
+ explicit host boundary:
241
247
 
242
248
  ```sh
243
- bun add @mannyc1/ts-release effect@beta @effect/platform-bun@beta
249
+ prepared_ref="$(ts-release prepare --config release.config.json)"
250
+ ts-release inspect "$prepared_ref"
244
251
  ```
245
252
 
246
- High-level workflows are available from the opt-in workflow facade:
253
+ The value is a path-free `prepared:local:sha256-…` reference resolved against
254
+ the selected content-addressed store. `--store` selects another local store;
255
+ the reference itself never embeds a filesystem path. Publication accepts only
256
+ a complete reference and never rebuilds from source as a fallback.
247
257
 
248
- ```ts
249
- import * as BunHttpClient from "@effect/platform-bun/BunHttpClient"
250
- import * as BunServices from "@effect/platform-bun/BunServices"
251
- import * as Effect from "effect/Effect"
252
- import * as Layer from "effect/Layer"
253
- import { Distribution, Live } from "@mannyc1/ts-release/workflows"
254
-
255
- const root = "/path/to/release-workspace"
256
- const RuntimeLayer = Live.makeLayer({ root }).pipe(
257
- Layer.provideMerge(BunServices.layer),
258
- Layer.provideMerge(BunHttpClient.layer)
259
- )
260
-
261
- const textPlan = await Effect.runPromise(
262
- Distribution.renderPlan({ root, configPath: "release.config.json", format: "text" }).pipe(
263
- Effect.provide(RuntimeLayer)
264
- )
265
- )
266
-
267
- const evidence = await Effect.runPromise(
268
- Distribution.run({
269
- root,
270
- configPath: "release.config.json",
271
- execute: true,
272
- approveIrreversible: true
273
- }).pipe(Effect.provide(RuntimeLayer))
274
- )
275
-
276
- console.log(textPlan)
277
- console.log(evidence.schemaVersion)
278
- ```
279
-
280
- Use `@mannyc1/ts-release/workflows` for the curated `Distribution`, `Config`,
281
- `Init`, `Diagnostics`, `Evidence`, and `Live` namespaces. The `Distribution`
282
- namespace is the artifact-first facade; `Config` keeps the lower-level
283
- config-file workflow names. Use exact subpaths such as
284
- `@mannyc1/ts-release/workflows/distribution` or lower-level `domain/`,
285
- `planner/`, `targets/`, and `host/` modules when you need tighter control or
286
- maximum tree-shaking.
287
-
288
- The package root export is intentionally empty. Public API is the explicit
289
- subpath list in `package.json`.
290
-
291
- ## Templates And Examples
258
+ Local extension work uses two primitives. `CommandCheck` is a pass/fail gate.
259
+ `CommandArtifact` generates or transforms declared regular-file bytes. Data
260
+ flow uses declared input and output IDs. Generic preparation children receive
261
+ no authored host environment values, and the runner may retain only `PATH` as
262
+ argv execution plumbing. Trusted commands are not a sandbox or a generic
263
+ remote-effect mechanism.
292
264
 
293
- Config templates live in `templates/`:
265
+ ## Observe and recover
294
266
 
295
- - `npm-only`
296
- - `npm-github`
297
- - `bun-cli-github`
298
- - `multi-target-homebrew`
299
- - `multi-target-scoop`
300
-
301
- Runnable fixtures live in `examples/` and are checked through the same workflow
302
- path as user configs.
267
+ Observation is read-only:
303
268
 
304
269
  ```sh
305
- bun run build
306
- cd examples/multi-target
307
- bun ../../apps/release-ts/src/cli/main.ts plan --config release.config.json --format text
270
+ ts-release observe "$prepared_ref"
308
271
  ```
309
272
 
310
- Templates with `artifactRecipes` need an explicit staging step before target
311
- planning expects the generated files to exist:
273
+ To resume a partial or response-lost release, publish the same reference:
312
274
 
313
275
  ```sh
314
- bun run cli stage-artifacts --config release.config.json --format text
276
+ ts-release publish "$prepared_ref"
315
277
  ```
316
278
 
317
- ## Evidence
279
+ Every attempt verifies the manifest and blobs, then reobserves every subject.
280
+ Equivalent subjects are skipped. Conflict and pre-mutation uncertainty stop
281
+ without mutation. A post-dispatch unknown outcome stays uncertain until a new
282
+ exact observation converges. Publication is not an atomic transaction, so a
283
+ release may partially succeed and there is no universal rollback.
318
284
 
319
- Validation, rendering, execution, reconciliation, and verification write JSON
320
- evidence bundles. Primitive commands write named files such as
321
- `validation.json`; the full `run` workflow writes `evidence.json`.
285
+ ## Provider-specific correction
322
286
 
323
- ```json
324
- {
325
- "schemaVersion": "release-evidence/v1",
326
- "releaseName": "release",
327
- "releaseVersion": "0.1.0",
328
- "records": [
329
- {
330
- "id": "npm:npm-pack-dry-run:command",
331
- "operationId": "npm:npm-pack-dry-run",
332
- "phase": "validation",
333
- "targetId": "npm",
334
- "risk": "read-only",
335
- "status": "passed",
336
- "severity": "info",
337
- "message": "npm pack dry run passed.",
338
- "startedAt": "2026-01-01T00:00:00.000Z",
339
- "endedAt": "2026-01-01T00:00:00.100Z",
340
- "durationMillis": 100,
341
- "command": "npm pack --dry-run --json",
342
- "exitCode": 0
343
- }
344
- ]
345
- }
346
- ```
347
-
348
- Failed commands preserve partial evidence when possible. Non-strict mode records
349
- missing validators as visible skipped evidence instead of silently dropping them.
350
-
351
- ## Reconciliation
352
-
353
- `reconcile` is a narrow repair path for GitHub Releases. It reads the release by
354
- tag, blocks on mismatched metadata or assets, skips an already matching
355
- published release, and can publish a matching draft with `--execute`.
356
-
357
- It does not replay immutable registry publishes:
287
+ Correction is deliberately separate from ordinary publication:
358
288
 
359
289
  ```sh
360
- bun run cli reconcile --config release.config.json --execute
290
+ ts-release correct "$prepared_ref" correction.json
361
291
  ```
362
292
 
363
- ## Repository Checks
293
+ The command binds authored intent to the exact prepared provider subject. npm
294
+ and GitHub Release corrections remain canonical external operator proposals.
295
+ Catalog Git installs one conditional `forward-catalog-state` correction: it
296
+ requires a SemVer-newer replacement and changes both the consumer formula or
297
+ manifest and its managed-state record against the exact observed branch
298
+ generation. Deletion, arbitrary inverse operations, and announcements are not
299
+ release destinations.
300
+
301
+ ## Capability and platform boundary
302
+
303
+ A source checkout or accepted field is not support evidence. The generated
304
+ capability inventory must join each supported row to its strict decoder,
305
+ default-layer entrypoint, exact observation semantics, and vertical test, and
306
+ the release-candidate matrix must exercise every claimed execution host.
307
+
308
+ | Axis | Kernel candidate boundary |
309
+ | --- | --- |
310
+ | Local preparation | Bun compilation, prebuilt imports, command checks/artifacts, archives, and checksums are retained; final support requires the generated capability and clean-candidate gates to agree. |
311
+ | Remote publication | npm, prebuilt PyPI distributions, GitHub Releases, and typed Homebrew/Scoop catalog Git delivery are installed. npm uses explicit trusted-publishing or token authentication; PyPI token writes require a host-supplied shared terminal claim store, and its trusted-publishing strategy is external-host-owned. |
312
+ | Correction | npm and GitHub authored proposals are exact-bound; PyPI yanking is observation-only; catalog Git installs exact paired SemVer-forward correction. |
313
+ | Execution hosts | Linux is the only installed execution host. The checked-in Action is a native Node 24 launcher around a workflow-installed, pinned Bun runtime. macOS and Windows are not ts-release execution hosts. |
314
+ | Artifact targets | The Bun builder advertises Linux and macOS x64/arm64 targets. macOS binaries are cross-compiled artifacts, not host-execution evidence. The self-release does not distribute a Windows ts-release binary. |
315
+ | Native tools | Linux preparation requires an external Bun executable and `libseccomp.so.2`; network-denied commands record both identities. WSL, when used, is Linux. A standalone CLI binary is not a self-contained replacement for these tools. |
316
+
317
+ Installed Node consumers must satisfy the package engine
318
+ `^22.22.2 || ^24.15.0 || >=26.0.0`; Bun consumers require Bun 1.3.14 or newer.
319
+ The checked-in Action uses GitHub's native Node 24 Action handler so the runner
320
+ can inject its Actions-artifact transport credentials. Its tiny checked-in
321
+ launcher passes no credentials to the Bun 1.3.14 runtime preloader, then runs
322
+ the checked-in `dist/index.js` through the workflow-installed Bun runtime.
323
+ Preparation stays in Bun, while every Actions-artifact upload or download is
324
+ delegated to the checked-in Node 24 bridge so the official artifact client runs
325
+ on its native stream implementation. The Action does not change the Node
326
+ engine of the installed library or CLI package.
327
+
328
+ The current source tree is not a release certificate. A published support
329
+ claim exists only after the clean-candidate evidence records all required
330
+ gates green; skipped live facts remain `UNVERIFIED`.
331
+
332
+ ## Extension jobs and exclusions
333
+
334
+ The kernel translates extension requests to the owner that can enforce them:
335
+
336
+ | User job | Owner |
337
+ | --- | --- |
338
+ | Tests, policy checks, generated notes, and agent bundles | `CommandCheck` or declared `CommandArtifact` bytes |
339
+ | npm, prebuilt PyPI, GitHub Release, and catalog Git remote verification/publication | Installed provider modules; PyPI token mutation also requires the shared terminal claim boundary |
340
+ | Environment protection or human authorization | External workflow host |
341
+ | Downstream announcements | External workflow step after a complete report |
342
+
343
+ Homebrew and Scoop rendering/delivery use typed renderers and an exact paired
344
+ Git Data subject; arbitrary whole-file catalog templating remains excluded.
345
+ Generic wrapper-wheel generation remains excluded from the prebuilt PyPI
346
+ capability. The repository-specific four-wheel `ts-release` self-release is an
347
+ explicit product decision and is prepared by its dedicated workflow. PyPI
348
+ support is contract-tested but has not been live-write-dogfooded in this wave.
349
+ Custom library applications may compose full provider subjects through the
350
+ [`provider-sdk`](https://github.com/mannyc2/ts-release/blob/main/docs/native-extensions.md)
351
+ subpath. The stock CLI and Action
352
+ do not discover packages or treat generic hooks as remote publishers.
353
+
354
+ ## Library API
355
+
356
+ The Promise API uses the same lifecycle as the CLI and Action:
364
357
 
365
- Use Bun for package management, scripts, and tests:
366
-
367
- ```sh
368
- bun run check:release
369
- bun run check:examples
370
- bun run check:readme
358
+ ```ts
359
+ import {
360
+ defineRelease,
361
+ encodeCompletePreparedReleaseRef,
362
+ makeReleaseApi
363
+ } from "@mannyc1/ts-release"
364
+ import { NodeReleaseLayer } from "@mannyc1/ts-release/node"
365
+
366
+ const config = defineRelease({
367
+ project: { repository: "owner/repo" },
368
+ versionFrom: "manifest" as const,
369
+ npmPackage: { path: "." },
370
+ publish: {
371
+ npm: {
372
+ authentication: {
373
+ strategy: "trusted-publishing" as const,
374
+ attestation: {
375
+ provider: "github-actions" as const,
376
+ runner: "github-hosted" as const,
377
+ repository: "owner/repo",
378
+ workflow: "release.yml",
379
+ workflowRef: "refs/heads/main",
380
+ allowedAction: "npm-publish-direct" as const
381
+ }
382
+ }
383
+ },
384
+ github: {}
385
+ }
386
+ })
387
+
388
+ const api = makeReleaseApi(NodeReleaseLayer)
389
+ try {
390
+ const result = await api.release({ config, workspace: process.cwd() })
391
+ console.log(encodeCompletePreparedReleaseRef(result.prepared))
392
+ console.log(result.report.status)
393
+ } finally {
394
+ await api.dispose()
395
+ }
371
396
  ```
372
397
 
373
- Real-tool integration checks are opt-in:
398
+ The public operations are `inspect`, `prepare`, `observe`, `publish`,
399
+ `release`, and `correct`. Public inputs contain neither credential values nor
400
+ prepared paths. The derived graph is ephemeral; the verified prepared
401
+ manifest and blobs are the durable cross-process boundary.
402
+
403
+ The separate `@mannyc1/ts-release/operation-journal` subpath exposes the
404
+ provider-neutral canonical envelope and one S3 CAS protocol for durable
405
+ external-operation continuation. It stores consumer-owned opaque bytes and
406
+ never decodes provider fields. Workflow repository/run coordinates are derived
407
+ from the re-observed GitHub OIDC session rather than accepted from an append
408
+ request. A host can supply one already-authenticated, exact-policy S3 boundary
409
+ as the credential-agnostic qualification seam. The separate
410
+ `@mannyc1/ts-release/operation-journal/aws` subpath is the only operational
411
+ backend implementation: it accepts one sealed activation contract, rejects
412
+ ambient AWS variables and shared files, requests GitHub OIDC directly, uses
413
+ only the returned short-lived role session, and parses live STS, IAM, bucket,
414
+ Object Lock, ownership, public-access, and policy responses. It accepts no
415
+ profile, credential, endpoint, alternate bucket, or fallback-store input.
416
+ Operation identities are bounded to 65,536 bytes, payloads to 1,048,576 bytes,
417
+ and retained objects to 1,500,000 bytes before hashing or allocation. The AWS
418
+ trust and activation contract require the
419
+ reusable workflow to be called as `uses: .../operational-journal.yml@<40-hex>`;
420
+ a branch or tag ref is not authority, and the observed `job_workflow_ref` SHA
421
+ must equal `job_workflow_sha`. The frozen subject selects exactly one GitHub
422
+ environment-subject form: name-bound `repo:owner/repository:environment:name`
423
+ or immutable-ID-bound
424
+ `repo:owner@ownerId/repository@repositoryId:environment:name`; observed IDs
425
+ must reconstruct the latter exactly, and there is no runtime fallback between
426
+ forms. The same STS-admitted token must also report `workflow_dispatch`, a
427
+ branch ref, a public repository, and a GitHub-hosted runner. Every OIDC fetch,
428
+ AWS SDK send, and retained-object stream has a fixed 10,000 ms wall-clock
429
+ deadline in addition to single-attempt retry policy.
430
+
431
+ The checked-in `operational-journal.yml` is intentionally inert: it has no
432
+ OIDC permission, AWS coordinate, credential input, checkout, or executable
433
+ adapter and always stops. Activating it requires the separately provisioned
434
+ bucket/role, a released adapter version, a reviewed opaque-byte caller/callee
435
+ transport, and qualification of the exact retained object protocol. The
436
+ serialized SDK requests, structural boundary, and fake tests are not live AWS
437
+ or workflow qualification.
438
+ An activated reusable job must install the package-supported Node 22.22.2
439
+ runtime independently of the caller and launch the adapter through an
440
+ `env -i` allowlist containing only the exact Actions OIDC request coordinates
441
+ and non-secret activation inputs. The caller's Node 24.14.1 runtime is below a
442
+ transitive dependency's admitted Node 24 floor and must not run this package.
443
+
444
+ ## Agent bundles and development
445
+
446
+ The single tracked agent source owner is `apps/ts-release-agents`. Generated
447
+ Codex and Claude layouts are ignored build output and are captured by the
448
+ self-release as declared `CommandArtifact` outputs. No root marketplace tree
449
+ is a second canonical owner.
374
450
 
375
451
  ```sh
376
- bun run test:integration:tools
377
- RELEASE_INTEGRATION_GITHUB=1 bun run test:integration:tools
452
+ bun install --frozen-lockfile
453
+ bun run check:portable
454
+ bun test
378
455
  ```
379
456
 
380
- See `ARCHITECTURE.md` for module boundaries, `SPEC.md` for the design contract,
381
- `templates/README.md` for starter configs, and `examples/README.md` for runnable
382
- fixtures.
457
+ The durable model is documented in [ARCHITECTURE.md](ARCHITECTURE.md), and the
458
+ precise public contract is in [SPEC.md](SPEC.md). Both files are included with the npm
459
+ package; this README does not rely on an unpackaged relative document.