@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
|
@@ -0,0 +1,479 @@
|
|
|
1
|
+
import { spawnSync } from "node:child_process";
|
|
2
|
+
import { existsSync, mkdirSync, readFileSync, readdirSync, rmSync, statSync, writeFileSync } from "node:fs";
|
|
3
|
+
import { dirname, relative, resolve } from "node:path";
|
|
4
|
+
function pidAlive(pid) {
|
|
5
|
+
try {
|
|
6
|
+
process.kill(pid, 0);
|
|
7
|
+
return true;
|
|
8
|
+
} catch {
|
|
9
|
+
return false;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
function gitSync(args, options) {
|
|
13
|
+
const env = {
|
|
14
|
+
...process.env,
|
|
15
|
+
...options.env ?? {}
|
|
16
|
+
};
|
|
17
|
+
for (const [key, value] of Object.entries(env)) {
|
|
18
|
+
if (value === void 0) {
|
|
19
|
+
delete env[key];
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
if (args[0] === "ls-remote") {
|
|
23
|
+
for (const key of Object.keys(env)) {
|
|
24
|
+
if (key.startsWith("GIT_") && key !== "GIT_ALLOW_PROTOCOL" && key !== "GIT_TERMINAL_PROMPT") {
|
|
25
|
+
delete env[key];
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
const spawnOptions = {
|
|
30
|
+
cwd: options.cwd,
|
|
31
|
+
env,
|
|
32
|
+
encoding: "utf8",
|
|
33
|
+
stdio: "pipe",
|
|
34
|
+
timeout: options.timeoutMs,
|
|
35
|
+
maxBuffer: options.maxBuffer ?? 1024 * 1024 * 32
|
|
36
|
+
};
|
|
37
|
+
const result = spawnSync("git", args, spawnOptions);
|
|
38
|
+
const output = {
|
|
39
|
+
status: result.status,
|
|
40
|
+
stdout: result.stdout ?? "",
|
|
41
|
+
stderr: result.stderr ?? ""
|
|
42
|
+
};
|
|
43
|
+
if (result.status !== 0 && !options.allowFailure) {
|
|
44
|
+
throw new Error(output.stderr.trim() || output.stdout.trim() || `git ${args.join(" ")} failed in ${options.cwd}.`);
|
|
45
|
+
}
|
|
46
|
+
return output;
|
|
47
|
+
}
|
|
48
|
+
class TreeseedGitLockError extends Error {
|
|
49
|
+
diagnostics;
|
|
50
|
+
command;
|
|
51
|
+
cwd;
|
|
52
|
+
constructor(message, input) {
|
|
53
|
+
super(message);
|
|
54
|
+
this.name = "TreeseedGitLockError";
|
|
55
|
+
this.diagnostics = input.diagnostics;
|
|
56
|
+
this.command = input.command;
|
|
57
|
+
this.cwd = input.cwd;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
function classifyTreeseedGitMode(args) {
|
|
61
|
+
const command = args[0] ?? "";
|
|
62
|
+
if (command === "remote" && args[1] !== "set-url") {
|
|
63
|
+
return "read";
|
|
64
|
+
}
|
|
65
|
+
if (command === "tag" && (args[1] === "-l" || args[1] === "--list")) {
|
|
66
|
+
return "read";
|
|
67
|
+
}
|
|
68
|
+
if (command === "merge-base" && args.includes("--is-ancestor")) {
|
|
69
|
+
return "read";
|
|
70
|
+
}
|
|
71
|
+
return (/* @__PURE__ */ new Set([
|
|
72
|
+
"add",
|
|
73
|
+
"checkout",
|
|
74
|
+
"commit",
|
|
75
|
+
"fetch",
|
|
76
|
+
"merge",
|
|
77
|
+
"pull",
|
|
78
|
+
"push",
|
|
79
|
+
"rebase",
|
|
80
|
+
"reset",
|
|
81
|
+
"restore",
|
|
82
|
+
"switch",
|
|
83
|
+
"tag",
|
|
84
|
+
"worktree"
|
|
85
|
+
])).has(command) ? "mutate" : "read";
|
|
86
|
+
}
|
|
87
|
+
function resolveCommonGitDir(cwd) {
|
|
88
|
+
const result = gitSync(["rev-parse", "--git-common-dir"], { cwd, allowFailure: true });
|
|
89
|
+
const raw = result.status === 0 ? result.stdout.trim() : "";
|
|
90
|
+
if (!raw) return null;
|
|
91
|
+
return resolve(cwd, raw);
|
|
92
|
+
}
|
|
93
|
+
function resolveGitDir(cwd) {
|
|
94
|
+
const result = gitSync(["rev-parse", "--git-dir"], { cwd, allowFailure: true });
|
|
95
|
+
const raw = result.status === 0 ? result.stdout.trim() : "";
|
|
96
|
+
if (!raw) return null;
|
|
97
|
+
return resolve(cwd, raw);
|
|
98
|
+
}
|
|
99
|
+
function resolveGitRoot(cwd) {
|
|
100
|
+
const result = gitSync(["rev-parse", "--show-toplevel"], { cwd, allowFailure: true });
|
|
101
|
+
const raw = result.status === 0 ? result.stdout.trim() : "";
|
|
102
|
+
return raw || cwd;
|
|
103
|
+
}
|
|
104
|
+
function lockRoot(commonGitDir) {
|
|
105
|
+
return commonGitDir ? resolve(commonGitDir, "treeseed", "locks") : resolve(process.cwd(), ".treeseed", "locks");
|
|
106
|
+
}
|
|
107
|
+
function lockPathFor(commonGitDir) {
|
|
108
|
+
const base = lockRoot(commonGitDir);
|
|
109
|
+
return resolve(base, "git-mutation.lock");
|
|
110
|
+
}
|
|
111
|
+
function lockMetadataPath(lockPath) {
|
|
112
|
+
return resolve(lockPath, "owner.json");
|
|
113
|
+
}
|
|
114
|
+
function isWithin(parent, candidate) {
|
|
115
|
+
const rel = relative(parent, candidate);
|
|
116
|
+
return rel === "" || !!rel && !rel.startsWith("..") && !rel.startsWith("/");
|
|
117
|
+
}
|
|
118
|
+
function staleTreeseedLock(lockPath) {
|
|
119
|
+
if (!existsSync(lockPath)) return false;
|
|
120
|
+
try {
|
|
121
|
+
const metadata = JSON.parse(readFileSync(lockMetadataPath(lockPath), "utf8"));
|
|
122
|
+
const pid = typeof metadata.pid === "number" ? metadata.pid : null;
|
|
123
|
+
if (pid && !pidAlive(pid)) return true;
|
|
124
|
+
const updatedAt = typeof metadata.updatedAt === "string" ? Date.parse(metadata.updatedAt) : Number.NaN;
|
|
125
|
+
return Number.isFinite(updatedAt) && Date.now() - updatedAt > 30 * 60 * 1e3;
|
|
126
|
+
} catch {
|
|
127
|
+
return false;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
function acquireMutationLock(commonGitDir) {
|
|
131
|
+
const path = lockPathFor(commonGitDir);
|
|
132
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
133
|
+
for (let attempt = 0; attempt < 80; attempt += 1) {
|
|
134
|
+
try {
|
|
135
|
+
mkdirSync(path);
|
|
136
|
+
writeFileSync(lockMetadataPath(path), `${JSON.stringify({
|
|
137
|
+
pid: process.pid,
|
|
138
|
+
host: process.env.HOSTNAME ?? null,
|
|
139
|
+
createdAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
140
|
+
updatedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
141
|
+
}, null, 2)}
|
|
142
|
+
`, "utf8");
|
|
143
|
+
return () => rmSync(path, { recursive: true, force: true });
|
|
144
|
+
} catch {
|
|
145
|
+
if (staleTreeseedLock(path)) {
|
|
146
|
+
rmSync(path, { recursive: true, force: true });
|
|
147
|
+
continue;
|
|
148
|
+
}
|
|
149
|
+
Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, 125);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
throw new Error(`Timed out waiting for Treeseed Git mutation lock ${path}.`);
|
|
153
|
+
}
|
|
154
|
+
function activeGitProcessHints(repoRoot, commonGitDir, gitDir, lockPath) {
|
|
155
|
+
const ps = spawnSync("ps", ["-eo", "pid=,args="], { encoding: "utf8", stdio: "pipe" });
|
|
156
|
+
return (ps.stdout ?? "").split(/\r?\n/u).map((line) => line.trim()).filter(Boolean).map((line) => {
|
|
157
|
+
const match = /^(\d+)\s+(.*)$/u.exec(line);
|
|
158
|
+
return match ? { pid: Number(match[1]), command: match[2] ?? "" } : null;
|
|
159
|
+
}).filter((entry) => entry !== null).filter((entry) => {
|
|
160
|
+
if (!/(^|[\/\s])git(\s|$)/u.test(entry.command)) return false;
|
|
161
|
+
return entry.command.includes(repoRoot) || (commonGitDir ? entry.command.includes(commonGitDir) : false) || (gitDir ? entry.command.includes(gitDir) : false) || (lockPath ? entry.command.includes(lockPath) || entry.command.includes(dirname(lockPath)) : false);
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
function absentDiagnostic(cwd, kind = "index") {
|
|
165
|
+
const repoRoot = resolveGitRoot(cwd);
|
|
166
|
+
const commonGitDir = resolveCommonGitDir(cwd);
|
|
167
|
+
const gitDir = resolveGitDir(cwd);
|
|
168
|
+
const indexLockPath = gitDir ? resolve(gitDir, "index.lock") : null;
|
|
169
|
+
return {
|
|
170
|
+
repoRoot,
|
|
171
|
+
commonGitDir,
|
|
172
|
+
lockPath: indexLockPath,
|
|
173
|
+
relativeLockPath: indexLockPath && commonGitDir ? relative(commonGitDir, indexLockPath) : null,
|
|
174
|
+
kind,
|
|
175
|
+
exists: false,
|
|
176
|
+
indexLockPath,
|
|
177
|
+
indexLockExists: false,
|
|
178
|
+
safeToRepair: false,
|
|
179
|
+
reason: "no Git lock present",
|
|
180
|
+
removed: false,
|
|
181
|
+
ageMs: null,
|
|
182
|
+
activeGitProcessHints: []
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
function classifyGitLockPath(baseGitDir, lockPath) {
|
|
186
|
+
const rel = relative(baseGitDir, lockPath).replace(/\\/gu, "/");
|
|
187
|
+
if (rel === "index.lock") return "index";
|
|
188
|
+
if (rel === "packed-refs.lock") return "packed-refs";
|
|
189
|
+
if (rel === "HEAD.lock") return "head";
|
|
190
|
+
if (rel === "treeseed/locks/git-mutation.lock") return "treeseed-mutation";
|
|
191
|
+
if (/^refs\/.+\.lock$/u.test(rel)) return "ref";
|
|
192
|
+
return "unknown";
|
|
193
|
+
}
|
|
194
|
+
function staleThresholdMs(kind) {
|
|
195
|
+
switch (kind) {
|
|
196
|
+
case "ref":
|
|
197
|
+
return 30 * 1e3;
|
|
198
|
+
case "packed-refs":
|
|
199
|
+
case "head":
|
|
200
|
+
return 2 * 60 * 1e3;
|
|
201
|
+
case "treeseed-mutation":
|
|
202
|
+
return 30 * 60 * 1e3;
|
|
203
|
+
case "index":
|
|
204
|
+
return 10 * 60 * 1e3;
|
|
205
|
+
default:
|
|
206
|
+
return Number.POSITIVE_INFINITY;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
function lockDiagnostic(cwd, lockPath) {
|
|
210
|
+
const repoRoot = resolveGitRoot(cwd);
|
|
211
|
+
const commonGitDir = resolveCommonGitDir(cwd);
|
|
212
|
+
const gitDir = resolveGitDir(cwd);
|
|
213
|
+
const resolvedLockPath = resolve(lockPath);
|
|
214
|
+
const baseGitDir = gitDir && isWithin(gitDir, resolvedLockPath) ? gitDir : commonGitDir && isWithin(commonGitDir, resolvedLockPath) ? commonGitDir : null;
|
|
215
|
+
const kind = baseGitDir ? classifyGitLockPath(baseGitDir, resolvedLockPath) : "unknown";
|
|
216
|
+
const indexLockPath = gitDir ? resolve(gitDir, "index.lock") : null;
|
|
217
|
+
if (!baseGitDir || !existsSync(resolvedLockPath)) {
|
|
218
|
+
return {
|
|
219
|
+
...absentDiagnostic(cwd, kind),
|
|
220
|
+
lockPath: resolvedLockPath,
|
|
221
|
+
relativeLockPath: baseGitDir ? relative(baseGitDir, resolvedLockPath) : null
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
const stat = statSync(resolvedLockPath);
|
|
225
|
+
const ageMs = Date.now() - stat.mtimeMs;
|
|
226
|
+
const activeHints = activeGitProcessHints(repoRoot, commonGitDir, gitDir, resolvedLockPath);
|
|
227
|
+
const insideGitDir = isWithin(baseGitDir, resolvedLockPath);
|
|
228
|
+
const safeToRepair = insideGitDir && kind !== "unknown" && ageMs > staleThresholdMs(kind) && activeHints.length === 0;
|
|
229
|
+
return {
|
|
230
|
+
repoRoot,
|
|
231
|
+
commonGitDir,
|
|
232
|
+
lockPath: resolvedLockPath,
|
|
233
|
+
relativeLockPath: relative(baseGitDir, resolvedLockPath),
|
|
234
|
+
kind,
|
|
235
|
+
exists: true,
|
|
236
|
+
indexLockPath,
|
|
237
|
+
indexLockExists: resolvedLockPath === indexLockPath,
|
|
238
|
+
safeToRepair,
|
|
239
|
+
reason: safeToRepair ? `${kind} lock is stale and no active Git process references this repo` : !insideGitDir ? "lock path is outside the Git directory" : kind === "unknown" ? "unknown Git lock kind is not safe to remove automatically" : activeHints.length > 0 ? `active Git process references this repo: ${activeHints.map((hint) => hint.pid).join(", ")}` : `${kind} lock may be owned by a recent Git process`,
|
|
240
|
+
removed: false,
|
|
241
|
+
ageMs,
|
|
242
|
+
activeGitProcessHints: activeHints
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
function collectLockPaths(commonGitDir, gitDir) {
|
|
246
|
+
const paths = [
|
|
247
|
+
resolve(gitDir, "index.lock"),
|
|
248
|
+
resolve(gitDir, "HEAD.lock"),
|
|
249
|
+
resolve(commonGitDir, "packed-refs.lock")
|
|
250
|
+
];
|
|
251
|
+
const refRoots = [
|
|
252
|
+
resolve(commonGitDir, "refs"),
|
|
253
|
+
resolve(gitDir, "refs")
|
|
254
|
+
];
|
|
255
|
+
for (const refRoot of refRoots) {
|
|
256
|
+
if (!existsSync(refRoot)) continue;
|
|
257
|
+
const stack = [refRoot];
|
|
258
|
+
while (stack.length > 0) {
|
|
259
|
+
const current = stack.pop();
|
|
260
|
+
if (!current) continue;
|
|
261
|
+
for (const entry of readdirSync(current, { withFileTypes: true })) {
|
|
262
|
+
const next = resolve(current, entry.name);
|
|
263
|
+
if (entry.isDirectory()) {
|
|
264
|
+
stack.push(next);
|
|
265
|
+
} else if (entry.isFile() && entry.name.endsWith(".lock")) {
|
|
266
|
+
paths.push(next);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
return [...new Set(paths)];
|
|
272
|
+
}
|
|
273
|
+
function inspectGitLocks(cwd) {
|
|
274
|
+
const commonGitDir = resolveCommonGitDir(cwd);
|
|
275
|
+
const gitDir = resolveGitDir(cwd);
|
|
276
|
+
if (!commonGitDir || !gitDir) return [absentDiagnostic(cwd)];
|
|
277
|
+
const diagnostics = collectLockPaths(commonGitDir, gitDir).filter((lockPath) => existsSync(lockPath)).map((lockPath) => lockDiagnostic(cwd, lockPath));
|
|
278
|
+
return diagnostics.length > 0 ? diagnostics : [absentDiagnostic(cwd)];
|
|
279
|
+
}
|
|
280
|
+
function presentLocks(cwd) {
|
|
281
|
+
return inspectGitLocks(cwd).filter((entry) => entry.exists);
|
|
282
|
+
}
|
|
283
|
+
function primaryDiagnostic(cwd) {
|
|
284
|
+
const diagnostics = inspectGitLocks(cwd);
|
|
285
|
+
const index = diagnostics.find((entry) => entry.kind === "index" && entry.exists);
|
|
286
|
+
const present = diagnostics.find((entry) => entry.exists);
|
|
287
|
+
return index ?? present ?? diagnostics[0] ?? absentDiagnostic(cwd);
|
|
288
|
+
}
|
|
289
|
+
function inspectIndexLock(cwd) {
|
|
290
|
+
const repoRoot = resolveGitRoot(cwd);
|
|
291
|
+
const commonGitDir = resolveCommonGitDir(cwd);
|
|
292
|
+
const gitDir = resolveGitDir(cwd);
|
|
293
|
+
const indexLockPath = gitDir ? resolve(gitDir, "index.lock") : null;
|
|
294
|
+
if (!indexLockPath || !existsSync(indexLockPath)) {
|
|
295
|
+
return absentDiagnostic(cwd);
|
|
296
|
+
}
|
|
297
|
+
return lockDiagnostic(cwd, indexLockPath);
|
|
298
|
+
}
|
|
299
|
+
function waitForIndexLockToClear(cwd) {
|
|
300
|
+
let diagnostic = inspectIndexLock(cwd);
|
|
301
|
+
if (!diagnostic.indexLockExists) {
|
|
302
|
+
return diagnostic;
|
|
303
|
+
}
|
|
304
|
+
for (let attempt = 0; attempt < 40; attempt += 1) {
|
|
305
|
+
Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, 125);
|
|
306
|
+
diagnostic = inspectIndexLock(cwd);
|
|
307
|
+
if (!diagnostic.indexLockExists) {
|
|
308
|
+
return diagnostic;
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
return diagnostic;
|
|
312
|
+
}
|
|
313
|
+
function inspectTreeseedGitLocks(cwd) {
|
|
314
|
+
return primaryDiagnostic(cwd);
|
|
315
|
+
}
|
|
316
|
+
function inspectTreeseedGitLockSet(cwd) {
|
|
317
|
+
return inspectGitLocks(cwd);
|
|
318
|
+
}
|
|
319
|
+
function workspaceGitRepositories(cwd) {
|
|
320
|
+
const root = resolveGitRoot(cwd);
|
|
321
|
+
const repositories = /* @__PURE__ */ new Set([root]);
|
|
322
|
+
const packagesDir = resolve(root, "packages");
|
|
323
|
+
if (existsSync(packagesDir)) {
|
|
324
|
+
for (const entry of readdirSync(packagesDir, { withFileTypes: true })) {
|
|
325
|
+
if (!entry.isDirectory()) continue;
|
|
326
|
+
const dir = resolve(packagesDir, entry.name);
|
|
327
|
+
if (existsSync(resolve(dir, ".git"))) repositories.add(dir);
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
const worktreesDir = resolve(root, ".treeseed", "worktrees");
|
|
331
|
+
if (existsSync(worktreesDir)) {
|
|
332
|
+
for (const entry of readdirSync(worktreesDir, { withFileTypes: true })) {
|
|
333
|
+
if (!entry.isDirectory()) continue;
|
|
334
|
+
const dir = resolve(worktreesDir, entry.name);
|
|
335
|
+
if (existsSync(resolve(dir, ".git"))) repositories.add(dir);
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
return [...repositories];
|
|
339
|
+
}
|
|
340
|
+
function inspectTreeseedWorkspaceGitLocks(cwd) {
|
|
341
|
+
const repositories = workspaceGitRepositories(cwd).map((repo) => ({
|
|
342
|
+
repoRoot: resolveGitRoot(repo),
|
|
343
|
+
locks: inspectGitLocks(repo)
|
|
344
|
+
}));
|
|
345
|
+
const allLocks = repositories.flatMap((repo) => repo.locks).filter((entry) => entry.exists);
|
|
346
|
+
return {
|
|
347
|
+
root: repositories[0]?.locks ?? [absentDiagnostic(cwd)],
|
|
348
|
+
repositories,
|
|
349
|
+
summary: {
|
|
350
|
+
repositoriesChecked: repositories.length,
|
|
351
|
+
locksPresent: allLocks.length,
|
|
352
|
+
safeToRepair: allLocks.filter((entry) => entry.safeToRepair).length,
|
|
353
|
+
unsafe: allLocks.filter((entry) => !entry.safeToRepair).length,
|
|
354
|
+
removed: allLocks.filter((entry) => entry.removed).length
|
|
355
|
+
}
|
|
356
|
+
};
|
|
357
|
+
}
|
|
358
|
+
function recoverTreeseedGitLocks(cwd, { execute = false, all = false } = {}) {
|
|
359
|
+
if (all) {
|
|
360
|
+
const repositories = workspaceGitRepositories(cwd).map((repo) => ({
|
|
361
|
+
repoRoot: resolveGitRoot(repo),
|
|
362
|
+
locks: recoverTreeseedGitLocks(repo, { execute, all: false })
|
|
363
|
+
}));
|
|
364
|
+
const allLocks = repositories.flatMap((repo) => repo.locks).filter((entry) => entry.exists);
|
|
365
|
+
return {
|
|
366
|
+
root: repositories[0]?.locks ?? [absentDiagnostic(cwd)],
|
|
367
|
+
repositories,
|
|
368
|
+
summary: {
|
|
369
|
+
repositoriesChecked: repositories.length,
|
|
370
|
+
locksPresent: allLocks.length,
|
|
371
|
+
safeToRepair: allLocks.filter((entry) => entry.safeToRepair).length,
|
|
372
|
+
unsafe: allLocks.filter((entry) => !entry.safeToRepair).length,
|
|
373
|
+
removed: allLocks.filter((entry) => entry.removed).length
|
|
374
|
+
}
|
|
375
|
+
};
|
|
376
|
+
}
|
|
377
|
+
const diagnostics = inspectGitLocks(cwd);
|
|
378
|
+
return diagnostics.map((diagnostic) => {
|
|
379
|
+
if (execute && diagnostic.lockPath && diagnostic.exists && diagnostic.safeToRepair) {
|
|
380
|
+
rmSync(diagnostic.lockPath, { force: true });
|
|
381
|
+
return { ...diagnostic, removed: true };
|
|
382
|
+
}
|
|
383
|
+
return diagnostic;
|
|
384
|
+
});
|
|
385
|
+
}
|
|
386
|
+
function repairSafeLocks(cwd) {
|
|
387
|
+
const diagnostics = inspectGitLocks(cwd);
|
|
388
|
+
const repaired = [];
|
|
389
|
+
for (const diagnostic of diagnostics) {
|
|
390
|
+
if (diagnostic.exists && diagnostic.safeToRepair && diagnostic.lockPath) {
|
|
391
|
+
rmSync(diagnostic.lockPath, { force: true });
|
|
392
|
+
repaired.push({ ...diagnostic, removed: true });
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
return repaired;
|
|
396
|
+
}
|
|
397
|
+
function gitLockFailure(output) {
|
|
398
|
+
const text = `${output.stderr}
|
|
399
|
+
${output.stdout}`;
|
|
400
|
+
return /cannot lock ref|Unable to create .*\.lock|Another git process seems to be running|index\.lock|packed-refs\.lock|HEAD\.lock|File exists/iu.test(text);
|
|
401
|
+
}
|
|
402
|
+
function gitLockErrorMessage(cwd, args, diagnostics, original, retry) {
|
|
403
|
+
const present = diagnostics.filter((entry) => entry.exists);
|
|
404
|
+
const details = present.length > 0 ? present.map((entry) => `${entry.repoRoot}: ${entry.relativeLockPath ?? entry.lockPath} safe=${entry.safeToRepair ? "yes" : "no"} - ${entry.reason}`).join("\n") : "No known Git lock files were present after the failure.";
|
|
405
|
+
return [
|
|
406
|
+
`Git command failed because the repository appears to be locked: git ${args.join(" ")}`,
|
|
407
|
+
`Working directory: ${cwd}`,
|
|
408
|
+
details,
|
|
409
|
+
"Run `npx trsd recover --git-locks --json` for diagnostics.",
|
|
410
|
+
`Original Git error: ${(original.stderr || original.stdout).trim()}`,
|
|
411
|
+
retry ? `Retry Git error: ${(retry.stderr || retry.stdout).trim()}` : null
|
|
412
|
+
].filter(Boolean).join("\n");
|
|
413
|
+
}
|
|
414
|
+
function runTreeseedGit(args, options) {
|
|
415
|
+
if ((options.mode ?? "read") === "read") {
|
|
416
|
+
return gitSync(args, options);
|
|
417
|
+
}
|
|
418
|
+
const commonGitDir = resolveCommonGitDir(options.cwd);
|
|
419
|
+
const release = acquireMutationLock(commonGitDir);
|
|
420
|
+
try {
|
|
421
|
+
const locks = presentLocks(options.cwd);
|
|
422
|
+
const unsafe = locks.find((entry) => !entry.safeToRepair);
|
|
423
|
+
if (unsafe) {
|
|
424
|
+
throw new TreeseedGitLockError(
|
|
425
|
+
`Git ${unsafe.kind} lock is not safe to remove for ${unsafe.repoRoot}: ${unsafe.reason}. Run npx trsd recover --git-locks --json for diagnostics.`,
|
|
426
|
+
{ diagnostics: locks, command: args, cwd: options.cwd }
|
|
427
|
+
);
|
|
428
|
+
}
|
|
429
|
+
repairSafeLocks(options.cwd);
|
|
430
|
+
const first = gitSync(args, { ...options, allowFailure: true });
|
|
431
|
+
if (first.status === 0) return first;
|
|
432
|
+
if (!gitLockFailure(first)) {
|
|
433
|
+
if (options.allowFailure) return first;
|
|
434
|
+
throw new Error(first.stderr.trim() || first.stdout.trim() || `git ${args.join(" ")} failed in ${options.cwd}.`);
|
|
435
|
+
}
|
|
436
|
+
const afterFailure = presentLocks(options.cwd);
|
|
437
|
+
const unsafeAfterFailure = afterFailure.find((entry) => !entry.safeToRepair);
|
|
438
|
+
if (unsafeAfterFailure) {
|
|
439
|
+
throw new TreeseedGitLockError(
|
|
440
|
+
gitLockErrorMessage(options.cwd, args, afterFailure, first),
|
|
441
|
+
{ diagnostics: afterFailure, command: args, cwd: options.cwd }
|
|
442
|
+
);
|
|
443
|
+
}
|
|
444
|
+
repairSafeLocks(options.cwd);
|
|
445
|
+
const retry = gitSync(args, { ...options, allowFailure: true });
|
|
446
|
+
if (retry.status === 0) return retry;
|
|
447
|
+
if (options.allowFailure) return retry;
|
|
448
|
+
throw new TreeseedGitLockError(
|
|
449
|
+
gitLockErrorMessage(options.cwd, args, afterFailure, first, retry),
|
|
450
|
+
{ diagnostics: afterFailure, command: args, cwd: options.cwd }
|
|
451
|
+
);
|
|
452
|
+
} finally {
|
|
453
|
+
release();
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
function runTreeseedGitText(args, options) {
|
|
457
|
+
return runTreeseedGit(args, options).stdout.trim();
|
|
458
|
+
}
|
|
459
|
+
function runTreeseedGitOk(args, options) {
|
|
460
|
+
return runTreeseedGit(args, { ...options, allowFailure: true }).status === 0;
|
|
461
|
+
}
|
|
462
|
+
async function runTreeseedGitBatch(operations, _options = {}) {
|
|
463
|
+
const results = [];
|
|
464
|
+
for (const operation of operations) {
|
|
465
|
+
results.push(runTreeseedGit(operation.args, operation));
|
|
466
|
+
}
|
|
467
|
+
return results;
|
|
468
|
+
}
|
|
469
|
+
export {
|
|
470
|
+
classifyTreeseedGitMode,
|
|
471
|
+
inspectTreeseedGitLockSet,
|
|
472
|
+
inspectTreeseedGitLocks,
|
|
473
|
+
inspectTreeseedWorkspaceGitLocks,
|
|
474
|
+
recoverTreeseedGitLocks,
|
|
475
|
+
runTreeseedGit,
|
|
476
|
+
runTreeseedGitBatch,
|
|
477
|
+
runTreeseedGitOk,
|
|
478
|
+
runTreeseedGitText
|
|
479
|
+
};
|
|
@@ -75,6 +75,41 @@ export declare function assertCleanWorktrees(repoDirs: any): any;
|
|
|
75
75
|
export declare function branchExists(repoDir: any, branchName: any): boolean;
|
|
76
76
|
export declare function remoteBranchExists(repoDir: any, branchName: any): boolean;
|
|
77
77
|
export declare function fetchOrigin(repoDir: any): void;
|
|
78
|
+
export declare function remoteHeadCommit(repoDir: any, branchName: any): string;
|
|
79
|
+
export declare function pushCommitToBranch(repoDir: any, commitSha: any, branchName: any, { forceWithLease }?: {
|
|
80
|
+
forceWithLease?: boolean | undefined;
|
|
81
|
+
}): void;
|
|
82
|
+
export type StageMergeDownResult = {
|
|
83
|
+
repoDir: string;
|
|
84
|
+
featureBranch: string;
|
|
85
|
+
sourceBranch: string;
|
|
86
|
+
beforeHead: string;
|
|
87
|
+
sourceHead: string | null;
|
|
88
|
+
afterHead: string;
|
|
89
|
+
merged: boolean;
|
|
90
|
+
pushed: boolean;
|
|
91
|
+
generatedMetadataReconciliation: Record<string, unknown> | null;
|
|
92
|
+
};
|
|
93
|
+
export type StageExactPromotionResult = {
|
|
94
|
+
repoDir: string;
|
|
95
|
+
targetBranch: string;
|
|
96
|
+
expectedBefore: string | null;
|
|
97
|
+
actualBefore: string | null;
|
|
98
|
+
commitSha: string;
|
|
99
|
+
pushed: boolean;
|
|
100
|
+
verified: boolean;
|
|
101
|
+
};
|
|
102
|
+
export declare function mergeBranchDownIntoFeature(repoDir: string, input: {
|
|
103
|
+
featureBranch: string;
|
|
104
|
+
sourceBranch?: typeof STAGING_BRANCH;
|
|
105
|
+
message: string;
|
|
106
|
+
allowGeneratedMetadataAutoResolution?: boolean;
|
|
107
|
+
}): StageMergeDownResult;
|
|
108
|
+
export declare function promoteCommitToBranchWithExpectedHead(repoDir: string, input: {
|
|
109
|
+
commitSha: string;
|
|
110
|
+
targetBranch?: typeof STAGING_BRANCH;
|
|
111
|
+
expectedBefore: string | null;
|
|
112
|
+
}): StageExactPromotionResult;
|
|
78
113
|
export declare function ensureLocalBranchTracking(repoDir: any, branchName: any): void;
|
|
79
114
|
export declare function checkoutBranch(repoDir: any, branchName: any): void;
|
|
80
115
|
export declare function checkoutTaskBranchFromStaging(cwd: any, branchName: any, { createIfMissing, pushIfCreated }?: {
|
|
@@ -102,6 +137,14 @@ export declare function createFeatureBranchFromStaging(cwd: any, branchName: any
|
|
|
102
137
|
export declare function pushBranch(repoDir: any, branchName: any, { setUpstream }?: {
|
|
103
138
|
setUpstream?: boolean | undefined;
|
|
104
139
|
}): void;
|
|
140
|
+
export declare function taskTagSlug(branchName: any): string;
|
|
141
|
+
export declare function createDeprecatedTaskTag(repoDir: any, branchName: any, reason?: string): {
|
|
142
|
+
repoDir: any;
|
|
143
|
+
branchName: any;
|
|
144
|
+
tagName: string;
|
|
145
|
+
head: string;
|
|
146
|
+
pushed: boolean;
|
|
147
|
+
};
|
|
105
148
|
export declare function ensureRemoteBranchFromBase(repoDir: any, branchName: any, { baseBranch }?: {
|
|
106
149
|
baseBranch?: string | undefined;
|
|
107
150
|
}): {
|
|
@@ -158,11 +201,6 @@ export declare function listTaskBranches(repoDir: any): {
|
|
|
158
201
|
remote: boolean;
|
|
159
202
|
current: boolean;
|
|
160
203
|
}[];
|
|
161
|
-
export declare function taskTagSlug(branchName: any): string;
|
|
162
|
-
export declare function createDeprecatedTaskTag(repoDir: any, branchName: any, message: any): {
|
|
163
|
-
tagName: string;
|
|
164
|
-
head: string;
|
|
165
|
-
};
|
|
166
204
|
export declare function waitForStagingAutomation(repoDir: any): {
|
|
167
205
|
status: string;
|
|
168
206
|
reason: string;
|