@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.
- package/README.md +9 -4
- package/dist/agent-capacity.d.ts +916 -0
- package/dist/agent-capacity.js +1600 -0
- package/dist/agent-tools.d.ts +37 -0
- package/dist/agent-tools.js +301 -0
- package/dist/api/app.d.ts +1 -1
- package/dist/api/auth/d1-database.d.ts +2 -2
- package/dist/api/auth/d1-provider.d.ts +4 -4
- package/dist/api/auth/d1-store.d.ts +2 -2
- package/dist/api/auth/memory-provider.d.ts +1 -1
- package/dist/api/auth/tokens.d.ts +1 -1
- package/dist/api/config.d.ts +3 -1
- package/dist/api/config.js +34 -10
- package/dist/api/http.d.ts +2 -2
- package/dist/api/index.d.ts +10 -10
- package/dist/api/index.js +4 -2
- package/dist/api/operations-routes.d.ts +3 -3
- package/dist/api/operations.d.ts +1 -1
- package/dist/api/providers.d.ts +1 -1
- package/dist/api/providers.js +21 -4
- package/dist/api/railway.d.ts +3 -2
- package/dist/api/sdk-dispatch.d.ts +4 -4
- package/dist/api/sdk-routes.d.ts +2 -2
- package/dist/api/templates.d.ts +2 -2
- package/dist/api/types.d.ts +3 -2
- package/dist/capacity-provider.d.ts +117 -60
- package/dist/capacity-provider.js +215 -43
- package/dist/capacity.d.ts +2 -2
- package/dist/cli-tools.d.ts +1 -1
- package/dist/content-operations.d.ts +97 -0
- package/dist/content-operations.js +250 -0
- package/dist/content-store.d.ts +4 -4
- package/dist/control-plane-client.d.ts +13 -18
- package/dist/control-plane-client.js +8 -86
- package/dist/control-plane.d.ts +2 -2
- package/dist/copilot.d.ts +3 -0
- package/dist/copilot.js +16 -1
- package/dist/d1-http.d.ts +1 -1
- package/dist/d1-store.d.ts +32 -57
- package/dist/d1-store.js +115 -318
- package/dist/db/d1.d.ts +1 -232
- package/dist/db/index.d.ts +3 -3
- package/dist/db/market-schema.d.ts +49037 -11843
- package/dist/db/market-schema.js +1788 -50
- package/dist/db/node-sqlite.d.ts +1 -232
- package/dist/db/schema.d.ts +0 -462
- package/dist/db/schema.js +2 -22
- package/dist/dispatch.d.ts +1 -1
- package/dist/dispatch.js +0 -11
- package/dist/fixture-support.js +52 -4
- package/dist/governance.d.ts +133 -0
- package/dist/governance.js +285 -0
- package/dist/graph/build.d.ts +2 -2
- package/dist/graph/context-query-contracts.d.ts +1 -1
- package/dist/graph/dsl.d.ts +1 -1
- package/dist/graph/query.d.ts +4 -4
- package/dist/graph/ranking.d.ts +1 -1
- package/dist/graph/schema.d.ts +1 -1
- package/dist/graph.d.ts +11 -11
- package/dist/guarantees/index.d.ts +425 -0
- package/dist/guarantees/index.js +1146 -0
- package/dist/hosting/apps.d.ts +1 -1
- package/dist/hosting/builtins.d.ts +1 -1
- package/dist/hosting/builtins.js +9 -198
- package/dist/hosting/contracts.d.ts +3 -2
- package/dist/hosting/graph.d.ts +24 -21
- package/dist/hosting/graph.js +280 -294
- package/dist/hosting/index.d.ts +4 -4
- package/dist/index.d.ts +88 -74
- package/dist/index.js +81 -10
- package/dist/local-dev/managed-dev.d.ts +85 -0
- package/dist/local-dev/managed-dev.js +368 -0
- package/dist/managed-dependencies.d.ts +9 -0
- package/dist/managed-dependencies.js +10 -8
- package/dist/market-client.d.ts +265 -7
- package/dist/market-client.js +381 -9
- package/dist/model-registry.d.ts +1 -1
- package/dist/model-registry.js +19 -19
- package/dist/operations/agent-tools.d.ts +2 -11
- package/dist/operations/agent-tools.js +2 -14
- package/dist/operations/providers/default.d.ts +1 -1
- package/dist/operations/providers/default.js +20 -37
- package/dist/operations/repository-operations.d.ts +26 -2
- package/dist/operations/repository-operations.js +159 -1
- package/dist/operations/runtime.d.ts +3 -3
- package/dist/operations/services/bootstrap-runner.d.ts +1 -1
- package/dist/operations/services/build-warning-policy.d.ts +34 -0
- package/dist/operations/services/build-warning-policy.js +81 -82
- package/dist/operations/services/commit-message-provider.js +4 -4
- package/dist/operations/services/config-runtime.d.ts +73 -19
- package/dist/operations/services/config-runtime.js +276 -100
- package/dist/operations/services/deploy.d.ts +41 -622
- package/dist/operations/services/deploy.js +181 -213
- package/dist/operations/services/deployment-readiness.d.ts +1 -1
- package/dist/operations/services/deployment-readiness.js +38 -7
- package/dist/operations/services/git-remote-policy.js +12 -4
- package/dist/operations/services/git-runner.d.ts +66 -0
- package/dist/operations/services/git-runner.js +479 -0
- package/dist/operations/services/git-workflow.d.ts +43 -5
- package/dist/operations/services/git-workflow.js +242 -20
- package/dist/operations/services/github-actions-verification.d.ts +3 -1
- package/dist/operations/services/github-actions-verification.js +11 -3
- package/dist/operations/services/github-api.js +21 -5
- package/dist/operations/services/github-automation.d.ts +3 -3
- package/dist/operations/services/github-automation.js +15 -18
- package/dist/operations/services/github-credentials.js +2 -1
- package/dist/operations/services/hosted-service-checks.d.ts +19 -1
- package/dist/operations/services/hosted-service-checks.js +162 -11
- package/dist/operations/services/hosting-audit.d.ts +2 -2
- package/dist/operations/services/hosting-audit.js +7 -7
- package/dist/operations/services/hub-launch.d.ts +1 -1
- package/dist/operations/services/hub-provider-launch.d.ts +5 -5
- package/dist/operations/services/hub-provider-launch.js +19 -14
- package/dist/operations/services/live-hosted-service-checks.d.ts +2 -1
- package/dist/operations/services/live-hosted-service-checks.js +193 -80
- package/dist/operations/services/local-dev.js +0 -1
- package/dist/operations/services/managed-host-security.d.ts +1 -1
- package/dist/operations/services/managed-repositories.d.ts +37 -0
- package/dist/operations/services/managed-repositories.js +177 -0
- package/dist/operations/services/operations-runner-smoke.d.ts +3 -2
- package/dist/operations/services/operations-runner-smoke.js +22 -4
- package/dist/operations/services/package-adapters.d.ts +77 -2
- package/dist/operations/services/package-adapters.js +629 -56
- package/dist/operations/services/package-reference-policy.d.ts +12 -88
- package/dist/operations/services/package-reference-policy.js +81 -213
- package/dist/operations/services/project-host-operations.d.ts +4 -4
- package/dist/operations/services/project-platform.d.ts +19 -193
- package/dist/operations/services/project-platform.js +31 -103
- package/dist/operations/services/project-web-monitor.d.ts +2 -2
- package/dist/operations/services/project-web-monitor.js +97 -2
- package/dist/operations/services/railway-api.d.ts +36 -7
- package/dist/operations/services/railway-api.js +331 -100
- package/dist/operations/services/railway-deploy.d.ts +7 -95
- package/dist/operations/services/railway-deploy.js +334 -742
- package/dist/operations/services/release-history.js +3 -4
- package/dist/operations/services/release-proof-ledger.d.ts +13 -0
- package/dist/operations/services/release-proof-ledger.js +81 -0
- package/dist/operations/services/release-proof-planner.d.ts +48 -0
- package/dist/operations/services/release-proof-planner.js +195 -0
- package/dist/operations/services/release-proof-runner.d.ts +16 -0
- package/dist/operations/services/release-proof-runner.js +169 -0
- package/dist/operations/services/release-proof.d.ts +81 -0
- package/dist/operations/services/release-proof.js +79 -0
- package/dist/operations/services/repository-save-orchestrator.d.ts +6 -7
- package/dist/operations/services/repository-save-orchestrator.js +353 -174
- package/dist/operations/services/runtime-paths.d.ts +1 -3
- package/dist/operations/services/runtime-paths.js +0 -4
- package/dist/operations/services/runtime-tools.d.ts +1 -192
- package/dist/operations/services/runtime-tools.js +4 -444
- package/dist/operations/services/save-deploy-preflight.js +9 -1
- package/dist/operations/services/template-host-bindings.d.ts +2 -2
- package/dist/operations/services/template-host-bindings.js +3 -2
- package/dist/operations/services/template-registry.d.ts +6 -6
- package/dist/operations/services/template-registry.js +33 -14
- package/dist/operations/services/template-secret-sync.d.ts +3 -3
- package/dist/operations/services/workflow-timing.d.ts +25 -0
- package/dist/operations/services/workflow-timing.js +79 -0
- package/dist/operations/services/workspace-dependency-mode.js +41 -4
- package/dist/operations/services/workspace-preflight.js +8 -8
- package/dist/operations/services/workspace-save-script.d.ts +4 -4
- package/dist/operations/services/workspace-save.d.ts +1 -0
- package/dist/operations/services/workspace-save.js +41 -18
- package/dist/operations/services/workspace-tools.js +40 -6
- package/dist/operations-registry.d.ts +1 -1
- package/dist/operations-registry.js +5 -6
- package/dist/operations-types.d.ts +1 -1
- package/dist/operations.d.ts +17 -11
- package/dist/operations.js +57 -3
- package/dist/platform/book-export.js +2 -0
- package/dist/platform/books-data.d.ts +1 -1
- package/dist/platform/config.d.ts +27 -0
- package/dist/platform/config.js +100 -0
- package/dist/platform/content-runtime-source.d.ts +54 -0
- package/dist/platform/content-runtime-source.js +169 -0
- package/dist/platform/contracts.d.ts +6 -1
- package/dist/platform/deploy-config.d.ts +1 -1
- package/dist/platform/deploy-config.js +7 -1
- package/dist/platform/deploy-runtime.d.ts +1 -1
- package/dist/platform/desired-state.d.ts +66 -0
- package/dist/platform/desired-state.js +1052 -0
- package/dist/platform/env.yaml +414 -19
- package/dist/platform/environment.d.ts +2 -2
- package/dist/platform/environment.js +54 -22
- package/dist/platform/local-content-materialization.d.ts +9 -0
- package/dist/platform/local-content-materialization.js +212 -0
- package/dist/platform/plugin.d.ts +5 -5
- package/dist/platform/plugins/runtime.d.ts +3 -3
- package/dist/platform/plugins/runtime.js +62 -1
- package/dist/platform/plugins.d.ts +6 -6
- package/dist/platform/published-content-pipeline.d.ts +3 -3
- package/dist/platform/published-content-pipeline.js +5 -1
- package/dist/platform/published-content.d.ts +4 -3
- package/dist/platform/site-config-schema.d.ts +1 -0
- package/dist/platform/site-config-schema.js +4 -1
- package/dist/platform/tenant/runtime-config.d.ts +152 -2
- package/dist/platform/tenant-config.d.ts +1 -1
- package/dist/platform/utils/site-config-schema.d.ts +154 -0
- package/dist/platform/utils/site-config-schema.js +400 -461
- package/dist/platform-operation-store.d.ts +1 -1
- package/dist/plugin-default.d.ts +1 -1
- package/dist/plugin-default.js +27 -12
- package/dist/project-import.d.ts +91 -0
- package/dist/project-import.js +257 -0
- package/dist/project-workflow.d.ts +1 -1
- package/dist/reconcile/bootstrap-systems.d.ts +2 -2
- package/dist/reconcile/bootstrap-systems.js +3 -3
- package/dist/reconcile/builtin-adapters.d.ts +7 -1
- package/dist/reconcile/builtin-adapters.js +2924 -346
- package/dist/reconcile/contracts.d.ts +15 -2
- package/dist/reconcile/desired-state.d.ts +2 -193
- package/dist/reconcile/desired-state.js +24 -33
- package/dist/reconcile/engine.d.ts +60 -397
- package/dist/reconcile/engine.js +182 -18
- package/dist/reconcile/index.d.ts +10 -10
- package/dist/reconcile/live-acceptance.d.ts +22 -1
- package/dist/reconcile/live-acceptance.js +456 -44
- package/dist/reconcile/providers/docker-private.d.ts +54 -0
- package/dist/reconcile/providers/docker-private.js +101 -0
- package/dist/reconcile/providers/github-private.d.ts +65 -0
- package/dist/reconcile/providers/github-private.js +119 -0
- package/dist/reconcile/providers/local-private.d.ts +28 -0
- package/dist/reconcile/providers/local-private.js +75 -0
- package/dist/reconcile/providers/railway-iac.d.ts +66 -0
- package/dist/reconcile/providers/railway-iac.js +275 -0
- package/dist/reconcile/providers/release-private.d.ts +92 -0
- package/dist/reconcile/providers/release-private.js +152 -0
- package/dist/reconcile/registry.d.ts +2 -2
- package/dist/reconcile/registry.js +16 -1
- package/dist/reconcile/state.d.ts +1 -1
- package/dist/reconcile/state.js +3 -40
- package/dist/reconcile/units.d.ts +1 -1
- package/dist/reconcile/units.js +7 -1
- package/dist/remote.d.ts +6 -6
- package/dist/scenes/artifacts.d.ts +16 -0
- package/dist/scenes/artifacts.js +61 -0
- package/dist/scenes/auth.d.ts +2 -0
- package/dist/scenes/auth.js +28 -0
- package/dist/scenes/base-url.d.ts +12 -0
- package/dist/scenes/base-url.js +123 -0
- package/dist/scenes/builtin-plugins.d.ts +2 -0
- package/dist/scenes/builtin-plugins.js +447 -0
- package/dist/scenes/checkpoints.d.ts +14 -0
- package/dist/scenes/checkpoints.js +33 -0
- package/dist/scenes/device-matrix.d.ts +2 -0
- package/dist/scenes/device-matrix.js +97 -0
- package/dist/scenes/devices.d.ts +11 -0
- package/dist/scenes/devices.js +22 -0
- package/dist/scenes/diagnostics.d.ts +5 -0
- package/dist/scenes/diagnostics.js +22 -0
- package/dist/scenes/diagram-providers.d.ts +2 -0
- package/dist/scenes/diagram-providers.js +181 -0
- package/dist/scenes/diagram-validation.d.ts +22 -0
- package/dist/scenes/diagram-validation.js +74 -0
- package/dist/scenes/environment.d.ts +2 -0
- package/dist/scenes/environment.js +65 -0
- package/dist/scenes/evidence-bundle.d.ts +5 -0
- package/dist/scenes/evidence-bundle.js +42 -0
- package/dist/scenes/evidence-report.d.ts +10 -0
- package/dist/scenes/evidence-report.js +73 -0
- package/dist/scenes/evidence.d.ts +16 -0
- package/dist/scenes/evidence.js +277 -0
- package/dist/scenes/index.d.ts +48 -0
- package/dist/scenes/index.js +312 -0
- package/dist/scenes/inspect.d.ts +9 -0
- package/dist/scenes/inspect.js +64 -0
- package/dist/scenes/loader.d.ts +3 -0
- package/dist/scenes/loader.js +38 -0
- package/dist/scenes/logs.d.ts +2 -0
- package/dist/scenes/logs.js +47 -0
- package/dist/scenes/operations.d.ts +3 -0
- package/dist/scenes/operations.js +128 -0
- package/dist/scenes/phase0.d.ts +9 -0
- package/dist/scenes/phase0.js +637 -0
- package/dist/scenes/planner.d.ts +12 -0
- package/dist/scenes/planner.js +166 -0
- package/dist/scenes/playwright-adapter.d.ts +2 -0
- package/dist/scenes/playwright-adapter.js +63 -0
- package/dist/scenes/plugins.d.ts +5 -0
- package/dist/scenes/plugins.js +115 -0
- package/dist/scenes/progress.d.ts +17 -0
- package/dist/scenes/progress.js +24 -0
- package/dist/scenes/publish-destinations.d.ts +12 -0
- package/dist/scenes/publish-destinations.js +99 -0
- package/dist/scenes/publish-plan-report.d.ts +10 -0
- package/dist/scenes/publish-plan-report.js +70 -0
- package/dist/scenes/publish-plan.d.ts +15 -0
- package/dist/scenes/publish-plan.js +248 -0
- package/dist/scenes/publish-redaction.d.ts +16 -0
- package/dist/scenes/publish-redaction.js +148 -0
- package/dist/scenes/publish-release-record.d.ts +13 -0
- package/dist/scenes/publish-release-record.js +34 -0
- package/dist/scenes/publish-report.d.ts +10 -0
- package/dist/scenes/publish-report.js +67 -0
- package/dist/scenes/publish.d.ts +16 -0
- package/dist/scenes/publish.js +298 -0
- package/dist/scenes/registry.d.ts +12 -0
- package/dist/scenes/registry.js +65 -0
- package/dist/scenes/remotion-adapter.d.ts +3 -0
- package/dist/scenes/remotion-adapter.js +94 -0
- package/dist/scenes/remotion-composition-registry.d.ts +2 -0
- package/dist/scenes/remotion-composition-registry.js +12 -0
- package/dist/scenes/remotion-compositions.d.ts +15 -0
- package/dist/scenes/remotion-compositions.js +464 -0
- package/dist/scenes/remotion-diagrams.d.ts +9 -0
- package/dist/scenes/remotion-diagrams.js +188 -0
- package/dist/scenes/remotion-input.d.ts +13 -0
- package/dist/scenes/remotion-input.js +291 -0
- package/dist/scenes/remotion-visuals.d.ts +29 -0
- package/dist/scenes/remotion-visuals.js +198 -0
- package/dist/scenes/render-media-assets.d.ts +9 -0
- package/dist/scenes/render-media-assets.js +117 -0
- package/dist/scenes/render-report.d.ts +10 -0
- package/dist/scenes/render-report.js +27 -0
- package/dist/scenes/render.d.ts +2 -0
- package/dist/scenes/render.js +218 -0
- package/dist/scenes/reporter.d.ts +3 -0
- package/dist/scenes/reporter.js +101 -0
- package/dist/scenes/resume.d.ts +2 -0
- package/dist/scenes/resume.js +79 -0
- package/dist/scenes/runner.d.ts +2 -0
- package/dist/scenes/runner.js +674 -0
- package/dist/scenes/schema.d.ts +6 -0
- package/dist/scenes/schema.js +994 -0
- package/dist/scenes/seed.d.ts +2 -0
- package/dist/scenes/seed.js +83 -0
- package/dist/scenes/segments.d.ts +15 -0
- package/dist/scenes/segments.js +79 -0
- package/dist/scenes/selectors.d.ts +3 -0
- package/dist/scenes/selectors.js +21 -0
- package/dist/scenes/timeline.d.ts +11 -0
- package/dist/scenes/timeline.js +26 -0
- package/dist/scenes/timeouts.d.ts +6 -0
- package/dist/scenes/timeouts.js +17 -0
- package/dist/scenes/training-captions.d.ts +14 -0
- package/dist/scenes/training-captions.js +98 -0
- package/dist/scenes/training-report.d.ts +10 -0
- package/dist/scenes/training-report.js +78 -0
- package/dist/scenes/training-transcript.d.ts +24 -0
- package/dist/scenes/training-transcript.js +204 -0
- package/dist/scenes/training.d.ts +10 -0
- package/dist/scenes/training.js +134 -0
- package/dist/scenes/types.d.ts +1872 -0
- package/dist/scenes/types.js +8 -0
- package/dist/scenes/visual-audit-contact-sheets.d.ts +6 -0
- package/dist/scenes/visual-audit-contact-sheets.js +119 -0
- package/dist/scenes/visual-audit-fixtures.d.ts +25 -0
- package/dist/scenes/visual-audit-fixtures.js +210 -0
- package/dist/scenes/visual-audit-report.d.ts +11 -0
- package/dist/scenes/visual-audit-report.js +85 -0
- package/dist/scenes/visual-audit-review.d.ts +23 -0
- package/dist/scenes/visual-audit-review.js +829 -0
- package/dist/scenes/visual-audit-routes.d.ts +13 -0
- package/dist/scenes/visual-audit-routes.js +308 -0
- package/dist/scenes/visual-audit.d.ts +3 -0
- package/dist/scenes/visual-audit.js +596 -0
- package/dist/scripts/build-dist.js +154 -40
- package/dist/scripts/check-build-warnings.js +42 -53
- package/dist/scripts/cleanup-markdown.js +1 -1
- package/dist/scripts/cli-test-fixtures.js +24 -28
- package/dist/scripts/migrate-journey-csv-to-guarantees.js +140 -0
- package/dist/scripts/package-tools.js +12 -1
- package/dist/scripts/prepare.js +3 -7
- package/dist/scripts/release-verify.js +2 -5
- package/dist/scripts/run-fixture-astro-command.js +1 -1
- package/dist/scripts/template-catalog.test.js +68 -82
- package/dist/scripts/tenant-dev.js +0 -10
- package/dist/scripts/test-cloudflare-local.js +1 -1
- package/dist/scripts/test-scaffold.js +0 -1
- package/dist/scripts/test-smoke.js +3 -3
- package/dist/scripts/treeseed-build-dist.js +4 -7
- package/dist/scripts/treeseed-release-verify.js +1 -1
- package/dist/scripts/verify-driver.js +30 -21
- package/dist/scripts/workflow-commands.test.js +18 -27
- package/dist/scripts/workspace-command-e2e.js +1 -1
- package/dist/scripts/workspace-lint.js +6 -0
- package/dist/scripts/workspace-release-test.js +90 -1
- package/dist/scripts/workspace-test.js +6 -0
- package/dist/sdk-dispatch.d.ts +1 -1
- package/dist/sdk-dispatch.js +0 -16
- package/dist/sdk-fields.d.ts +1 -1
- package/dist/sdk-filters.d.ts +1 -1
- package/dist/sdk-types.d.ts +1184 -113
- package/dist/sdk-types.js +393 -0
- package/dist/sdk.d.ts +74 -79
- package/dist/sdk.js +27 -36
- package/dist/secrets-capability.d.ts +421 -0
- package/dist/secrets-capability.js +530 -0
- package/dist/seeds/normalize.js +1 -0
- package/dist/seeds/planner.js +38 -0
- package/dist/seeds/schema.js +293 -4
- package/dist/seeds/types.d.ts +60 -0
- package/dist/seeds/types.js +9 -1
- package/dist/service-credentials.d.ts +54 -0
- package/dist/service-credentials.js +112 -0
- package/dist/stores/cursor-store.d.ts +2 -2
- package/dist/stores/envelopes.d.ts +1 -1
- package/dist/stores/helpers.d.ts +1 -1
- package/dist/stores/lease-store.d.ts +2 -2
- package/dist/stores/message-store.d.ts +2 -2
- package/dist/stores/operational-store.d.ts +3 -26
- package/dist/stores/operational-store.js +0 -225
- package/dist/stores/project-workflow-store.d.ts +2 -2
- package/dist/stores/run-store.d.ts +2 -3
- package/dist/stores/run-store.js +0 -98
- package/dist/stores/subscription-store.d.ts +2 -3
- package/dist/stores/subscription-store.js +0 -100
- package/dist/template-catalog.d.ts +1 -1
- package/dist/template-launch-requirements.d.ts +2 -2
- package/dist/template-launch-ui.d.ts +2 -2
- package/dist/treedx/adapters.d.ts +6 -6
- package/dist/treedx/client.d.ts +1 -1
- package/dist/treedx/errors.d.ts +1 -1
- package/dist/treedx/federated-client.d.ts +3 -3
- package/dist/treedx/graph-adapter.d.ts +2 -2
- package/dist/treedx/index.d.ts +14 -14
- package/dist/treedx/market-integration.d.ts +1 -1
- package/dist/treedx/ports.d.ts +30 -30
- package/dist/treedx/query-adapter.d.ts +3 -3
- package/dist/treedx/registry-client.d.ts +2 -2
- package/dist/treedx/repository-adapter.d.ts +4 -4
- package/dist/treedx/repository-adapter.js +14 -3
- package/dist/treedx/sdk-integration.d.ts +3 -3
- package/dist/treedx/types.d.ts +2 -2
- package/dist/treedx/workspace-adapter.d.ts +2 -2
- package/dist/treedx-backends.d.ts +13 -11
- package/dist/treedx-backends.js +52 -50
- package/dist/treedx-client.d.ts +3 -0
- package/dist/treedx-client.js +10 -1
- package/dist/treeseed/services/compose.yml +2 -3
- package/dist/treeseed/template-catalog/catalog.fixture.json +4 -4
- package/dist/types/agents.d.ts +256 -0
- package/dist/types/agents.js +42 -1
- package/dist/verification.d.ts +1 -0
- package/dist/verification.js +143 -14
- package/dist/workflow/operations.d.ts +510 -559
- package/dist/workflow/operations.js +1891 -1342
- package/dist/workflow/policy.js +19 -7
- package/dist/workflow/runs.d.ts +9 -3
- package/dist/workflow/runs.js +66 -26
- package/dist/workflow/session.d.ts +4 -1
- package/dist/workflow/session.js +50 -10
- package/dist/workflow/worktrees.d.ts +6 -2
- package/dist/workflow/worktrees.js +98 -15
- package/dist/workflow-state.d.ts +5 -5
- package/dist/workflow-state.js +27 -17
- package/dist/workflow-support.d.ts +26 -25
- package/dist/workflow-support.js +27 -31
- package/dist/workflow.d.ts +46 -16
- package/dist/workflow.js +19 -7
- package/drizzle/d1/0000_treeseed_d1.sql +0 -18
- package/drizzle/market/0000_market_control_plane.sql +1793 -1499
- package/drizzle/market/0005_agent_capacity_coordination.sql +145 -0
- package/drizzle/market/0006_provider_assignment_lifecycle.sql +9 -0
- package/drizzle/market/0007_agent_architecture_gap_closure.sql +157 -0
- package/drizzle/market/0008_agent_capacity_operational_closure.sql +27 -0
- package/drizzle/market/0009_agent_capacity_runtime_hardening.sql +29 -0
- package/drizzle/market/0010_secrets_capability_persistence.sql +130 -0
- package/drizzle/market/0011_github_app_adapter.sql +47 -0
- package/drizzle/market/0012_workday_test_runs.sql +44 -0
- package/drizzle/market/0013_runtime_task_lifecycle.sql +39 -0
- package/drizzle/market/0014_governance_pipeline.sql +189 -0
- package/package.json +75 -18
- package/scripts/{verify-driver.mjs → verify-driver.ts} +19 -4
- package/templates/github/deploy-web.workflow.yml +12 -8
- package/dist/operations/services/mailpit-runtime.d.ts +0 -20
- package/dist/operations/services/mailpit-runtime.js +0 -67
- package/dist/operations/services/release-candidate.d.ts +0 -60
- package/dist/operations/services/release-candidate.js +0 -953
- package/dist/scripts/ensure-mailpit.js +0 -48
- package/dist/scripts/logs-mailpit.js +0 -2
- package/dist/scripts/run-ts.js +0 -45
- package/dist/scripts/stop-mailpit.js +0 -5
- 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
|
-
|
|
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
|
|
41
|
-
if (
|
|
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
|
-
|
|
51
|
-
|
|
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
|
|
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
|
-
|
|
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" };
|
|
@@ -506,14 +724,18 @@ export {
|
|
|
506
724
|
inspectDetachedHeadRepair,
|
|
507
725
|
isTaskBranch,
|
|
508
726
|
listTaskBranches,
|
|
727
|
+
mergeBranchDownIntoFeature,
|
|
509
728
|
mergeBranchIntoTarget,
|
|
510
729
|
mergeCurrentBranchIntoStaging,
|
|
511
730
|
mergeStagingIntoMain,
|
|
512
731
|
prepareReleaseBranches,
|
|
732
|
+
promoteCommitToBranchWithExpectedHead,
|
|
513
733
|
pushBranch,
|
|
734
|
+
pushCommitToBranch,
|
|
514
735
|
pushHeadToBranch,
|
|
515
736
|
reattachDetachedHeadIfSafe,
|
|
516
737
|
remoteBranchExists,
|
|
738
|
+
remoteHeadCommit,
|
|
517
739
|
squashMergeBranchIntoStaging,
|
|
518
740
|
syncBranchWithOrigin,
|
|
519
741
|
taskTagSlug,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type GitHubApiClient, type GitHubWorkflowProgressEvent } from './github-api.
|
|
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';
|
|
@@ -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
|
}
|
|
@@ -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
|
|
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
|
|
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
|
|
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");
|
|
@@ -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
|
-
|
|
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
|
-
|
|
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.
|
|
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;
|
|
@@ -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.
|
|
229
|
-
failedJobs: import("./github-api.
|
|
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 {
|
|
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
|
|
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
|
-
|
|
49
|
-
|
|
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 =
|
|
58
|
+
const retry = runTreeseedGit(retryArgs, {
|
|
55
59
|
cwd,
|
|
56
|
-
|
|
57
|
-
|
|
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
|
-
|
|
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
|
-
'
|
|
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",
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { resolveTreeseedGitHubToken } from "../../service-credentials.js";
|
|
1
2
|
function cleanRepositorySlug(repository) {
|
|
2
3
|
const raw = String(repository ?? "").trim().replace(/^https?:\/\/github\.com\//iu, "").replace(/^git@github\.com:/iu, "").replace(/^ssh:\/\/git@github\.com\//iu, "").replace(/\.git$/iu, "").replace(/^\/+|\/+$/gu, "");
|
|
3
4
|
const [owner, repo, ...extra] = raw.split("/").filter(Boolean);
|
|
@@ -32,7 +33,7 @@ function resolveGitHubCredentialForRepository(repository, {
|
|
|
32
33
|
token: repositoryToken
|
|
33
34
|
};
|
|
34
35
|
}
|
|
35
|
-
const fallbackToken =
|
|
36
|
+
const fallbackToken = resolveTreeseedGitHubToken(values ?? {}) || resolveTreeseedGitHubToken(env);
|
|
36
37
|
if (fallbackToken) {
|
|
37
38
|
return {
|
|
38
39
|
repository: normalizedRepository,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export type TreeseedHostedServiceCheckStatus = 'passed' | 'failed' | 'skipped' | 'warning';
|
|
2
2
|
export type TreeseedHostedServiceTarget = 'local' | 'staging' | 'prod';
|
|
3
3
|
export type TreeseedHostedServiceProvider = 'cloudflare' | 'railway' | 'http' | 'dns' | 'github';
|
|
4
|
-
export type TreeseedHostedServiceType = 'web' | 'api' | 'operationsRunner' | 'treeseedDatabase' | 'customDomain' | 'dnsRecord' | 'githubWorkflow' | 'unknown';
|
|
4
|
+
export type TreeseedHostedServiceType = 'web' | 'api' | 'operationsRunner' | 'capacityProviderManager' | 'capacityProviderRunner' | 'treeseedDatabase' | 'customDomain' | 'dnsRecord' | 'githubWorkflow' | 'unknown';
|
|
5
5
|
export interface TreeseedHostedServiceCheck {
|
|
6
6
|
id: string;
|
|
7
7
|
provider: TreeseedHostedServiceProvider;
|
|
@@ -31,13 +31,30 @@ export interface TreeseedObservedRailwayServiceState {
|
|
|
31
31
|
projectName?: string | null;
|
|
32
32
|
environmentName?: string | null;
|
|
33
33
|
serviceName?: string | null;
|
|
34
|
+
serviceId?: string | null;
|
|
34
35
|
rootDirectory?: string | null;
|
|
35
36
|
buildCommand?: string | null;
|
|
37
|
+
dockerfilePath?: string | null;
|
|
36
38
|
startCommand?: string | null;
|
|
37
39
|
healthcheckPath?: string | null;
|
|
38
40
|
healthcheckTimeoutSeconds?: number | null;
|
|
39
41
|
runtimeMode?: string | null;
|
|
42
|
+
deploymentStatus?: string | null;
|
|
43
|
+
deploymentHealthy?: boolean | null;
|
|
44
|
+
deploymentBranch?: string | null;
|
|
45
|
+
deploymentRepo?: string | null;
|
|
46
|
+
deploymentRootDirectory?: string | null;
|
|
47
|
+
deploymentCommitHash?: string | null;
|
|
48
|
+
deploymentRequiredMountPath?: string | null;
|
|
49
|
+
deploymentVolumeMounts?: string[];
|
|
50
|
+
volumeName?: string | null;
|
|
51
|
+
volumeId?: string | null;
|
|
40
52
|
volumeMountPath?: string | null;
|
|
53
|
+
volumeServiceId?: string | null;
|
|
54
|
+
volumeEnvironmentId?: string | null;
|
|
55
|
+
volumeState?: string | null;
|
|
56
|
+
volumePendingDeletion?: boolean | null;
|
|
57
|
+
volumeDeletedAt?: string | null;
|
|
41
58
|
variables?: Record<string, unknown> | string[];
|
|
42
59
|
secrets?: Record<string, unknown> | string[];
|
|
43
60
|
health?: 'ready' | 'failed' | 'unknown' | string | null;
|
|
@@ -46,6 +63,7 @@ export interface TreeseedHostedServiceCheckOptions {
|
|
|
46
63
|
tenantRoot: string;
|
|
47
64
|
target?: TreeseedHostedServiceTarget;
|
|
48
65
|
appId?: string;
|
|
66
|
+
serviceKeys?: string[];
|
|
49
67
|
now?: Date;
|
|
50
68
|
valuesOverlay?: Record<string, string | undefined>;
|
|
51
69
|
observedRailwayServices?: Record<string, TreeseedObservedRailwayServiceState | undefined>;
|