@mannyc1/ts-release 0.0.7 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (695) hide show
  1. package/ARCHITECTURE.md +184 -92
  2. package/CHANGELOG.md +197 -0
  3. package/LICENSE +21 -0
  4. package/README.md +404 -327
  5. package/SPEC.md +257 -310
  6. package/apps/release-ts/README.md +39 -0
  7. package/apps/release-ts/src/cli/command.ts +164 -0
  8. package/apps/release-ts/src/cli/commands.ts +351 -0
  9. package/apps/release-ts/src/cli/main.ts +43 -0
  10. package/apps/release-ts/src/cli/node-main.ts +49 -0
  11. package/apps/ts-release-agents/LICENSE +21 -0
  12. package/apps/ts-release-agents/README.md +21 -0
  13. package/apps/ts-release-agents/evals/cases.json +11 -0
  14. package/apps/ts-release-agents/manifests/claude.json +5 -0
  15. package/apps/ts-release-agents/manifests/codex.json +5 -0
  16. package/apps/ts-release-agents/package.json +11 -0
  17. package/apps/ts-release-agents/skills/release/SKILL.md +48 -0
  18. package/apps/ts-release-agents/skills/release/references/configuration.md +18 -0
  19. package/apps/ts-release-agents/skills/release/references/recovery.md +10 -0
  20. package/apps/ts-release-agents/skills/release/references/staged-workflow.md +12 -0
  21. package/apps/ts-release-agents/skills/release/references/target-selection.md +13 -0
  22. package/apps/ts-release-agents/skills/release/references/verification.md +14 -0
  23. package/apps/ts-release-agents/src/build.ts +105 -0
  24. package/apps/ts-release-agents/src/check.ts +122 -0
  25. package/apps/ts-release-agents/src/install.ts +121 -0
  26. package/apps/ts-release-agents/test/contract.test.ts +56 -0
  27. package/apps/ts-release-agents/tsconfig.json +5 -0
  28. package/dist/api/api.d.ts +15 -0
  29. package/dist/api/api.d.ts.map +1 -0
  30. package/dist/api/api.js +244 -0
  31. package/dist/api/api.js.map +1 -0
  32. package/dist/api/errors.d.ts +39 -0
  33. package/dist/api/errors.d.ts.map +1 -0
  34. package/dist/api/errors.js +32 -0
  35. package/dist/api/errors.js.map +1 -0
  36. package/dist/api/input.d.ts +10 -0
  37. package/dist/api/input.d.ts.map +1 -0
  38. package/dist/api/input.js +73 -0
  39. package/dist/api/input.js.map +1 -0
  40. package/dist/api/runtime.d.ts +18 -0
  41. package/dist/api/runtime.d.ts.map +1 -0
  42. package/dist/api/runtime.js +7 -0
  43. package/dist/api/runtime.js.map +1 -0
  44. package/dist/api/types.d.ts +76 -0
  45. package/dist/api/types.d.ts.map +1 -0
  46. package/dist/api/types.js +17 -0
  47. package/dist/api/types.js.map +1 -0
  48. package/dist/bin/ts-release.js +39346 -0
  49. package/dist/capabilities/bun-targets.d.ts +3 -0
  50. package/dist/capabilities/bun-targets.d.ts.map +1 -0
  51. package/dist/capabilities/bun-targets.js +3 -0
  52. package/dist/capabilities/bun-targets.js.map +1 -0
  53. package/dist/capabilities/field-ownership.d.ts +17 -0
  54. package/dist/capabilities/field-ownership.d.ts.map +1 -0
  55. package/dist/capabilities/field-ownership.js +40 -0
  56. package/dist/capabilities/field-ownership.js.map +1 -0
  57. package/dist/capabilities/module.d.ts +91 -0
  58. package/dist/capabilities/module.d.ts.map +1 -0
  59. package/dist/capabilities/module.js +2 -0
  60. package/dist/capabilities/module.js.map +1 -0
  61. package/dist/capabilities/registry.d.ts +829 -0
  62. package/dist/capabilities/registry.d.ts.map +1 -0
  63. package/dist/capabilities/registry.js +291 -0
  64. package/dist/capabilities/registry.js.map +1 -0
  65. package/dist/config/config.d.ts +6 -0
  66. package/dist/config/config.d.ts.map +1 -0
  67. package/dist/config/config.js +42 -0
  68. package/dist/config/config.js.map +1 -0
  69. package/dist/correction/coordinator.d.ts +248 -0
  70. package/dist/correction/coordinator.d.ts.map +1 -0
  71. package/dist/correction/coordinator.js +274 -0
  72. package/dist/correction/coordinator.js.map +1 -0
  73. package/dist/correction/index.d.ts +3 -0
  74. package/dist/correction/index.d.ts.map +1 -0
  75. package/dist/correction/index.js +3 -0
  76. package/dist/correction/index.js.map +1 -0
  77. package/dist/correction/intent.d.ts +111 -0
  78. package/dist/correction/intent.d.ts.map +1 -0
  79. package/dist/correction/intent.js +146 -0
  80. package/dist/correction/intent.js.map +1 -0
  81. package/dist/drivers/archive.d.ts +9 -0
  82. package/dist/drivers/archive.d.ts.map +1 -0
  83. package/dist/drivers/archive.js +105 -0
  84. package/dist/drivers/archive.js.map +1 -0
  85. package/dist/drivers/contain.d.ts +6 -0
  86. package/dist/drivers/contain.d.ts.map +1 -0
  87. package/dist/drivers/contain.js +17 -0
  88. package/dist/drivers/contain.js.map +1 -0
  89. package/dist/drivers/environment.d.ts +4 -0
  90. package/dist/drivers/environment.d.ts.map +1 -0
  91. package/dist/drivers/environment.js +18 -0
  92. package/dist/drivers/environment.js.map +1 -0
  93. package/dist/drivers/errors.d.ts +9 -0
  94. package/dist/drivers/errors.d.ts.map +1 -0
  95. package/dist/drivers/errors.js +6 -0
  96. package/dist/drivers/errors.js.map +1 -0
  97. package/dist/drivers/glob.d.ts +2 -0
  98. package/dist/drivers/glob.d.ts.map +1 -0
  99. package/dist/drivers/glob.js +162 -0
  100. package/dist/drivers/glob.js.map +1 -0
  101. package/dist/drivers/process.d.ts +48 -0
  102. package/dist/drivers/process.d.ts.map +1 -0
  103. package/dist/drivers/process.js +257 -0
  104. package/dist/drivers/process.js.map +1 -0
  105. package/dist/drivers/python-wheel.d.ts +21 -0
  106. package/dist/drivers/python-wheel.d.ts.map +1 -0
  107. package/dist/drivers/python-wheel.js +109 -0
  108. package/dist/drivers/python-wheel.js.map +1 -0
  109. package/dist/drivers/redact.d.ts +4 -0
  110. package/dist/drivers/redact.d.ts.map +1 -0
  111. package/dist/drivers/redact.js +24 -0
  112. package/dist/drivers/redact.js.map +1 -0
  113. package/dist/drivers/seccomp-helper-source.d.ts +7 -0
  114. package/dist/drivers/seccomp-helper-source.d.ts.map +1 -0
  115. package/dist/drivers/seccomp-helper-source.js +121 -0
  116. package/dist/drivers/seccomp-helper-source.js.map +1 -0
  117. package/dist/drivers/utils.d.ts +4 -0
  118. package/dist/drivers/utils.d.ts.map +1 -0
  119. package/dist/drivers/utils.js +5 -0
  120. package/dist/drivers/utils.js.map +1 -0
  121. package/dist/drivers/workspace.d.ts +9 -0
  122. package/dist/drivers/workspace.d.ts.map +1 -0
  123. package/dist/drivers/workspace.js +53 -0
  124. package/dist/drivers/workspace.js.map +1 -0
  125. package/dist/extensions/provider-adapter.d.ts +48 -0
  126. package/dist/extensions/provider-adapter.d.ts.map +1 -0
  127. package/dist/extensions/provider-adapter.js +64 -0
  128. package/dist/extensions/provider-adapter.js.map +1 -0
  129. package/dist/host.d.ts +33 -0
  130. package/dist/host.d.ts.map +1 -0
  131. package/dist/host.js +20 -0
  132. package/dist/host.js.map +1 -0
  133. package/dist/index.d.ts +19 -1
  134. package/dist/index.d.ts.map +1 -1
  135. package/dist/index.js +12 -1
  136. package/dist/index.js.map +1 -1
  137. package/dist/model/artifact-collection.d.ts +84 -0
  138. package/dist/model/artifact-collection.d.ts.map +1 -0
  139. package/dist/model/artifact-collection.js +185 -0
  140. package/dist/model/artifact-collection.js.map +1 -0
  141. package/dist/model/authority.d.ts +89 -0
  142. package/dist/model/authority.d.ts.map +1 -0
  143. package/dist/model/authority.js +80 -0
  144. package/dist/model/authority.js.map +1 -0
  145. package/dist/model/bun-targets.d.ts +34 -0
  146. package/dist/model/bun-targets.d.ts.map +1 -0
  147. package/dist/model/bun-targets.js +17 -0
  148. package/dist/model/bun-targets.js.map +1 -0
  149. package/dist/model/canonical.d.ts +8 -0
  150. package/dist/model/canonical.d.ts.map +1 -0
  151. package/dist/model/canonical.js +205 -0
  152. package/dist/model/canonical.js.map +1 -0
  153. package/dist/model/catalog.d.ts +76 -0
  154. package/dist/model/catalog.d.ts.map +1 -0
  155. package/dist/model/catalog.js +174 -0
  156. package/dist/model/catalog.js.map +1 -0
  157. package/dist/model/digest.d.ts +53 -0
  158. package/dist/model/digest.d.ts.map +1 -0
  159. package/dist/model/digest.js +127 -0
  160. package/dist/model/digest.js.map +1 -0
  161. package/dist/model/errors.d.ts +14 -0
  162. package/dist/model/errors.d.ts.map +1 -0
  163. package/dist/model/errors.js +8 -0
  164. package/dist/model/errors.js.map +1 -0
  165. package/dist/model/primitives.d.ts +19 -0
  166. package/dist/model/primitives.d.ts.map +1 -0
  167. package/dist/model/primitives.js +18 -0
  168. package/dist/model/primitives.js.map +1 -0
  169. package/dist/model/pypi.d.ts +12 -0
  170. package/dist/model/pypi.d.ts.map +1 -0
  171. package/dist/model/pypi.js +20 -0
  172. package/dist/model/pypi.js.map +1 -0
  173. package/dist/model/python-distribution.d.ts +33 -0
  174. package/dist/model/python-distribution.d.ts.map +1 -0
  175. package/dist/model/python-distribution.js +367 -0
  176. package/dist/model/python-distribution.js.map +1 -0
  177. package/dist/model/secret-patterns.d.ts +2 -0
  178. package/dist/model/secret-patterns.d.ts.map +1 -0
  179. package/dist/model/secret-patterns.js +12 -0
  180. package/dist/model/secret-patterns.js.map +1 -0
  181. package/dist/operation-journal/authority.d.ts +3 -0
  182. package/dist/operation-journal/authority.d.ts.map +1 -0
  183. package/dist/operation-journal/authority.js +147 -0
  184. package/dist/operation-journal/authority.js.map +1 -0
  185. package/dist/operation-journal/aws/deadline.d.ts +12 -0
  186. package/dist/operation-journal/aws/deadline.d.ts.map +1 -0
  187. package/dist/operation-journal/aws/deadline.js +38 -0
  188. package/dist/operation-journal/aws/deadline.js.map +1 -0
  189. package/dist/operation-journal/aws/oidc.d.ts +27 -0
  190. package/dist/operation-journal/aws/oidc.d.ts.map +1 -0
  191. package/dist/operation-journal/aws/oidc.js +361 -0
  192. package/dist/operation-journal/aws/oidc.js.map +1 -0
  193. package/dist/operation-journal/aws/policy.d.ts +42 -0
  194. package/dist/operation-journal/aws/policy.d.ts.map +1 -0
  195. package/dist/operation-journal/aws/policy.js +404 -0
  196. package/dist/operation-journal/aws/policy.js.map +1 -0
  197. package/dist/operation-journal/aws/s3-boundary.d.ts +17 -0
  198. package/dist/operation-journal/aws/s3-boundary.d.ts.map +1 -0
  199. package/dist/operation-journal/aws/s3-boundary.js +417 -0
  200. package/dist/operation-journal/aws/s3-boundary.js.map +1 -0
  201. package/dist/operation-journal/aws.d.ts +11 -0
  202. package/dist/operation-journal/aws.d.ts.map +1 -0
  203. package/dist/operation-journal/aws.js +50 -0
  204. package/dist/operation-journal/aws.js.map +1 -0
  205. package/dist/operation-journal/canonical.d.ts +52 -0
  206. package/dist/operation-journal/canonical.d.ts.map +1 -0
  207. package/dist/operation-journal/canonical.js +282 -0
  208. package/dist/operation-journal/canonical.js.map +1 -0
  209. package/dist/operation-journal/model.d.ts +251 -0
  210. package/dist/operation-journal/model.d.ts.map +1 -0
  211. package/dist/operation-journal/model.js +56 -0
  212. package/dist/operation-journal/model.js.map +1 -0
  213. package/dist/operation-journal/reducer.d.ts +28 -0
  214. package/dist/operation-journal/reducer.d.ts.map +1 -0
  215. package/dist/operation-journal/reducer.js +73 -0
  216. package/dist/operation-journal/reducer.js.map +1 -0
  217. package/dist/operation-journal/s3.d.ts +7 -0
  218. package/dist/operation-journal/s3.d.ts.map +1 -0
  219. package/dist/operation-journal/s3.js +667 -0
  220. package/dist/operation-journal/s3.js.map +1 -0
  221. package/dist/operation-journal.d.ts +14 -0
  222. package/dist/operation-journal.d.ts.map +1 -0
  223. package/dist/operation-journal.js +12 -0
  224. package/dist/operation-journal.js.map +1 -0
  225. package/dist/platform/bun.d.ts +7 -0
  226. package/dist/platform/bun.d.ts.map +1 -0
  227. package/dist/platform/bun.js +15 -0
  228. package/dist/platform/bun.js.map +1 -0
  229. package/dist/platform/credentials.d.ts +32 -0
  230. package/dist/platform/credentials.d.ts.map +1 -0
  231. package/dist/platform/credentials.js +834 -0
  232. package/dist/platform/credentials.js.map +1 -0
  233. package/dist/platform/host-support.d.ts +2 -0
  234. package/dist/platform/host-support.d.ts.map +1 -0
  235. package/dist/platform/host-support.js +4 -0
  236. package/dist/platform/host-support.js.map +1 -0
  237. package/dist/platform/node.d.ts +7 -0
  238. package/dist/platform/node.d.ts.map +1 -0
  239. package/dist/platform/node.js +15 -0
  240. package/dist/platform/node.js.map +1 -0
  241. package/dist/platform/release-runtime.d.ts +11 -0
  242. package/dist/platform/release-runtime.d.ts.map +1 -0
  243. package/dist/platform/release-runtime.js +34 -0
  244. package/dist/platform/release-runtime.js.map +1 -0
  245. package/dist/platform/services.d.ts +15 -0
  246. package/dist/platform/services.d.ts.map +1 -0
  247. package/dist/platform/services.js +30 -0
  248. package/dist/platform/services.js.map +1 -0
  249. package/dist/platform/source-observer.d.ts +5 -0
  250. package/dist/platform/source-observer.d.ts.map +1 -0
  251. package/dist/platform/source-observer.js +159 -0
  252. package/dist/platform/source-observer.js.map +1 -0
  253. package/dist/provider-sdk.d.ts +14 -0
  254. package/dist/provider-sdk.d.ts.map +1 -0
  255. package/dist/provider-sdk.js +10 -0
  256. package/dist/provider-sdk.js.map +1 -0
  257. package/dist/publication/adapter.d.ts +212 -0
  258. package/dist/publication/adapter.d.ts.map +1 -0
  259. package/dist/publication/adapter.js +83 -0
  260. package/dist/publication/adapter.js.map +1 -0
  261. package/dist/publication/authority.d.ts +137 -0
  262. package/dist/publication/authority.d.ts.map +1 -0
  263. package/dist/publication/authority.js +233 -0
  264. package/dist/publication/authority.js.map +1 -0
  265. package/dist/publication/catalog-git.d.ts +37 -0
  266. package/dist/publication/catalog-git.d.ts.map +1 -0
  267. package/dist/publication/catalog-git.js +451 -0
  268. package/dist/publication/catalog-git.js.map +1 -0
  269. package/dist/publication/claim.d.ts +39 -0
  270. package/dist/publication/claim.d.ts.map +1 -0
  271. package/dist/publication/claim.js +31 -0
  272. package/dist/publication/claim.js.map +1 -0
  273. package/dist/publication/coordinator.d.ts +246 -0
  274. package/dist/publication/coordinator.d.ts.map +1 -0
  275. package/dist/publication/coordinator.js +370 -0
  276. package/dist/publication/coordinator.js.map +1 -0
  277. package/dist/publication/github.d.ts +36 -0
  278. package/dist/publication/github.d.ts.map +1 -0
  279. package/dist/publication/github.js +695 -0
  280. package/dist/publication/github.js.map +1 -0
  281. package/dist/publication/http.d.ts +69 -0
  282. package/dist/publication/http.d.ts.map +1 -0
  283. package/dist/publication/http.js +29 -0
  284. package/dist/publication/http.js.map +1 -0
  285. package/dist/publication/index.d.ts +5 -0
  286. package/dist/publication/index.d.ts.map +1 -0
  287. package/dist/publication/index.js +5 -0
  288. package/dist/publication/index.js.map +1 -0
  289. package/dist/publication/npm.d.ts +40 -0
  290. package/dist/publication/npm.d.ts.map +1 -0
  291. package/dist/publication/npm.js +359 -0
  292. package/dist/publication/npm.js.map +1 -0
  293. package/dist/publication/profiles.d.ts +136 -0
  294. package/dist/publication/profiles.d.ts.map +1 -0
  295. package/dist/publication/profiles.js +90 -0
  296. package/dist/publication/profiles.js.map +1 -0
  297. package/dist/publication/publisher.d.ts +82 -0
  298. package/dist/publication/publisher.d.ts.map +1 -0
  299. package/dist/publication/publisher.js +53 -0
  300. package/dist/publication/publisher.js.map +1 -0
  301. package/dist/publication/pypi.d.ts +45 -0
  302. package/dist/publication/pypi.d.ts.map +1 -0
  303. package/dist/publication/pypi.js +369 -0
  304. package/dist/publication/pypi.js.map +1 -0
  305. package/dist/publication/recovery.d.ts +663 -0
  306. package/dist/publication/recovery.d.ts.map +1 -0
  307. package/dist/publication/recovery.js +252 -0
  308. package/dist/publication/recovery.js.map +1 -0
  309. package/dist/publication/report.d.ts +1061 -0
  310. package/dist/publication/report.d.ts.map +1 -0
  311. package/dist/publication/report.js +441 -0
  312. package/dist/publication/report.js.map +1 -0
  313. package/dist/recipes/config.d.ts +296 -0
  314. package/dist/recipes/config.d.ts.map +1 -0
  315. package/dist/recipes/config.js +325 -0
  316. package/dist/recipes/config.js.map +1 -0
  317. package/dist/release/capabilities.d.ts +12 -0
  318. package/dist/release/capabilities.d.ts.map +1 -0
  319. package/dist/release/capabilities.js +395 -0
  320. package/dist/release/capabilities.js.map +1 -0
  321. package/dist/release/compiler.d.ts +5 -0
  322. package/dist/release/compiler.d.ts.map +1 -0
  323. package/dist/release/compiler.js +19 -0
  324. package/dist/release/compiler.js.map +1 -0
  325. package/dist/release/config.d.ts +5 -0
  326. package/dist/release/config.d.ts.map +1 -0
  327. package/dist/release/config.js +10 -0
  328. package/dist/release/config.js.map +1 -0
  329. package/dist/release/context.d.ts +96 -0
  330. package/dist/release/context.d.ts.map +1 -0
  331. package/dist/release/context.js +168 -0
  332. package/dist/release/context.js.map +1 -0
  333. package/dist/release/graph.d.ts +271 -0
  334. package/dist/release/graph.d.ts.map +1 -0
  335. package/dist/release/graph.js +766 -0
  336. package/dist/release/graph.js.map +1 -0
  337. package/dist/release/inspect.d.ts +88 -0
  338. package/dist/release/inspect.d.ts.map +1 -0
  339. package/dist/release/inspect.js +75 -0
  340. package/dist/release/inspect.js.map +1 -0
  341. package/dist/release/prepare.d.ts +24 -0
  342. package/dist/release/prepare.d.ts.map +1 -0
  343. package/dist/release/prepare.js +1115 -0
  344. package/dist/release/prepare.js.map +1 -0
  345. package/dist/release/prepared-ref.d.ts +60 -0
  346. package/dist/release/prepared-ref.d.ts.map +1 -0
  347. package/dist/release/prepared-ref.js +131 -0
  348. package/dist/release/prepared-ref.js.map +1 -0
  349. package/dist/release/prepared-store.d.ts +90 -0
  350. package/dist/release/prepared-store.d.ts.map +1 -0
  351. package/dist/release/prepared-store.js +339 -0
  352. package/dist/release/prepared-store.js.map +1 -0
  353. package/dist/release/prepared.d.ts +172 -0
  354. package/dist/release/prepared.d.ts.map +1 -0
  355. package/dist/release/prepared.js +268 -0
  356. package/dist/release/prepared.js.map +1 -0
  357. package/dist/release/staging.d.ts +31 -0
  358. package/dist/release/staging.d.ts.map +1 -0
  359. package/dist/release/staging.js +218 -0
  360. package/dist/release/staging.js.map +1 -0
  361. package/dist/resolve/authored.d.ts +53 -0
  362. package/dist/resolve/authored.d.ts.map +1 -0
  363. package/dist/resolve/authored.js +55 -0
  364. package/dist/resolve/authored.js.map +1 -0
  365. package/dist/resolve/encode.d.ts +3 -0
  366. package/dist/resolve/encode.d.ts.map +1 -0
  367. package/dist/resolve/encode.js +21 -0
  368. package/dist/resolve/encode.js.map +1 -0
  369. package/dist/resolve/errors.d.ts +7 -0
  370. package/dist/resolve/errors.d.ts.map +1 -0
  371. package/dist/resolve/errors.js +17 -0
  372. package/dist/resolve/errors.js.map +1 -0
  373. package/dist/resolve/facts.d.ts +12 -0
  374. package/dist/resolve/facts.d.ts.map +1 -0
  375. package/dist/resolve/facts.js +18 -0
  376. package/dist/resolve/facts.js.map +1 -0
  377. package/dist/resolve/resolve.d.ts +10 -0
  378. package/dist/resolve/resolve.d.ts.map +1 -0
  379. package/dist/resolve/resolve.js +242 -0
  380. package/dist/resolve/resolve.js.map +1 -0
  381. package/dist/store.d.ts +11 -0
  382. package/dist/store.d.ts.map +1 -0
  383. package/dist/store.js +9 -0
  384. package/dist/store.js.map +1 -0
  385. package/examples/README.md +20 -30
  386. package/examples/github-release/release.config.json +11 -18
  387. package/examples/homebrew-tap/README.md +11 -0
  388. package/examples/homebrew-tap/release.config.json +40 -28
  389. package/examples/multi-target/release.config.json +28 -53
  390. package/examples/npm-first-publish/release.config.json +23 -25
  391. package/examples/npm-only/release.config.json +22 -30
  392. package/examples/portable-cli/README.md +17 -0
  393. package/examples/portable-cli/artifacts/portable-example-0.1.0-darwin-arm64 +1 -0
  394. package/examples/portable-cli/artifacts/portable-example-0.1.0-darwin-x64 +1 -0
  395. package/examples/portable-cli/artifacts/portable-example-0.1.0-linux-arm64 +1 -0
  396. package/examples/portable-cli/artifacts/portable-example-0.1.0-linux-x64 +1 -0
  397. package/examples/portable-cli/artifacts/portable-example-0.1.0-windows-x64.exe +1 -0
  398. package/examples/portable-cli/artifacts/portable_example-0.1.0-py3-none-macosx_10_15_x86_64.whl +1 -0
  399. package/examples/portable-cli/artifacts/portable_example-0.1.0-py3-none-macosx_11_0_arm64.whl +1 -0
  400. package/examples/portable-cli/artifacts/portable_example-0.1.0-py3-none-manylinux2014_aarch64.whl +1 -0
  401. package/examples/portable-cli/artifacts/portable_example-0.1.0-py3-none-manylinux2014_x86_64.whl +1 -0
  402. package/examples/portable-cli/artifacts/portable_example-0.1.0-py3-none-win_amd64.whl +1 -0
  403. package/examples/portable-cli/package.json +9 -0
  404. package/examples/portable-cli/release.config.json +53 -0
  405. package/examples/portable-cli/src/cli.ts +3 -0
  406. package/examples/pypi-registry/README.md +8 -0
  407. package/examples/scoop-bucket/README.md +10 -0
  408. package/examples/scoop-bucket/release.config.json +40 -30
  409. package/package.json +73 -154
  410. package/src/api/api.ts +365 -0
  411. package/src/api/errors.ts +36 -0
  412. package/src/api/input.ts +92 -0
  413. package/src/api/runtime.ts +14 -0
  414. package/src/api/types.ts +103 -0
  415. package/src/capabilities/bun-targets.ts +2 -0
  416. package/src/capabilities/field-ownership.ts +60 -0
  417. package/src/capabilities/module.ts +158 -0
  418. package/src/capabilities/registry.ts +333 -0
  419. package/src/config/config.ts +48 -0
  420. package/src/correction/coordinator.ts +336 -0
  421. package/src/correction/index.ts +2 -0
  422. package/src/correction/intent.ts +172 -0
  423. package/src/drivers/archive.ts +111 -0
  424. package/src/drivers/contain.ts +20 -0
  425. package/src/drivers/environment.ts +28 -0
  426. package/src/drivers/errors.ts +6 -0
  427. package/src/drivers/glob.ts +137 -0
  428. package/src/drivers/process.ts +339 -0
  429. package/src/drivers/python-wheel.ts +145 -0
  430. package/src/drivers/redact.ts +31 -0
  431. package/src/drivers/seccomp-helper-source.ts +121 -0
  432. package/src/drivers/utils.ts +10 -0
  433. package/src/drivers/workspace.ts +46 -0
  434. package/src/extensions/provider-adapter.ts +99 -0
  435. package/src/host.ts +140 -0
  436. package/src/index.ts +64 -0
  437. package/src/model/artifact-collection.ts +237 -0
  438. package/src/model/authority.ts +116 -0
  439. package/src/model/bun-targets.ts +34 -0
  440. package/src/model/canonical.ts +205 -0
  441. package/src/model/catalog.ts +220 -0
  442. package/src/model/digest.ts +172 -0
  443. package/src/model/errors.ts +6 -0
  444. package/src/model/primitives.ts +37 -0
  445. package/src/model/pypi.ts +30 -0
  446. package/src/model/python-distribution.ts +360 -0
  447. package/src/model/secret-patterns.ts +11 -0
  448. package/src/operation-journal/authority.ts +162 -0
  449. package/src/operation-journal/aws/deadline.ts +41 -0
  450. package/src/operation-journal/aws/oidc.ts +439 -0
  451. package/src/operation-journal/aws/policy.ts +491 -0
  452. package/src/operation-journal/aws/s3-boundary.ts +562 -0
  453. package/src/operation-journal/aws.ts +60 -0
  454. package/src/operation-journal/canonical.ts +373 -0
  455. package/src/operation-journal/model.ts +301 -0
  456. package/src/operation-journal/reducer.ts +112 -0
  457. package/src/operation-journal/s3.ts +884 -0
  458. package/src/operation-journal.ts +51 -0
  459. package/src/platform/bun.ts +38 -0
  460. package/src/platform/credentials.ts +1151 -0
  461. package/src/platform/host-support.ts +4 -0
  462. package/src/platform/node.ts +38 -0
  463. package/src/platform/release-runtime.ts +47 -0
  464. package/src/platform/services.ts +57 -0
  465. package/src/platform/source-observer.ts +193 -0
  466. package/src/provider-sdk.ts +48 -0
  467. package/src/publication/adapter.ts +132 -0
  468. package/src/publication/authority.ts +397 -0
  469. package/src/publication/catalog-git.ts +603 -0
  470. package/src/publication/claim.ts +51 -0
  471. package/src/publication/coordinator.ts +578 -0
  472. package/src/publication/github.ts +1022 -0
  473. package/src/publication/http.ts +101 -0
  474. package/src/publication/index.ts +4 -0
  475. package/src/publication/npm.ts +525 -0
  476. package/src/publication/profiles.ts +94 -0
  477. package/src/publication/publisher.ts +130 -0
  478. package/src/publication/pypi.ts +463 -0
  479. package/src/publication/recovery.ts +349 -0
  480. package/src/publication/report.ts +628 -0
  481. package/src/recipes/config.ts +395 -0
  482. package/src/release/capabilities.ts +460 -0
  483. package/src/release/compiler.ts +28 -0
  484. package/src/release/config.ts +12 -0
  485. package/src/release/context.ts +223 -0
  486. package/src/release/graph.ts +866 -0
  487. package/src/release/inspect.ts +83 -0
  488. package/src/release/prepare.ts +1329 -0
  489. package/src/release/prepared-ref.ts +193 -0
  490. package/src/release/prepared-store.ts +378 -0
  491. package/src/release/prepared.ts +299 -0
  492. package/src/release/staging.ts +257 -0
  493. package/src/resolve/authored.ts +64 -0
  494. package/src/resolve/encode.ts +22 -0
  495. package/src/resolve/errors.ts +15 -0
  496. package/src/resolve/facts.ts +18 -0
  497. package/src/resolve/resolve.ts +328 -0
  498. package/src/store.ts +28 -0
  499. package/templates/README.md +55 -72
  500. package/templates/bun-cli-github/README.md +7 -9
  501. package/templates/bun-cli-github/release.config.json +35 -73
  502. package/templates/github-actions/release.yml +74 -0
  503. package/templates/github-actions/reviewed-release.yml +115 -0
  504. package/templates/multi-target-homebrew/README.md +10 -0
  505. package/templates/multi-target-homebrew/release.config.json +43 -60
  506. package/templates/multi-target-scoop/README.md +10 -0
  507. package/templates/multi-target-scoop/release.config.json +43 -62
  508. package/templates/npm-github/release.config.json +25 -38
  509. package/templates/npm-github/reviewed-release.config.json +37 -0
  510. package/templates/npm-only/README.md +10 -0
  511. package/templates/npm-only/release.config.json +15 -30
  512. package/templates/portable-cli/README.md +13 -0
  513. package/templates/portable-cli/release.config.json +53 -0
  514. package/dist/artifacts/adapter.d.ts +0 -39
  515. package/dist/artifacts/adapter.d.ts.map +0 -1
  516. package/dist/artifacts/adapter.js +0 -23
  517. package/dist/artifacts/adapter.js.map +0 -1
  518. package/dist/artifacts/registry.d.ts +0 -21
  519. package/dist/artifacts/registry.d.ts.map +0 -1
  520. package/dist/artifacts/registry.js +0 -21
  521. package/dist/artifacts/registry.js.map +0 -1
  522. package/dist/config/errors.d.ts +0 -24
  523. package/dist/config/errors.d.ts.map +0 -1
  524. package/dist/config/errors.js +0 -19
  525. package/dist/config/errors.js.map +0 -1
  526. package/dist/config/load.d.ts +0 -9
  527. package/dist/config/load.d.ts.map +0 -1
  528. package/dist/config/load.js +0 -29
  529. package/dist/config/load.js.map +0 -1
  530. package/dist/config/schema.d.ts +0 -12
  531. package/dist/config/schema.d.ts.map +0 -1
  532. package/dist/config/schema.js +0 -19
  533. package/dist/config/schema.js.map +0 -1
  534. package/dist/domain/artifact.d.ts +0 -118
  535. package/dist/domain/artifact.d.ts.map +0 -1
  536. package/dist/domain/artifact.js +0 -197
  537. package/dist/domain/artifact.js.map +0 -1
  538. package/dist/domain/evidence.d.ts +0 -59
  539. package/dist/domain/evidence.d.ts.map +0 -1
  540. package/dist/domain/evidence.js +0 -51
  541. package/dist/domain/evidence.js.map +0 -1
  542. package/dist/domain/operation.d.ts +0 -143
  543. package/dist/domain/operation.d.ts.map +0 -1
  544. package/dist/domain/operation.js +0 -198
  545. package/dist/domain/operation.js.map +0 -1
  546. package/dist/domain/release.d.ts +0 -93
  547. package/dist/domain/release.d.ts.map +0 -1
  548. package/dist/domain/release.js +0 -82
  549. package/dist/domain/release.js.map +0 -1
  550. package/dist/domain/remote-state.d.ts +0 -58
  551. package/dist/domain/remote-state.d.ts.map +0 -1
  552. package/dist/domain/remote-state.js +0 -55
  553. package/dist/domain/remote-state.js.map +0 -1
  554. package/dist/domain/target.d.ts +0 -148
  555. package/dist/domain/target.d.ts.map +0 -1
  556. package/dist/domain/target.js +0 -151
  557. package/dist/domain/target.js.map +0 -1
  558. package/dist/host/host.d.ts +0 -32
  559. package/dist/host/host.d.ts.map +0 -1
  560. package/dist/host/host.js +0 -24
  561. package/dist/host/host.js.map +0 -1
  562. package/dist/host/http-live.d.ts +0 -6
  563. package/dist/host/http-live.d.ts.map +0 -1
  564. package/dist/host/http-live.js +0 -86
  565. package/dist/host/http-live.js.map +0 -1
  566. package/dist/host/http.d.ts +0 -43
  567. package/dist/host/http.d.ts.map +0 -1
  568. package/dist/host/http.js +0 -59
  569. package/dist/host/http.js.map +0 -1
  570. package/dist/host/platform.d.ts +0 -10
  571. package/dist/host/platform.d.ts.map +0 -1
  572. package/dist/host/platform.js +0 -114
  573. package/dist/host/platform.js.map +0 -1
  574. package/dist/host/test.d.ts +0 -23
  575. package/dist/host/test.d.ts.map +0 -1
  576. package/dist/host/test.js +0 -222
  577. package/dist/host/test.js.map +0 -1
  578. package/dist/internal/workspace-path.d.ts +0 -15
  579. package/dist/internal/workspace-path.d.ts.map +0 -1
  580. package/dist/internal/workspace-path.js +0 -36
  581. package/dist/internal/workspace-path.js.map +0 -1
  582. package/dist/planner/artifact-inventory.d.ts +0 -9
  583. package/dist/planner/artifact-inventory.d.ts.map +0 -1
  584. package/dist/planner/artifact-inventory.js +0 -86
  585. package/dist/planner/artifact-inventory.js.map +0 -1
  586. package/dist/planner/create-release-plan.d.ts +0 -5
  587. package/dist/planner/create-release-plan.d.ts.map +0 -1
  588. package/dist/planner/create-release-plan.js +0 -25
  589. package/dist/planner/create-release-plan.js.map +0 -1
  590. package/dist/planner/errors.d.ts +0 -67
  591. package/dist/planner/errors.d.ts.map +0 -1
  592. package/dist/planner/errors.js +0 -58
  593. package/dist/planner/errors.js.map +0 -1
  594. package/dist/planner/evidence-recorder.d.ts +0 -28
  595. package/dist/planner/evidence-recorder.d.ts.map +0 -1
  596. package/dist/planner/evidence-recorder.js +0 -362
  597. package/dist/planner/evidence-recorder.js.map +0 -1
  598. package/dist/planner/executor.d.ts +0 -58
  599. package/dist/planner/executor.d.ts.map +0 -1
  600. package/dist/planner/executor.js +0 -147
  601. package/dist/planner/executor.js.map +0 -1
  602. package/dist/planner/normalize-release.d.ts +0 -19
  603. package/dist/planner/normalize-release.d.ts.map +0 -1
  604. package/dist/planner/normalize-release.js +0 -342
  605. package/dist/planner/normalize-release.js.map +0 -1
  606. package/dist/planner/reconcile.d.ts +0 -17
  607. package/dist/planner/reconcile.d.ts.map +0 -1
  608. package/dist/planner/reconcile.js +0 -259
  609. package/dist/planner/reconcile.js.map +0 -1
  610. package/dist/planner/render-plan.d.ts +0 -15
  611. package/dist/planner/render-plan.d.ts.map +0 -1
  612. package/dist/planner/render-plan.js +0 -231
  613. package/dist/planner/render-plan.js.map +0 -1
  614. package/dist/targets/adapter-helpers.d.ts +0 -79
  615. package/dist/targets/adapter-helpers.d.ts.map +0 -1
  616. package/dist/targets/adapter-helpers.js +0 -194
  617. package/dist/targets/adapter-helpers.js.map +0 -1
  618. package/dist/targets/adapter.d.ts +0 -17
  619. package/dist/targets/adapter.d.ts.map +0 -1
  620. package/dist/targets/adapter.js +0 -2
  621. package/dist/targets/adapter.js.map +0 -1
  622. package/dist/targets/github-release.d.ts +0 -25
  623. package/dist/targets/github-release.d.ts.map +0 -1
  624. package/dist/targets/github-release.js +0 -82
  625. package/dist/targets/github-release.js.map +0 -1
  626. package/dist/targets/github.d.ts +0 -11
  627. package/dist/targets/github.d.ts.map +0 -1
  628. package/dist/targets/github.js +0 -117
  629. package/dist/targets/github.js.map +0 -1
  630. package/dist/targets/homebrew.d.ts +0 -11
  631. package/dist/targets/homebrew.d.ts.map +0 -1
  632. package/dist/targets/homebrew.js +0 -210
  633. package/dist/targets/homebrew.js.map +0 -1
  634. package/dist/targets/live.d.ts +0 -5
  635. package/dist/targets/live.d.ts.map +0 -1
  636. package/dist/targets/live.js +0 -50
  637. package/dist/targets/live.js.map +0 -1
  638. package/dist/targets/npm.d.ts +0 -10
  639. package/dist/targets/npm.d.ts.map +0 -1
  640. package/dist/targets/npm.js +0 -112
  641. package/dist/targets/npm.js.map +0 -1
  642. package/dist/targets/pypi.d.ts +0 -11
  643. package/dist/targets/pypi.d.ts.map +0 -1
  644. package/dist/targets/pypi.js +0 -141
  645. package/dist/targets/pypi.js.map +0 -1
  646. package/dist/targets/registry.d.ts +0 -25
  647. package/dist/targets/registry.d.ts.map +0 -1
  648. package/dist/targets/registry.js +0 -34
  649. package/dist/targets/registry.js.map +0 -1
  650. package/dist/targets/scoop.d.ts +0 -11
  651. package/dist/targets/scoop.d.ts.map +0 -1
  652. package/dist/targets/scoop.js +0 -88
  653. package/dist/targets/scoop.js.map +0 -1
  654. package/dist/types/effect-internal.d.ts +0 -5
  655. package/dist/types/effect-internal.d.ts.map +0 -1
  656. package/dist/types/effect-internal.js +0 -2
  657. package/dist/types/effect-internal.js.map +0 -1
  658. package/dist/workflows/config.d.ts +0 -202
  659. package/dist/workflows/config.d.ts.map +0 -1
  660. package/dist/workflows/config.js +0 -420
  661. package/dist/workflows/config.js.map +0 -1
  662. package/dist/workflows/diagnostics.d.ts +0 -62
  663. package/dist/workflows/diagnostics.d.ts.map +0 -1
  664. package/dist/workflows/diagnostics.js +0 -530
  665. package/dist/workflows/diagnostics.js.map +0 -1
  666. package/dist/workflows/distribution.d.ts +0 -25
  667. package/dist/workflows/distribution.d.ts.map +0 -1
  668. package/dist/workflows/distribution.js +0 -24
  669. package/dist/workflows/distribution.js.map +0 -1
  670. package/dist/workflows/evidence.d.ts +0 -17
  671. package/dist/workflows/evidence.d.ts.map +0 -1
  672. package/dist/workflows/evidence.js +0 -32
  673. package/dist/workflows/evidence.js.map +0 -1
  674. package/dist/workflows/index.d.ts +0 -8
  675. package/dist/workflows/index.d.ts.map +0 -1
  676. package/dist/workflows/index.js +0 -7
  677. package/dist/workflows/index.js.map +0 -1
  678. package/dist/workflows/init.d.ts +0 -84
  679. package/dist/workflows/init.d.ts.map +0 -1
  680. package/dist/workflows/init.js +0 -487
  681. package/dist/workflows/init.js.map +0 -1
  682. package/dist/workflows/live.d.ts +0 -9
  683. package/dist/workflows/live.d.ts.map +0 -1
  684. package/dist/workflows/live.js +0 -7
  685. package/dist/workflows/live.js.map +0 -1
  686. package/dist/workflows/options.d.ts +0 -30
  687. package/dist/workflows/options.d.ts.map +0 -1
  688. package/dist/workflows/options.js +0 -16
  689. package/dist/workflows/options.js.map +0 -1
  690. package/examples/non-strict-skips/artifacts/release-example-skips-0.1.0.tgz +0 -1
  691. package/examples/non-strict-skips/release.config.json +0 -31
  692. package/examples/pypi-registry/release.config.json +0 -31
  693. package/templates/github-actions/plan-and-approved-execute.yml +0 -58
  694. package/templates/github-actions/plan-only.yml +0 -33
  695. package/templates/github-actions/trusted-publishing.yml +0 -61
