@treeseed/sdk 0.11.0 → 0.12.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +627 -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 +63 -0
- package/dist/platform/desired-state.js +1021 -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
package/dist/workflow/policy.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
|
-
import {
|
|
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
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
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;
|
package/dist/workflow/runs.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import type { TreeseedWorkflowMode } from './session.
|
|
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
|
|
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;
|
package/dist/workflow/runs.js
CHANGED
|
@@ -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
|
|
23
|
-
|
|
24
|
-
|
|
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
|
|
27
|
-
|
|
28
|
-
|
|
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
|
|
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
|
|
141
|
-
const
|
|
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"
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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.
|
|
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
|
};
|
package/dist/workflow/session.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
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
|
-
|
|
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
|
-
|
|
46
|
-
|
|
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
|
|
54
|
-
|
|
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.
|
|
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 {
|
|
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
|
|
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
|
-
|
|
16
|
-
|
|
19
|
+
mode: mutating ? "mutate" : "read",
|
|
20
|
+
allowFailure
|
|
17
21
|
});
|
|
18
|
-
if (
|
|
19
|
-
|
|
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
|
-
|
|
76
|
-
|
|
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
|
-
|
|
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 {
|
package/dist/workflow-state.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { collectPublicPackageReleaseLineState } from './operations/services/workspace-save.
|
|
2
|
-
import { packageAdapterPlanSummary } from './operations/services/package-adapters.
|
|
3
|
-
import { inspectWorkspaceDependencyMode } from './operations/services/workspace-dependency-mode.
|
|
4
|
-
import type { TreeseedWorkflowNextStep } from './workflow.
|
|
5
|
-
import { type TreeseedWorkflowBranchRole } from './workflow/policy.
|
|
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 = {
|