@treeseed/sdk 0.11.0 → 0.12.5

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 (473) hide show
  1. package/README.md +9 -4
  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 +117 -60
  27. package/dist/capacity-provider.js +215 -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 +2 -2
  36. package/dist/copilot.d.ts +3 -0
  37. package/dist/copilot.js +16 -1
  38. package/dist/d1-http.d.ts +1 -1
  39. package/dist/d1-store.d.ts +32 -57
  40. package/dist/d1-store.js +115 -318
  41. package/dist/db/d1.d.ts +1 -232
  42. package/dist/db/index.d.ts +3 -3
  43. package/dist/db/market-schema.d.ts +49037 -11843
  44. package/dist/db/market-schema.js +1788 -50
  45. package/dist/db/node-sqlite.d.ts +1 -232
  46. package/dist/db/schema.d.ts +0 -462
  47. package/dist/db/schema.js +2 -22
  48. package/dist/dispatch.d.ts +1 -1
  49. package/dist/dispatch.js +0 -11
  50. package/dist/fixture-support.js +52 -4
  51. package/dist/governance.d.ts +133 -0
  52. package/dist/governance.js +285 -0
  53. package/dist/graph/build.d.ts +2 -2
  54. package/dist/graph/context-query-contracts.d.ts +1 -1
  55. package/dist/graph/dsl.d.ts +1 -1
  56. package/dist/graph/query.d.ts +4 -4
  57. package/dist/graph/ranking.d.ts +1 -1
  58. package/dist/graph/schema.d.ts +1 -1
  59. package/dist/graph.d.ts +11 -11
  60. package/dist/guarantees/index.d.ts +425 -0
  61. package/dist/guarantees/index.js +1146 -0
  62. package/dist/hosting/apps.d.ts +1 -1
  63. package/dist/hosting/builtins.d.ts +1 -1
  64. package/dist/hosting/builtins.js +9 -198
  65. package/dist/hosting/contracts.d.ts +3 -2
  66. package/dist/hosting/graph.d.ts +24 -21
  67. package/dist/hosting/graph.js +280 -294
  68. package/dist/hosting/index.d.ts +4 -4
  69. package/dist/index.d.ts +88 -74
  70. package/dist/index.js +81 -10
  71. package/dist/local-dev/managed-dev.d.ts +85 -0
  72. package/dist/local-dev/managed-dev.js +368 -0
  73. package/dist/managed-dependencies.d.ts +9 -0
  74. package/dist/managed-dependencies.js +10 -8
  75. package/dist/market-client.d.ts +265 -7
  76. package/dist/market-client.js +381 -9
  77. package/dist/model-registry.d.ts +1 -1
  78. package/dist/model-registry.js +19 -19
  79. package/dist/operations/agent-tools.d.ts +2 -11
  80. package/dist/operations/agent-tools.js +2 -14
  81. package/dist/operations/providers/default.d.ts +1 -1
  82. package/dist/operations/providers/default.js +20 -37
  83. package/dist/operations/repository-operations.d.ts +26 -2
  84. package/dist/operations/repository-operations.js +159 -1
  85. package/dist/operations/runtime.d.ts +3 -3
  86. package/dist/operations/services/bootstrap-runner.d.ts +1 -1
  87. package/dist/operations/services/build-warning-policy.d.ts +34 -0
  88. package/dist/operations/services/build-warning-policy.js +81 -82
  89. package/dist/operations/services/commit-message-provider.js +4 -4
  90. package/dist/operations/services/config-runtime.d.ts +73 -19
  91. package/dist/operations/services/config-runtime.js +276 -100
  92. package/dist/operations/services/deploy.d.ts +41 -622
  93. package/dist/operations/services/deploy.js +181 -213
  94. package/dist/operations/services/deployment-readiness.d.ts +1 -1
  95. package/dist/operations/services/deployment-readiness.js +38 -7
  96. package/dist/operations/services/git-remote-policy.js +12 -4
  97. package/dist/operations/services/git-runner.d.ts +66 -0
  98. package/dist/operations/services/git-runner.js +479 -0
  99. package/dist/operations/services/git-workflow.d.ts +43 -5
  100. package/dist/operations/services/git-workflow.js +242 -20
  101. package/dist/operations/services/github-actions-verification.d.ts +3 -1
  102. package/dist/operations/services/github-actions-verification.js +11 -3
  103. package/dist/operations/services/github-api.js +21 -5
  104. package/dist/operations/services/github-automation.d.ts +3 -3
  105. package/dist/operations/services/github-automation.js +15 -18
  106. package/dist/operations/services/github-credentials.js +2 -1
  107. package/dist/operations/services/hosted-service-checks.d.ts +19 -1
  108. package/dist/operations/services/hosted-service-checks.js +162 -11
  109. package/dist/operations/services/hosting-audit.d.ts +2 -2
  110. package/dist/operations/services/hosting-audit.js +7 -7
  111. package/dist/operations/services/hub-launch.d.ts +1 -1
  112. package/dist/operations/services/hub-provider-launch.d.ts +5 -5
  113. package/dist/operations/services/hub-provider-launch.js +19 -14
  114. package/dist/operations/services/live-hosted-service-checks.d.ts +2 -1
  115. package/dist/operations/services/live-hosted-service-checks.js +193 -80
  116. package/dist/operations/services/local-dev.js +0 -1
  117. package/dist/operations/services/managed-host-security.d.ts +1 -1
  118. package/dist/operations/services/managed-repositories.d.ts +37 -0
  119. package/dist/operations/services/managed-repositories.js +177 -0
  120. package/dist/operations/services/operations-runner-smoke.d.ts +3 -2
  121. package/dist/operations/services/operations-runner-smoke.js +22 -4
  122. package/dist/operations/services/package-adapters.d.ts +77 -2
  123. package/dist/operations/services/package-adapters.js +629 -56
  124. package/dist/operations/services/package-reference-policy.d.ts +12 -88
  125. package/dist/operations/services/package-reference-policy.js +81 -213
  126. package/dist/operations/services/project-host-operations.d.ts +4 -4
  127. package/dist/operations/services/project-platform.d.ts +19 -193
  128. package/dist/operations/services/project-platform.js +31 -103
  129. package/dist/operations/services/project-web-monitor.d.ts +2 -2
  130. package/dist/operations/services/project-web-monitor.js +97 -2
  131. package/dist/operations/services/railway-api.d.ts +36 -7
  132. package/dist/operations/services/railway-api.js +331 -100
  133. package/dist/operations/services/railway-deploy.d.ts +7 -95
  134. package/dist/operations/services/railway-deploy.js +334 -742
  135. package/dist/operations/services/release-history.js +3 -4
  136. package/dist/operations/services/release-proof-ledger.d.ts +13 -0
  137. package/dist/operations/services/release-proof-ledger.js +81 -0
  138. package/dist/operations/services/release-proof-planner.d.ts +48 -0
  139. package/dist/operations/services/release-proof-planner.js +195 -0
  140. package/dist/operations/services/release-proof-runner.d.ts +16 -0
  141. package/dist/operations/services/release-proof-runner.js +169 -0
  142. package/dist/operations/services/release-proof.d.ts +81 -0
  143. package/dist/operations/services/release-proof.js +79 -0
  144. package/dist/operations/services/repository-save-orchestrator.d.ts +6 -7
  145. package/dist/operations/services/repository-save-orchestrator.js +353 -174
  146. package/dist/operations/services/runtime-paths.d.ts +1 -3
  147. package/dist/operations/services/runtime-paths.js +0 -4
  148. package/dist/operations/services/runtime-tools.d.ts +1 -192
  149. package/dist/operations/services/runtime-tools.js +4 -444
  150. package/dist/operations/services/save-deploy-preflight.js +9 -1
  151. package/dist/operations/services/template-host-bindings.d.ts +2 -2
  152. package/dist/operations/services/template-host-bindings.js +3 -2
  153. package/dist/operations/services/template-registry.d.ts +6 -6
  154. package/dist/operations/services/template-registry.js +33 -14
  155. package/dist/operations/services/template-secret-sync.d.ts +3 -3
  156. package/dist/operations/services/workflow-timing.d.ts +25 -0
  157. package/dist/operations/services/workflow-timing.js +79 -0
  158. package/dist/operations/services/workspace-dependency-mode.js +41 -4
  159. package/dist/operations/services/workspace-preflight.js +8 -8
  160. package/dist/operations/services/workspace-save-script.d.ts +4 -4
  161. package/dist/operations/services/workspace-save.d.ts +1 -0
  162. package/dist/operations/services/workspace-save.js +41 -18
  163. package/dist/operations/services/workspace-tools.js +40 -6
  164. package/dist/operations-registry.d.ts +1 -1
  165. package/dist/operations-registry.js +5 -6
  166. package/dist/operations-types.d.ts +1 -1
  167. package/dist/operations.d.ts +17 -11
  168. package/dist/operations.js +57 -3
  169. package/dist/platform/book-export.js +2 -0
  170. package/dist/platform/books-data.d.ts +1 -1
  171. package/dist/platform/config.d.ts +27 -0
  172. package/dist/platform/config.js +100 -0
  173. package/dist/platform/content-runtime-source.d.ts +54 -0
  174. package/dist/platform/content-runtime-source.js +169 -0
  175. package/dist/platform/contracts.d.ts +6 -1
  176. package/dist/platform/deploy-config.d.ts +1 -1
  177. package/dist/platform/deploy-config.js +7 -1
  178. package/dist/platform/deploy-runtime.d.ts +1 -1
  179. package/dist/platform/desired-state.d.ts +66 -0
  180. package/dist/platform/desired-state.js +1052 -0
  181. package/dist/platform/env.yaml +414 -19
  182. package/dist/platform/environment.d.ts +2 -2
  183. package/dist/platform/environment.js +54 -22
  184. package/dist/platform/local-content-materialization.d.ts +9 -0
  185. package/dist/platform/local-content-materialization.js +212 -0
  186. package/dist/platform/plugin.d.ts +5 -5
  187. package/dist/platform/plugins/runtime.d.ts +3 -3
  188. package/dist/platform/plugins/runtime.js +62 -1
  189. package/dist/platform/plugins.d.ts +6 -6
  190. package/dist/platform/published-content-pipeline.d.ts +3 -3
  191. package/dist/platform/published-content-pipeline.js +5 -1
  192. package/dist/platform/published-content.d.ts +4 -3
  193. package/dist/platform/site-config-schema.d.ts +1 -0
  194. package/dist/platform/site-config-schema.js +4 -1
  195. package/dist/platform/tenant/runtime-config.d.ts +152 -2
  196. package/dist/platform/tenant-config.d.ts +1 -1
  197. package/dist/platform/utils/site-config-schema.d.ts +154 -0
  198. package/dist/platform/utils/site-config-schema.js +400 -461
  199. package/dist/platform-operation-store.d.ts +1 -1
  200. package/dist/plugin-default.d.ts +1 -1
  201. package/dist/plugin-default.js +27 -12
  202. package/dist/project-import.d.ts +91 -0
  203. package/dist/project-import.js +257 -0
  204. package/dist/project-workflow.d.ts +1 -1
  205. package/dist/reconcile/bootstrap-systems.d.ts +2 -2
  206. package/dist/reconcile/bootstrap-systems.js +3 -3
  207. package/dist/reconcile/builtin-adapters.d.ts +7 -1
  208. package/dist/reconcile/builtin-adapters.js +2924 -346
  209. package/dist/reconcile/contracts.d.ts +15 -2
  210. package/dist/reconcile/desired-state.d.ts +2 -193
  211. package/dist/reconcile/desired-state.js +24 -33
  212. package/dist/reconcile/engine.d.ts +60 -397
  213. package/dist/reconcile/engine.js +182 -18
  214. package/dist/reconcile/index.d.ts +10 -10
  215. package/dist/reconcile/live-acceptance.d.ts +22 -1
  216. package/dist/reconcile/live-acceptance.js +456 -44
  217. package/dist/reconcile/providers/docker-private.d.ts +54 -0
  218. package/dist/reconcile/providers/docker-private.js +101 -0
  219. package/dist/reconcile/providers/github-private.d.ts +65 -0
  220. package/dist/reconcile/providers/github-private.js +119 -0
  221. package/dist/reconcile/providers/local-private.d.ts +28 -0
  222. package/dist/reconcile/providers/local-private.js +75 -0
  223. package/dist/reconcile/providers/railway-iac.d.ts +66 -0
  224. package/dist/reconcile/providers/railway-iac.js +275 -0
  225. package/dist/reconcile/providers/release-private.d.ts +92 -0
  226. package/dist/reconcile/providers/release-private.js +152 -0
  227. package/dist/reconcile/registry.d.ts +2 -2
  228. package/dist/reconcile/registry.js +16 -1
  229. package/dist/reconcile/state.d.ts +1 -1
  230. package/dist/reconcile/state.js +3 -40
  231. package/dist/reconcile/units.d.ts +1 -1
  232. package/dist/reconcile/units.js +7 -1
  233. package/dist/remote.d.ts +6 -6
  234. package/dist/scenes/artifacts.d.ts +16 -0
  235. package/dist/scenes/artifacts.js +61 -0
  236. package/dist/scenes/auth.d.ts +2 -0
  237. package/dist/scenes/auth.js +28 -0
  238. package/dist/scenes/base-url.d.ts +12 -0
  239. package/dist/scenes/base-url.js +123 -0
  240. package/dist/scenes/builtin-plugins.d.ts +2 -0
  241. package/dist/scenes/builtin-plugins.js +447 -0
  242. package/dist/scenes/checkpoints.d.ts +14 -0
  243. package/dist/scenes/checkpoints.js +33 -0
  244. package/dist/scenes/device-matrix.d.ts +2 -0
  245. package/dist/scenes/device-matrix.js +97 -0
  246. package/dist/scenes/devices.d.ts +11 -0
  247. package/dist/scenes/devices.js +22 -0
  248. package/dist/scenes/diagnostics.d.ts +5 -0
  249. package/dist/scenes/diagnostics.js +22 -0
  250. package/dist/scenes/diagram-providers.d.ts +2 -0
  251. package/dist/scenes/diagram-providers.js +181 -0
  252. package/dist/scenes/diagram-validation.d.ts +22 -0
  253. package/dist/scenes/diagram-validation.js +74 -0
  254. package/dist/scenes/environment.d.ts +2 -0
  255. package/dist/scenes/environment.js +65 -0
  256. package/dist/scenes/evidence-bundle.d.ts +5 -0
  257. package/dist/scenes/evidence-bundle.js +42 -0
  258. package/dist/scenes/evidence-report.d.ts +10 -0
  259. package/dist/scenes/evidence-report.js +73 -0
  260. package/dist/scenes/evidence.d.ts +16 -0
  261. package/dist/scenes/evidence.js +277 -0
  262. package/dist/scenes/index.d.ts +48 -0
  263. package/dist/scenes/index.js +312 -0
  264. package/dist/scenes/inspect.d.ts +9 -0
  265. package/dist/scenes/inspect.js +64 -0
  266. package/dist/scenes/loader.d.ts +3 -0
  267. package/dist/scenes/loader.js +38 -0
  268. package/dist/scenes/logs.d.ts +2 -0
  269. package/dist/scenes/logs.js +47 -0
  270. package/dist/scenes/operations.d.ts +3 -0
  271. package/dist/scenes/operations.js +128 -0
  272. package/dist/scenes/phase0.d.ts +9 -0
  273. package/dist/scenes/phase0.js +637 -0
  274. package/dist/scenes/planner.d.ts +12 -0
  275. package/dist/scenes/planner.js +166 -0
  276. package/dist/scenes/playwright-adapter.d.ts +2 -0
  277. package/dist/scenes/playwright-adapter.js +63 -0
  278. package/dist/scenes/plugins.d.ts +5 -0
  279. package/dist/scenes/plugins.js +115 -0
  280. package/dist/scenes/progress.d.ts +17 -0
  281. package/dist/scenes/progress.js +24 -0
  282. package/dist/scenes/publish-destinations.d.ts +12 -0
  283. package/dist/scenes/publish-destinations.js +99 -0
  284. package/dist/scenes/publish-plan-report.d.ts +10 -0
  285. package/dist/scenes/publish-plan-report.js +70 -0
  286. package/dist/scenes/publish-plan.d.ts +15 -0
  287. package/dist/scenes/publish-plan.js +248 -0
  288. package/dist/scenes/publish-redaction.d.ts +16 -0
  289. package/dist/scenes/publish-redaction.js +148 -0
  290. package/dist/scenes/publish-release-record.d.ts +13 -0
  291. package/dist/scenes/publish-release-record.js +34 -0
  292. package/dist/scenes/publish-report.d.ts +10 -0
  293. package/dist/scenes/publish-report.js +67 -0
  294. package/dist/scenes/publish.d.ts +16 -0
  295. package/dist/scenes/publish.js +298 -0
  296. package/dist/scenes/registry.d.ts +12 -0
  297. package/dist/scenes/registry.js +65 -0
  298. package/dist/scenes/remotion-adapter.d.ts +3 -0
  299. package/dist/scenes/remotion-adapter.js +94 -0
  300. package/dist/scenes/remotion-composition-registry.d.ts +2 -0
  301. package/dist/scenes/remotion-composition-registry.js +12 -0
  302. package/dist/scenes/remotion-compositions.d.ts +15 -0
  303. package/dist/scenes/remotion-compositions.js +464 -0
  304. package/dist/scenes/remotion-diagrams.d.ts +9 -0
  305. package/dist/scenes/remotion-diagrams.js +188 -0
  306. package/dist/scenes/remotion-input.d.ts +13 -0
  307. package/dist/scenes/remotion-input.js +291 -0
  308. package/dist/scenes/remotion-visuals.d.ts +29 -0
  309. package/dist/scenes/remotion-visuals.js +198 -0
  310. package/dist/scenes/render-media-assets.d.ts +9 -0
  311. package/dist/scenes/render-media-assets.js +117 -0
  312. package/dist/scenes/render-report.d.ts +10 -0
  313. package/dist/scenes/render-report.js +27 -0
  314. package/dist/scenes/render.d.ts +2 -0
  315. package/dist/scenes/render.js +218 -0
  316. package/dist/scenes/reporter.d.ts +3 -0
  317. package/dist/scenes/reporter.js +101 -0
  318. package/dist/scenes/resume.d.ts +2 -0
  319. package/dist/scenes/resume.js +79 -0
  320. package/dist/scenes/runner.d.ts +2 -0
  321. package/dist/scenes/runner.js +674 -0
  322. package/dist/scenes/schema.d.ts +6 -0
  323. package/dist/scenes/schema.js +994 -0
  324. package/dist/scenes/seed.d.ts +2 -0
  325. package/dist/scenes/seed.js +83 -0
  326. package/dist/scenes/segments.d.ts +15 -0
  327. package/dist/scenes/segments.js +79 -0
  328. package/dist/scenes/selectors.d.ts +3 -0
  329. package/dist/scenes/selectors.js +21 -0
  330. package/dist/scenes/timeline.d.ts +11 -0
  331. package/dist/scenes/timeline.js +26 -0
  332. package/dist/scenes/timeouts.d.ts +6 -0
  333. package/dist/scenes/timeouts.js +17 -0
  334. package/dist/scenes/training-captions.d.ts +14 -0
  335. package/dist/scenes/training-captions.js +98 -0
  336. package/dist/scenes/training-report.d.ts +10 -0
  337. package/dist/scenes/training-report.js +78 -0
  338. package/dist/scenes/training-transcript.d.ts +24 -0
  339. package/dist/scenes/training-transcript.js +204 -0
  340. package/dist/scenes/training.d.ts +10 -0
  341. package/dist/scenes/training.js +134 -0
  342. package/dist/scenes/types.d.ts +1872 -0
  343. package/dist/scenes/types.js +8 -0
  344. package/dist/scenes/visual-audit-contact-sheets.d.ts +6 -0
  345. package/dist/scenes/visual-audit-contact-sheets.js +119 -0
  346. package/dist/scenes/visual-audit-fixtures.d.ts +25 -0
  347. package/dist/scenes/visual-audit-fixtures.js +210 -0
  348. package/dist/scenes/visual-audit-report.d.ts +11 -0
  349. package/dist/scenes/visual-audit-report.js +85 -0
  350. package/dist/scenes/visual-audit-review.d.ts +23 -0
  351. package/dist/scenes/visual-audit-review.js +829 -0
  352. package/dist/scenes/visual-audit-routes.d.ts +13 -0
  353. package/dist/scenes/visual-audit-routes.js +308 -0
  354. package/dist/scenes/visual-audit.d.ts +3 -0
  355. package/dist/scenes/visual-audit.js +596 -0
  356. package/dist/scripts/build-dist.js +154 -40
  357. package/dist/scripts/check-build-warnings.js +42 -53
  358. package/dist/scripts/cleanup-markdown.js +1 -1
  359. package/dist/scripts/cli-test-fixtures.js +24 -28
  360. package/dist/scripts/migrate-journey-csv-to-guarantees.js +140 -0
  361. package/dist/scripts/package-tools.js +12 -1
  362. package/dist/scripts/prepare.js +3 -7
  363. package/dist/scripts/release-verify.js +2 -5
  364. package/dist/scripts/run-fixture-astro-command.js +1 -1
  365. package/dist/scripts/template-catalog.test.js +68 -82
  366. package/dist/scripts/tenant-dev.js +0 -10
  367. package/dist/scripts/test-cloudflare-local.js +1 -1
  368. package/dist/scripts/test-scaffold.js +0 -1
  369. package/dist/scripts/test-smoke.js +3 -3
  370. package/dist/scripts/treeseed-build-dist.js +4 -7
  371. package/dist/scripts/treeseed-release-verify.js +1 -1
  372. package/dist/scripts/verify-driver.js +30 -21
  373. package/dist/scripts/workflow-commands.test.js +18 -27
  374. package/dist/scripts/workspace-command-e2e.js +1 -1
  375. package/dist/scripts/workspace-lint.js +6 -0
  376. package/dist/scripts/workspace-release-test.js +90 -1
  377. package/dist/scripts/workspace-test.js +6 -0
  378. package/dist/sdk-dispatch.d.ts +1 -1
  379. package/dist/sdk-dispatch.js +0 -16
  380. package/dist/sdk-fields.d.ts +1 -1
  381. package/dist/sdk-filters.d.ts +1 -1
  382. package/dist/sdk-types.d.ts +1184 -113
  383. package/dist/sdk-types.js +393 -0
  384. package/dist/sdk.d.ts +74 -79
  385. package/dist/sdk.js +27 -36
  386. package/dist/secrets-capability.d.ts +421 -0
  387. package/dist/secrets-capability.js +530 -0
  388. package/dist/seeds/normalize.js +1 -0
  389. package/dist/seeds/planner.js +38 -0
  390. package/dist/seeds/schema.js +293 -4
  391. package/dist/seeds/types.d.ts +60 -0
  392. package/dist/seeds/types.js +9 -1
  393. package/dist/service-credentials.d.ts +54 -0
  394. package/dist/service-credentials.js +112 -0
  395. package/dist/stores/cursor-store.d.ts +2 -2
  396. package/dist/stores/envelopes.d.ts +1 -1
  397. package/dist/stores/helpers.d.ts +1 -1
  398. package/dist/stores/lease-store.d.ts +2 -2
  399. package/dist/stores/message-store.d.ts +2 -2
  400. package/dist/stores/operational-store.d.ts +3 -26
  401. package/dist/stores/operational-store.js +0 -225
  402. package/dist/stores/project-workflow-store.d.ts +2 -2
  403. package/dist/stores/run-store.d.ts +2 -3
  404. package/dist/stores/run-store.js +0 -98
  405. package/dist/stores/subscription-store.d.ts +2 -3
  406. package/dist/stores/subscription-store.js +0 -100
  407. package/dist/template-catalog.d.ts +1 -1
  408. package/dist/template-launch-requirements.d.ts +2 -2
  409. package/dist/template-launch-ui.d.ts +2 -2
  410. package/dist/treedx/adapters.d.ts +6 -6
  411. package/dist/treedx/client.d.ts +1 -1
  412. package/dist/treedx/errors.d.ts +1 -1
  413. package/dist/treedx/federated-client.d.ts +3 -3
  414. package/dist/treedx/graph-adapter.d.ts +2 -2
  415. package/dist/treedx/index.d.ts +14 -14
  416. package/dist/treedx/market-integration.d.ts +1 -1
  417. package/dist/treedx/ports.d.ts +30 -30
  418. package/dist/treedx/query-adapter.d.ts +3 -3
  419. package/dist/treedx/registry-client.d.ts +2 -2
  420. package/dist/treedx/repository-adapter.d.ts +4 -4
  421. package/dist/treedx/repository-adapter.js +14 -3
  422. package/dist/treedx/sdk-integration.d.ts +3 -3
  423. package/dist/treedx/types.d.ts +2 -2
  424. package/dist/treedx/workspace-adapter.d.ts +2 -2
  425. package/dist/treedx-backends.d.ts +13 -11
  426. package/dist/treedx-backends.js +52 -50
  427. package/dist/treedx-client.d.ts +3 -0
  428. package/dist/treedx-client.js +10 -1
  429. package/dist/treeseed/services/compose.yml +2 -3
  430. package/dist/treeseed/template-catalog/catalog.fixture.json +4 -4
  431. package/dist/types/agents.d.ts +256 -0
  432. package/dist/types/agents.js +42 -1
  433. package/dist/verification.d.ts +1 -0
  434. package/dist/verification.js +143 -14
  435. package/dist/workflow/operations.d.ts +510 -559
  436. package/dist/workflow/operations.js +1891 -1342
  437. package/dist/workflow/policy.js +19 -7
  438. package/dist/workflow/runs.d.ts +9 -3
  439. package/dist/workflow/runs.js +66 -26
  440. package/dist/workflow/session.d.ts +4 -1
  441. package/dist/workflow/session.js +50 -10
  442. package/dist/workflow/worktrees.d.ts +6 -2
  443. package/dist/workflow/worktrees.js +98 -15
  444. package/dist/workflow-state.d.ts +5 -5
  445. package/dist/workflow-state.js +27 -17
  446. package/dist/workflow-support.d.ts +26 -25
  447. package/dist/workflow-support.js +27 -31
  448. package/dist/workflow.d.ts +46 -16
  449. package/dist/workflow.js +19 -7
  450. package/drizzle/d1/0000_treeseed_d1.sql +0 -18
  451. package/drizzle/market/0000_market_control_plane.sql +1793 -1499
  452. package/drizzle/market/0005_agent_capacity_coordination.sql +145 -0
  453. package/drizzle/market/0006_provider_assignment_lifecycle.sql +9 -0
  454. package/drizzle/market/0007_agent_architecture_gap_closure.sql +157 -0
  455. package/drizzle/market/0008_agent_capacity_operational_closure.sql +27 -0
  456. package/drizzle/market/0009_agent_capacity_runtime_hardening.sql +29 -0
  457. package/drizzle/market/0010_secrets_capability_persistence.sql +130 -0
  458. package/drizzle/market/0011_github_app_adapter.sql +47 -0
  459. package/drizzle/market/0012_workday_test_runs.sql +44 -0
  460. package/drizzle/market/0013_runtime_task_lifecycle.sql +39 -0
  461. package/drizzle/market/0014_governance_pipeline.sql +189 -0
  462. package/package.json +75 -18
  463. package/scripts/{verify-driver.mjs → verify-driver.ts} +19 -4
  464. package/templates/github/deploy-web.workflow.yml +12 -8
  465. package/dist/operations/services/mailpit-runtime.d.ts +0 -20
  466. package/dist/operations/services/mailpit-runtime.js +0 -67
  467. package/dist/operations/services/release-candidate.d.ts +0 -60
  468. package/dist/operations/services/release-candidate.js +0 -953
  469. package/dist/scripts/ensure-mailpit.js +0 -48
  470. package/dist/scripts/logs-mailpit.js +0 -2
  471. package/dist/scripts/run-ts.js +0 -45
  472. package/dist/scripts/stop-mailpit.js +0 -5
  473. package/dist/scripts/treeseed-run-ts.js +0 -45