@@ -0,0 +1,121 @@
1
+ /**
2
+ * Embedded so source, built JS, npm consumers, and standalone CLI bundles all
3
+ * execute the same audited helper bytes through the pinned Bun runtime.
4
+ */
5
+ export const makeNetworkIsolationHelperSource = (requiredLibrary = "libseccomp.so.2"): string => String.raw`import { dlopen, ptr } from "bun:ffi"
6
+ import { createHash } from "node:crypto"
7
+ import { readFileSync, readdirSync, realpathSync, writeFileSync } from "node:fs"
8
+ import { arch, release } from "node:os"
9
+
10
+ const fail = (reason) => {
11
+ process.stderr.write("ts-release network isolation failed closed: " + reason + "\n")
12
+ process.exit(125)
13
+ }
14
+ if (process.platform !== "linux" || !["x64", "arm64"].includes(process.arch)) {
15
+ fail("unsupported host " + process.platform + "/" + process.arch)
16
+ }
17
+ const identityPath = process.env.TS_RELEASE_NETWORK_IDENTITY_FILE
18
+ const expectedHelperDigest = process.env.TS_RELEASE_NETWORK_HELPER_SHA256
19
+ const libraryName = process.env.TS_RELEASE_NETWORK_LIBRARY
20
+ if (!identityPath || !expectedHelperDigest || libraryName !== ${JSON.stringify(requiredLibrary)}) {
21
+ fail("missing or invalid internal isolation parameters")
22
+ }
23
+ const helperDigest = createHash("sha256").update(readFileSync(process.argv[1])).digest("hex")
24
+ if (helperDigest !== expectedHelperDigest) fail("helper digest disagrees with parent")
25
+ const argv = process.argv.slice(2)
26
+ if (argv.length === 0) fail("missing command")
27
+ const deniedSyscalls = [
28
+ "socket", "socketpair", "connect", "bind", "listen", "accept", "accept4",
29
+ "sendto", "sendmsg", "sendmmsg", "recvfrom", "recvmsg", "recvmmsg",
30
+ "io_uring_setup", "io_uring_enter", "io_uring_register", "pidfd_getfd"
31
+ ]
32
+ let library
33
+ try {
34
+ library = dlopen(libraryName, {
35
+ seccomp_init: { args: ["u32"], returns: "ptr" },
36
+ seccomp_rule_add: { args: ["ptr", "u32", "i32", "u32"], returns: "i32" },
37
+ seccomp_load: { args: ["ptr"], returns: "i32" },
38
+ seccomp_release: { args: ["ptr"], returns: "void" },
39
+ seccomp_syscall_resolve_name: { args: ["ptr"], returns: "i32" }
40
+ })
41
+ } catch (cause) {
42
+ fail("libseccomp.so.2 unavailable: " + String(cause))
43
+ }
44
+ let libraryPath
45
+ try {
46
+ const mapping = readFileSync("/proc/self/maps", "utf8").split("\n").find((line) => line.includes("libseccomp.so"))
47
+ const candidate = mapping && mapping.trim().split(/\s+/).at(-1)
48
+ if (!candidate || !candidate.startsWith("/")) fail("loaded libseccomp mapping is unavailable")
49
+ libraryPath = realpathSync(candidate)
50
+ } catch (cause) {
51
+ fail("cannot identify loaded libseccomp: " + String(cause))
52
+ }
53
+ const libraryDigest = createHash("sha256").update(readFileSync(libraryPath)).digest("hex")
54
+ const bunDigest = createHash("sha256").update(readFileSync(realpathSync(process.execPath))).digest("hex")
55
+ const context = library.symbols.seccomp_init(0x7fff0000)
56
+ if (context === null) fail("seccomp_init returned null")
57
+ try {
58
+ for (const name of deniedSyscalls) {
59
+ const bytes = new TextEncoder().encode(name + "\0")
60
+ const syscall = library.symbols.seccomp_syscall_resolve_name(ptr(bytes))
61
+ if (syscall < 0) fail("kernel/libseccomp cannot resolve " + name)
62
+ const result = library.symbols.seccomp_rule_add(context, 0x00050001, syscall, 0)
63
+ if (result !== 0) fail("seccomp_rule_add(" + name + ") returned " + result)
64
+ }
65
+ const loaded = library.symbols.seccomp_load(context)
66
+ if (loaded !== 0) fail("seccomp_load returned " + loaded)
67
+ } finally {
68
+ library.symbols.seccomp_release(context)
69
+ }
70
+ library.close()
71
+ const identity = {
72
+ protocol: "ts-release-seccomp-network-deny/v1",
73
+ helperSha256: helperDigest,
74
+ librarySha256: libraryDigest,
75
+ bunVersion: globalThis["Bun"].version,
76
+ bunSha256: bunDigest,
77
+ kernel: release(),
78
+ architecture: arch(),
79
+ deniedSyscalls
80
+ }
81
+ try {
82
+ writeFileSync(identityPath, JSON.stringify(identity), { encoding: "utf8", flag: "wx", mode: 0o600 })
83
+ } catch (cause) {
84
+ fail("cannot persist isolation identity: " + String(cause))
85
+ }
86
+ const childEnvironment = { ...process.env }
87
+ delete childEnvironment.TS_RELEASE_NETWORK_IDENTITY_FILE
88
+ delete childEnvironment.TS_RELEASE_NETWORK_HELPER_SHA256
89
+ delete childEnvironment.TS_RELEASE_NETWORK_LIBRARY
90
+ // The runtime spawn API preserves caller-provided non-stdio descriptors. Close only the
91
+ // descriptors explicitly inherited without FD_CLOEXEC; Bun's own internal
92
+ // descriptors remain untouched and are closed by exec.
93
+ let libc
94
+ try {
95
+ libc = dlopen("libc.so.6", {
96
+ fcntl: { args: ["i32", "i32"], returns: "i32" },
97
+ close: { args: ["i32"], returns: "i32" }
98
+ })
99
+ for (const item of readdirSync("/proc/self/fd")) {
100
+ const fd = Number(item)
101
+ if (!Number.isSafeInteger(fd) || fd <= 2) continue
102
+ const flags = libc.symbols.fcntl(fd, 1)
103
+ if (flags >= 0 && (flags & 1) === 0) libc.symbols.close(fd)
104
+ }
105
+ libc.close()
106
+ } catch (cause) {
107
+ fail("cannot close inherited non-stdio descriptors: " + String(cause))
108
+ }
109
+ let child
110
+ try {
111
+ child = globalThis["Bun"].spawn(argv, {
112
+ env: childEnvironment,
113
+ stdio: ["ignore", "inherit", "inherit"]
114
+ })
115
+ } catch (cause) {
116
+ fail("isolated child spawn failed: " + String(cause))
117
+ }
118
+ process.exit(await child.exited)
119
+ `
120
+
121
+ export const networkIsolationHelperSource = makeNetworkIsolationHelperSource()
@@ -0,0 +1,10 @@
1
+ import { createHash } from "node:crypto"
2
+ import { DriverError } from "./errors.js"
3
+
4
+ export const failure = (
5
+ reason: string,
6
+ commitment: "before-commit" | "unknown" = "before-commit"
7
+ ) => DriverError.make({ reason, commitment })
8
+
9
+ export const sha256 = (bytes: Uint8Array): string =>
10
+ createHash("sha256").update(bytes).digest("hex")
@@ -0,0 +1,46 @@
1
+ import {
2
+ chmodSync, closeSync, constants, existsSync, fstatSync, fsyncSync, lstatSync,
3
+ mkdirSync, mkdtempSync, openSync, readFileSync, realpathSync, writeFileSync
4
+ } from "node:fs"
5
+ import { tmpdir } from "node:os"
6
+ import { join } from "node:path"
7
+ import { contained } from "./contain.js"
8
+ import { DriverError } from "./errors.js"
9
+
10
+ const fail = (reason: string): DriverError => DriverError.make({ reason, commitment: "before-commit" })
11
+
12
+ /** Create private scratch beneath the host temp root and return its canonical path.
13
+ * macOS commonly exposes that root through /var while realpath resolves /private/var. */
14
+ export const makeCanonicalTemporaryDirectory = (prefix: string): string =>
15
+ realpathSync(mkdtempSync(join(realpathSync(tmpdir()), prefix)))
16
+
17
+ export const secureRead = (root: string, path: string): { readonly bytes: Uint8Array, readonly inode: number } => {
18
+ let current = root
19
+ for (const part of path.split(/[\\/]+/u)) {
20
+ current = join(current, part)
21
+ if (lstatSync(current).isSymbolicLink()) throw fail("Structured read encountered a symlink.")
22
+ }
23
+ const descriptor = openSync(current, constants.O_RDONLY | constants.O_NOFOLLOW)
24
+ try {
25
+ const opened = fstatSync(descriptor)
26
+ const resolved = realpathSync(current)
27
+ if (!contained(root, resolved)) throw fail("Opened file escaped the workspace root.")
28
+ const landed = lstatSync(resolved)
29
+ if (landed.ino !== opened.ino || landed.dev !== opened.dev) throw fail("Opened file changed identity.")
30
+ return { bytes: new Uint8Array(readFileSync(descriptor)), inode: opened.ino }
31
+ } finally { closeSync(descriptor) }
32
+ }
33
+
34
+ export const secureWrite = (root: string, path: string, bytes: Uint8Array | string): void => {
35
+ const parts = path.split(/[\\/]+/u).filter((part) => part.length > 0)
36
+ let parent = root
37
+ for (const part of parts.slice(0, -1)) {
38
+ parent = join(parent, part)
39
+ mkdirSync(parent, { recursive: true })
40
+ if (lstatSync(parent).isSymbolicLink()) throw fail("Structured write encountered a symlink.")
41
+ }
42
+ const target = join(parent, parts.at(-1)!)
43
+ if (existsSync(target) && lstatSync(target).isSymbolicLink()) throw fail("Structured write encountered a symlink.")
44
+ const descriptor = openSync(target, constants.O_WRONLY | constants.O_CREAT | constants.O_TRUNC | constants.O_NOFOLLOW, 0o644)
45
+ try { writeFileSync(descriptor, bytes); fsyncSync(descriptor) } finally { closeSync(descriptor) }
46
+ }
@@ -0,0 +1,99 @@
1
+ import * as Schema from "effect/Schema"
2
+ import { NonEmptyName } from "../model/primitives.js"
3
+ import type { ReleaseSubject } from "../publication/coordinator.js"
4
+ import {
5
+ assertRecoveryProfileMatches,
6
+ validatePublicationProfiles,
7
+ type PublicationProfileRegistration
8
+ } from "../publication/recovery.js"
9
+ import type { PublicationSubjectServices } from "../capabilities/module.js"
10
+ import type { PreparedBundle } from "../release/prepared-store.js"
11
+
12
+ /**
13
+ * Closed acknowledgements required from every custom application adapter.
14
+ * They are intentionally precise rather than extensible strings: a boolean
15
+ * success callback or generic command publisher cannot satisfy this contract.
16
+ */
17
+ export class ProviderAdapterContract
18
+ extends Schema.Class<ProviderAdapterContract>("ProviderAdapterContract")({
19
+ schemaVersion: Schema.Literal("ts-release/provider-adapter-contract/v1"),
20
+ preparedSubject: Schema.Literal("typed-canonical-data"),
21
+ identity: Schema.Literal("canonical-subject-id"),
22
+ observation: Schema.Literal("exact-equality-and-authoritative-absence"),
23
+ mutation: Schema.Literal("typed-precondition-and-commitment"),
24
+ credentials: Schema.Literal("audience-and-purpose-scoped"),
25
+ recovery: Schema.Literal("coordinator-profile"),
26
+ certification: Schema.Literal("provider-protocol-and-public-boundary-tests")
27
+ }) {}
28
+
29
+ export interface CustomProviderAdapterInput {
30
+ readonly id: string
31
+ readonly contract: ProviderAdapterContract
32
+ readonly profile: PublicationProfileRegistration
33
+ /**
34
+ * Derive typed subjects only from a verified prepared bundle and opaque host
35
+ * sinks. Returning no subject means this installed application adapter does
36
+ * not apply to that bundle.
37
+ */
38
+ readonly subjects: (
39
+ bundle: PreparedBundle,
40
+ services: PublicationSubjectServices
41
+ ) => ReadonlyArray<ReleaseSubject>
42
+ }
43
+
44
+ export interface CustomProviderAdapter extends Omit<CustomProviderAdapterInput, "id"> {
45
+ readonly _tag: "CustomProviderAdapter"
46
+ readonly id: NonEmptyName
47
+ }
48
+
49
+ const decodeContract = Schema.decodeUnknownSync(ProviderAdapterContract, {
50
+ onExcessProperty: "error"
51
+ })
52
+
53
+ /** Validate once at custom-application composition time. */
54
+ export const makeProviderAdapter = (input: CustomProviderAdapterInput): CustomProviderAdapter => {
55
+ const contract = decodeContract(input.contract)
56
+ const id = NonEmptyName.make(input.id)
57
+ const profile = validatePublicationProfiles({ [id.toString()]: input.profile })[id.toString()]!
58
+ if (profile.id !== id.toString()) {
59
+ throw new Error("A custom provider adapter id must equal its recovery-profile registration id.")
60
+ }
61
+ return Object.freeze({
62
+ _tag: "CustomProviderAdapter" as const,
63
+ ...input,
64
+ id,
65
+ contract,
66
+ profile
67
+ })
68
+ }
69
+
70
+ /**
71
+ * Build custom subjects behind the same profile and identity checks used by
72
+ * built-ins. Coordinator construction performs the final request identity,
73
+ * audience, purpose, mutation, prerequisite, and durable-history checks.
74
+ */
75
+ export const customProviderSubjects = (
76
+ bundle: PreparedBundle,
77
+ adapters: ReadonlyArray<CustomProviderAdapter>,
78
+ services: PublicationSubjectServices,
79
+ reservedIds: ReadonlySet<string> = new Set()
80
+ ): ReadonlyArray<ReleaseSubject> => {
81
+ const result: Array<ReleaseSubject> = []
82
+ const ids = new Set(reservedIds)
83
+ for (const adapter of adapters) {
84
+ const subjects = adapter.subjects(bundle, services)
85
+ for (const subject of subjects) {
86
+ if (ids.has(subject.id.toString())) {
87
+ throw new Error(`Custom provider adapter ${adapter.id} repeats subject ${subject.id}.`)
88
+ }
89
+ assertRecoveryProfileMatches(adapter.profile.id, adapter.profile.recovery, subject.recovery)
90
+ if (subject.observationRequests.some((request) => request.provider.toString() !== adapter.profile.provider) ||
91
+ subject.mutationRequest.provider.toString() !== adapter.profile.provider) {
92
+ throw new Error(`Custom provider adapter ${adapter.id} emitted credential authority for a foreign provider.`)
93
+ }
94
+ ids.add(subject.id.toString())
95
+ result.push(subject)
96
+ }
97
+ }
98
+ return result
99
+ }
package/src/host.ts ADDED
@@ -0,0 +1,140 @@
1
+ import * as Layer from "effect/Layer"
2
+ import type { ReleaseRuntimeShape } from "./api/runtime.js"
3
+ import { ReleaseRuntime } from "./api/runtime.js"
4
+ import type { ReleaseApiLayer } from "./api/types.js"
5
+ import type { RunCommand } from "./drivers/process.js"
6
+ import { Sha256Digest, sha256Digest } from "./model/digest.js"
7
+ import { SafeRelativePath, WorkspaceRoot } from "./model/primitives.js"
8
+ import type { CredentialRequest } from "./model/authority.js"
9
+ import {
10
+ CredentialAudienceMismatch,
11
+ CredentialProvider,
12
+ CredentialPurposeMismatch,
13
+ CredentialStrategyUnsupported,
14
+ CredentialSubjectMismatch,
15
+ CredentialUnavailable,
16
+ makeCredentialProvider,
17
+ type CredentialAuthorityError,
18
+ type CredentialGrant,
19
+ type CredentialGrantAcquirer,
20
+ type CredentialGrantDescriptor,
21
+ type CredentialProviderShape,
22
+ type MutationCredentialGrant
23
+ } from "./publication/authority.js"
24
+ import {
25
+ AuthorizedMutationHttp,
26
+ HttpAuthorizer,
27
+ type AuthorizedMutationHttpShape,
28
+ type HttpAuthorizationError,
29
+ type HttpAuthorizerShape,
30
+ type HttpObservationRequest,
31
+ type HttpResponse
32
+ } from "./publication/http.js"
33
+ import {
34
+ CertifiedPublisherSpawn,
35
+ NpmUserConfigResource,
36
+ type CertifiedPublisherSpawnShape,
37
+ type NpmUserConfigResourceShape
38
+ } from "./publication/publisher.js"
39
+ import {
40
+ PublicationClaimOccupied,
41
+ PublicationClaimRequest,
42
+ PublicationClaimStore,
43
+ PublicationClaimUnavailable,
44
+ type PublicationClaimError,
45
+ type PublicationClaimStoreShape
46
+ } from "./publication/claim.js"
47
+ import {
48
+ ReleaseContextError,
49
+ SourceMaterializationError,
50
+ StagingEntry,
51
+ StagingSnapshot,
52
+ VerifiedSource,
53
+ makeSourceObserver,
54
+ type SourceObserverRuntime,
55
+ type SourceObserverShape,
56
+ type VerifiedReleaseContext
57
+ } from "./release/context.js"
58
+ import {
59
+ PreparedReleaseStore,
60
+ type PreparedReleaseStoreShape
61
+ } from "./release/prepared-store.js"
62
+
63
+ export {
64
+ CredentialAudienceMismatch,
65
+ CredentialPurposeMismatch,
66
+ CredentialStrategyUnsupported,
67
+ CredentialSubjectMismatch,
68
+ CredentialUnavailable,
69
+ PublicationClaimOccupied,
70
+ PublicationClaimRequest,
71
+ PublicationClaimUnavailable,
72
+ ReleaseContextError,
73
+ SafeRelativePath,
74
+ Sha256Digest,
75
+ SourceMaterializationError,
76
+ StagingEntry,
77
+ StagingSnapshot,
78
+ VerifiedSource,
79
+ WorkspaceRoot,
80
+ makeCredentialProvider,
81
+ makeSourceObserver,
82
+ sha256Digest
83
+ }
84
+
85
+ export type {
86
+ CredentialAuthorityError,
87
+ CredentialGrant,
88
+ CredentialGrantAcquirer,
89
+ CredentialGrantDescriptor,
90
+ CredentialProviderShape,
91
+ CredentialRequest,
92
+ HttpAuthorizationError,
93
+ HttpAuthorizerShape,
94
+ HttpObservationRequest,
95
+ HttpResponse,
96
+ AuthorizedMutationHttpShape,
97
+ CertifiedPublisherSpawnShape,
98
+ NpmUserConfigResourceShape,
99
+ PublicationClaimError,
100
+ PublicationClaimStoreShape,
101
+ MutationCredentialGrant,
102
+ ReleaseRuntimeShape,
103
+ RunCommand,
104
+ SourceObserverRuntime,
105
+ SourceObserverShape,
106
+ VerifiedReleaseContext
107
+ }
108
+
109
+ /** Structural inputs for a library-owned host integration. */
110
+ export interface CustomReleaseLayerInput {
111
+ readonly runtime: ReleaseRuntimeShape
112
+ readonly preparedStore: PreparedReleaseStoreShape
113
+ readonly credentialProvider: CredentialProviderShape
114
+ readonly httpAuthorizer: HttpAuthorizerShape
115
+ readonly authorizedMutationHttp: AuthorizedMutationHttpShape
116
+ readonly npmUserConfigResource: NpmUserConfigResourceShape
117
+ readonly certifiedPublisherSpawn: CertifiedPublisherSpawnShape
118
+ /** Required before a durable-cas-required publication can acquire mutation credentials. */
119
+ readonly publicationClaimStore?: PublicationClaimStoreShape
120
+ }
121
+
122
+ /**
123
+ * Compose the complete API service boundary without exposing Context service
124
+ * tags. Credentials remain opaque grants and HTTP authorization remains a
125
+ * host-owned elimination boundary.
126
+ */
127
+ export const makeCustomReleaseLayer = (
128
+ input: CustomReleaseLayerInput
129
+ ): ReleaseApiLayer => Layer.mergeAll(
130
+ Layer.succeed(ReleaseRuntime, input.runtime),
131
+ Layer.succeed(PreparedReleaseStore, input.preparedStore),
132
+ Layer.succeed(CredentialProvider, input.credentialProvider),
133
+ Layer.succeed(HttpAuthorizer, input.httpAuthorizer),
134
+ Layer.succeed(AuthorizedMutationHttp, input.authorizedMutationHttp),
135
+ Layer.succeed(NpmUserConfigResource, input.npmUserConfigResource),
136
+ Layer.succeed(CertifiedPublisherSpawn, input.certifiedPublisherSpawn),
137
+ ...(input.publicationClaimStore === undefined
138
+ ? []
139
+ : [Layer.succeed(PublicationClaimStore, input.publicationClaimStore)])
140
+ )
package/src/index.ts ADDED
@@ -0,0 +1,64 @@
1
+ declare global {
2
+ const SchemaErrorTypeId: unique symbol
3
+ }
4
+ // The root is the intentionally small public lifecycle surface.
5
+ export {
6
+ CorrectionReport,
7
+ correct,
8
+ inspect,
9
+ makeReleaseApi,
10
+ observe,
11
+ prepare,
12
+ publish,
13
+ release
14
+ } from "./api/api.js"
15
+ export type {
16
+ CorrectInput,
17
+ InspectInput,
18
+ InspectOutput,
19
+ ObserveInput,
20
+ PrepareInput,
21
+ PublishInput,
22
+ ReleaseApi,
23
+ ReleaseApiLayer,
24
+ ReleaseApiOptions,
25
+ ReleaseInput,
26
+ ReleaseResult
27
+ } from "./api/types.js"
28
+ export {
29
+ AuthoredCatalogForwardCorrection,
30
+ AuthoredGithubReleaseAmendment,
31
+ AuthoredNpmDeprecation,
32
+ decodeAuthoredCorrection
33
+ } from "./correction/intent.js"
34
+ export type { AuthoredCorrection } from "./correction/intent.js"
35
+ export {
36
+ PreparationModeUnsupported, ReleaseAbortedError, ReleaseIncompleteError,
37
+ ReleaseInputError, ReleasePreparationError
38
+ } from "./api/errors.js"
39
+ export {
40
+ CredentialStrategyUnsupported,
41
+ CredentialUnavailable
42
+ } from "./publication/authority.js"
43
+ export {
44
+ CredentialFailureCause,
45
+ CredentialStrategyUnsupportedCause,
46
+ CredentialUnavailableCause,
47
+ ObservationReport,
48
+ ReleaseReport
49
+ } from "./publication/report.js"
50
+ export {
51
+ CompletePreparedReleaseRef, GitHubActionsCompletePreparedReleaseRef,
52
+ LocalCompletePreparedReleaseRef, PreparedReleaseRefCodecError,
53
+ PreparedReleaseRefMalformedError, PreparedReleaseRefUnknownSchemeError,
54
+ decodeCompletePreparedReleaseRef, encodeCompletePreparedReleaseRef,
55
+ makeGitHubActionsCompletePreparedReleaseRef, makeLocalCompletePreparedReleaseRef
56
+ } from "./release/prepared-ref.js"
57
+ export type { PreparedReleaseSha256 } from "./release/prepared-ref.js"
58
+ export { ReleaseRuntime } from "./api/runtime.js"
59
+ export { unsupportedExecutionHost } from "./platform/host-support.js"
60
+ export { resolveConfig } from "./resolve/resolve.js"
61
+ export type { AuthoredConfig, AuthoredProject } from "./resolve/authored.js"
62
+ export type { ObservedFacts } from "./resolve/facts.js"
63
+ export { encodeResolvedConfig } from "./resolve/encode.js"
64
+ export const defineRelease = <const Config>(config: Config): Config => config