@treeseed/sdk 0.12.26 → 0.12.28
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 +1 -1
- package/dist/guarantees/index.js +15 -1
- package/dist/hosting/builtins.js +4 -4
- package/dist/hosting/contracts.d.ts +3 -3
- package/dist/hosting/graph.d.ts +4 -4
- package/dist/hosting/graph.js +17 -17
- package/dist/operations/agent-tools.d.ts +1 -1
- package/dist/operations/agent-tools.js +1 -1
- package/dist/operations/providers/default.js +2 -2
- package/dist/operations/services/config-runtime.d.ts +9 -9
- package/dist/operations/services/config-runtime.js +10 -10
- package/dist/operations/services/deploy.d.ts +8 -8
- package/dist/operations/services/deploy.js +151 -151
- package/dist/operations/services/github-automation.d.ts +6 -6
- package/dist/operations/services/github-automation.js +8 -8
- package/dist/operations/services/hub-launch.d.ts +1 -1
- package/dist/operations/services/hub-launch.js +1 -1
- package/dist/operations/services/package-adapters.d.ts +2 -2
- package/dist/operations/services/package-adapters.js +2 -2
- package/dist/operations/services/project-host-operations.d.ts +1 -1
- package/dist/operations/services/project-host-operations.js +1 -1
- package/dist/operations/services/project-platform.d.ts +8 -8
- package/dist/operations/services/project-platform.js +31 -31
- package/dist/operations/services/project-web-monitor.d.ts +1 -1
- package/dist/operations/services/project-web-monitor.js +4 -4
- package/dist/operations/services/railway-deploy.d.ts +4 -4
- package/dist/operations/services/railway-deploy.js +7 -7
- package/dist/operations/services/repository-save-orchestrator.js +3 -3
- package/dist/operations/services/template-secret-sync.d.ts +1 -1
- package/dist/operations/services/template-secret-sync.js +3 -3
- package/dist/reconcile/builtin-adapters.js +86 -40
- package/dist/reconcile/contracts.d.ts +1 -1
- package/dist/reconcile/engine.d.ts +4 -4
- package/dist/reconcile/engine.js +12 -12
- package/dist/reconcile/providers/release-private.d.ts +1 -1
- package/dist/scripts/tenant-deploy.js +9 -9
- package/dist/scripts/tenant-destroy.js +7 -7
- package/dist/scripts/tenant-workflow-action.js +4 -4
- package/dist/scripts/test-scaffold.js +2 -2
- package/dist/scripts/workspace-command-e2e.js +4 -4
- package/dist/sdk-types.d.ts +2 -2
- package/dist/treedx/generated/openapi-types.d.ts +11 -11
- package/dist/treedx/types.d.ts +15 -15
- package/dist/workflow/operations.d.ts +6 -4
- package/dist/workflow/operations.js +46 -23
- package/dist/workflow.d.ts +0 -9
- package/package.json +1 -1
package/README.md
CHANGED
package/dist/guarantees/index.js
CHANGED
|
@@ -699,11 +699,25 @@ function apiAcceptanceEnvironment(environment) {
|
|
|
699
699
|
};
|
|
700
700
|
}
|
|
701
701
|
function apiAcceptanceBaseUrl(environment) {
|
|
702
|
-
if (process.env.TREESEED_API_BASE_URL?.trim())
|
|
702
|
+
if (process.env.TREESEED_API_BASE_URL?.trim()) {
|
|
703
|
+
const configured = process.env.TREESEED_API_BASE_URL.trim().replace(/\/+$/u, "");
|
|
704
|
+
if (environment !== "local" && isLoopbackUrl(configured)) {
|
|
705
|
+
throw new Error(`API guarantee environment ${environment} must target a live hosted API URL, not ${configured}.`);
|
|
706
|
+
}
|
|
707
|
+
return configured;
|
|
708
|
+
}
|
|
703
709
|
if (environment === "staging") return "https://api.preview.treeseed.dev";
|
|
704
710
|
if (environment === "prod") return "https://api.treeseed.dev";
|
|
705
711
|
return "http://127.0.0.1:3000";
|
|
706
712
|
}
|
|
713
|
+
function isLoopbackUrl(value) {
|
|
714
|
+
try {
|
|
715
|
+
const url = new URL(value);
|
|
716
|
+
return ["localhost", "127.0.0.1", "0.0.0.0", "::1", "[::1]"].includes(url.hostname);
|
|
717
|
+
} catch {
|
|
718
|
+
return false;
|
|
719
|
+
}
|
|
720
|
+
}
|
|
707
721
|
async function defaultTreeseedGuaranteeVerifierExecutor(input) {
|
|
708
722
|
const definition = input.definition;
|
|
709
723
|
const ownerPackage = definition.ownerPackage ?? input.guarantee.manifest.ownerPackage;
|
package/dist/hosting/builtins.js
CHANGED
|
@@ -18,7 +18,7 @@ function syntheticStatus(input) {
|
|
|
18
18
|
unitId: input.unit.id,
|
|
19
19
|
serviceType: input.unit.serviceType.id,
|
|
20
20
|
placement: input.unit.placement,
|
|
21
|
-
|
|
21
|
+
planOnly: input.planOnly === true
|
|
22
22
|
},
|
|
23
23
|
warnings: []
|
|
24
24
|
};
|
|
@@ -85,10 +85,10 @@ function createSyntheticHostAdapter(id, label, capabilityIds, environments = ALL
|
|
|
85
85
|
apply(input) {
|
|
86
86
|
return {
|
|
87
87
|
...syntheticStatus(input),
|
|
88
|
-
status: input.
|
|
88
|
+
status: input.planOnly ? "pending" : "ready",
|
|
89
89
|
state: {
|
|
90
90
|
...syntheticStatus(input).state,
|
|
91
|
-
applied: input.
|
|
91
|
+
applied: input.planOnly !== true
|
|
92
92
|
}
|
|
93
93
|
};
|
|
94
94
|
},
|
|
@@ -327,7 +327,7 @@ function createCloudflareHostAdapter() {
|
|
|
327
327
|
},
|
|
328
328
|
verify(input) {
|
|
329
329
|
if (!isPagesSite(input)) return base.verify(input);
|
|
330
|
-
if (input.
|
|
330
|
+
if (input.planOnly) return base.verify(input);
|
|
331
331
|
const projectName = cloudflarePagesProjectName(input);
|
|
332
332
|
const branchName = projectName ? cloudflarePagesBranchName(input) : null;
|
|
333
333
|
const domain = cloudflarePagesDomain(input);
|
|
@@ -13,7 +13,7 @@ export interface TreeseedHostAdapterOperationInput {
|
|
|
13
13
|
environment: TreeseedHostingEnvironment;
|
|
14
14
|
unit: TreeseedHostingUnit;
|
|
15
15
|
graph: TreeseedHostingGraph;
|
|
16
|
-
|
|
16
|
+
planOnly?: boolean;
|
|
17
17
|
}
|
|
18
18
|
export interface TreeseedHostAdapterOperationResult {
|
|
19
19
|
status: TreeseedHostingStatus;
|
|
@@ -161,7 +161,7 @@ export interface TreeseedHostingVerification {
|
|
|
161
161
|
}
|
|
162
162
|
export interface TreeseedHostingPlan {
|
|
163
163
|
environment: TreeseedHostingEnvironment;
|
|
164
|
-
|
|
164
|
+
planOnly: boolean;
|
|
165
165
|
units: Array<{
|
|
166
166
|
unit: TreeseedHostingUnit;
|
|
167
167
|
observed: TreeseedHostAdapterOperationResult;
|
|
@@ -173,7 +173,7 @@ export interface TreeseedHostingPlan {
|
|
|
173
173
|
}
|
|
174
174
|
export interface TreeseedHostingApplyResult {
|
|
175
175
|
environment: TreeseedHostingEnvironment;
|
|
176
|
-
|
|
176
|
+
planOnly: boolean;
|
|
177
177
|
selectedApps?: string[];
|
|
178
178
|
selectedSystems?: string[];
|
|
179
179
|
skippedSystems?: Array<{
|
package/dist/hosting/graph.d.ts
CHANGED
|
@@ -3,13 +3,13 @@ import type { TreeseedRunnableBootstrapSystem } from '../reconcile/bootstrap-sys
|
|
|
3
3
|
import type { TreeseedHostingApplyResult, TreeseedHostingEnvironment, TreeseedHostingGraph, TreeseedHostingGraphInput, TreeseedHostingPlan, TreeseedHostingPlacementSummary, TreeseedHostingUnit, TreeseedServicePlacement } from './contracts.js';
|
|
4
4
|
export declare function compileTreeseedHostingGraph(input: TreeseedHostingGraphInput): TreeseedHostingGraph;
|
|
5
5
|
export declare function planTreeseedHostingGraph(input: TreeseedHostingGraphInput & {
|
|
6
|
-
|
|
6
|
+
planOnly?: boolean;
|
|
7
7
|
}): Promise<TreeseedHostingPlan>;
|
|
8
8
|
/**
|
|
9
9
|
* @deprecated Use reconcileTreeseedTarget with hosting selectors instead.
|
|
10
10
|
*/
|
|
11
11
|
export declare function applyTreeseedHostingGraph(input: TreeseedHostingGraphInput & {
|
|
12
|
-
|
|
12
|
+
planOnly?: boolean;
|
|
13
13
|
}): Promise<TreeseedHostingApplyResult>;
|
|
14
14
|
export declare function serializeHostingUnit(unit: TreeseedHostingUnit): {
|
|
15
15
|
id: string;
|
|
@@ -111,7 +111,7 @@ export declare function serializeHostingPlan(plan: TreeseedHostingPlan): {
|
|
|
111
111
|
liveVerification: import("../reconcile/platform.js").TreeseedCanonicalLiveVerification;
|
|
112
112
|
ok: boolean;
|
|
113
113
|
environment: TreeseedHostingEnvironment;
|
|
114
|
-
|
|
114
|
+
planOnly: boolean;
|
|
115
115
|
};
|
|
116
116
|
export declare function serializeHostingApplyResult(result: TreeseedHostingApplyResult): {
|
|
117
117
|
selectedApps: string[];
|
|
@@ -190,6 +190,6 @@ export declare function serializeHostingApplyResult(result: TreeseedHostingApply
|
|
|
190
190
|
liveVerification: import("../reconcile/platform.js").TreeseedCanonicalLiveVerification;
|
|
191
191
|
ok: boolean;
|
|
192
192
|
environment: TreeseedHostingEnvironment;
|
|
193
|
-
|
|
193
|
+
planOnly: boolean;
|
|
194
194
|
};
|
|
195
195
|
export declare function hostingEnvironmentLabel(environment: TreeseedHostingEnvironment): string;
|
package/dist/hosting/graph.js
CHANGED
|
@@ -162,8 +162,8 @@ function railwaySourcePolicy(input, serviceKey, service, imageRef) {
|
|
|
162
162
|
const configuredSource = service.railway?.source && typeof service.railway.source === "object" && !Array.isArray(service.railway.source) ? service.railway.source : {};
|
|
163
163
|
const configuredMode = typeof service.railway?.sourceMode === "string" ? service.railway.sourceMode : null;
|
|
164
164
|
const repository = typeof service.railway?.sourceRepo === "string" ? service.railway.sourceRepo : typeof configuredSource.repository === "string" ? configuredSource.repository : typeof configuredSource.repo === "string" ? configuredSource.repo : readPackageRepository(resolveRailwayServiceSourceRoot(input, serviceKey, service)) ?? readPackageRepository(input.tenantRoot);
|
|
165
|
-
const
|
|
166
|
-
const mode = input.environment === "prod" ? "image" :
|
|
165
|
+
const apiPackageSourceEligible = ["api", "operationsRunner"].includes(serviceKey);
|
|
166
|
+
const mode = input.environment === "prod" ? "image" : input.environment === "staging" && apiPackageSourceEligible ? "git" : configuredMode === "git" || configuredMode === "image" ? configuredMode : imageRef ? "image" : "git";
|
|
167
167
|
if (mode !== "git") {
|
|
168
168
|
return {
|
|
169
169
|
sourceMode: "image",
|
|
@@ -721,14 +721,14 @@ async function planTreeseedHostingGraph(input) {
|
|
|
721
721
|
const graph = compileTreeseedHostingGraph(input);
|
|
722
722
|
const units = [];
|
|
723
723
|
for (const unit of graph.units) {
|
|
724
|
-
const observed = await unit.host.refresh({ environment: graph.environment, unit, graph,
|
|
725
|
-
const plan = await unit.host.diff({ environment: graph.environment, unit, graph, observed,
|
|
726
|
-
const verification = await unit.host.verify({ environment: graph.environment, unit, graph, observed,
|
|
724
|
+
const observed = await unit.host.refresh({ environment: graph.environment, unit, graph, planOnly: input.planOnly !== false });
|
|
725
|
+
const plan = await unit.host.diff({ environment: graph.environment, unit, graph, observed, planOnly: input.planOnly !== false });
|
|
726
|
+
const verification = await unit.host.verify({ environment: graph.environment, unit, graph, observed, planOnly: input.planOnly !== false });
|
|
727
727
|
units.push({ unit, observed, plan, verification });
|
|
728
728
|
}
|
|
729
729
|
return {
|
|
730
730
|
environment: graph.environment,
|
|
731
|
-
|
|
731
|
+
planOnly: input.planOnly !== false,
|
|
732
732
|
units,
|
|
733
733
|
placements: graph.placements,
|
|
734
734
|
warnings: graph.warnings
|
|
@@ -769,10 +769,10 @@ async function applyTreeseedHostingGraph(input) {
|
|
|
769
769
|
const graph = compileTreeseedHostingGraph(input);
|
|
770
770
|
const selectedSystems = railwayReconcileSystemsForUnits(graph.units);
|
|
771
771
|
const infrastructureUnits = graph.units.filter(isInfrastructureHostedUnit);
|
|
772
|
-
if (plan.
|
|
772
|
+
if (plan.planOnly) {
|
|
773
773
|
return {
|
|
774
774
|
environment: plan.environment,
|
|
775
|
-
|
|
775
|
+
planOnly: true,
|
|
776
776
|
selectedApps: [...new Set(graph.units.map((unit) => unit.application?.id).filter((value) => Boolean(value)))],
|
|
777
777
|
selectedSystems,
|
|
778
778
|
skippedSystems: ["web", "data", "github"].filter((system) => !selectedSystems.includes(system)).map((system) => ({ system, reason: selectedSystems.length > 0 ? "Not selected by hosting app filter." : "No Railway reconciliation selected." })),
|
|
@@ -794,7 +794,7 @@ async function applyTreeseedHostingGraph(input) {
|
|
|
794
794
|
target: createPersistentDeployTarget(graph.environment),
|
|
795
795
|
systems: selectedSystems.length > 0 ? selectedSystems : void 0,
|
|
796
796
|
env: railwayEnvForHostingApply(input, graph),
|
|
797
|
-
|
|
797
|
+
planOnly: plan.planOnly
|
|
798
798
|
});
|
|
799
799
|
const resultByUnit = /* @__PURE__ */ new Map();
|
|
800
800
|
for (const entry of reconcile.results) {
|
|
@@ -808,11 +808,11 @@ async function applyTreeseedHostingGraph(input) {
|
|
|
808
808
|
unit,
|
|
809
809
|
plan: entry.plan,
|
|
810
810
|
result: {
|
|
811
|
-
status: reconcileResult?.verification?.ready || plan.
|
|
811
|
+
status: reconcileResult?.verification?.ready || plan.planOnly ? "ready" : "blocked",
|
|
812
812
|
locators: reconcileResult?.resourceLocators ?? {},
|
|
813
813
|
state: reconcileResult?.state ?? {
|
|
814
814
|
unitId: unit.id,
|
|
815
|
-
action: plan.
|
|
815
|
+
action: plan.planOnly ? "plan" : "unmatched"
|
|
816
816
|
},
|
|
817
817
|
warnings: reconcileResult?.warnings ?? []
|
|
818
818
|
},
|
|
@@ -831,9 +831,9 @@ async function applyTreeseedHostingGraph(input) {
|
|
|
831
831
|
warnings: reconcileResult.verification.warnings
|
|
832
832
|
} : {
|
|
833
833
|
unitId: unit.id,
|
|
834
|
-
status: plan.
|
|
835
|
-
verified: plan.
|
|
836
|
-
checks: plan.
|
|
834
|
+
status: plan.planOnly ? "ready" : "blocked",
|
|
835
|
+
verified: plan.planOnly,
|
|
836
|
+
checks: plan.planOnly ? [] : [{
|
|
837
837
|
key: "reconcile-result",
|
|
838
838
|
label: "Hosting unit matched a reconcile result",
|
|
839
839
|
ok: false,
|
|
@@ -845,7 +845,7 @@ async function applyTreeseedHostingGraph(input) {
|
|
|
845
845
|
});
|
|
846
846
|
return {
|
|
847
847
|
environment: plan.environment,
|
|
848
|
-
|
|
848
|
+
planOnly: plan.planOnly,
|
|
849
849
|
selectedApps: [...new Set(graph.units.map((unit) => unit.application?.id).filter((value) => Boolean(value)))],
|
|
850
850
|
selectedSystems,
|
|
851
851
|
skippedSystems: ["web", "data", "github"].filter((system) => !selectedSystems.includes(system)).map((system) => ({ system, reason: selectedSystems.length > 0 ? "Not selected by hosting app filter." : "No Railway reconciliation selected." })),
|
|
@@ -1032,7 +1032,7 @@ function serializeHostingPlan(plan) {
|
|
|
1032
1032
|
const canonical = canonicalHostingReportFromPlan(plan);
|
|
1033
1033
|
return {
|
|
1034
1034
|
environment: plan.environment,
|
|
1035
|
-
|
|
1035
|
+
planOnly: plan.planOnly,
|
|
1036
1036
|
...canonical,
|
|
1037
1037
|
selectedApps: [...new Set(plan.units.map((entry) => entry.unit.application?.id).filter((value) => Boolean(value)))],
|
|
1038
1038
|
selectedSystems,
|
|
@@ -1063,7 +1063,7 @@ function serializeHostingApplyResult(result) {
|
|
|
1063
1063
|
const canonical = canonicalHostingReportFromApplyResult(result);
|
|
1064
1064
|
return {
|
|
1065
1065
|
environment: result.environment,
|
|
1066
|
-
|
|
1066
|
+
planOnly: result.planOnly,
|
|
1067
1067
|
...canonical,
|
|
1068
1068
|
selectedApps: result.selectedApps ?? [],
|
|
1069
1069
|
selectedSystems: result.selectedSystems ?? [],
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export declare const AGENT_OPERATION_NAMES: readonly ["switch", "dev", "verify", "save", "update", "stage", "close", "release"];
|
|
2
|
-
export declare const AGENT_OPERATION_MODES: readonly ["
|
|
2
|
+
export declare const AGENT_OPERATION_MODES: readonly ["plan", "read_only", "mutating"];
|
|
3
3
|
export type AgentOperationName = (typeof AGENT_OPERATION_NAMES)[number];
|
|
4
4
|
export type AgentOperationMode = (typeof AGENT_OPERATION_MODES)[number];
|
|
5
5
|
export type AgentOperationStatus = 'completed' | 'waiting' | 'failed' | 'skipped' | 'retry_created';
|
|
@@ -8,7 +8,7 @@ const AGENT_OPERATION_NAMES = [
|
|
|
8
8
|
"close",
|
|
9
9
|
"release"
|
|
10
10
|
];
|
|
11
|
-
const AGENT_OPERATION_MODES = ["
|
|
11
|
+
const AGENT_OPERATION_MODES = ["plan", "read_only", "mutating"];
|
|
12
12
|
function normalizePath(value) {
|
|
13
13
|
return value.replace(/\\/gu, "/").replace(/^\.?\//u, "").replace(/\/+/gu, "/");
|
|
14
14
|
}
|
|
@@ -718,7 +718,7 @@ class RepositoryHostCreateRepositoriesOperation extends BaseOperation {
|
|
|
718
718
|
}
|
|
719
719
|
return operationResult(this.metadata, await createKnowledgeHubRepositories({
|
|
720
720
|
plan,
|
|
721
|
-
|
|
721
|
+
planOnly: input.planOnly === true,
|
|
722
722
|
description: typeof input.description === "string" ? input.description : null,
|
|
723
723
|
homepageUrl: typeof input.homepageUrl === "string" ? input.homepageUrl : null
|
|
724
724
|
}));
|
|
@@ -741,7 +741,7 @@ class ContentPublishOperation extends BaseOperation {
|
|
|
741
741
|
const tenantRoot = typeof input.tenantRoot === "string" ? input.tenantRoot : context.cwd;
|
|
742
742
|
const contentRepositoryRoot = typeof input.contentRepositoryRoot === "string" ? input.contentRepositoryRoot : typeof input.contentRoot === "string" ? input.contentRoot : null;
|
|
743
743
|
const scope = input.scope === "staging" || input.scope === "prod" || input.scope === "local" ? input.scope : "prod";
|
|
744
|
-
if (input.
|
|
744
|
+
if (input.planOnly === true) {
|
|
745
745
|
return operationResult(this.metadata, {
|
|
746
746
|
status: "planned",
|
|
747
747
|
tenantRoot,
|
|
@@ -358,10 +358,10 @@ export declare function checkTreeseedProviderConnections({ tenantRoot, scope, en
|
|
|
358
358
|
issues: any[];
|
|
359
359
|
}>;
|
|
360
360
|
export declare function formatTreeseedProviderConnectionReport(report: any): string;
|
|
361
|
-
export declare function syncTreeseedGitHubEnvironment({ tenantRoot, scope,
|
|
361
|
+
export declare function syncTreeseedGitHubEnvironment({ tenantRoot, scope, planOnly, repository: repositoryInput, valuesOverlay, entryIds, managedHostMode, execution, concurrency, onProgress, }: {
|
|
362
362
|
tenantRoot: string;
|
|
363
363
|
scope?: TreeseedConfigScope;
|
|
364
|
-
|
|
364
|
+
planOnly?: boolean;
|
|
365
365
|
repository?: string | null;
|
|
366
366
|
valuesOverlay?: Record<string, string | undefined>;
|
|
367
367
|
entryIds?: string[];
|
|
@@ -402,10 +402,10 @@ export declare function syncTreeseedGitHubEnvironment({ tenantRoot, scope, dryRu
|
|
|
402
402
|
};
|
|
403
403
|
entryIds: string[] | undefined;
|
|
404
404
|
}>;
|
|
405
|
-
export declare function syncTreeseedCloudflareEnvironment({ tenantRoot, scope,
|
|
405
|
+
export declare function syncTreeseedCloudflareEnvironment({ tenantRoot, scope, planOnly, valuesOverlay, entryIds, onProgress, }: {
|
|
406
406
|
tenantRoot: string;
|
|
407
407
|
scope?: TreeseedConfigScope;
|
|
408
|
-
|
|
408
|
+
planOnly?: boolean;
|
|
409
409
|
valuesOverlay?: Record<string, string | undefined>;
|
|
410
410
|
entryIds?: string[];
|
|
411
411
|
onProgress?: (message: string, stream?: 'stdout' | 'stderr') => void;
|
|
@@ -420,10 +420,10 @@ export declare function syncTreeseedCloudflareEnvironment({ tenantRoot, scope, d
|
|
|
420
420
|
secrets: string[];
|
|
421
421
|
varsManagedByWranglerConfig: string[];
|
|
422
422
|
};
|
|
423
|
-
export declare function syncTreeseedRailwayEnvironment({ tenantRoot, scope,
|
|
423
|
+
export declare function syncTreeseedRailwayEnvironment({ tenantRoot, scope, planOnly, valuesOverlay, entryIds, onProgress, }: {
|
|
424
424
|
tenantRoot: string;
|
|
425
425
|
scope?: TreeseedConfigScope;
|
|
426
|
-
|
|
426
|
+
planOnly?: boolean;
|
|
427
427
|
valuesOverlay?: Record<string, string | undefined>;
|
|
428
428
|
entryIds?: string[];
|
|
429
429
|
onProgress?: (message: string, stream?: 'stdout' | 'stderr') => void;
|
|
@@ -441,12 +441,12 @@ export declare function syncTreeseedRailwayEnvironment({ tenantRoot, scope, dryR
|
|
|
441
441
|
environmentName: string;
|
|
442
442
|
secrets: any;
|
|
443
443
|
variables: any;
|
|
444
|
-
|
|
444
|
+
planOnly: boolean;
|
|
445
445
|
}[];
|
|
446
446
|
}>;
|
|
447
|
-
export declare function initializeTreeseedPersistentEnvironment({ tenantRoot, scope,
|
|
447
|
+
export declare function initializeTreeseedPersistentEnvironment({ tenantRoot, scope, planOnly }?: {
|
|
448
448
|
scope?: string | undefined;
|
|
449
|
-
|
|
449
|
+
planOnly?: boolean | undefined;
|
|
450
450
|
}): Promise<{
|
|
451
451
|
scope: string;
|
|
452
452
|
target: {
|
|
@@ -1836,8 +1836,8 @@ function assertTreeseedCommandEnvironment({ tenantRoot, scope, purpose }) {
|
|
|
1836
1836
|
error.details = report.validation;
|
|
1837
1837
|
throw error;
|
|
1838
1838
|
}
|
|
1839
|
-
function runGh(args, { cwd,
|
|
1840
|
-
if (
|
|
1839
|
+
function runGh(args, { cwd, planOnly = false, input, env } = {}) {
|
|
1840
|
+
if (planOnly) {
|
|
1841
1841
|
return { status: 0, stdout: "", stderr: "" };
|
|
1842
1842
|
}
|
|
1843
1843
|
const gh = resolveTreeseedToolBinary("gh", { env });
|
|
@@ -2374,7 +2374,7 @@ function createGitHubConfigSyncUnits({
|
|
|
2374
2374
|
async function syncTreeseedGitHubEnvironment({
|
|
2375
2375
|
tenantRoot,
|
|
2376
2376
|
scope = "prod",
|
|
2377
|
-
|
|
2377
|
+
planOnly = false,
|
|
2378
2378
|
repository: repositoryInput,
|
|
2379
2379
|
valuesOverlay = {},
|
|
2380
2380
|
entryIds,
|
|
@@ -2433,7 +2433,7 @@ async function syncTreeseedGitHubEnvironment({
|
|
|
2433
2433
|
}
|
|
2434
2434
|
let completed = 0;
|
|
2435
2435
|
const total = items.length;
|
|
2436
|
-
if (!
|
|
2436
|
+
if (!planOnly) {
|
|
2437
2437
|
const units = createGitHubConfigSyncUnits({ scope, repository, environment, items });
|
|
2438
2438
|
if (units.length === 0) {
|
|
2439
2439
|
progress(`[${scope}][github][sync] Complete: 0 secrets, 0 variables, 0 total.`);
|
|
@@ -2515,7 +2515,7 @@ async function syncTreeseedGitHubEnvironment({
|
|
|
2515
2515
|
function syncTreeseedCloudflareEnvironment({
|
|
2516
2516
|
tenantRoot,
|
|
2517
2517
|
scope = "prod",
|
|
2518
|
-
|
|
2518
|
+
planOnly = false,
|
|
2519
2519
|
valuesOverlay = {},
|
|
2520
2520
|
entryIds,
|
|
2521
2521
|
onProgress
|
|
@@ -2538,7 +2538,7 @@ function syncTreeseedCloudflareEnvironment({
|
|
|
2538
2538
|
const cloudflareSecrets = Object.fromEntries(registry.entries.filter((entry) => entry.scopes.includes(scope) && entry.targets.includes("cloudflare-secret") && (!entryFilter || entryFilter.has(entry.id))).map((entry) => [entry.id, values[entry.id]]).filter(([, value]) => typeof value === "string" && value.length > 0));
|
|
2539
2539
|
progress(`[${scope}][cloudflare][sync] Syncing Cloudflare secrets...`);
|
|
2540
2540
|
const syncedSecrets = syncCloudflareSecrets(tenantRoot, {
|
|
2541
|
-
|
|
2541
|
+
planOnly,
|
|
2542
2542
|
target,
|
|
2543
2543
|
extraSecrets: cloudflareSecrets,
|
|
2544
2544
|
entryIds
|
|
@@ -2564,7 +2564,7 @@ function railwayEnvironmentEntryIdsForService(registry, values, scope, target, s
|
|
|
2564
2564
|
async function syncTreeseedRailwayEnvironment({
|
|
2565
2565
|
tenantRoot,
|
|
2566
2566
|
scope = "prod",
|
|
2567
|
-
|
|
2567
|
+
planOnly = false,
|
|
2568
2568
|
valuesOverlay = {},
|
|
2569
2569
|
entryIds,
|
|
2570
2570
|
onProgress
|
|
@@ -2608,13 +2608,13 @@ async function syncTreeseedRailwayEnvironment({
|
|
|
2608
2608
|
environmentName,
|
|
2609
2609
|
secrets: railwayEnvironmentEntryIdsForService(registry, serviceValues, scope, "railway-secret", service.key, entryFilter),
|
|
2610
2610
|
variables: railwayEnvironmentEntryIdsForService(registry, serviceValues, scope, "railway-var", service.key, entryFilter),
|
|
2611
|
-
|
|
2611
|
+
planOnly
|
|
2612
2612
|
};
|
|
2613
2613
|
}).filter(Boolean);
|
|
2614
2614
|
for (const service of services) {
|
|
2615
2615
|
const serviceValues = serviceValuesByName.get(service.serviceName || service.serviceId || service.instanceKey || service.service) ?? values;
|
|
2616
2616
|
progress(`[${scope}][railway][${service.service}] Syncing ${service.secrets.length} secrets and ${service.variables.length} variables...`);
|
|
2617
|
-
if (!
|
|
2617
|
+
if (!planOnly) {
|
|
2618
2618
|
const railwayEnv = { ...process.env, ...values };
|
|
2619
2619
|
const project = (await ensureRailwayProject({
|
|
2620
2620
|
projectId: "",
|
|
@@ -2653,7 +2653,7 @@ async function syncTreeseedRailwayEnvironment({
|
|
|
2653
2653
|
services
|
|
2654
2654
|
};
|
|
2655
2655
|
}
|
|
2656
|
-
async function initializeTreeseedPersistentEnvironment({ tenantRoot, scope = "prod",
|
|
2656
|
+
async function initializeTreeseedPersistentEnvironment({ tenantRoot, scope = "prod", planOnly = false } = {}) {
|
|
2657
2657
|
const normalizedScope = scope === "prod" ? "prod" : scope;
|
|
2658
2658
|
const target = createPersistentDeployTarget(normalizedScope);
|
|
2659
2659
|
const summary = await reconcileTreeseedTarget({
|
|
@@ -218,8 +218,8 @@ export declare function buildTreeseedManagedCloudflareCacheRules(deployConfig: a
|
|
|
218
218
|
};
|
|
219
219
|
enabled: boolean;
|
|
220
220
|
}[];
|
|
221
|
-
export declare function reconcileCloudflareWebCacheRules(tenantRoot: any, deployConfig: any, state: any, target: any, {
|
|
222
|
-
|
|
221
|
+
export declare function reconcileCloudflareWebCacheRules(tenantRoot: any, deployConfig: any, state: any, target: any, { planOnly, env: providedEnv }?: {
|
|
222
|
+
planOnly?: boolean | undefined;
|
|
223
223
|
}): {
|
|
224
224
|
managed: boolean;
|
|
225
225
|
skipped: boolean;
|
|
@@ -232,14 +232,14 @@ export declare function reconcileCloudflareWebCacheRules(tenantRoot: any, deploy
|
|
|
232
232
|
managed: boolean;
|
|
233
233
|
skipped: boolean;
|
|
234
234
|
reason: string;
|
|
235
|
-
|
|
235
|
+
planOnly?: undefined;
|
|
236
236
|
zoneId?: undefined;
|
|
237
237
|
host?: undefined;
|
|
238
238
|
rules?: undefined;
|
|
239
239
|
rulesetId?: undefined;
|
|
240
240
|
} | {
|
|
241
241
|
managed: boolean;
|
|
242
|
-
|
|
242
|
+
planOnly: boolean;
|
|
243
243
|
zoneId: any;
|
|
244
244
|
host: any;
|
|
245
245
|
rules: {
|
|
@@ -277,7 +277,7 @@ export declare function reconcileCloudflareWebCacheRules(tenantRoot: any, deploy
|
|
|
277
277
|
rulesetId: any;
|
|
278
278
|
skipped?: undefined;
|
|
279
279
|
reason?: undefined;
|
|
280
|
-
|
|
280
|
+
planOnly?: undefined;
|
|
281
281
|
rules?: undefined;
|
|
282
282
|
})[];
|
|
283
283
|
skipped?: undefined;
|
|
@@ -341,8 +341,8 @@ export declare function validateDestroyPrerequisites(tenantRoot: any, { requireR
|
|
|
341
341
|
}): import("../../platform/contracts.js").TreeseedDeployConfig;
|
|
342
342
|
export declare function shouldDeleteRailwayProjectAfterEnvironmentDestroy(project: any, scope: any, deleteData: any, deletedEnvironmentId?: null): boolean;
|
|
343
343
|
export declare function setDestroyDockerRunnerForTests(runner: any): void;
|
|
344
|
-
export declare function dockerLocalRuntimeResourceOperations({
|
|
345
|
-
|
|
344
|
+
export declare function dockerLocalRuntimeResourceOperations({ planOnly }?: {
|
|
345
|
+
planOnly?: boolean | undefined;
|
|
346
346
|
}): any[];
|
|
347
347
|
export declare function cloudflareDestroyVerification(tenantRoot: any, deployConfig: any, state: any, env: any): {
|
|
348
348
|
provider: string;
|
|
@@ -627,7 +627,7 @@ export declare function verifyProvisionedCloudflareResources(tenantRoot: any, op
|
|
|
627
627
|
};
|
|
628
628
|
export declare function runRemoteD1Migrations(tenantRoot: any, options?: {}): {
|
|
629
629
|
databaseName: any;
|
|
630
|
-
|
|
630
|
+
planOnly: boolean;
|
|
631
631
|
};
|
|
632
632
|
export declare function markDeploymentInitialized(tenantRoot: any, options?: {}): any;
|
|
633
633
|
export declare function markManagedServicesInitialized(tenantRoot: any, options?: {}): any;
|