@@ -1,6 +1,8 @@
1
- import { findNearestTreeseedRoot, run } from "../operations/services/workspace-tools.js";
1
+ import { relative } from "node:path";
2
+ import { findNearestTreeseedRoot } from "../operations/services/workspace-tools.js";
2
3
  import { currentBranch, repoRoot } from "../operations/services/workspace-save.js";
3
4
  import { PRODUCTION_BRANCH, STAGING_BRANCH } from "../operations/services/git-workflow.js";
5
+ import { runTreeseedGitOk } from "../operations/services/git-runner.js";
4
6
  function safeRepoRoot(cwd) {
5
7
  try {
6
8
  return repoRoot(cwd);
@@ -9,12 +11,12 @@ function safeRepoRoot(cwd) {
9
11
  }
10
12
  }
11
13
  function repoHasHead(repoDir) {
12
- try {
13
- run("git", ["rev-parse", "--verify", "HEAD"], { cwd: repoDir, capture: true });
14
- return true;
15
- } catch {
16
- return false;
17
- }
14
+ return runTreeseedGitOk(["rev-parse", "--verify", "HEAD"], { cwd: repoDir, mode: "read" });
15
+ }
16
+ function isInsideUnresolvedManagedWorktree(startCwd, tenantRoot) {
17
+ if (!tenantRoot) return false;
18
+ const relativePath = relative(tenantRoot, startCwd).replaceAll("\\", "/");
19
+ return relativePath === ".treeseed/worktrees" || relativePath.startsWith(".treeseed/worktrees/");
18
20
  }
19
21
  function classifyTreeseedBranchRole(branchName, repoDir) {
20
22
  if (!repoDir) {
@@ -33,6 +35,16 @@ function classifyTreeseedBranchRole(branchName, repoDir) {
33
35
  }
34
36
  function resolveTreeseedWorkflowPaths(startCwd) {
35
37
  const tenantRoot = findNearestTreeseedRoot(startCwd);
38
+ if (isInsideUnresolvedManagedWorktree(startCwd, tenantRoot)) {
39
+ return {
40
+ requestedCwd: startCwd,
41
+ tenantRoot: null,
42
+ cwd: startCwd,
43
+ repoRoot: null,
44
+ branchName: null,
45
+ branchRole: "none"
46
+ };
47
+ }
36
48
  const cwd = tenantRoot ?? startCwd;
37
49
  const gitRoot = safeRepoRoot(cwd);
38
50
  const branchName = gitRoot ? currentBranch(gitRoot) || null : null;
@@ -1,6 +1,7 @@
1
- import type { TreeseedWorkflowMode } from './session.ts';
2
- export type TreeseedWorkflowRunCommand = 'switch' | 'save' | 'close' | 'stage' | 'release' | 'destroy';
1
+ import type { TreeseedWorkflowMode } from './session.js';
2
+ export type TreeseedWorkflowRunCommand = 'switch' | 'save' | 'update' | 'close' | 'stage' | 'release' | 'destroy';
3
3
  export type TreeseedWorkflowExecutionMode = 'execute' | 'plan';
4
+ export type TreeseedWorkflowLockScope = 'worktree' | 'shared';
4
5
  export type TreeseedWorkflowRunStatus = 'running' | 'failed' | 'completed';
5
6
  export type TreeseedWorkflowRunClassificationState = 'resumable' | 'stale' | 'obsolete';
6
7
  export type TreeseedWorkflowRunClassification = {
@@ -67,6 +68,7 @@ export type TreeseedWorkflowRunJournal = {
67
68
  export type TreeseedWorkflowLockRecord = {
68
69
  schemaVersion: 1;
69
70
  kind: 'treeseed.workflow.lock';
71
+ scope?: TreeseedWorkflowLockScope;
70
72
  runId: string;
71
73
  command: TreeseedWorkflowRunCommand;
72
74
  root: string;
@@ -83,8 +85,12 @@ export type TreeseedWorkflowLockInspection = {
83
85
  stale: boolean;
84
86
  staleReason: string | null;
85
87
  };
88
+ export declare function workflowLockScopeForCommand(command: TreeseedWorkflowRunCommand): TreeseedWorkflowLockScope;
89
+ export declare function isSharedWorkflowCommand(command?: string | null): command is TreeseedWorkflowRunCommand;
86
90
  export declare function generateWorkflowRunId(command: TreeseedWorkflowRunCommand): string;
87
- export declare function inspectWorkflowLock(root: string): TreeseedWorkflowLockInspection;
91
+ export declare function inspectWorkflowLock(root: string, options?: {
92
+ scope?: TreeseedWorkflowLockScope;
93
+ }): TreeseedWorkflowLockInspection;
88
94
  export declare function acquireWorkflowLock(root: string, command: TreeseedWorkflowRunCommand, runId: string): {
89
95
  readonly acquired: false;
90
96
  readonly lock: TreeseedWorkflowLockRecord;
@@ -6,6 +6,7 @@ const WORKFLOW_RUNS_DIR = `${WORKFLOW_CONTROL_DIR}/runs`;
6
6
  const WORKTREE_METADATA_PATH = ".treeseed/worktree.json";
7
7
  const LOCK_STALE_AFTER_MS = 4 * 60 * 60 * 1e3;
8
8
  const WORKFLOW_RUN_STORAGE_ROOTS = /* @__PURE__ */ new Map();
9
+ const SHARED_LOCK_COMMANDS = /* @__PURE__ */ new Set(["stage", "release"]);
9
10
  function nowIso() {
10
11
  return (/* @__PURE__ */ new Date()).toISOString();
11
12
  }
@@ -19,24 +20,41 @@ function managedWorktreePrimaryRoot(root) {
19
20
  return null;
20
21
  }
21
22
  }
22
- function workflowStorageRoot(root, runId) {
23
- if (runId && WORKFLOW_RUN_STORAGE_ROOTS.has(runId)) {
24
- return WORKFLOW_RUN_STORAGE_ROOTS.get(runId);
23
+ function workflowLockScopeForCommand(command) {
24
+ return SHARED_LOCK_COMMANDS.has(command) ? "shared" : "worktree";
25
+ }
26
+ function isSharedWorkflowCommand(command) {
27
+ return command === "stage" || command === "release";
28
+ }
29
+ function workflowCommandFromRunId(runId) {
30
+ if (!runId) return null;
31
+ const prefix = runId.split("-", 1)[0];
32
+ return ["switch", "save", "update", "close", "stage", "release", "destroy"].includes(prefix) ? prefix : null;
33
+ }
34
+ function workflowStorageRootForScope(root, scope) {
35
+ return scope === "shared" ? managedWorktreePrimaryRoot(root) ?? root : root;
36
+ }
37
+ function workflowStorageRoot(root, runId, scope) {
38
+ const storageKey = runId ? `${resolve(root)}\0${runId}` : null;
39
+ if (storageKey && WORKFLOW_RUN_STORAGE_ROOTS.has(storageKey)) {
40
+ return WORKFLOW_RUN_STORAGE_ROOTS.get(storageKey);
25
41
  }
26
- const storageRoot = managedWorktreePrimaryRoot(root) ?? root;
27
- if (runId) {
28
- WORKFLOW_RUN_STORAGE_ROOTS.set(runId, storageRoot);
42
+ const command = workflowCommandFromRunId(runId);
43
+ const resolvedScope = scope ?? (command ? workflowLockScopeForCommand(command) : "worktree");
44
+ const storageRoot = workflowStorageRootForScope(root, resolvedScope);
45
+ if (storageKey) {
46
+ WORKFLOW_RUN_STORAGE_ROOTS.set(storageKey, storageRoot);
29
47
  }
30
48
  return storageRoot;
31
49
  }
32
- function workflowControlRoot(root, runId) {
33
- return resolve(workflowStorageRoot(root, runId), WORKFLOW_CONTROL_DIR);
50
+ function workflowControlRoot(root, runId, scope) {
51
+ return resolve(workflowStorageRoot(root, runId, scope), WORKFLOW_CONTROL_DIR);
34
52
  }
35
- function workflowRunsRoot(root, runId) {
36
- return resolve(workflowStorageRoot(root, runId), WORKFLOW_RUNS_DIR);
53
+ function workflowRunsRoot(root, runId, scope) {
54
+ return resolve(workflowStorageRoot(root, runId, scope), WORKFLOW_RUNS_DIR);
37
55
  }
38
- function workflowLockPath(root, runId) {
39
- return resolve(workflowStorageRoot(root, runId), WORKFLOW_CONTROL_DIR, "lock.json");
56
+ function workflowLockPath(root, runId, scope) {
57
+ return resolve(workflowStorageRoot(root, runId, scope), WORKFLOW_CONTROL_DIR, "lock.json");
40
58
  }
41
59
  function workflowRunPath(root, runId) {
42
60
  return resolve(workflowStorageRoot(root, runId), WORKFLOW_RUNS_DIR, `${runId}.json`);
@@ -72,9 +90,9 @@ function ensureWorkflowExcludeRule(root) {
72
90
  writeFileSync(excludePath, `${current}${current.endsWith("\n") || current.length === 0 ? "" : "\n"}${pattern}
73
91
  `, "utf8");
74
92
  }
75
- function ensureWorkflowControlDirs(root, runId) {
76
- const controlDir = workflowControlRoot(root, runId);
77
- const runsDir = workflowRunsRoot(root, runId);
93
+ function ensureWorkflowControlDirs(root, runId, scope) {
94
+ const controlDir = workflowControlRoot(root, runId, scope);
95
+ const runsDir = workflowRunsRoot(root, runId, scope);
78
96
  mkdirSync(runsDir, { recursive: true });
79
97
  ensureWorkflowExcludeRule(root);
80
98
  writeFileSync(resolve(controlDir, ".gitignore"), "*\n!.gitignore\n!runs/\nruns/*\n!runs/.gitignore\n", "utf8");
@@ -82,7 +100,7 @@ function ensureWorkflowControlDirs(root, runId) {
82
100
  return {
83
101
  controlDir,
84
102
  runsDir,
85
- lockPath: workflowLockPath(root)
103
+ lockPath: workflowLockPath(root, runId, scope)
86
104
  };
87
105
  }
88
106
  function safeJsonParse(filePath) {
@@ -109,8 +127,9 @@ function pidIsAlive(pid) {
109
127
  function generateWorkflowRunId(command) {
110
128
  return `${command}-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;
111
129
  }
112
- function inspectWorkflowLock(root) {
113
- const lock = safeJsonParse(workflowLockPath(root));
130
+ function inspectWorkflowLock(root, options = {}) {
131
+ const scope = options.scope ?? "worktree";
132
+ const lock = safeJsonParse(workflowLockPath(root, null, scope));
114
133
  if (!lock) {
115
134
  return {
116
135
  lock: null,
@@ -128,6 +147,7 @@ function inspectWorkflowLock(root) {
128
147
  return {
129
148
  lock: {
130
149
  ...lock,
150
+ scope: lock.scope ?? scope,
131
151
  stale: staleReason != null,
132
152
  staleReason
133
153
  },
@@ -137,8 +157,9 @@ function inspectWorkflowLock(root) {
137
157
  };
138
158
  }
139
159
  function acquireWorkflowLock(root, command, runId) {
140
- const dirs = ensureWorkflowControlDirs(root, runId);
141
- const inspection = inspectWorkflowLock(root);
160
+ const scope = workflowLockScopeForCommand(command);
161
+ const dirs = ensureWorkflowControlDirs(root, runId, scope);
162
+ const inspection = inspectWorkflowLock(root, { scope });
142
163
  if (inspection.active && inspection.lock && inspection.lock.runId !== runId) {
143
164
  return {
144
165
  acquired: false,
@@ -152,6 +173,7 @@ function acquireWorkflowLock(root, command, runId) {
152
173
  const lock = {
153
174
  schemaVersion: 1,
154
175
  kind: "treeseed.workflow.lock",
176
+ scope,
155
177
  runId,
156
178
  command,
157
179
  root,
@@ -245,7 +267,7 @@ function isReleaseGateOnlyCompletion(journal) {
245
267
  const releaseRootData = stringRecord(releaseRoot.data);
246
268
  if (typeof releaseRootData?.releasedCommit !== "string") return false;
247
269
  const pendingStep = journal.steps.find((step) => step.status === "pending");
248
- return pendingStep?.id === "release-root-gates" || pendingStep?.id === "release-back-merge" || pendingStep?.id === "cleanup-dev-tags";
270
+ return pendingStep?.id === "release-root-gates" || pendingStep?.id === "release-back-merge";
249
271
  }
250
272
  function releaseStepData(journal, stepId) {
251
273
  return stringRecord(journal.steps.find((step) => step.id === stepId)?.data);
@@ -266,14 +288,18 @@ function collectSaveExpectedHeads(journal) {
266
288
  const saveData = stringRecord(journal.steps.find((step) => step.id === "save-repositories")?.data);
267
289
  const partialFailure = savePartialFailureData(journal);
268
290
  const source = saveData ?? partialFailure;
291
+ const partial = saveData == null && partialFailure != null;
292
+ const failingRepo = partial && typeof partialFailure?.failingRepo === "string" ? partialFailure.failingRepo : null;
269
293
  const rootRepo = stringRecord(source?.rootRepo);
270
- if (typeof rootRepo?.commitSha === "string") {
294
+ const rootCompletionUnknown = rootRepo?.pushed == null && rootRepo?.committed == null;
295
+ if (typeof rootRepo?.commitSha === "string" && (!partial || rootRepo.pushed === true || rootRepo.committed === true || rootCompletionUnknown && rootRepo.dirty !== true)) {
271
296
  heads["@treeseed/market"] = rootRepo.commitSha;
272
297
  }
273
298
  const repos = Array.isArray(source?.repos) ? source.repos : [];
274
299
  for (const entry of repos) {
275
300
  const repo = stringRecord(entry);
276
- if (typeof repo?.name === "string" && typeof repo.commitSha === "string") {
301
+ const completionUnknown = repo?.pushed == null && repo?.committed == null;
302
+ if (typeof repo?.name === "string" && typeof repo.commitSha === "string" && (!partial || repo.pushed === true || repo.committed === true || completionUnknown && repo.name !== failingRepo && repo.dirty !== true)) {
277
303
  heads[repo.name] = repo.commitSha;
278
304
  }
279
305
  }
@@ -297,7 +323,10 @@ function classifyWorkflowRunJournal(journal, options = {}) {
297
323
  classifiedAt: now
298
324
  };
299
325
  }
300
- if (!journal.resumable) {
326
+ const recovery = stringRecord(stringRecord(journal.failure)?.details)?.recovery;
327
+ const recoveryRecord = stringRecord(recovery);
328
+ const recoveryMarkedResumable = recoveryRecord?.resumable === true;
329
+ if (!journal.resumable && !recoveryMarkedResumable) {
301
330
  return {
302
331
  state: "obsolete",
303
332
  reasons: ["workflow run is not marked resumable"],
@@ -446,13 +475,22 @@ function createWorkflowRunJournal(root, options) {
446
475
  result: null
447
476
  });
448
477
  }
449
- function listWorkflowRunJournals(root) {
450
- const runsDir = workflowRunsRoot(root);
478
+ function listWorkflowRunJournalsForScope(root, scope) {
479
+ const runsDir = workflowRunsRoot(root, null, scope);
451
480
  if (!existsSync(runsDir)) {
452
481
  return [];
453
482
  }
454
483
  return readdirSync(runsDir).filter((entry) => entry.endsWith(".json")).map((entry) => safeJsonParse(resolve(runsDir, entry))).filter((entry) => entry != null).sort((left, right) => right.createdAt.localeCompare(left.createdAt));
455
484
  }
485
+ function listWorkflowRunJournals(root) {
486
+ const local = listWorkflowRunJournalsForScope(root, "worktree");
487
+ const shared = listWorkflowRunJournalsForScope(root, "shared");
488
+ const byId = /* @__PURE__ */ new Map();
489
+ for (const journal of [...local, ...shared]) {
490
+ byId.set(journal.runId, journal);
491
+ }
492
+ return [...byId.values()].sort((left, right) => right.createdAt.localeCompare(left.createdAt));
493
+ }
456
494
  function listInterruptedWorkflowRuns(root) {
457
495
  return listWorkflowRunJournals(root).filter((journal) => journal.status === "failed" && journal.resumable);
458
496
  }
@@ -466,11 +504,13 @@ export {
466
504
  generateWorkflowRunId,
467
505
  getCachedSuccessfulWorkflowGate,
468
506
  inspectWorkflowLock,
507
+ isSharedWorkflowCommand,
469
508
  listInterruptedWorkflowRuns,
470
509
  listWorkflowRunJournals,
471
510
  readWorkflowRunJournal,
472
511
  refreshWorkflowLock,
473
512
  releaseWorkflowLock,
474
513
  updateWorkflowRunJournal,
514
+ workflowLockScopeForCommand,
475
515
  writeWorkflowRunJournal
476
516
  };
@@ -1,9 +1,11 @@
1
- import { type TreeseedWorkflowBranchRole } from './policy.ts';
1
+ import { type TreeseedWorkflowBranchRole } from './policy.js';
2
+ import { type TreeseedManagedRepositoryKind } from '../operations/services/managed-repositories.js';
2
3
  export type TreeseedWorkflowMode = 'root-only' | 'recursive-workspace';
3
4
  export type TreeseedWorkflowSessionRepo = {
4
5
  name: string;
5
6
  path: string;
6
7
  relativePath: string;
8
+ kind: TreeseedManagedRepositoryKind | 'package';
7
9
  branchName: string | null;
8
10
  branchRole: TreeseedWorkflowBranchRole;
9
11
  dirty: boolean;
@@ -22,6 +24,7 @@ export type TreeseedWorkflowSession = {
22
24
  branchName: string | null;
23
25
  branchRole: TreeseedWorkflowBranchRole;
24
26
  rootRepo: TreeseedWorkflowSessionRepo;
27
+ managedRepos: TreeseedWorkflowSessionRepo[];
25
28
  packageRepos: TreeseedWorkflowSessionRepo[];
26
29
  packageSelection: TreeseedWorkflowPackageSelection;
27
30
  };
@@ -1,4 +1,5 @@
1
- import { relative } from "node:path";
1
+ import { existsSync } from "node:fs";
2
+ import { relative, resolve } from "node:path";
2
3
  import {
3
4
  currentBranch,
4
5
  gitStatusPorcelain,
@@ -13,10 +14,14 @@ import {
13
14
  workspacePackages,
14
15
  workspaceRoot
15
16
  } from "../operations/services/workspace-tools.js";
17
+ import { discoverTreeseedPackageAdapters } from "../operations/services/package-adapters.js";
16
18
  import {
17
19
  classifyTreeseedBranchRole,
18
20
  resolveTreeseedWorkflowPaths
19
21
  } from "./policy.js";
22
+ import {
23
+ checkedOutManagedWorkflowRepos
24
+ } from "../operations/services/managed-repositories.js";
20
25
  function hasOriginRemote(repoDir) {
21
26
  try {
22
27
  originRemoteUrl(repoDir);
@@ -25,12 +30,13 @@ function hasOriginRemote(repoDir) {
25
30
  return false;
26
31
  }
27
32
  }
28
- function repoState(root, name, repoDir) {
33
+ function repoState(root, name, repoDir, kind = "package") {
29
34
  const branchName = currentBranch(repoDir) || null;
30
35
  return {
31
36
  name,
32
37
  path: repoDir,
33
38
  relativePath: relative(root, repoDir).replaceAll("\\", "/") || ".",
39
+ kind,
34
40
  branchName,
35
41
  branchRole: classifyTreeseedBranchRole(branchName, repoDir),
36
42
  dirty: gitStatusPorcelain(repoDir).length > 0,
@@ -39,20 +45,52 @@ function repoState(root, name, repoDir) {
39
45
  };
40
46
  }
41
47
  function checkedOutWorkspacePackageRepos(root) {
42
- if (!hasCompleteTreeseedPackageCheckout(root)) {
48
+ let packages = [];
49
+ try {
50
+ packages = workspacePackages(root);
51
+ } catch {
52
+ packages = [];
53
+ }
54
+ if (!hasCompleteTreeseedPackageCheckout(root) && packages.length === 0) {
43
55
  return [];
44
56
  }
45
- return sortWorkspacePackages(
46
- workspacePackages(root).filter((pkg) => pkg.name?.startsWith("@treeseed/"))
47
- );
57
+ const repos = /* @__PURE__ */ new Map();
58
+ for (const pkg of packages.filter((pkg2) => pkg2.name?.startsWith("@treeseed/"))) {
59
+ if (!existsSync(resolve(pkg.dir, ".git"))) continue;
60
+ repos.set(pkg.name, pkg);
61
+ }
62
+ for (const adapter of discoverTreeseedPackageAdapters(root)) {
63
+ if (!adapter.publishTarget && adapter.artifacts.length === 0) continue;
64
+ if (repos.has(adapter.id)) continue;
65
+ if (!existsSync(resolve(adapter.dir, ".git"))) continue;
66
+ repos.set(adapter.id, {
67
+ dir: adapter.dir,
68
+ name: adapter.id,
69
+ packageJson: {},
70
+ relativeDir: adapter.relativeDir
71
+ });
72
+ }
73
+ return sortWorkspacePackages([...repos.values()]);
48
74
  }
49
75
  function workflowModeForRoot(root) {
50
76
  return hasCompleteTreeseedPackageCheckout(root) ? "recursive-workspace" : "root-only";
51
77
  }
52
78
  function collectReleasePackageSelection(root) {
53
- const publishable = sortWorkspacePackages(
54
- publishableWorkspacePackages(root).filter((pkg) => pkg.name?.startsWith("@treeseed/"))
55
- );
79
+ const publishableByName = /* @__PURE__ */ new Map();
80
+ for (const pkg of publishableWorkspacePackages(root).filter((pkg2) => pkg2.name?.startsWith("@treeseed/"))) {
81
+ publishableByName.set(pkg.name, pkg);
82
+ }
83
+ for (const adapter of discoverTreeseedPackageAdapters(root)) {
84
+ if (!adapter.publishTarget && adapter.artifacts.length === 0) continue;
85
+ if (publishableByName.has(adapter.id)) continue;
86
+ publishableByName.set(adapter.id, {
87
+ dir: adapter.dir,
88
+ name: adapter.id,
89
+ packageJson: {},
90
+ relativeDir: adapter.relativeDir
91
+ });
92
+ }
93
+ const publishable = sortWorkspacePackages([...publishableByName.values()]);
56
94
  const changed = changedWorkspacePackages({
57
95
  root,
58
96
  baseRef: "main",
@@ -78,13 +116,15 @@ function resolveTreeseedWorkflowSession(cwd) {
78
116
  const gitRoot = repoRoot(root);
79
117
  const mode = workflowModeForRoot(root);
80
118
  const packageRepos = checkedOutWorkspacePackageRepos(root).map((pkg) => repoState(root, pkg.name, pkg.dir));
119
+ const managedRepos = checkedOutManagedWorkflowRepos(root).map((repo) => repoState(root, repo.name, repo.dir, repo.kind));
81
120
  return {
82
121
  root,
83
122
  gitRoot,
84
123
  mode,
85
124
  branchName: currentBranch(gitRoot) || null,
86
125
  branchRole: classifyTreeseedBranchRole(currentBranch(gitRoot) || null, gitRoot),
87
- rootRepo: repoState(root, "@treeseed/market", gitRoot),
126
+ rootRepo: repoState(root, "@treeseed/market", gitRoot, "root"),
127
+ managedRepos,
88
128
  packageRepos,
89
129
  packageSelection: collectReleasePackageSelection(root)
90
130
  };
@@ -1,4 +1,4 @@
1
- import type { TreeseedWorkflowWorktreeMode } from '../workflow.ts';
1
+ import type { TreeseedWorkflowWorktreeMode } from '../workflow.js';
2
2
  export type ManagedWorkflowWorktreeMetadata = {
3
3
  schemaVersion: 1;
4
4
  kind: 'treeseed.workflow.worktree';
@@ -24,16 +24,20 @@ export declare function ensureManagedWorkflowWorktree({ root, branchName, mode,
24
24
  mode?: TreeseedWorkflowWorktreeMode;
25
25
  env?: NodeJS.ProcessEnv | Record<string, string | undefined>;
26
26
  }): ManagedWorkflowWorktreeResult;
27
- export declare function removeManagedWorkflowWorktree(root: string): {
27
+ export declare function removeManagedWorkflowWorktree(root: string, options?: {
28
+ deleteBranch?: boolean;
29
+ }): {
28
30
  removed: boolean;
29
31
  reason: string;
30
32
  worktreePath?: undefined;
31
33
  primaryRoot?: undefined;
32
34
  branch?: undefined;
35
+ deletedLocalBranch?: undefined;
33
36
  } | {
34
37
  removed: boolean;
35
38
  worktreePath: string;
36
39
  primaryRoot: string;
37
40
  branch: string;
41
+ deletedLocalBranch: boolean;
38
42
  reason?: undefined;
39
43
  };
@@ -1,23 +1,26 @@
1
+ import { spawnSync } from "node:child_process";
1
2
  import { createHash } from "node:crypto";
2
- import { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from "node:fs";
3
+ import { copyFileSync, existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from "node:fs";
3
4
  import { dirname, resolve } from "node:path";
4
- import { spawnSync } from "node:child_process";
5
+ import { runTreeseedGit } from "../operations/services/git-runner.js";
5
6
  import { sortWorkspacePackages, workspacePackages, workspaceRoot } from "../operations/services/workspace-tools.js";
6
7
  import { repoRoot } from "../operations/services/workspace-save.js";
8
+ import { discoverTreeseedPackageAdapters } from "../operations/services/package-adapters.js";
7
9
  const WORKTREE_METADATA_PATH = ".treeseed/worktree.json";
8
10
  const WORKTREE_ROOT = ".treeseed/worktrees";
11
+ const MACHINE_CONFIG_PATH = ".treeseed/config/machine.yaml";
9
12
  function nowIso() {
10
13
  return (/* @__PURE__ */ new Date()).toISOString();
11
14
  }
12
15
  function runGit(args, { cwd, capture = true, allowFailure = false }) {
13
- const result = spawnSync("git", args, {
16
+ const mutating = /^(add|commit|checkout|switch|merge|tag|push|fetch|worktree|submodule|reset|clean|restore|branch)$/u.test(args[0] ?? "");
17
+ const result = runTreeseedGit(args, {
14
18
  cwd,
15
- stdio: capture ? "pipe" : "inherit",
16
- encoding: "utf8"
19
+ mode: mutating ? "mutate" : "read",
20
+ allowFailure
17
21
  });
18
- if (result.status !== 0 && !allowFailure) {
19
- throw new Error(result.stderr?.trim() || result.stdout?.trim() || `git ${args.join(" ")} failed`);
20
- }
22
+ if (!capture && result.stdout.trim()) process.stdout.write(result.stdout);
23
+ if (!capture && result.stderr.trim()) process.stderr.write(result.stderr);
21
24
  return result;
22
25
  }
23
26
  function slugifyBranch(branchName) {
@@ -72,8 +75,23 @@ function checkoutManagedPackageBranch(repoDir, branchName) {
72
75
  }
73
76
  }
74
77
  function checkoutManagedPackageBranches(worktreePath, branchName) {
75
- for (const pkg of sortWorkspacePackages(workspacePackages(worktreePath))) {
76
- if (!pkg.name?.startsWith("@treeseed/")) continue;
78
+ const packages = /* @__PURE__ */ new Map();
79
+ for (const pkg of workspacePackages(worktreePath)) {
80
+ if (pkg.name?.startsWith("@treeseed/")) {
81
+ packages.set(pkg.name, pkg);
82
+ }
83
+ }
84
+ for (const adapter of discoverTreeseedPackageAdapters(worktreePath)) {
85
+ if (!adapter.publishTarget && adapter.artifacts.length === 0) continue;
86
+ if (packages.has(adapter.id)) continue;
87
+ packages.set(adapter.id, {
88
+ dir: adapter.dir,
89
+ name: adapter.id,
90
+ packageJson: {},
91
+ relativeDir: adapter.relativeDir
92
+ });
93
+ }
94
+ for (const pkg of sortWorkspacePackages([...packages.values()])) {
77
95
  if (!existsSync(resolve(pkg.dir, ".git"))) continue;
78
96
  checkoutManagedPackageBranch(pkg.dir, branchName);
79
97
  }
@@ -102,7 +120,7 @@ function ensureManagedWorktreeExclude(root) {
102
120
  if (!commonGitDir) return;
103
121
  const absolutePath = resolve(root, commonGitDir, "info", "exclude");
104
122
  const current = existsSync(absolutePath) ? readFileSync(absolutePath, "utf8") : "";
105
- const patterns = ["/.treeseed/worktree.json", "/.treeseed/workflow/", "/.treeseed/worktrees/"];
123
+ const patterns = ["/.treeseed/worktree.json", "/.treeseed/config/", "/.treeseed/workflow/", "/.treeseed/worktrees/"];
106
124
  const missing = patterns.filter((pattern) => !current.includes(pattern));
107
125
  if (missing.length === 0) return;
108
126
  mkdirSync(dirname(absolutePath), { recursive: true });
@@ -113,6 +131,13 @@ function ensureManagedWorktreeExclude(root) {
113
131
  "utf8"
114
132
  );
115
133
  }
134
+ function ensureManagedWorktreeMachineConfig(primaryRoot, worktreePath) {
135
+ const sourcePath = resolve(primaryRoot, MACHINE_CONFIG_PATH);
136
+ const targetPath = resolve(worktreePath, MACHINE_CONFIG_PATH);
137
+ if (!existsSync(sourcePath) || existsSync(targetPath)) return;
138
+ mkdirSync(dirname(targetPath), { recursive: true });
139
+ copyFileSync(sourcePath, targetPath);
140
+ }
116
141
  function effectiveWorkflowWorktreeMode(mode, env = process.env) {
117
142
  const envMode = String(env.TREESEED_WORKTREE_MODE ?? "").trim().toLowerCase();
118
143
  if (mode === "on" || envMode === "on" || envMode === "true" || envMode === "1") return "on";
@@ -170,12 +195,16 @@ function ensureManagedWorkflowWorktree({
170
195
  runGit(["worktree", "add", "--detach", worktreePath, baseRef], { cwd: primaryGitRoot });
171
196
  } else if (!existingEntry) {
172
197
  runGit(["worktree", "prune"], { cwd: primaryGitRoot, allowFailure: true });
198
+ if (existsSync(worktreePath)) {
199
+ throw new Error(`Managed worktree path ${worktreePath} exists but is not registered as a Git worktree.`);
200
+ }
173
201
  } else if (!currentBranchName(worktreePath)) {
174
202
  runGit(["fetch", "origin"], { cwd: worktreePath, allowFailure: true });
175
203
  runGit(["reset", "--hard", baseRef], { cwd: worktreePath });
176
204
  }
177
205
  runGit(["submodule", "update", "--init", "--recursive"], { cwd: worktreePath });
178
206
  checkoutManagedPackageBranches(worktreePath, branchName);
207
+ ensureManagedWorktreeMachineConfig(primaryRoot, worktreePath);
179
208
  ensureManagedWorktreeExclude(worktreePath);
180
209
  const timestamp = nowIso();
181
210
  const previous = readMetadata(worktreePath);
@@ -196,7 +225,7 @@ function ensureManagedWorkflowWorktree({
196
225
  resumed: !created
197
226
  };
198
227
  }
199
- function removeManagedWorkflowWorktree(root) {
228
+ function removeManagedWorkflowWorktree(root, options = {}) {
200
229
  const metadata = readMetadata(root);
201
230
  if (!metadata) {
202
231
  return { removed: false, reason: "not-managed" };
@@ -204,13 +233,67 @@ function removeManagedWorkflowWorktree(root) {
204
233
  const primaryRoot = metadata.primaryRoot;
205
234
  const primaryGitRoot = repoRoot(primaryRoot);
206
235
  process.chdir(primaryRoot);
207
- runGit(["worktree", "remove", "--force", metadata.worktreePath], { cwd: primaryGitRoot });
208
- rmSync(metadata.worktreePath, { recursive: true, force: true });
236
+ const gitRemove = runGit(["worktree", "remove", "--force", metadata.worktreePath], { cwd: primaryGitRoot, allowFailure: true });
237
+ removeWorkflowWorktreeDirectory(metadata.worktreePath);
238
+ if (gitRemove.status !== 0) {
239
+ runGit(["worktree", "prune"], { cwd: primaryGitRoot, allowFailure: true });
240
+ }
241
+ let deletedLocalBranch = false;
242
+ if (options.deleteBranch === true && metadata.branch) {
243
+ const deleted = runGit(["branch", "-D", metadata.branch], { cwd: primaryGitRoot, allowFailure: true });
244
+ deletedLocalBranch = deleted.status === 0;
245
+ }
209
246
  return {
210
247
  removed: true,
211
248
  worktreePath: metadata.worktreePath,
212
249
  primaryRoot,
213
- branch: metadata.branch
250
+ branch: metadata.branch,
251
+ deletedLocalBranch
252
+ };
253
+ }
254
+ function removeWorkflowWorktreeDirectory(worktreePath) {
255
+ try {
256
+ rmSync(worktreePath, { recursive: true, force: true });
257
+ return;
258
+ } catch (error) {
259
+ const repair = repairDockerOwnedWorktreeArtifacts(worktreePath);
260
+ if (!repair.repaired) {
261
+ throw error;
262
+ }
263
+ try {
264
+ rmSync(worktreePath, { recursive: true, force: true });
265
+ return;
266
+ } catch (retryError) {
267
+ const detail = repair.stderr ? ` Docker ownership repair stderr: ${repair.stderr}` : "";
268
+ const message = retryError instanceof Error ? retryError.message : String(retryError);
269
+ throw new Error(`${message}.${detail}`);
270
+ }
271
+ }
272
+ }
273
+ function repairDockerOwnedWorktreeArtifacts(worktreePath) {
274
+ if (!existsSync(worktreePath) || typeof process.getuid !== "function" || typeof process.getgid !== "function") {
275
+ return { repaired: false, stderr: "" };
276
+ }
277
+ const uid = String(process.getuid());
278
+ const gid = String(process.getgid());
279
+ const result = spawnSync("docker", [
280
+ "run",
281
+ "--rm",
282
+ "-v",
283
+ `${worktreePath}:/target`,
284
+ "debian:bookworm-slim",
285
+ "chown",
286
+ "-R",
287
+ `${uid}:${gid}`,
288
+ "/target"
289
+ ], {
290
+ encoding: "utf8",
291
+ stdio: ["ignore", "pipe", "pipe"],
292
+ timeout: 3e5
293
+ });
294
+ return {
295
+ repaired: result.status === 0,
296
+ stderr: String(result.stderr ?? "").trim()
214
297
  };
215
298
  }
216
299
  export {
@@ -1,8 +1,8 @@
1
- import { collectPublicPackageReleaseLineState } from './operations/services/workspace-save.ts';
2
- import { packageAdapterPlanSummary } from './operations/services/package-adapters.ts';
3
- import { inspectWorkspaceDependencyMode } from './operations/services/workspace-dependency-mode.ts';
4
- import type { TreeseedWorkflowNextStep } from './workflow.ts';
5
- import { type TreeseedWorkflowBranchRole } from './workflow/policy.ts';
1
+ import { collectPublicPackageReleaseLineState } from './operations/services/workspace-save.js';
2
+ import { packageAdapterPlanSummary } from './operations/services/package-adapters.js';
3
+ import { inspectWorkspaceDependencyMode } from './operations/services/workspace-dependency-mode.js';
4
+ import type { TreeseedWorkflowNextStep } from './workflow.js';
5
+ import { type TreeseedWorkflowBranchRole } from './workflow/policy.js';
6
6
  export type TreeseedBranchRole = TreeseedWorkflowBranchRole;
7
7
  export type TreeseedWorkflowRecommendation = TreeseedWorkflowNextStep;
8
8
  export type TreeseedWorkflowEnvironmentStatus = {