@treeseed/sdk 0.10.28 → 0.12.4

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 (509) hide show
  1. package/README.md +213 -7
  2. package/dist/agent-capacity.d.ts +916 -0
  3. package/dist/agent-capacity.js +1600 -0
  4. package/dist/agent-tools.d.ts +37 -0
  5. package/dist/agent-tools.js +301 -0
  6. package/dist/api/app.d.ts +1 -1
  7. package/dist/api/auth/d1-database.d.ts +2 -2
  8. package/dist/api/auth/d1-provider.d.ts +4 -4
  9. package/dist/api/auth/d1-store.d.ts +2 -2
  10. package/dist/api/auth/memory-provider.d.ts +1 -1
  11. package/dist/api/auth/tokens.d.ts +1 -1
  12. package/dist/api/config.d.ts +3 -1
  13. package/dist/api/config.js +34 -10
  14. package/dist/api/http.d.ts +2 -2
  15. package/dist/api/index.d.ts +10 -10
  16. package/dist/api/index.js +4 -2
  17. package/dist/api/operations-routes.d.ts +3 -3
  18. package/dist/api/operations.d.ts +1 -1
  19. package/dist/api/providers.d.ts +1 -1
  20. package/dist/api/providers.js +21 -4
  21. package/dist/api/railway.d.ts +3 -2
  22. package/dist/api/sdk-dispatch.d.ts +4 -4
  23. package/dist/api/sdk-routes.d.ts +2 -2
  24. package/dist/api/templates.d.ts +2 -2
  25. package/dist/api/types.d.ts +3 -2
  26. package/dist/capacity-provider.d.ts +118 -59
  27. package/dist/capacity-provider.js +235 -43
  28. package/dist/capacity.d.ts +2 -2
  29. package/dist/cli-tools.d.ts +1 -1
  30. package/dist/content-operations.d.ts +97 -0
  31. package/dist/content-operations.js +250 -0
  32. package/dist/content-store.d.ts +4 -4
  33. package/dist/control-plane-client.d.ts +13 -18
  34. package/dist/control-plane-client.js +8 -86
  35. package/dist/control-plane.d.ts +3 -2
  36. package/dist/control-plane.js +38 -13
  37. package/dist/copilot.d.ts +3 -0
  38. package/dist/copilot.js +16 -1
  39. package/dist/d1-http.d.ts +1 -1
  40. package/dist/d1-store.d.ts +32 -57
  41. package/dist/d1-store.js +115 -318
  42. package/dist/db/d1.d.ts +1 -232
  43. package/dist/db/index.d.ts +3 -3
  44. package/dist/db/market-schema.d.ts +50900 -11018
  45. package/dist/db/market-schema.js +2313 -467
  46. package/dist/db/node-sqlite.d.ts +1 -232
  47. package/dist/db/node-sqlite.js +7 -2
  48. package/dist/db/schema.d.ts +0 -462
  49. package/dist/db/schema.js +2 -22
  50. package/dist/dispatch.d.ts +1 -1
  51. package/dist/dispatch.js +0 -11
  52. package/dist/fixture-support.js +52 -4
  53. package/dist/governance.d.ts +133 -0
  54. package/dist/governance.js +285 -0
  55. package/dist/graph/build.d.ts +2 -2
  56. package/dist/graph/context-query-contracts.d.ts +1 -1
  57. package/dist/graph/dsl.d.ts +1 -1
  58. package/dist/graph/query.d.ts +4 -4
  59. package/dist/graph/ranking.d.ts +1 -1
  60. package/dist/graph/schema.d.ts +1 -1
  61. package/dist/graph.d.ts +11 -11
  62. package/dist/guarantees/index.d.ts +425 -0
  63. package/dist/guarantees/index.js +1146 -0
  64. package/dist/hosting/apps.d.ts +12 -0
  65. package/dist/hosting/apps.js +107 -0
  66. package/dist/hosting/builtins.d.ts +25 -0
  67. package/dist/hosting/builtins.js +602 -0
  68. package/dist/hosting/contracts.d.ts +208 -0
  69. package/dist/hosting/contracts.js +0 -0
  70. package/dist/hosting/graph.d.ts +195 -0
  71. package/dist/hosting/graph.js +1092 -0
  72. package/dist/hosting/index.d.ts +4 -0
  73. package/dist/hosting/index.js +4 -0
  74. package/dist/index.d.ts +88 -67
  75. package/dist/index.js +142 -14
  76. package/dist/local-dev/managed-dev.d.ts +85 -0
  77. package/dist/local-dev/managed-dev.js +368 -0
  78. package/dist/managed-dependencies.d.ts +9 -0
  79. package/dist/managed-dependencies.js +10 -9
  80. package/dist/market-client.d.ts +327 -9
  81. package/dist/market-client.js +464 -20
  82. package/dist/model-registry.d.ts +1 -1
  83. package/dist/model-registry.js +19 -19
  84. package/dist/operations/agent-tools.d.ts +2 -11
  85. package/dist/operations/agent-tools.js +2 -14
  86. package/dist/operations/providers/default.d.ts +1 -1
  87. package/dist/operations/providers/default.js +20 -37
  88. package/dist/operations/repository-operations.d.ts +26 -2
  89. package/dist/operations/repository-operations.js +159 -1
  90. package/dist/operations/runtime.d.ts +3 -3
  91. package/dist/operations/services/bootstrap-runner.d.ts +4 -2
  92. package/dist/operations/services/bootstrap-runner.js +22 -2
  93. package/dist/operations/services/build-warning-policy.d.ts +34 -0
  94. package/dist/operations/services/build-warning-policy.js +81 -82
  95. package/dist/operations/services/commit-message-provider.js +4 -4
  96. package/dist/operations/services/config-runtime.d.ts +83 -24
  97. package/dist/operations/services/config-runtime.js +449 -130
  98. package/dist/operations/services/deploy.d.ts +106 -624
  99. package/dist/operations/services/deploy.js +746 -263
  100. package/dist/operations/services/deployment-readiness.d.ts +30 -0
  101. package/dist/operations/services/deployment-readiness.js +206 -0
  102. package/dist/operations/services/git-remote-policy.js +12 -4
  103. package/dist/operations/services/git-runner.d.ts +66 -0
  104. package/dist/operations/services/git-runner.js +479 -0
  105. package/dist/operations/services/git-workflow.d.ts +45 -6
  106. package/dist/operations/services/git-workflow.js +251 -23
  107. package/dist/operations/services/github-actions-verification.d.ts +4 -1
  108. package/dist/operations/services/github-actions-verification.js +12 -3
  109. package/dist/operations/services/github-api.js +22 -6
  110. package/dist/operations/services/github-automation.d.ts +4 -4
  111. package/dist/operations/services/github-automation.js +19 -21
  112. package/dist/operations/services/github-credentials.d.ts +13 -0
  113. package/dist/operations/services/github-credentials.js +59 -0
  114. package/dist/operations/services/hosted-service-checks.d.ts +81 -0
  115. package/dist/operations/services/hosted-service-checks.js +478 -0
  116. package/dist/operations/services/hosting-audit.d.ts +2 -2
  117. package/dist/operations/services/hosting-audit.js +7 -7
  118. package/dist/operations/services/hub-launch.d.ts +1 -1
  119. package/dist/operations/services/hub-provider-launch.d.ts +5 -5
  120. package/dist/operations/services/hub-provider-launch.js +22 -17
  121. package/dist/operations/services/live-hosted-service-checks.d.ts +26 -0
  122. package/dist/operations/services/live-hosted-service-checks.js +463 -0
  123. package/dist/operations/services/local-dev.js +0 -1
  124. package/dist/operations/services/managed-host-security.d.ts +1 -1
  125. package/dist/operations/services/managed-host-security.js +1 -1
  126. package/dist/operations/services/managed-repositories.d.ts +37 -0
  127. package/dist/operations/services/managed-repositories.js +177 -0
  128. package/dist/operations/services/operations-runner-smoke.d.ts +31 -0
  129. package/dist/operations/services/operations-runner-smoke.js +198 -0
  130. package/dist/operations/services/package-adapters.d.ts +170 -0
  131. package/dist/operations/services/package-adapters.js +859 -0
  132. package/dist/operations/services/package-reference-policy.d.ts +13 -88
  133. package/dist/operations/services/package-reference-policy.js +96 -215
  134. package/dist/operations/services/project-host-operations.d.ts +4 -4
  135. package/dist/operations/services/project-platform.d.ts +57 -173
  136. package/dist/operations/services/project-platform.js +80 -111
  137. package/dist/operations/services/project-web-monitor.d.ts +2 -2
  138. package/dist/operations/services/project-web-monitor.js +122 -5
  139. package/dist/operations/services/railway-api.d.ts +117 -5
  140. package/dist/operations/services/railway-api.js +915 -93
  141. package/dist/operations/services/railway-deploy.d.ts +30 -112
  142. package/dist/operations/services/railway-deploy.js +521 -961
  143. package/dist/operations/services/release-history.js +3 -4
  144. package/dist/operations/services/release-proof-ledger.d.ts +13 -0
  145. package/dist/operations/services/release-proof-ledger.js +81 -0
  146. package/dist/operations/services/release-proof-planner.d.ts +48 -0
  147. package/dist/operations/services/release-proof-planner.js +195 -0
  148. package/dist/operations/services/release-proof-runner.d.ts +16 -0
  149. package/dist/operations/services/release-proof-runner.js +169 -0
  150. package/dist/operations/services/release-proof.d.ts +81 -0
  151. package/dist/operations/services/release-proof.js +79 -0
  152. package/dist/operations/services/repository-save-orchestrator.d.ts +8 -7
  153. package/dist/operations/services/repository-save-orchestrator.js +604 -212
  154. package/dist/operations/services/runtime-paths.d.ts +1 -3
  155. package/dist/operations/services/runtime-paths.js +0 -4
  156. package/dist/operations/services/runtime-tools.d.ts +1 -191
  157. package/dist/operations/services/runtime-tools.js +4 -443
  158. package/dist/operations/services/save-deploy-preflight.js +9 -1
  159. package/dist/operations/services/template-host-bindings.d.ts +2 -2
  160. package/dist/operations/services/template-host-bindings.js +3 -2
  161. package/dist/operations/services/template-registry.d.ts +6 -6
  162. package/dist/operations/services/template-registry.js +33 -14
  163. package/dist/operations/services/template-secret-sync.d.ts +3 -3
  164. package/dist/operations/services/verification-cache.d.ts +25 -0
  165. package/dist/operations/services/verification-cache.js +71 -0
  166. package/dist/operations/services/workflow-timing.d.ts +25 -0
  167. package/dist/operations/services/workflow-timing.js +79 -0
  168. package/dist/operations/services/workspace-dependency-mode.js +50 -5
  169. package/dist/operations/services/workspace-preflight.js +8 -8
  170. package/dist/operations/services/workspace-save-script.d.ts +4 -4
  171. package/dist/operations/services/workspace-save.d.ts +1 -0
  172. package/dist/operations/services/workspace-save.js +42 -19
  173. package/dist/operations/services/workspace-tools.js +42 -7
  174. package/dist/operations-registry.d.ts +1 -1
  175. package/dist/operations-registry.js +5 -6
  176. package/dist/operations-types.d.ts +1 -1
  177. package/dist/operations.d.ts +17 -11
  178. package/dist/operations.js +57 -3
  179. package/dist/platform/book-export.js +2 -0
  180. package/dist/platform/books-data.d.ts +1 -1
  181. package/dist/platform/config.d.ts +27 -0
  182. package/dist/platform/config.js +100 -0
  183. package/dist/platform/content-runtime-source.d.ts +54 -0
  184. package/dist/platform/content-runtime-source.js +169 -0
  185. package/dist/platform/contracts.d.ts +38 -2
  186. package/dist/platform/deploy-config.d.ts +1 -1
  187. package/dist/platform/deploy-config.js +80 -9
  188. package/dist/platform/deploy-runtime.d.ts +1 -1
  189. package/dist/platform/desired-state.d.ts +63 -0
  190. package/dist/platform/desired-state.js +1021 -0
  191. package/dist/platform/env.yaml +568 -45
  192. package/dist/platform/environment.d.ts +3 -2
  193. package/dist/platform/environment.js +122 -21
  194. package/dist/platform/local-content-materialization.d.ts +9 -0
  195. package/dist/platform/local-content-materialization.js +212 -0
  196. package/dist/platform/plugin.d.ts +13 -4
  197. package/dist/platform/plugins/runtime.d.ts +3 -3
  198. package/dist/platform/plugins/runtime.js +62 -1
  199. package/dist/platform/plugins.d.ts +6 -6
  200. package/dist/platform/published-content-pipeline.d.ts +3 -3
  201. package/dist/platform/published-content-pipeline.js +5 -1
  202. package/dist/platform/published-content.d.ts +4 -3
  203. package/dist/platform/site-config-schema.d.ts +1 -0
  204. package/dist/platform/site-config-schema.js +4 -1
  205. package/dist/platform/tenant/runtime-config.d.ts +152 -2
  206. package/dist/platform/tenant-config.d.ts +1 -1
  207. package/dist/platform/utils/site-config-schema.d.ts +154 -0
  208. package/dist/platform/utils/site-config-schema.js +400 -461
  209. package/dist/platform-operation-store.d.ts +1 -1
  210. package/dist/platform-operation-store.js +2 -2
  211. package/dist/platform-operations.js +1 -1
  212. package/dist/plugin-default.d.ts +1 -1
  213. package/dist/plugin-default.js +27 -12
  214. package/dist/project-import.d.ts +91 -0
  215. package/dist/project-import.js +257 -0
  216. package/dist/project-workflow.d.ts +1 -1
  217. package/dist/reconcile/bootstrap-systems.d.ts +2 -2
  218. package/dist/reconcile/bootstrap-systems.js +5 -5
  219. package/dist/reconcile/builtin-adapters.d.ts +7 -1
  220. package/dist/reconcile/builtin-adapters.js +3190 -429
  221. package/dist/reconcile/contracts.d.ts +23 -6
  222. package/dist/reconcile/desired-state.d.ts +2 -192
  223. package/dist/reconcile/desired-state.js +29 -38
  224. package/dist/reconcile/engine.d.ts +61 -395
  225. package/dist/reconcile/engine.js +229 -44
  226. package/dist/reconcile/index.d.ts +10 -8
  227. package/dist/reconcile/index.js +2 -0
  228. package/dist/reconcile/live-acceptance.d.ts +100 -0
  229. package/dist/reconcile/live-acceptance.js +2027 -0
  230. package/dist/reconcile/platform.d.ts +104 -0
  231. package/dist/reconcile/platform.js +100 -0
  232. package/dist/reconcile/providers/docker-private.d.ts +54 -0
  233. package/dist/reconcile/providers/docker-private.js +101 -0
  234. package/dist/reconcile/providers/github-private.d.ts +65 -0
  235. package/dist/reconcile/providers/github-private.js +119 -0
  236. package/dist/reconcile/providers/local-private.d.ts +28 -0
  237. package/dist/reconcile/providers/local-private.js +75 -0
  238. package/dist/reconcile/providers/railway-iac.d.ts +66 -0
  239. package/dist/reconcile/providers/railway-iac.js +275 -0
  240. package/dist/reconcile/providers/release-private.d.ts +92 -0
  241. package/dist/reconcile/providers/release-private.js +152 -0
  242. package/dist/reconcile/registry.d.ts +2 -2
  243. package/dist/reconcile/registry.js +16 -1
  244. package/dist/reconcile/state.d.ts +1 -1
  245. package/dist/reconcile/state.js +7 -44
  246. package/dist/reconcile/units.d.ts +1 -1
  247. package/dist/reconcile/units.js +9 -3
  248. package/dist/remote.d.ts +6 -6
  249. package/dist/scenes/artifacts.d.ts +16 -0
  250. package/dist/scenes/artifacts.js +61 -0
  251. package/dist/scenes/auth.d.ts +2 -0
  252. package/dist/scenes/auth.js +28 -0
  253. package/dist/scenes/base-url.d.ts +12 -0
  254. package/dist/scenes/base-url.js +123 -0
  255. package/dist/scenes/builtin-plugins.d.ts +2 -0
  256. package/dist/scenes/builtin-plugins.js +447 -0
  257. package/dist/scenes/checkpoints.d.ts +14 -0
  258. package/dist/scenes/checkpoints.js +33 -0
  259. package/dist/scenes/device-matrix.d.ts +2 -0
  260. package/dist/scenes/device-matrix.js +97 -0
  261. package/dist/scenes/devices.d.ts +11 -0
  262. package/dist/scenes/devices.js +22 -0
  263. package/dist/scenes/diagnostics.d.ts +5 -0
  264. package/dist/scenes/diagnostics.js +22 -0
  265. package/dist/scenes/diagram-providers.d.ts +2 -0
  266. package/dist/scenes/diagram-providers.js +181 -0
  267. package/dist/scenes/diagram-validation.d.ts +22 -0
  268. package/dist/scenes/diagram-validation.js +74 -0
  269. package/dist/scenes/environment.d.ts +2 -0
  270. package/dist/scenes/environment.js +65 -0
  271. package/dist/scenes/evidence-bundle.d.ts +5 -0
  272. package/dist/scenes/evidence-bundle.js +42 -0
  273. package/dist/scenes/evidence-report.d.ts +10 -0
  274. package/dist/scenes/evidence-report.js +73 -0
  275. package/dist/scenes/evidence.d.ts +16 -0
  276. package/dist/scenes/evidence.js +277 -0
  277. package/dist/scenes/index.d.ts +48 -0
  278. package/dist/scenes/index.js +312 -0
  279. package/dist/scenes/inspect.d.ts +9 -0
  280. package/dist/scenes/inspect.js +64 -0
  281. package/dist/scenes/loader.d.ts +3 -0
  282. package/dist/scenes/loader.js +38 -0
  283. package/dist/scenes/logs.d.ts +2 -0
  284. package/dist/scenes/logs.js +47 -0
  285. package/dist/scenes/operations.d.ts +3 -0
  286. package/dist/scenes/operations.js +128 -0
  287. package/dist/scenes/phase0.d.ts +9 -0
  288. package/dist/scenes/phase0.js +637 -0
  289. package/dist/scenes/planner.d.ts +12 -0
  290. package/dist/scenes/planner.js +166 -0
  291. package/dist/scenes/playwright-adapter.d.ts +2 -0
  292. package/dist/scenes/playwright-adapter.js +63 -0
  293. package/dist/scenes/plugins.d.ts +5 -0
  294. package/dist/scenes/plugins.js +115 -0
  295. package/dist/scenes/progress.d.ts +17 -0
  296. package/dist/scenes/progress.js +24 -0
  297. package/dist/scenes/publish-destinations.d.ts +12 -0
  298. package/dist/scenes/publish-destinations.js +99 -0
  299. package/dist/scenes/publish-plan-report.d.ts +10 -0
  300. package/dist/scenes/publish-plan-report.js +70 -0
  301. package/dist/scenes/publish-plan.d.ts +15 -0
  302. package/dist/scenes/publish-plan.js +248 -0
  303. package/dist/scenes/publish-redaction.d.ts +16 -0
  304. package/dist/scenes/publish-redaction.js +148 -0
  305. package/dist/scenes/publish-release-record.d.ts +13 -0
  306. package/dist/scenes/publish-release-record.js +34 -0
  307. package/dist/scenes/publish-report.d.ts +10 -0
  308. package/dist/scenes/publish-report.js +67 -0
  309. package/dist/scenes/publish.d.ts +16 -0
  310. package/dist/scenes/publish.js +298 -0
  311. package/dist/scenes/registry.d.ts +12 -0
  312. package/dist/scenes/registry.js +65 -0
  313. package/dist/scenes/remotion-adapter.d.ts +3 -0
  314. package/dist/scenes/remotion-adapter.js +94 -0
  315. package/dist/scenes/remotion-composition-registry.d.ts +2 -0
  316. package/dist/scenes/remotion-composition-registry.js +12 -0
  317. package/dist/scenes/remotion-compositions.d.ts +15 -0
  318. package/dist/scenes/remotion-compositions.js +464 -0
  319. package/dist/scenes/remotion-diagrams.d.ts +9 -0
  320. package/dist/scenes/remotion-diagrams.js +188 -0
  321. package/dist/scenes/remotion-input.d.ts +13 -0
  322. package/dist/scenes/remotion-input.js +291 -0
  323. package/dist/scenes/remotion-visuals.d.ts +29 -0
  324. package/dist/scenes/remotion-visuals.js +198 -0
  325. package/dist/scenes/render-media-assets.d.ts +9 -0
  326. package/dist/scenes/render-media-assets.js +117 -0
  327. package/dist/scenes/render-report.d.ts +10 -0
  328. package/dist/scenes/render-report.js +27 -0
  329. package/dist/scenes/render.d.ts +2 -0
  330. package/dist/scenes/render.js +218 -0
  331. package/dist/scenes/reporter.d.ts +3 -0
  332. package/dist/scenes/reporter.js +101 -0
  333. package/dist/scenes/resume.d.ts +2 -0
  334. package/dist/scenes/resume.js +79 -0
  335. package/dist/scenes/runner.d.ts +2 -0
  336. package/dist/scenes/runner.js +674 -0
  337. package/dist/scenes/schema.d.ts +6 -0
  338. package/dist/scenes/schema.js +994 -0
  339. package/dist/scenes/seed.d.ts +2 -0
  340. package/dist/scenes/seed.js +83 -0
  341. package/dist/scenes/segments.d.ts +15 -0
  342. package/dist/scenes/segments.js +79 -0
  343. package/dist/scenes/selectors.d.ts +3 -0
  344. package/dist/scenes/selectors.js +21 -0
  345. package/dist/scenes/timeline.d.ts +11 -0
  346. package/dist/scenes/timeline.js +26 -0
  347. package/dist/scenes/timeouts.d.ts +6 -0
  348. package/dist/scenes/timeouts.js +17 -0
  349. package/dist/scenes/training-captions.d.ts +14 -0
  350. package/dist/scenes/training-captions.js +98 -0
  351. package/dist/scenes/training-report.d.ts +10 -0
  352. package/dist/scenes/training-report.js +78 -0
  353. package/dist/scenes/training-transcript.d.ts +24 -0
  354. package/dist/scenes/training-transcript.js +204 -0
  355. package/dist/scenes/training.d.ts +10 -0
  356. package/dist/scenes/training.js +134 -0
  357. package/dist/scenes/types.d.ts +1872 -0
  358. package/dist/scenes/types.js +8 -0
  359. package/dist/scenes/visual-audit-contact-sheets.d.ts +6 -0
  360. package/dist/scenes/visual-audit-contact-sheets.js +119 -0
  361. package/dist/scenes/visual-audit-fixtures.d.ts +25 -0
  362. package/dist/scenes/visual-audit-fixtures.js +210 -0
  363. package/dist/scenes/visual-audit-report.d.ts +11 -0
  364. package/dist/scenes/visual-audit-report.js +85 -0
  365. package/dist/scenes/visual-audit-review.d.ts +23 -0
  366. package/dist/scenes/visual-audit-review.js +829 -0
  367. package/dist/scenes/visual-audit-routes.d.ts +13 -0
  368. package/dist/scenes/visual-audit-routes.js +308 -0
  369. package/dist/scenes/visual-audit.d.ts +3 -0
  370. package/dist/scenes/visual-audit.js +596 -0
  371. package/dist/scripts/build-dist.js +154 -40
  372. package/dist/scripts/check-build-warnings.js +42 -53
  373. package/dist/scripts/cleanup-markdown.js +1 -1
  374. package/dist/scripts/cli-test-fixtures.js +24 -28
  375. package/dist/scripts/deployment-readiness.js +20 -0
  376. package/dist/scripts/generate-treedx-openapi-types.js +186 -0
  377. package/dist/scripts/migrate-journey-csv-to-guarantees.js +140 -0
  378. package/dist/scripts/operations-runner-smoke.js +16 -0
  379. package/dist/scripts/package-tools.js +12 -1
  380. package/dist/scripts/prepare.js +3 -7
  381. package/dist/scripts/release-verify.js +6 -6
  382. package/dist/scripts/run-fixture-astro-command.js +1 -1
  383. package/dist/scripts/template-catalog.test.js +68 -82
  384. package/dist/scripts/tenant-dev.js +0 -10
  385. package/dist/scripts/tenant-workflow-action.js +10 -1
  386. package/dist/scripts/test-cloudflare-local.js +1 -1
  387. package/dist/scripts/test-scaffold.js +0 -1
  388. package/dist/scripts/test-smoke.js +3 -3
  389. package/dist/scripts/treeseed-build-dist.js +4 -7
  390. package/dist/scripts/treeseed-release-verify.js +1 -1
  391. package/dist/scripts/verify-driver.js +30 -21
  392. package/dist/scripts/workflow-commands.test.js +18 -27
  393. package/dist/scripts/workspace-command-e2e.js +1 -1
  394. package/dist/scripts/workspace-lint.js +6 -0
  395. package/dist/scripts/workspace-release-test.js +90 -1
  396. package/dist/scripts/workspace-test.js +6 -0
  397. package/dist/sdk-dispatch.d.ts +1 -1
  398. package/dist/sdk-dispatch.js +0 -16
  399. package/dist/sdk-fields.d.ts +1 -1
  400. package/dist/sdk-filters.d.ts +1 -1
  401. package/dist/sdk-types.d.ts +1352 -116
  402. package/dist/sdk-types.js +413 -2
  403. package/dist/sdk.d.ts +106 -100
  404. package/dist/sdk.js +211 -51
  405. package/dist/secrets-capability.d.ts +421 -0
  406. package/dist/secrets-capability.js +530 -0
  407. package/dist/seeds/normalize.js +1 -0
  408. package/dist/seeds/planner.js +38 -0
  409. package/dist/seeds/schema.js +293 -4
  410. package/dist/seeds/types.d.ts +60 -0
  411. package/dist/seeds/types.js +9 -1
  412. package/dist/service-credentials.d.ts +54 -0
  413. package/dist/service-credentials.js +112 -0
  414. package/dist/stores/cursor-store.d.ts +2 -2
  415. package/dist/stores/envelopes.d.ts +1 -1
  416. package/dist/stores/helpers.d.ts +1 -1
  417. package/dist/stores/lease-store.d.ts +2 -2
  418. package/dist/stores/message-store.d.ts +2 -2
  419. package/dist/stores/operational-store.d.ts +3 -26
  420. package/dist/stores/operational-store.js +0 -225
  421. package/dist/stores/project-workflow-store.d.ts +2 -2
  422. package/dist/stores/run-store.d.ts +2 -3
  423. package/dist/stores/run-store.js +0 -98
  424. package/dist/stores/subscription-store.d.ts +2 -3
  425. package/dist/stores/subscription-store.js +0 -100
  426. package/dist/template-catalog.d.ts +1 -1
  427. package/dist/template-launch-requirements.d.ts +2 -2
  428. package/dist/template-launch-requirements.js +9 -0
  429. package/dist/template-launch-ui.d.ts +2 -2
  430. package/dist/treedx/adapters.d.ts +6 -0
  431. package/dist/treedx/adapters.js +36 -0
  432. package/dist/treedx/client.d.ts +222 -0
  433. package/dist/treedx/client.js +871 -0
  434. package/dist/treedx/errors.d.ts +13 -0
  435. package/dist/treedx/errors.js +17 -0
  436. package/dist/treedx/federated-client.d.ts +27 -0
  437. package/dist/treedx/federated-client.js +158 -0
  438. package/dist/treedx/generated/openapi-types.d.ts +3558 -0
  439. package/dist/treedx/generated/openapi-types.js +0 -0
  440. package/dist/treedx/graph-adapter.d.ts +33 -0
  441. package/dist/treedx/graph-adapter.js +156 -0
  442. package/dist/treedx/index.d.ts +14 -0
  443. package/dist/treedx/index.js +48 -0
  444. package/dist/treedx/market-integration.d.ts +27 -0
  445. package/dist/treedx/market-integration.js +131 -0
  446. package/dist/treedx/ports.d.ts +166 -0
  447. package/dist/treedx/ports.js +231 -0
  448. package/dist/treedx/query-adapter.d.ts +19 -0
  449. package/dist/treedx/query-adapter.js +62 -0
  450. package/dist/treedx/registry-client.d.ts +11 -0
  451. package/dist/treedx/registry-client.js +19 -0
  452. package/dist/treedx/repository-adapter.d.ts +45 -0
  453. package/dist/treedx/repository-adapter.js +319 -0
  454. package/dist/treedx/sdk-integration.d.ts +27 -0
  455. package/dist/treedx/sdk-integration.js +63 -0
  456. package/dist/treedx/types.d.ts +1084 -0
  457. package/dist/treedx/types.js +8 -0
  458. package/dist/treedx/workspace-adapter.d.ts +27 -0
  459. package/dist/treedx/workspace-adapter.js +65 -0
  460. package/dist/treedx-backends.d.ts +220 -0
  461. package/dist/treedx-backends.js +634 -0
  462. package/dist/treedx-client.d.ts +89 -0
  463. package/dist/treedx-client.js +184 -0
  464. package/dist/treeseed/services/compose.yml +2 -3
  465. package/dist/treeseed/template-catalog/catalog.fixture.json +27 -27
  466. package/dist/types/agents.d.ts +256 -0
  467. package/dist/types/agents.js +42 -1
  468. package/dist/verification.d.ts +1 -0
  469. package/dist/verification.js +143 -14
  470. package/dist/workflow/operations.d.ts +580 -523
  471. package/dist/workflow/operations.js +2084 -1279
  472. package/dist/workflow/policy.js +19 -7
  473. package/dist/workflow/runs.d.ts +9 -3
  474. package/dist/workflow/runs.js +66 -26
  475. package/dist/workflow/session.d.ts +4 -1
  476. package/dist/workflow/session.js +50 -10
  477. package/dist/workflow/worktrees.d.ts +6 -2
  478. package/dist/workflow/worktrees.js +98 -15
  479. package/dist/workflow-state.d.ts +17 -4
  480. package/dist/workflow-state.js +68 -41
  481. package/dist/workflow-support.d.ts +26 -17
  482. package/dist/workflow-support.js +84 -24
  483. package/dist/workflow.d.ts +51 -16
  484. package/dist/workflow.js +19 -7
  485. package/drizzle/d1/0000_treeseed_d1.sql +0 -18
  486. package/drizzle/market/0000_market_control_plane.sql +1793 -1499
  487. package/drizzle/market/0004_treedx_market_integration.sql +99 -0
  488. package/drizzle/market/0005_agent_capacity_coordination.sql +145 -0
  489. package/drizzle/market/0006_provider_assignment_lifecycle.sql +9 -0
  490. package/drizzle/market/0007_agent_architecture_gap_closure.sql +157 -0
  491. package/drizzle/market/0008_agent_capacity_operational_closure.sql +27 -0
  492. package/drizzle/market/0009_agent_capacity_runtime_hardening.sql +29 -0
  493. package/drizzle/market/0010_secrets_capability_persistence.sql +130 -0
  494. package/drizzle/market/0011_github_app_adapter.sql +47 -0
  495. package/drizzle/market/0012_workday_test_runs.sql +44 -0
  496. package/drizzle/market/0013_runtime_task_lifecycle.sql +39 -0
  497. package/drizzle/market/0014_governance_pipeline.sql +189 -0
  498. package/package.json +106 -18
  499. package/scripts/{verify-driver.mjs → verify-driver.ts} +19 -4
  500. package/templates/github/deploy-web.workflow.yml +49 -12
  501. package/dist/operations/services/mailpit-runtime.d.ts +0 -20
  502. package/dist/operations/services/mailpit-runtime.js +0 -67
  503. package/dist/operations/services/release-candidate.d.ts +0 -41
  504. package/dist/operations/services/release-candidate.js +0 -616
  505. package/dist/scripts/ensure-mailpit.js +0 -48
  506. package/dist/scripts/logs-mailpit.js +0 -2
  507. package/dist/scripts/run-ts.js +0 -45
  508. package/dist/scripts/stop-mailpit.js +0 -5
  509. package/dist/scripts/treeseed-run-ts.js +0 -45
