@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/SPEC.md CHANGED
@@ -1,310 +1,257 @@
1
- # Release Package Spec
2
-
3
- ## Purpose
4
-
5
- The `release` package is a small TypeScript library for turning installable artifacts into explicit, inspectable, and repeatable package-manager distribution plans.
6
-
7
- It should not be a fake universal package manager or a generic task runner. Its job is to model what is being distributed, which artifact variants exist, which package managers or install channels consume them, and which externally visible actions require deliberate approval.
8
-
9
- The package should make distribution work boring: the same inputs should produce the same plan, the same staged artifacts should produce auditable inventory, and the same publish operation should be understandable before anything is executed.
10
-
11
- ## Core Idea
12
-
13
- A distribution is a data flow:
14
-
15
- ```text
16
- release intent
17
- -> normalized release model
18
- -> artifact recipes and inventory
19
- -> installable artifact variants
20
- -> target-specific operations
21
- -> generated package-manager files
22
- -> validation and rendering evidence
23
- -> approved execution
24
- -> post-publish verification
25
- -> optional modeled reconciliation
26
- ```
27
-
28
- The package owns the model and the orchestration. Ecosystem tools remain the source of truth for ecosystem-specific behavior.
29
-
30
- For example, npm, PyPI, GitHub Releases, Homebrew taps, Scoop buckets, OCI registries, app stores, or other targets may each need different manifests, commands, credentials, artifacts, and validators. The release package should describe those differences directly instead of hiding them behind one fake universal abstraction.
31
-
32
- ## Current Shape
33
-
34
- The root package is the reusable library. It exposes explicit subpaths for domain data, config loading, planners, target adapters, host services, and high-level workflows. The official Bun CLI lives in `apps/release-ts`, and the GitHub Action lives in `apps/ts-release-action`; both are runtime adapters over the same TypeScript workflows.
35
-
36
- Current first-party workflows cover:
37
-
38
- - config validation and plan rendering
39
- - explicit artifact recipe staging
40
- - data-first init/scaffolding previews with approved writes
41
- - static doctor/auth/CI diagnostics
42
- - render, validation, execution, verification, and workflow evidence
43
- - narrow GitHub release reconciliation without republishing npm versions
44
-
45
- Reusable configs live in `templates/`, runnable fixtures live in `examples/`, and publish operations remain data until an execute approval and any irreversible approval are supplied.
46
-
47
- ## Design Goals
48
-
49
- ### Plan-first
50
-
51
- The primary output of the package is a distribution plan, not a side effect.
52
-
53
- A plan should be serializable, reviewable, and suitable for CI artifacts. It should explain:
54
-
55
- - release identity: name, version, commit, tag, notes, and source metadata
56
- - artifact inventory: files, checksums, sizes, formats, intended consumers, and installable variants
57
- - target operations: what each target will do and what inputs it needs
58
- - validation steps: which checks must run before publishing
59
- - execution gates: which operations are irreversible or require explicit approval
60
- - evidence paths: where validation and publish results will be recorded
61
-
62
- ### Explicit target semantics
63
-
64
- Different distribution targets have different shapes. The package should model those shapes instead of flattening them.
65
-
66
- Examples:
67
-
68
- - A release host publish creates or updates a release record and uploads assets.
69
- - A registry publish creates immutable package versions.
70
- - A catalog update changes a repository or index that points at artifacts.
71
- - A deployment promotes already-built assets into an environment.
72
-
73
- Each target should declare its required inputs, auth requirements, dry-run support, validation strategy, mutability rules, and recovery behavior. When auth cannot be proven locally, the target should also model the expected execution context, provider-specific setup, and setup prerequisites.
74
-
75
- ### Evidence-driven validation
76
-
77
- Validation should produce structured evidence, not just console output.
78
-
79
- Evidence should be machine-readable enough for CI and human-readable enough for debugging. It should include command invocations, tool versions where practical, exit statuses, important paths, skipped checks, warnings, failures, and timestamps.
80
-
81
- Evidence should also preserve enough context to debug failed or interrupted releases.
82
-
83
- Strict mode should fail on missing required validators. Non-strict mode may record skips, but skips must be visible in the evidence.
84
-
85
- ### Gated irreversible actions
86
-
87
- Operations that publish immutable versions, create public releases, overwrite indexes, or otherwise affect users must be marked as irreversible or externally visible.
88
-
89
- The default behavior should be dry-run or print-only. Execution should require an explicit execute flag, and irreversible operations should require a second confirmation flag or equivalent programmatic approval.
90
-
91
- Failed publish evidence must not be treated as proof that nothing was published.
92
-
93
- The package should make it hard to accidentally publish and easy to see exactly what would be published.
94
-
95
- ### Library-first, CLI-second
96
-
97
- The core package should be a reusable library. A CLI can exist as an adapter, but it should not contain the release logic.
98
-
99
- The library should expose APIs for:
100
-
101
- - loading and normalizing config
102
- - staging declared artifact recipes through provided adapters
103
- - constructing a release plan
104
- - scaffolding starter configs and CI workflows as proposed files
105
- - rendering config schemas and validation results
106
- - rendering target files or generated metadata
107
- - validating plans and artifacts
108
- - reporting static auth and CI readiness with confidence levels
109
- - preparing executable operations
110
- - running approved operations through an injected host interface
111
- - recording evidence
112
- - reconciling narrowly modeled remote state without replaying immutable publishes
113
-
114
- The CLI and GitHub Action should mainly parse host inputs, call the library, format host-specific output, and persist evidence.
115
-
116
- ### Host abstraction without pretending the world is pure
117
-
118
- The package should isolate filesystem, environment, process execution, network calls, and time behind a narrow host interface where that improves testability and portability.
119
-
120
- The host boundary should not become a full application framework. It exists so core planning logic can be deterministic and so execution can be tested without touching real registries or release hosts.
121
-
122
- ### Composable, not magical
123
-
124
- The package should compose with existing tools rather than replace them.
125
-
126
- Builders, packagers, changelog generators, signing tools, registry CLIs, provenance tools, and ecosystem validators should be treated as inputs or adapters. The release package should coordinate them, capture their evidence, and enforce release policy around them.
127
-
128
- ## Non-goals
129
-
130
- The package should not try to:
131
-
132
- - build every artifact itself or replace full build pipelines
133
- - replace ecosystem-native publishing tools
134
- - invent a universal package format or one manifest schema for every ecosystem
135
- - hide target-specific auth requirements
136
- - guarantee semantic versioning policy for the project using it
137
- - own changelog generation as a core requirement
138
- - require a monorepo
139
- - require a specific CI provider
140
- - treat dry-run output as equivalent to successful publication
141
-
142
- These may be integrated through adapters, but they should not define the core.
143
-
144
- ## Core Concepts
145
-
146
- ### Release Intent
147
-
148
- User-authored input describing what should be released.
149
-
150
- It should be concise but complete enough to identify the release, locate artifacts, choose targets, and declare policy.
151
-
152
- Identity may be static config data or may be derived from a package manifest. Release intent should declare artifact files, optional artifact recipes, target policy, and evidence location. Whether a project decides to bump a version from tags, commits, or human review belongs outside the generic distribution model unless it becomes a separate app-local or target-specific adapter.
153
-
154
- ### Artifact Recipe
155
-
156
- An optional, explicit staging contract for artifacts that `ts-release` can create before planning target distribution.
157
-
158
- Recipes are data until the caller runs a staging workflow. The first recipe family is Bun executable compilation, which produces executable artifacts with derived operating-system and architecture variants. Additional recipe families should land only when they provide durable distribution value without turning the core into a general build system.
159
-
160
- ### Installable Artifact Variant
161
-
162
- Platform metadata attached to an artifact intent or inventory item.
163
-
164
- Variants should capture facts that package-manager targets need to choose or render the right artifact: operating system, architecture, optional Linux libc family, executable extension, binary name, install path, and source target triple. Target adapters should consume this data instead of guessing from filenames.
165
-
166
- ### Release Model
167
-
168
- A normalized internal representation with defaults resolved, paths normalized, targets expanded, and invalid combinations rejected.
169
-
170
- The model should be deterministic and independent of terminal formatting or CLI flags.
171
-
172
- ### Release Plan
173
-
174
- A serializable plan derived from the release model.
175
-
176
- The plan is the contract between planning, validation, execution, and CI review. It should be stable enough to diff in tests and inspect in logs.
177
-
178
- ### Target Adapter
179
-
180
- A module that knows how to plan, validate, and execute operations for one distribution target.
181
-
182
- Adapters should expose capabilities clearly: dry-run support, required credentials, validation commands, generated files, publish commands, and expected evidence.
183
-
184
- ### Operation
185
-
186
- A concrete action that may be rendered, validated, executed, or skipped.
187
-
188
- Operations should carry enough metadata to explain their risk level, inputs, outputs, and execution requirements.
189
-
190
- ### Evidence
191
-
192
- Structured records produced by validation, rendering, execution, and verification.
193
-
194
- Evidence should survive outside the process as JSON or another stable format. It should be useful for CI summaries, release audits, and debugging failed publishes.
195
-
196
- ## Expected Public Surface
197
-
198
- The package should make these workflows straightforward:
199
-
200
- - initialize a starter config and optional CI workflow from templates
201
- - validate config JSON and schema shape
202
- - stage declared artifact recipes
203
- - create a plan from config
204
- - inspect the plan without executing anything
205
- - render target-specific files
206
- - validate artifacts and target readiness
207
- - report static auth and CI readiness
208
- - produce evidence artifacts
209
- - print publish operations
210
- - execute approved operations
211
- - verify published state after execution
212
- - reconcile a matching GitHub draft release without republishing immutable registries
213
-
214
- The API should favor explicit functions and typed data over hidden global state.
215
-
216
- ## Configuration Principles
217
-
218
- Configuration should be declarative and boring.
219
-
220
- It should describe release facts and target policy, not arbitrary scripts. Escape hatches can exist, but they should be visible in the plan and evidence.
221
-
222
- Good config answers:
223
-
224
- - What is the release?
225
- - Which artifacts and variants are part of it?
226
- - Which targets or install surfaces receive them?
227
- - What credentials or environment are required?
228
- - What must be validated first?
229
- - Which generated files or indexes will change?
230
- - Which operations are allowed to execute in this environment?
231
-
232
- Artifact path templates may interpolate only named release data such as `{version}`, `{name}`, and `{normalizedName}`. They must be expanded before path safety and artifact inventory checks. Artifact variants must be explicit data or derived by a known recipe adapter before target rendering.
233
-
234
- ## Testing Strategy
235
-
236
- The core should be heavily testable without real external services.
237
-
238
- Important test categories:
239
-
240
- - config parsing and normalization
241
- - invalid config diagnostics
242
- - deterministic plan generation
243
- - adapter capability modeling
244
- - dry-run behavior
245
- - irreversible-operation gating
246
- - evidence recording
247
- - command construction without execution
248
- - execution through fake host implementations
249
- - target adapter contract tests
250
-
251
- Real integration tests can exist for official validators and sandbox registries, but the core should not depend on live services to prove its behavior.
252
-
253
- ## Success Criteria
254
-
255
- The rewrite is successful when:
256
-
257
- - a user can define an artifact-first distribution intent in a small config
258
- - the package can stage declared artifacts before target planning
259
- - the package produces a reviewable distribution plan with no side effects
260
- - target differences are explicit in the plan
261
- - installable artifact variants are available before package-manager rendering
262
- - validation emits structured evidence
263
- - publish operations are blocked by default
264
- - irreversible operations require deliberate approval
265
- - core behavior is covered with deterministic tests
266
- - a CLI can be rebuilt as a thin adapter over the library
267
- - a GitHub Action can run the same workflows without embedding CLI behavior
268
- - starter templates can be checked by the same workflow path as examples
269
- - adding a new target does not require rewriting the core planner
270
-
271
- ## Biases
272
-
273
- Prefer:
274
-
275
- - explicit data over implicit conventions
276
- - small target adapters over a large universal abstraction
277
- - official ecosystem validators over homegrown approximations
278
- - deterministic planning over clever runtime discovery
279
- - evidence artifacts over terminal-only output
280
- - hard failures for unsafe ambiguity
281
- - dry-run as the default mode
282
-
283
- Avoid:
284
-
285
- - hook-runner architecture as the core design
286
- - hidden publish side effects during validation
287
- - target adapters that silently shell out without modeling risk
288
- - global process state in the planning layer
289
- - special cases that only work for one repository shape
290
- - abstractions that erase important ecosystem differences
291
-
292
- ## Implementation Direction
293
-
294
- Continue from the data model.
295
-
296
- Keep the smallest set of types needed to represent release identity, artifact recipes, artifact variants, targets, operations, validation results, execution gates, and evidence. Add target adapters end to end only when they prove the abstractions carry real differences without becoming generic mush.
297
-
298
- The implementation should stay narrow but honest:
299
-
300
- 1. Load config.
301
- 2. Stage declared artifact recipes when requested.
302
- 3. Normalize into a release model with artifact inventory and variants.
303
- 4. Generate a serializable distribution plan.
304
- 5. Render generated files only through explicit render operations.
305
- 6. Validate with structured evidence.
306
- 7. Print executable operations.
307
- 8. Execute only when explicitly approved.
308
- 9. Verify remote state and record evidence.
309
-
310
- Everything else should be added only after it has a clear place in that flow.
1
+ # ts-release specification
2
+
3
+ ## 1. Public operations
4
+
5
+ The root package exports `inspect`, `prepare`, `observe`, `publish`, `release`,
6
+ and `correct`, plus `makeReleaseApi`, durable-reference codecs, configuration helpers, and
7
+ tagged input/runtime errors. The total observation and release report schemas,
8
+ transient credential acquisition errors, and their secret-free durable causes
9
+ are also public. The constructed API adds `dispose` for its host runtime. CLI
10
+ and Action boundaries call these same operations.
11
+
12
+ ## 2. Authored and verified forms
13
+
14
+ Authored configuration is decoded strictly. Resolution combines it with
15
+ observed package and Git facts; disagreement is an error. Verified context
16
+ records the clean source commit/tree and package-manifest digest. Preparation
17
+ materializes that exact commit into a fresh private staging root. Changed,
18
+ ignored, or untracked workspace bytes are never implicit inputs.
19
+
20
+ ## 3. Derived graph
21
+
22
+ The graph contains imported artifacts, build, archive, checksum, command check,
23
+ command artifact, typed Homebrew/Scoop rendering, npm publication, exact-file
24
+ PyPI publication, GitHub Release publication, and catalog Git publication
25
+ primitives. It is
26
+ sorted and linked inside one process. It is never serialized as authority and
27
+ never crosses a runner boundary.
28
+
29
+ ## 4. Prepared release
30
+
31
+ `prepared-release/v2` is canonical JSON plus content-addressed blobs. A
32
+ `CompletePreparedReleaseRef` is the only public cross-process locator and
33
+ contains content identity, never a local path. The complete manifest records
34
+ materialized source identity, project coordinates, artifact IDs, exact
35
+ sizes/digests/media types, input basis, execution provenance, and provider
36
+ subjects. A prepared store refuses missing, altered, extra, symlinked,
37
+ non-canonical, or producer-mismatched content.
38
+
39
+ An npm trusted-publishing subject also binds the exact verified source commit
40
+ and a versioned GitHub/npm provenance-environment contract. The host validates
41
+ all npm-consumed GitHub run facts before reading OIDC authority, snapshots them
42
+ privately onto the issued workload grant, and projects only that snapshot plus
43
+ the two OIDC request values into the closed npm child.
44
+
45
+ A PyPI publication records one independent subject per prebuilt wheel or gzip
46
+ sdist. Preparation parses archive structure and embedded metadata and requires
47
+ project/version/filename agreement before the file can enter a prepared
48
+ manifest. Each subject binds the closed PyPI/TestPyPI Simple and upload
49
+ endpoints, exact filename, size, SHA-256, media type, and distribution tags.
50
+
51
+ ## 5. Observation
52
+
53
+ Publication is subject-based. `observe` uses a read-only report algebra.
54
+ `publish` observes every subject before mutation and again afterward.
55
+ Equivalent subjects are idempotent skips; only a typed provider decision may
56
+ authorize mutation; conflict or inconclusive state blocks. Provider correction
57
+ intent is typed and bound to the prepared digest. npm and GitHub Release
58
+ requests produce external proposals; catalog Git admits one SemVer-forward
59
+ conditional replacement of its exact target/state pair. Credential unavailability
60
+ and unsupported authentication remain total report data with distinct tagged,
61
+ secret-free causes; they do not escape as publication control flow.
62
+
63
+ PyPI observation accepts only a standards-shaped JSON Simple response with
64
+ API major 1 and the API 1.1 equality fields. A visible project page that omits
65
+ the exact filename can authorize token upload only after the host atomically
66
+ creates a shared, durable, terminal claim for the prepared subject. Claim
67
+ unavailability or occupation blocks before credential acquisition. A project
68
+ 404 never authorizes first creation. Yanked files conflict; no yank mutation
69
+ is installed. Trusted publishing is an external PyPA Action path and is
70
+ rejected by the stock coordinator before dispatch.
71
+
72
+ Catalog observation reads the exact branch ref, commit, complete untruncated
73
+ recursive tree, and both managed blobs. Mutation creates exact blobs and a tree
74
+ with the observed root as `base_tree`, verifies every unrelated object and mode
75
+ in the proposed full tree, creates a commit with the observed commit as its
76
+ sole parent, and updates the ref with `force: false`. A catalog subject depends
77
+ on convergence of its configured GitHub release asset subjects.
78
+
79
+ ## 6. Native preparation
80
+
81
+ `CommandCheck` runs trusted argv code against declared inputs. `CommandArtifact`
82
+ generates or transforms declared regular-file outputs. `builder: "command"`
83
+ lowers to the same primitive. Generic preparation children inherit no host
84
+ environment. A nonempty authored environment request is rejected unless a
85
+ future dedicated capability certifies its safe build-time contract. There is
86
+ no generic hook or remote-publisher escape hatch. The public API recognizes
87
+ reserved partition and merge preparation modes and rejects them with
88
+ `PreparationModeUnsupported`; it creates no partial durable object.
89
+
90
+ ## 7. Hosts
91
+
92
+ The capability registry owns separate execution-host, artifact-target, and
93
+ native-tool-host axes. Linux is the only installed execution host. The exact
94
+ advertised artifact targets are Linux x64/arm64 and macOS x64/arm64; macOS
95
+ binaries are cross-compiled artifacts, not execution-host evidence. Windows is
96
+ neither an execution host nor an advertised artifact target, and the
97
+ self-release does not distribute a Windows ts-release binary. WSL is Linux for
98
+ this contract.
99
+
100
+ The checked-in Action is a Linux workflow boundary: its composite step
101
+ requires Bash and a workflow-installed, pinned Bun runtime. The distributed
102
+ package and CLI run under the declared Node engine, but preparation and
103
+ network-denied command execution delegate to an external Bun executable whose
104
+ Linux child loads `libseccomp.so.2`. The standalone CLI is therefore not a
105
+ self-contained preparation sandbox. These declared axes still require the
106
+ clean-candidate public-entrypoint smoke matrix before release certification.
107
+
108
+ ## 8. Error and safety contract
109
+
110
+ Structured Effect errors cross the library boundary. A pre-commit preparation
111
+ failure proves no remote mutation; a post-commit abort carries the exact
112
+ durable reference. Filesystem paths are contained and symlink-checked. Public
113
+ inputs contain no credential values. Secrets are acquired through host layers,
114
+ consumed only by audience- and purpose-checking sinks, and redacted at process
115
+ output boundaries. Host credential error text never enters durable reports;
116
+ only request-derived, secret-free cause data does. The Action validates its
117
+ inputs before calling the library.
118
+
119
+ ## 9. Recovery limits
120
+
121
+ Rerun the same prepared bytes. A partial release is possible; atomic rollback,
122
+ deletion, exactly-once publication, and universal correction are not claimed.
123
+ PyPI filenames remain consumed after deletion and uncertain token uploads are
124
+ never blindly replayed; the required terminal claim survives process loss and
125
+ must be shared by every runner capable of dispatching that subject.
126
+ Read-convergence timing defaults are conservative assumed bounds until live
127
+ post-write evidence measures them. Announcements and unsupported providers
128
+ remain outside the retained product.
129
+
130
+ The provider-neutral `operation-journal` subpath admits only
131
+ `IntentRecorded`, `ReceiptRecorded`, zero or more `ObservationRecorded`, and
132
+ `TerminalRecorded`, with `OutcomeUnknown` as the terminal alternative from an
133
+ intent. Payload bytes and their codec identifier are opaque to ts-release.
134
+ There is one storage protocol: a versioned, Object-Locked S3 namespace with
135
+ immutable conditional event creates and conditional `head.bin` replacement.
136
+ An acknowledgment exists only after exact retained event/head versions and the
137
+ complete chain are re-read. Conditional conflicts, response loss, and process
138
+ death are reconciled by bounded exact-version reads; ambiguity stops and never
139
+ authorizes a provider resubmission. Credential acquisition, provider codecs,
140
+ and provider calls remain host/consumer responsibilities.
141
+
142
+ The release point must equal the re-observed caller `sha`. Standard OIDC claims
143
+ identify the caller while `job_workflow_ref` and
144
+ `job_workflow_sha` separately identify the called ts-release workflow and its
145
+ exact source commit. The OIDC trust-policy digest is independent of the bucket
146
+ and role-policy digests. Repository ID, run ID, and run attempt in journal
147
+ events come only from that observed session; they are not append inputs. The
148
+ checked-in reusable workflow is inert and always fails without OIDC permission
149
+ until the package-owned `operation-journal/aws` adapter has been released and
150
+ the exact infrastructure, opaque-byte workflow topology, and retained-object
151
+ protocol have been separately qualified. Local fake and serialized-request
152
+ tests establish implementation behavior, not live AWS certification.
153
+ AWS trust must compare `job_workflow_ref` to the reusable workflow path at one
154
+ lowercase 40-hex ts-release commit. The called workflow ref must end in the
155
+ same value as `job_workflow_sha`; branch and tag refs are rejected before STS.
156
+
157
+ The library embeds no consumer repository, immutable ID, environment, subject,
158
+ or caller-workflow name. An activation contract supplies those exact expected
159
+ values and the adapter re-observes them. Its parsed trust projection must bind
160
+ `aud`, the frozen environment `sub`, repository/IDs, caller `workflow`, `ref`,
161
+ `environment`, and `job_workflow_ref`. Workflow source SHAs remain separately
162
+ re-observed evidence and are not misrepresented as AWS trust-condition keys.
163
+ The activation contract freezes either the exact name-bound environment
164
+ subject or its immutable owner/repository-ID-bound form; the adapter admits no
165
+ fallback between those forms. After STS admits the token, local equality also
166
+ requires `event_name=workflow_dispatch`, `ref_type=branch`,
167
+ `repository_visibility=public`, and `runner_environment=github-hosted`.
168
+ The adapter accepts no credential, profile, endpoint, or alternate-store input:
169
+ it rejects ambient AWS variables and shared files, directly exchanges GitHub
170
+ OIDC for one short-lived role session, and derives governance facts from signed
171
+ STS/IAM/S3 responses and exact parsed policies rather than caller booleans.
172
+ Operation identities are limited to 65,536 bytes, consumer payloads to
173
+ 1,048,576 bytes, and every retained object to 1,500,000 bytes; declared and
174
+ streamed lengths are both enforced before hashing or full object allocation.
175
+ Every OIDC fetch, AWS SDK send, and response/body stream is
176
+ bounded by one fixed 10,000 ms wall-clock deadline. The activated reusable job
177
+ uses pinned Node 22.22.2 and an
178
+ `env -i` allowlist. Node 24.14.1 is not in this package's engine because the
179
+ authoritative transitive floor begins at Node 24.15.0.
180
+
181
+ ## 10. Product evidence
182
+
183
+ In the source distribution, the generated capability inventory is joined
184
+ one-to-one from executable module values and dated evidence. Evidence records
185
+ contain sanitized references only and cannot configure runtime support. A
186
+ source checkout, configuration field, detached test, or protocol double is not
187
+ release certification.
188
+
189
+ ## 11. Distribution
190
+
191
+ The canonical package identity is `@mannyc1/ts-release`. The canonical Action
192
+ is the monorepo subpath `mannyc2/ts-release/apps/ts-release-action`. Public
193
+ consumer documents bind an immutable version only when its tag targets the
194
+ exact certified result commit before the package README becomes visible.
195
+ Installed Node package consumers require
196
+ `^22.22.2 || ^24.15.0 || >=26.0.0`. The checked-in Action declares a composite
197
+ runtime and runs `dist/index.js` with the pinned Bun installed earlier in each
198
+ advertised Linux workflow. Its entrypoint evidence is separate from installed
199
+ package evidence and does not alter the package's Node engine. The packaged
200
+ Node CLI still requires external Bun and, for network-denied commands on its
201
+ Linux execution host, `libseccomp.so.2`.
202
+
203
+ ## 12. Non-goals
204
+
205
+ The engine does not transport host-gate identity or persist execution history as authority,
206
+ provide generic lifecycle hooks, or claim to be a language-specific clone of
207
+ another release product. Arbitrary catalog templates, engine-owned downstream
208
+ announcements, dynamic adapter discovery, and command publishers are not
209
+ capabilities installed in the stock kernel.
210
+
211
+ ## 13. Root export audit
212
+
213
+ The root runtime exports are exactly:
214
+
215
+ - `AuthoredGithubReleaseAmendment`
216
+ - `AuthoredCatalogForwardCorrection`
217
+ - `AuthoredNpmDeprecation`
218
+ - `CompletePreparedReleaseRef`
219
+ - `CorrectionReport`
220
+ - `CredentialFailureCause`
221
+ - `CredentialStrategyUnsupported`
222
+ - `CredentialStrategyUnsupportedCause`
223
+ - `CredentialUnavailable`
224
+ - `CredentialUnavailableCause`
225
+ - `GitHubActionsCompletePreparedReleaseRef`
226
+ - `LocalCompletePreparedReleaseRef`
227
+ - `ObservationReport`
228
+ - `PreparationModeUnsupported`
229
+ - `PreparedReleaseRefCodecError`
230
+ - `PreparedReleaseRefMalformedError`
231
+ - `PreparedReleaseRefUnknownSchemeError`
232
+ - `ReleaseAbortedError`
233
+ - `ReleaseIncompleteError`
234
+ - `ReleasePreparationError`
235
+ - `ReleaseReport`
236
+ - `correct`
237
+ - `decodeAuthoredCorrection`
238
+ - `decodeCompletePreparedReleaseRef`
239
+ - `defineRelease`
240
+ - `encodeCompletePreparedReleaseRef`
241
+ - `encodeResolvedConfig`
242
+ - `inspect`
243
+ - `makeGitHubActionsCompletePreparedReleaseRef`
244
+ - `makeLocalCompletePreparedReleaseRef`
245
+ - `makeReleaseApi`
246
+ - `observe`
247
+ - `prepare`
248
+ - `publish`
249
+ - `release`
250
+ - `ReleaseInputError`
251
+ - `ReleaseRuntime`
252
+ - `resolveConfig`
253
+ - `unsupportedExecutionHost`
254
+
255
+ ## 14. License
256
+
257
+ MIT.
@@ -0,0 +1,39 @@
1
+ # ts-release CLI
2
+
3
+ The CLI exposes exactly seven commands:
4
+
5
+ - `init` writes an explicit preset only after that preset passes strict
6
+ authored-config inspection.
7
+ - `inspect` observes authored configuration or reads a prepared bundle.
8
+ - `prepare` stages native preparations and stores an exact bundle.
9
+ - `observe` reads the remote subjects for one prepared bundle without mutation.
10
+ - `publish` observes and publishes one prepared bundle.
11
+ - `release` composes preparation and publication automatically.
12
+ - `correct` binds one provider-specific correction proposal to the exact
13
+ prepared subject; the installed kernel has no corrective mutation adapter.
14
+
15
+ ```sh
16
+ bun run cli init --preset bun-npm-github
17
+ bun run cli inspect --config release.config.json
18
+ bun run cli release --config release.config.json
19
+ ```
20
+
21
+ The published Node bundle is built from `src/cli/node-main.ts`; development
22
+ uses the Bun host entrypoint.
23
+
24
+ The publishing preset first discovers the canonical owner/repository, then
25
+ writes explicit trusted-publishing and GitHub intent and strictly inspects the
26
+ exact generated object. It refuses to guess when repository discovery is
27
+ ambiguous or absent.
28
+
29
+ The preset binds trusted publication to `.github/workflows/release.yml` at
30
+ `refs/heads/main`. Change both `workflow` and `workflowRef` when another exact
31
+ workflow/ref is the intended host; a mismatch is rejected before OIDC request
32
+ material is read.
33
+
34
+ The repository-specific PyPI self-release is separate from that npm/GitHub
35
+ path. `pypi-release.config.json` builds the four Linux/macOS x64/arm64 native
36
+ wheel artifacts, and `scripts/prepare-pypi-distributions.ts` materializes the
37
+ verified set for `.github/workflows/pypi-release.yml`. Its external publisher
38
+ identity is the official PyPA Action bound to the `pypi` GitHub environment;
39
+ the script prepares bytes only and never exchanges OIDC or uploads them.