@@ -1,12 +1,57 @@
1
+ import { existsSync, readFileSync, writeFileSync } from "node:fs";
2
+ import { isAbsolute, resolve } from "node:path";
1
3
  import { run, workspaceRoot } from "./workspace-tools.js";
2
- import { currentBranch, gitStatusPorcelain, repoRoot } from "./workspace-save.js";
4
+ import { collectMergeConflictReport, currentBranch, formatMergeConflictReport, gitStatusPorcelain, repoRoot } from "./workspace-save.js";
3
5
  import { ensureSshPushUrlForOrigin } from "./git-remote-policy.js";
6
+ import { runTreeseedGit } from "./git-runner.js";
4
7
  import { createTreeseedManagedToolEnv, resolveTreeseedToolBinary } from "../../managed-dependencies.js";
5
8
  const STAGING_BRANCH = "staging";
6
9
  const PRODUCTION_BRANCH = "main";
7
10
  const RESERVED_BRANCHES = /* @__PURE__ */ new Set([STAGING_BRANCH, PRODUCTION_BRANCH]);
11
+ function gitMode(args) {
12
+ const command = args[0] ?? "";
13
+ return (/* @__PURE__ */ new Set([
14
+ "add",
15
+ "checkout",
16
+ "commit",
17
+ "merge",
18
+ "pull",
19
+ "push",
20
+ "rebase",
21
+ "reset",
22
+ "restore",
23
+ "switch",
24
+ "tag",
25
+ "update-index",
26
+ "worktree"
27
+ ])).has(command) ? "mutate" : "read";
28
+ }
8
29
  function runGit(args, { cwd, capture = false } = {}) {
9
- return run("git", args, { cwd, capture });
30
+ const result = runTreeseedGit(args, {
31
+ cwd: cwd ?? workspaceRoot(),
32
+ mode: gitMode(args),
33
+ allowFailure: false
34
+ });
35
+ return capture ? result.stdout : result.stdout;
36
+ }
37
+ function runGitAllowFailure(args, { cwd }) {
38
+ return runTreeseedGit(args, {
39
+ cwd,
40
+ mode: gitMode(args),
41
+ allowFailure: true
42
+ });
43
+ }
44
+ function abortInProgressMerge(repoDir) {
45
+ const mergeHead = runGitAllowFailure(["rev-parse", "--git-path", "MERGE_HEAD"], { cwd: repoDir }).stdout.trim();
46
+ const mergeHeadPath = mergeHead && (isAbsolute(mergeHead) ? mergeHead : resolve(repoDir, mergeHead));
47
+ if (!mergeHeadPath || !existsSync(mergeHeadPath) && conflictedFiles(repoDir).length === 0) {
48
+ return false;
49
+ }
50
+ const abort = runGitAllowFailure(["merge", "--abort"], { cwd: repoDir });
51
+ if (abort.status === 0) {
52
+ return true;
53
+ }
54
+ return runGitAllowFailure(["reset", "--merge"], { cwd: repoDir }).status === 0;
10
55
  }
11
56
  function ensureWritableOrigin(repoDir) {
12
57
  try {
@@ -26,6 +71,62 @@ function repoHasStagedChanges(repoDir) {
26
71
  function conflictedFiles(repoDir) {
27
72
  return runGit(["diff", "--name-only", "--diff-filter=U"], { cwd: repoDir, capture: true }).split("\n").map((line) => line.trim()).filter(Boolean);
28
73
  }
74
+ function isGeneratedPackageMetadataFile(filePath) {
75
+ return filePath === "package.json" || filePath === "package-lock.json";
76
+ }
77
+ function isPackagePointerConflict(repoDir, filePath) {
78
+ if (!/^packages\/[^/]+$/u.test(filePath)) {
79
+ return false;
80
+ }
81
+ const stagedEntries = runGit(["ls-files", "-u", "--", filePath], { cwd: repoDir, capture: true }).split("\n").map((line) => line.trim()).filter(Boolean);
82
+ return stagedEntries.length > 0 && stagedEntries.every((line) => line.startsWith("160000 "));
83
+ }
84
+ function releaseSideConflictSha(repoDir, filePath) {
85
+ const stagedEntries = runGit(["ls-files", "-u", "--", filePath], { cwd: repoDir, capture: true }).split("\n").map((line) => line.trim()).filter(Boolean);
86
+ for (const entry of stagedEntries) {
87
+ const match = /^(\d+)\s+([0-9a-f]{40})\s+3\t(.+)$/u.exec(entry);
88
+ if (match && match[1] === "160000" && match[3] === filePath) {
89
+ return match[2];
90
+ }
91
+ }
92
+ return null;
93
+ }
94
+ function materializeReleaseSideFile(repoDir, filePath) {
95
+ const content = runGit(["show", `:3:${filePath}`], { cwd: repoDir, capture: true });
96
+ writeFileSync(resolve(repoDir, filePath), content);
97
+ runGit(["add", "--", filePath], { cwd: repoDir });
98
+ }
99
+ function stageReleaseSidePackagePointer(repoDir, filePath) {
100
+ const sha = releaseSideConflictSha(repoDir, filePath);
101
+ if (!sha) {
102
+ throw new Error(`Unable to resolve release-side package pointer for ${filePath}.`);
103
+ }
104
+ runGit(["update-index", "--cacheinfo", "160000", sha, filePath], { cwd: repoDir });
105
+ }
106
+ function isReleaseSideOnlyTextConflict(repoDir, filePath) {
107
+ if (isGeneratedPackageMetadataFile(filePath) || isPackagePointerConflict(repoDir, filePath)) {
108
+ return false;
109
+ }
110
+ const content = readFileSync(resolve(repoDir, filePath), "utf8");
111
+ const conflictBlocks = content.match(/<<<<<<< [\s\S]*?>>>>>>> .+/gu) ?? [];
112
+ if (conflictBlocks.length === 0) {
113
+ return false;
114
+ }
115
+ return conflictBlocks.every((block) => {
116
+ const middle = block.indexOf("=======");
117
+ if (middle === -1) {
118
+ return false;
119
+ }
120
+ const ours = block.slice(block.indexOf("\n") + 1, middle).trim();
121
+ return ours.length === 0;
122
+ });
123
+ }
124
+ function isReleaseSidePreferredWorkflowConflict(filePath) {
125
+ return [
126
+ "src/operations/services/git-workflow.ts",
127
+ "src/workflow/operations.ts"
128
+ ].includes(filePath);
129
+ }
29
130
  function resolveGeneratedPackageMetadataConflicts(repoDir) {
30
131
  const files = conflictedFiles(repoDir);
31
132
  if (files.length === 0) {
@@ -37,8 +138,8 @@ function resolveGeneratedPackageMetadataConflicts(repoDir) {
37
138
  allConflictsWereGeneratedMetadata: false
38
139
  };
39
140
  }
40
- const generatedMetadataFiles = /* @__PURE__ */ new Set(["package.json", "package-lock.json"]);
41
- if (files.some((file) => !generatedMetadataFiles.has(file))) {
141
+ const allConflictsWereGeneratedMetadata = files.every((file) => isGeneratedPackageMetadataFile(file) || isPackagePointerConflict(repoDir, file) || isReleaseSideOnlyTextConflict(repoDir, file) || isReleaseSidePreferredWorkflowConflict(file));
142
+ if (!allConflictsWereGeneratedMetadata) {
42
143
  return {
43
144
  resolved: false,
44
145
  repoDir,
@@ -47,14 +148,27 @@ function resolveGeneratedPackageMetadataConflicts(repoDir) {
47
148
  allConflictsWereGeneratedMetadata: false
48
149
  };
49
150
  }
50
- runGit(["checkout", "--theirs", "--", ...files], { cwd: repoDir });
51
- runGit(["add", "--", ...files], { cwd: repoDir });
151
+ for (const file of files) {
152
+ if (isGeneratedPackageMetadataFile(file)) {
153
+ materializeReleaseSideFile(repoDir, file);
154
+ continue;
155
+ }
156
+ if (isReleaseSideOnlyTextConflict(repoDir, file)) {
157
+ materializeReleaseSideFile(repoDir, file);
158
+ continue;
159
+ }
160
+ if (isReleaseSidePreferredWorkflowConflict(file)) {
161
+ materializeReleaseSideFile(repoDir, file);
162
+ continue;
163
+ }
164
+ stageReleaseSidePackagePointer(repoDir, file);
165
+ }
52
166
  return {
53
167
  resolved: true,
54
168
  repoDir,
55
169
  targetBranch: STAGING_BRANCH,
56
170
  reconciledFiles: files,
57
- allConflictsWereGeneratedMetadata: true
171
+ allConflictsWereGeneratedMetadata
58
172
  };
59
173
  }
60
174
  function headCommit(repoDir, ref = "HEAD") {
@@ -164,6 +278,93 @@ function remoteBranchExists(repoDir, branchName) {
164
278
  function fetchOrigin(repoDir) {
165
279
  runGit(["fetch", "origin"], { cwd: repoDir, capture: true });
166
280
  }
281
+ function remoteHeadCommit(repoDir, branchName) {
282
+ fetchOrigin(repoDir);
283
+ return runGit(["rev-parse", `origin/${branchName}`], { cwd: repoDir, capture: true }).trim();
284
+ }
285
+ function pushCommitToBranch(repoDir, commitSha, branchName, { forceWithLease = false } = {}) {
286
+ ensureWritableOrigin(repoDir);
287
+ const args = forceWithLease ? ["push", "--force-with-lease", "origin", `${commitSha}:refs/heads/${branchName}`] : ["push", "origin", `${commitSha}:refs/heads/${branchName}`];
288
+ runGit(args, { cwd: repoDir });
289
+ }
290
+ function mergeBranchDownIntoFeature(repoDir, input) {
291
+ const sourceBranch = input.sourceBranch ?? STAGING_BRANCH;
292
+ assertCleanWorktree(repoDir);
293
+ fetchOrigin(repoDir);
294
+ if (!branchExists(repoDir, input.featureBranch)) {
295
+ if (!remoteBranchExists(repoDir, input.featureBranch)) {
296
+ throw new Error(`Feature branch "${input.featureBranch}" does not exist locally or on origin.`);
297
+ }
298
+ runGit(["branch", input.featureBranch, `origin/${input.featureBranch}`], { cwd: repoDir });
299
+ }
300
+ checkoutBranch(repoDir, input.featureBranch);
301
+ const beforeHead = headCommit(repoDir);
302
+ const sourceHead = remoteBranchExists(repoDir, sourceBranch) ? remoteHeadCommit(repoDir, sourceBranch) : null;
303
+ if (!sourceHead) {
304
+ throw new Error(`Source branch "${sourceBranch}" does not exist on origin.`);
305
+ }
306
+ let generatedMetadataReconciliation = null;
307
+ try {
308
+ runGit(["merge", "--no-ff", `origin/${sourceBranch}`, "-m", input.message], { cwd: repoDir, capture: true });
309
+ } catch (error) {
310
+ const reconciliation = input.allowGeneratedMetadataAutoResolution === false ? { resolved: false } : resolveGeneratedPackageMetadataConflicts(repoDir);
311
+ if (!reconciliation.resolved) {
312
+ const report = collectMergeConflictReport(repoDir);
313
+ const conflictError = new Error(formatMergeConflictReport(report, repoDir, sourceBranch));
314
+ Object.assign(conflictError, {
315
+ cause: error,
316
+ mergeConflictReport: report,
317
+ code: "conflict_resolution_required"
318
+ });
319
+ throw conflictError;
320
+ }
321
+ generatedMetadataReconciliation = reconciliation;
322
+ if (repoHasStagedChanges(repoDir)) {
323
+ runGit(["commit", "-m", input.message], { cwd: repoDir });
324
+ }
325
+ }
326
+ const afterHead = headCommit(repoDir);
327
+ const merged = beforeHead !== afterHead;
328
+ if (merged) {
329
+ pushBranch(repoDir, input.featureBranch);
330
+ }
331
+ return {
332
+ repoDir,
333
+ featureBranch: input.featureBranch,
334
+ sourceBranch,
335
+ beforeHead,
336
+ sourceHead,
337
+ afterHead,
338
+ merged,
339
+ pushed: merged,
340
+ generatedMetadataReconciliation
341
+ };
342
+ }
343
+ function promoteCommitToBranchWithExpectedHead(repoDir, input) {
344
+ const targetBranch = input.targetBranch ?? STAGING_BRANCH;
345
+ fetchOrigin(repoDir);
346
+ const actualBefore = remoteBranchExists(repoDir, targetBranch) ? remoteHeadCommit(repoDir, targetBranch) : null;
347
+ if (actualBefore !== input.expectedBefore) {
348
+ throw new Error(`Refusing to promote ${targetBranch}; origin/${targetBranch} moved from ${input.expectedBefore ?? "(missing)"} to ${actualBefore ?? "(missing)"}.`);
349
+ }
350
+ ensureWritableOrigin(repoDir);
351
+ const lease = actualBefore ? `--force-with-lease=refs/heads/${targetBranch}:${actualBefore}` : "--force-with-lease";
352
+ runGit(["push", lease, "origin", `${input.commitSha}:refs/heads/${targetBranch}`], { cwd: repoDir });
353
+ fetchOrigin(repoDir);
354
+ const verifiedHead = remoteHeadCommit(repoDir, targetBranch);
355
+ if (verifiedHead !== input.commitSha) {
356
+ throw new Error(`Promotion verification failed for ${targetBranch}; expected ${input.commitSha}, observed ${verifiedHead}.`);
357
+ }
358
+ return {
359
+ repoDir,
360
+ targetBranch,
361
+ expectedBefore: input.expectedBefore,
362
+ actualBefore,
363
+ commitSha: input.commitSha,
364
+ pushed: true,
365
+ verified: true
366
+ };
367
+ }
167
368
  function ensureLocalBranchTracking(repoDir, branchName) {
168
369
  if (branchExists(repoDir, branchName)) {
169
370
  return;
@@ -273,6 +474,27 @@ function pushBranch(repoDir, branchName, { setUpstream = false } = {}) {
273
474
  const args = setUpstream ? ["push", "-u", "origin", branchName] : ["push", "origin", branchName];
274
475
  runGit(args, { cwd: repoDir });
275
476
  }
477
+ function taskTagSlug(branchName) {
478
+ return String(branchName ?? "").normalize("NFKD").replace(/[\u0300-\u036f]/gu, "").replace(/[^a-z0-9._-]+/giu, "-").toLowerCase().replace(/-+/gu, "-").replace(/^-|-$/gu, "") || "task";
479
+ }
480
+ function createDeprecatedTaskTag(repoDir, branchName, reason = "") {
481
+ const head = headCommit(repoDir, branchName);
482
+ const tagName = `deprecated/${taskTagSlug(branchName)}/${head.slice(0, 12)}`;
483
+ const message = [
484
+ `Deprecated task branch ${branchName}`,
485
+ String(reason ?? "").trim()
486
+ ].filter(Boolean).join("\n\n");
487
+ runGit(["tag", "-a", tagName, head, "-m", message], { cwd: repoDir });
488
+ ensureWritableOrigin(repoDir);
489
+ runGit(["push", "origin", tagName], { cwd: repoDir });
490
+ return {
491
+ repoDir,
492
+ branchName,
493
+ tagName,
494
+ head,
495
+ pushed: true
496
+ };
497
+ }
276
498
  function ensureRemoteBranchFromBase(repoDir, branchName, { baseBranch = PRODUCTION_BRANCH } = {}) {
277
499
  fetchOrigin(repoDir);
278
500
  if (remoteBranchExists(repoDir, branchName)) {
@@ -331,7 +553,15 @@ function squashMergeBranchIntoStaging(cwd, featureBranch, message, { pushTarget
331
553
  } catch (error) {
332
554
  const reconciliation = resolveGeneratedPackageMetadataConflicts(repoDir);
333
555
  if (!reconciliation.resolved) {
334
- throw error;
556
+ const report = collectMergeConflictReport(repoDir);
557
+ const mergeAborted = abortInProgressMerge(repoDir);
558
+ const conflictError = new Error(formatMergeConflictReport(report, repoDir, STAGING_BRANCH));
559
+ Object.assign(conflictError, {
560
+ cause: error,
561
+ mergeAborted,
562
+ mergeConflictReport: report
563
+ });
564
+ throw conflictError;
335
565
  }
336
566
  if (reportGeneratedMetadataReconciliation) {
337
567
  console.log(`Resolving generated package metadata reconciliation for ${reconciliation.reconciledFiles.join(", ")}.`);
@@ -407,18 +637,6 @@ function listTaskBranches(repoDir) {
407
637
  };
408
638
  });
409
639
  }
410
- function taskTagSlug(branchName) {
411
- return String(branchName).trim().replaceAll("\\", "/").replace(/[^A-Za-z0-9._/-]+/g, "-").replace(/\/+/g, "-").replace(/^-+|-+$/g, "") || "task";
412
- }
413
- function createDeprecatedTaskTag(repoDir, branchName, message) {
414
- const head = runGit(["rev-parse", branchName], { cwd: repoDir, capture: true }).trim();
415
- const shortSha = head.slice(0, 12);
416
- const tagName = `deprecated/${taskTagSlug(branchName)}/${shortSha}`;
417
- runGit(["tag", "-a", tagName, head, "-m", message], { cwd: repoDir });
418
- ensureWritableOrigin(repoDir);
419
- runGit(["push", "origin", tagName], { cwd: repoDir, capture: true });
420
- return { tagName, head };
421
- }
422
640
  function waitForStagingAutomation(repoDir) {
423
641
  if (process.env.TREESEED_STAGE_WAIT_MODE === "skip") {
424
642
  return { status: "skipped", reason: "disabled" };
@@ -456,16 +674,22 @@ function mergeStagingIntoMain(cwd = workspaceRoot()) {
456
674
  sourceBranch: STAGING_BRANCH,
457
675
  targetBranch: PRODUCTION_BRANCH,
458
676
  message: `release: ${STAGING_BRANCH} -> ${PRODUCTION_BRANCH}`,
459
- pushTarget: true
677
+ pushTarget: true,
678
+ allowUnrelatedHistories: false
460
679
  });
461
680
  }
462
- function mergeBranchIntoTarget(cwd = workspaceRoot(), { sourceBranch, targetBranch, message, pushTarget = true, quietMerge = false } = {}) {
681
+ function mergeBranchIntoTarget(cwd = workspaceRoot(), { sourceBranch, targetBranch, message, pushTarget = true, quietMerge = false, allowUnrelatedHistories = false } = {}) {
463
682
  const repoDir = prepareReleaseBranches(cwd);
464
683
  checkoutBranch(repoDir, targetBranch);
465
684
  if (remoteBranchExists(repoDir, targetBranch)) {
466
685
  runGit(["merge", "--ff-only", `origin/${targetBranch}`], { cwd: repoDir });
467
686
  }
468
- runGit(["merge", "--no-ff", sourceBranch, "-m", message], { cwd: repoDir, capture: quietMerge });
687
+ const mergeArgs = ["merge", "--no-ff"];
688
+ if (allowUnrelatedHistories) {
689
+ mergeArgs.push("--allow-unrelated-histories");
690
+ }
691
+ mergeArgs.push(sourceBranch, "-m", message);
692
+ runGit(mergeArgs, { cwd: repoDir, capture: quietMerge });
469
693
  pushBranch(repoDir, STAGING_BRANCH);
470
694
  if (pushTarget) {
471
695
  pushBranch(repoDir, targetBranch);
@@ -500,14 +724,18 @@ export {
500
724
  inspectDetachedHeadRepair,
501
725
  isTaskBranch,
502
726
  listTaskBranches,
727
+ mergeBranchDownIntoFeature,
503
728
  mergeBranchIntoTarget,
504
729
  mergeCurrentBranchIntoStaging,
505
730
  mergeStagingIntoMain,
506
731
  prepareReleaseBranches,
732
+ promoteCommitToBranchWithExpectedHead,
507
733
  pushBranch,
734
+ pushCommitToBranch,
508
735
  pushHeadToBranch,
509
736
  reattachDetachedHeadIfSafe,
510
737
  remoteBranchExists,
738
+ remoteHeadCommit,
511
739
  squashMergeBranchIntoStaging,
512
740
  syncBranchWithOrigin,
513
741
  taskTagSlug,
@@ -1,4 +1,4 @@
1
- import { type GitHubApiClient, type GitHubWorkflowProgressEvent } from './github-api.ts';
1
+ import { type GitHubApiClient, type GitHubWorkflowProgressEvent } from './github-api.js';
2
2
  export type GitHubActionsWorkflowState = 'success' | 'failure' | 'pending' | 'missing' | 'not_pushed' | 'error';
3
3
  export type GitHubActionsVerificationTarget = {
4
4
  name: string;
@@ -8,6 +8,7 @@ export type GitHubActionsVerificationTarget = {
8
8
  headSha: string | null;
9
9
  workflows: string[];
10
10
  kind?: 'root' | 'package';
11
+ missingIsFailure?: boolean;
11
12
  };
12
13
  export type GitHubActionsWorkflowGate = {
13
14
  name: string;
@@ -68,6 +69,7 @@ export type GitHubActionsRepositoryInspection = {
68
69
  state: GitHubActionsWorkflowState;
69
70
  message: string | null;
70
71
  workflows: GitHubActionsWorkflowRunInspection[];
72
+ missingIsFailure: boolean;
71
73
  };
72
74
  export type GitHubActionsVerificationFailure = {
73
75
  type: 'repository' | 'workflow' | 'job';
@@ -135,6 +137,7 @@ export declare function waitForGitHubActionsGate(gate: GitHubActionsWorkflowGate
135
137
  timeoutSeconds?: number;
136
138
  pollSeconds?: number;
137
139
  operation?: string;
140
+ env?: NodeJS.ProcessEnv | Record<string, string | undefined>;
138
141
  onProgress?: (message: string, stream?: 'stdout' | 'stderr') => void;
139
142
  }): Promise<Record<string, unknown>>;
140
143
  export {};
@@ -278,6 +278,9 @@ function collectFailures(repositories) {
278
278
  failures.push(...workflow.failedJobs.map((job) => jobFailure(repo, workflow, job)));
279
279
  continue;
280
280
  }
281
+ if (workflow.state === "missing" && !repo.missingIsFailure) {
282
+ continue;
283
+ }
281
284
  if (workflow.state === "failure" || workflow.state === "missing" || workflow.state === "error") {
282
285
  failures.push(workflowFailure(repo, workflow));
283
286
  }
@@ -312,9 +315,11 @@ async function inspectTarget(client, target, options) {
312
315
  remoteSynced: false,
313
316
  state: "error",
314
317
  message: "Repository, branch, or head SHA is unavailable.",
315
- workflows: []
318
+ workflows: [],
319
+ missingIsFailure: target.missingIsFailure ?? true
316
320
  };
317
321
  }
322
+ const missingIsFailure = target.missingIsFailure ?? true;
318
323
  try {
319
324
  const remoteHeadSha = await resolveRemoteBranchHead(client, target.repository, target.branch);
320
325
  if (remoteHeadSha !== target.headSha) {
@@ -329,6 +334,7 @@ async function inspectTarget(client, target, options) {
329
334
  remoteSynced: false,
330
335
  state: "not_pushed",
331
336
  message: `Local HEAD ${target.headSha.slice(0, 12)} does not match origin/${target.branch} ${remoteHeadSha.slice(0, 12)}.`,
337
+ missingIsFailure,
332
338
  workflows: target.workflows.map((workflow) => ({
333
339
  workflow,
334
340
  state: "not_pushed",
@@ -359,7 +365,8 @@ async function inspectTarget(client, target, options) {
359
365
  remoteSynced: true,
360
366
  state: aggregateWorkflowState(workflows.map((workflow) => workflow.state)),
361
367
  message: null,
362
- workflows
368
+ workflows,
369
+ missingIsFailure
363
370
  };
364
371
  } catch (error) {
365
372
  return {
@@ -373,7 +380,8 @@ async function inspectTarget(client, target, options) {
373
380
  remoteSynced: false,
374
381
  state: "error",
375
382
  message: error instanceof Error ? error.message : String(error),
376
- workflows: []
383
+ workflows: [],
384
+ missingIsFailure
377
385
  };
378
386
  }
379
387
  }
@@ -544,6 +552,7 @@ async function waitForGitHubActionsGate(gate, options = {}) {
544
552
  dispatchIfMissing: gate.dispatchIfMissing ?? gate.workflow === "verify.yml",
545
553
  dispatchAfterSeconds: gate.dispatchAfterSeconds ?? 75,
546
554
  dispatchInputs: gate.dispatchInputs,
555
+ env: options.env,
547
556
  onProgress: reportProgress
548
557
  });
549
558
  }
@@ -3,6 +3,7 @@ import { spawnSync } from "node:child_process";
3
3
  import { createRequire } from "node:module";
4
4
  import { Octokit } from "octokit";
5
5
  import { createTreeseedManagedToolEnv, resolveTreeseedToolBinary } from "../../managed-dependencies.js";
6
+ import { resolveTreeseedGitHubToken } from "../../service-credentials.js";
6
7
  const require2 = createRequire(import.meta.url);
7
8
  const sodium = require2("libsodium-wrappers");
8
9
  const DEFAULT_GITHUB_API_TIMEOUT_MS = 6e4;
@@ -15,7 +16,7 @@ function configuredEnvValue(env, key) {
15
16
  return typeof value === "string" && value.trim() ? value.trim() : "";
16
17
  }
17
18
  function resolveGitHubApiToken(env = process.env) {
18
- return configuredEnvValue(env, "GH_TOKEN") || configuredEnvValue(env, "GITHUB_TOKEN");
19
+ return resolveTreeseedGitHubToken(env);
19
20
  }
20
21
  function parseGitHubRepositorySlug(value) {
21
22
  const normalized = String(value ?? "").trim().replace(/\.git$/u, "");
@@ -108,7 +109,7 @@ function createGitHubApiClient({
108
109
  } = {}) {
109
110
  const token = resolveGitHubApiToken(env);
110
111
  if (!token) {
111
- throw new Error("Configure GH_TOKEN before using Treeseed GitHub automation.");
112
+ throw new Error("Configure TREESEED_GITHUB_TOKEN before using Treeseed GitHub automation.");
112
113
  }
113
114
  return new Octokit({
114
115
  auth: token,
@@ -466,7 +467,7 @@ function upsertGitHubRepositoryVariableWithGhCli(repository, name, value, {
466
467
  } = {}) {
467
468
  const token = resolveGitHubApiToken(env);
468
469
  if (!token) {
469
- throw new Error("Configure GH_TOKEN before using Treeseed GitHub automation.");
470
+ throw new Error("Configure TREESEED_GITHUB_TOKEN before using Treeseed GitHub automation.");
470
471
  }
471
472
  const { owner, name: repo } = typeof repository === "string" ? parseGitHubRepositorySlug(repository) : repository;
472
473
  const ghEnv = {
@@ -742,6 +743,8 @@ async function waitForGitHubWorkflowRunCompletion(repository, {
742
743
  const startedAt = Date.now();
743
744
  let dispatchedMissingRun = false;
744
745
  let lastProgress = null;
746
+ let monitorErrorStartedAt = null;
747
+ let lastMonitorError = null;
745
748
  const emitProgress = (type, run = null, jobs = []) => {
746
749
  const completedJobs = jobs.filter((job) => job.status === "completed");
747
750
  const failedJobs = jobs.filter((job) => job.conclusion && job.conclusion !== "success" && job.conclusion !== "skipped");
@@ -773,6 +776,8 @@ async function waitForGitHubWorkflowRunCompletion(repository, {
773
776
  workflow_id: workflow,
774
777
  per_page: 20
775
778
  });
779
+ monitorErrorStartedAt = null;
780
+ lastMonitorError = null;
776
781
  const match = listed.data.workflow_runs.map((run) => normalizeWorkflowRun(run)).find((run) => (!headSha || run.headSha === headSha) && (!branch || run.headBranch === branch));
777
782
  if (!match?.id) {
778
783
  emitProgress("waiting");
@@ -794,7 +799,7 @@ async function waitForGitHubWorkflowRunCompletion(repository, {
794
799
  continue;
795
800
  }
796
801
  for (; ; ) {
797
- if (Date.now() - startedAt >= timeoutSeconds * 1e3) {
802
+ if (Date.now() - startedAt >= timeoutSeconds * 1e3 && lastProgress?.runId === match.id) {
798
803
  break;
799
804
  }
800
805
  const current = await client.rest.actions.getWorkflowRun({
@@ -802,6 +807,8 @@ async function waitForGitHubWorkflowRunCompletion(repository, {
802
807
  repo: name,
803
808
  run_id: match.id
804
809
  });
810
+ monitorErrorStartedAt = null;
811
+ lastMonitorError = null;
805
812
  const normalized = normalizeWorkflowRun(current.data);
806
813
  const progressJobs = await listWorkflowJobsForProgress(client, owner, name, match.id);
807
814
  if (normalized.status === "completed") {
@@ -826,11 +833,20 @@ async function waitForGitHubWorkflowRunCompletion(repository, {
826
833
  await sleep(pollSeconds * 1e3);
827
834
  }
828
835
  } catch (error) {
829
- throw normalizeGitHubApiError(error, `Unable to monitor GitHub workflow ${workflow} in ${owner}/${name}`);
836
+ const normalizedError = normalizeGitHubApiError(error, `Unable to monitor GitHub workflow ${workflow} in ${owner}/${name}`);
837
+ lastMonitorError = normalizedError;
838
+ monitorErrorStartedAt ??= Date.now();
839
+ const toleratedMonitorErrorSeconds = Math.max(pollSeconds * 2, 120);
840
+ if (Date.now() - monitorErrorStartedAt < toleratedMonitorErrorSeconds * 1e3) {
841
+ await sleep(pollSeconds * 1e3);
842
+ continue;
843
+ }
844
+ throw normalizedError;
830
845
  }
831
846
  }
832
847
  const lastState = lastProgress ? ` Last known state: run ${lastProgress.runId ?? "(not created)"} ${lastProgress.status ?? "waiting"}${lastProgress.conclusion ? `/${lastProgress.conclusion}` : ""}${lastProgress.url ? ` ${lastProgress.url}` : ""}.` : "";
833
- throw new Error(`Timed out waiting for GitHub workflow ${workflow} in ${owner}/${name}.${lastState}`);
848
+ const monitorErrorState = lastMonitorError ? ` Last monitor error: ${lastMonitorError.message}` : "";
849
+ throw new Error(`Timed out waiting for GitHub workflow ${workflow} in ${owner}/${name}.${lastState}${monitorErrorState}`);
834
850
  }
835
851
  async function ensureGitHubBranchFromBase(repository, branch, {
836
852
  baseBranch = "main",
@@ -61,7 +61,7 @@ export declare function ensureGitHubBootstrapRepository(tenantRoot: string, { va
61
61
  }>;
62
62
  export declare function createGitHubRepository(input: any, { env }?: {
63
63
  env?: NodeJS.ProcessEnv | undefined;
64
- }): Promise<import("./github-api.ts").GitHubRepositorySummary>;
64
+ }): Promise<import("./github-api.js").GitHubRepositorySummary>;
65
65
  export declare function initializeGitHubRepositoryWorkingTree(cwd: any, repository: any, { defaultBranch, createStaging, commitMessage, remoteName, push, forcePush, }?: {
66
66
  defaultBranch?: string | undefined;
67
67
  createStaging?: boolean | undefined;
@@ -209,7 +209,7 @@ export declare function ensureGitHubDeployAutomation(tenantRoot: any, { dryRun,
209
209
  skipped?: undefined;
210
210
  };
211
211
  }>;
212
- export declare function waitForGitHubWorkflowCompletion(tenantRoot: any, { repository, workflow, headSha, branch, timeoutSeconds, pollSeconds, dispatchIfMissing, dispatchAfterSeconds, dispatchInputs, onProgress, }?: {
212
+ export declare function waitForGitHubWorkflowCompletion(tenantRoot: any, { repository, workflow, headSha, branch, timeoutSeconds, pollSeconds, dispatchIfMissing, dispatchAfterSeconds, dispatchInputs, onProgress, env, }?: {
213
213
  workflow?: string | undefined;
214
214
  timeoutSeconds?: number | undefined;
215
215
  pollSeconds?: number | undefined;
@@ -225,6 +225,6 @@ export declare function waitForGitHubWorkflowCompletion(tenantRoot: any, { repos
225
225
  updatedAt: string | null;
226
226
  conclusion: string | null;
227
227
  url: string | null;
228
- jobs: import("./github-api.ts").GitHubWorkflowJobSummary[];
229
- failedJobs: import("./github-api.ts").GitHubWorkflowJobSummary[];
228
+ jobs: import("./github-api.js").GitHubWorkflowJobSummary[];
229
+ failedJobs: import("./github-api.js").GitHubWorkflowJobSummary[];
230
230
  }>;
@@ -1,6 +1,6 @@
1
1
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
2
2
  import { dirname, relative, resolve } from "node:path";
3
- import { spawnSync } from "node:child_process";
3
+ import { runTreeseedGit } from "./git-runner.js";
4
4
  import { resolveTreeseedEnvironmentRegistry } from "../../platform/environment.js";
5
5
  import { packageRoot, loadCliDeployConfig } from "./runtime-tools.js";
6
6
  import {
@@ -18,6 +18,7 @@ import {
18
18
  upsertGitHubRepositoryVariable,
19
19
  waitForGitHubWorkflowRunCompletion
20
20
  } from "./github-api.js";
21
+ import { resolveTreeseedGitHubToken } from "../../service-credentials.js";
21
22
  function envOrNull(key) {
22
23
  const value = process.env[key];
23
24
  return typeof value === "string" && value.length > 0 ? value : null;
@@ -43,19 +44,24 @@ function parseGitHubRepositoryFromRemote(remoteUrl) {
43
44
  return null;
44
45
  }
45
46
  function runGit(args, { cwd, allowFailure = false, capture = true } = {}) {
46
- const result = spawnSync("git", args, {
47
+ const mutating = /^(add|commit|checkout|switch|merge|tag|push|fetch|worktree|submodule|reset|clean|restore|branch)$/u.test(args[0] ?? "");
48
+ const result = runTreeseedGit(args, {
47
49
  cwd,
48
- stdio: capture ? "pipe" : "inherit",
49
- encoding: "utf8"
50
+ mode: mutating ? "mutate" : "read",
51
+ allowFailure
50
52
  });
53
+ if (!capture && result.stdout.trim()) process.stdout.write(result.stdout);
54
+ if (!capture && result.stderr.trim()) process.stderr.write(result.stderr);
51
55
  if (result.status !== 0 && !allowFailure) {
52
56
  if (args[0] === "push" && !args.includes("--force")) {
53
57
  const retryArgs = ["push", "--force", ...args.slice(1)];
54
- const retry = spawnSync("git", retryArgs, {
58
+ const retry = runTreeseedGit(retryArgs, {
55
59
  cwd,
56
- stdio: capture ? "pipe" : "inherit",
57
- encoding: "utf8"
60
+ mode: "mutate",
61
+ allowFailure: true
58
62
  });
63
+ if (!capture && retry.stdout.trim()) process.stdout.write(retry.stdout);
64
+ if (!capture && retry.stderr.trim()) process.stderr.write(retry.stderr);
59
65
  if (retry.status === 0) return retry;
60
66
  const retryDetail = retry.stderr?.trim() || retry.stdout?.trim();
61
67
  throw new Error(`git ${retryArgs.join(" ")} failed${retryDetail ? `: ${retryDetail}` : ""}`);
@@ -65,14 +71,6 @@ function runGit(args, { cwd, allowFailure = false, capture = true } = {}) {
65
71
  }
66
72
  return result;
67
73
  }
68
- function sleepSeconds(seconds) {
69
- if (!Number.isFinite(seconds) || seconds <= 0) {
70
- return;
71
- }
72
- spawnSync("sleep", [String(seconds)], {
73
- stdio: "ignore"
74
- });
75
- }
76
74
  function resolveGitHubRemoteUrls(owner, name) {
77
75
  const normalizedOwner = slugifySegment(owner, "owner");
78
76
  const normalizedName = slugifySegment(name, "repo");
@@ -185,8 +183,7 @@ async function ensureGitHubBootstrapRepository(tenantRoot, {
185
183
  onProgress?.(`[local][github][repo] Preparing ${slug} from ${target.source}...`);
186
184
  const client = createGitHubApiClient({
187
185
  env: {
188
- GH_TOKEN: configuredValue(values, "GH_TOKEN") || configuredValue(values, "GITHUB_TOKEN"),
189
- GITHUB_TOKEN: configuredValue(values, "GH_TOKEN") || configuredValue(values, "GITHUB_TOKEN")
186
+ TREESEED_GITHUB_TOKEN: resolveTreeseedGitHubToken(values)
190
187
  }
191
188
  });
192
189
  const existing = await maybeGetGitHubRepository({ owner: target.owner, name: target.name }, { client });
@@ -295,7 +292,7 @@ function renderTenantWorkflowActionCommand() {
295
292
  'if [[ -n "${TREESEED_WORKFLOW_PROJECT:-}" ]]; then EXTRA_ARGS+=(--project-id "${TREESEED_WORKFLOW_PROJECT}"); fi',
296
293
  'if [[ -n "${TREESEED_WORKFLOW_PREVIEW_ID:-}" ]]; then EXTRA_ARGS+=(--preview-id "${TREESEED_WORKFLOW_PREVIEW_ID}"); fi',
297
294
  "if test -f ./packages/sdk/scripts/tenant-workflow-action.ts; then",
298
- ' node ./packages/sdk/scripts/run-ts.mjs ./packages/sdk/scripts/tenant-workflow-action.ts --action "${TREESEED_WORKFLOW_ACTION}" --environment "${TREESEED_WORKFLOW_ENVIRONMENT}" "${EXTRA_ARGS[@]}"',
295
+ ' tsx ./packages/sdk/scripts/tenant-workflow-action.ts --action "${TREESEED_WORKFLOW_ACTION}" --environment "${TREESEED_WORKFLOW_ENVIRONMENT}" "${EXTRA_ARGS[@]}"',
299
296
  "elif test -f ./node_modules/@treeseed/sdk/dist/scripts/tenant-workflow-action.js; then",
300
297
  ' node ./node_modules/@treeseed/sdk/dist/scripts/tenant-workflow-action.js --action "${TREESEED_WORKFLOW_ACTION}" --environment "${TREESEED_WORKFLOW_ENVIRONMENT}" "${EXTRA_ARGS[@]}"',
301
298
  "else",
@@ -358,7 +355,7 @@ function ensureStandardizedGitHubWorkflows(tenantRoot) {
358
355
  const deployConfig = loadCliDeployConfig(tenantRoot);
359
356
  const deploy = ensureDeployWorkflow(tenantRoot);
360
357
  const workflows = [deploy, ...deploy.additionalWorkflows ?? []];
361
- if ((deployConfig.hosting?.kind ?? "self_hosted_project") === "market_control_plane") {
358
+ if ((deployConfig.hosting?.kind ?? "self_hosted_project") === "treeseed_control_plane") {
362
359
  workflows.push(ensureHostedProjectWorkflow(tenantRoot));
363
360
  }
364
361
  return workflows;
@@ -477,11 +474,12 @@ async function waitForGitHubWorkflowCompletion(tenantRoot, {
477
474
  dispatchIfMissing = false,
478
475
  dispatchAfterSeconds,
479
476
  dispatchInputs,
480
- onProgress
477
+ onProgress,
478
+ env
481
479
  } = {}) {
482
480
  const repo = repository ?? resolveGitHubRepositorySlug(tenantRoot);
483
481
  return await waitForGitHubWorkflowRunCompletion(repo, {
484
- client: createGitHubApiClient(),
482
+ client: createGitHubApiClient({ env }),
485
483
  workflow,
486
484
  headSha,
487
485
  branch,