@treeseed/sdk 0.4.12 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. package/dist/control-plane-client.d.ts +60 -1
  2. package/dist/control-plane-client.js +59 -0
  3. package/dist/control-plane.d.ts +1 -1
  4. package/dist/control-plane.js +11 -4
  5. package/dist/d1-store.d.ts +58 -0
  6. package/dist/d1-store.js +64 -0
  7. package/dist/dispatch.js +6 -0
  8. package/dist/graph/schema.js +4 -0
  9. package/dist/index.d.ts +5 -1
  10. package/dist/index.js +32 -0
  11. package/dist/knowledge-coop.d.ts +223 -0
  12. package/dist/knowledge-coop.js +82 -0
  13. package/dist/model-registry.js +79 -0
  14. package/dist/operations/providers/default.js +128 -7
  15. package/dist/operations/services/config-runtime.d.ts +102 -24
  16. package/dist/operations/services/config-runtime.js +896 -160
  17. package/dist/operations/services/deploy.d.ts +223 -15
  18. package/dist/operations/services/deploy.js +626 -55
  19. package/dist/operations/services/git-workflow.d.ts +47 -3
  20. package/dist/operations/services/git-workflow.js +125 -19
  21. package/dist/operations/services/github-automation.d.ts +85 -0
  22. package/dist/operations/services/github-automation.js +220 -1
  23. package/dist/operations/services/key-agent.d.ts +118 -0
  24. package/dist/operations/services/key-agent.js +476 -0
  25. package/dist/operations/services/knowledge-coop-launch.d.ts +90 -0
  26. package/dist/operations/services/knowledge-coop-launch.js +753 -0
  27. package/dist/operations/services/knowledge-coop-packaging.d.ts +59 -0
  28. package/dist/operations/services/knowledge-coop-packaging.js +234 -0
  29. package/dist/operations/services/local-dev.d.ts +0 -1
  30. package/dist/operations/services/local-dev.js +1 -14
  31. package/dist/operations/services/project-platform.d.ts +42 -182
  32. package/dist/operations/services/project-platform.js +162 -59
  33. package/dist/operations/services/railway-deploy.d.ts +1 -0
  34. package/dist/operations/services/railway-deploy.js +31 -13
  35. package/dist/operations/services/runtime-tools.d.ts +52 -5
  36. package/dist/operations/services/runtime-tools.js +186 -26
  37. package/dist/operations/services/watch-dev.js +2 -4
  38. package/dist/operations/services/workspace-preflight.d.ts +4 -4
  39. package/dist/operations/services/workspace-preflight.js +22 -20
  40. package/dist/operations/services/workspace-save.d.ts +10 -1
  41. package/dist/operations/services/workspace-save.js +54 -3
  42. package/dist/operations/services/workspace-tools.d.ts +1 -0
  43. package/dist/operations/services/workspace-tools.js +20 -5
  44. package/dist/operations-registry.js +15 -8
  45. package/dist/operations-types.d.ts +2 -2
  46. package/dist/platform/contracts.d.ts +39 -3
  47. package/dist/platform/deploy-config.d.ts +12 -1
  48. package/dist/platform/deploy-config.js +214 -15
  49. package/dist/platform/deploy-runtime.d.ts +1 -0
  50. package/dist/platform/deploy-runtime.js +10 -2
  51. package/dist/platform/env.yaml +93 -61
  52. package/dist/platform/environment.d.ts +13 -2
  53. package/dist/platform/environment.js +90 -20
  54. package/dist/platform/plugins/constants.d.ts +1 -0
  55. package/dist/platform/plugins/constants.js +7 -6
  56. package/dist/platform/tenant/runtime-config.js +8 -1
  57. package/dist/platform/tenant-config.js +4 -0
  58. package/dist/platform/utils/site-config-schema.js +18 -0
  59. package/dist/plugin-default.js +2 -2
  60. package/dist/scripts/key-agent.js +165 -0
  61. package/dist/scripts/tenant-build.js +4 -1
  62. package/dist/scripts/tenant-check.js +4 -1
  63. package/dist/scripts/tenant-deploy.js +43 -4
  64. package/dist/scripts/tenant-dev.js +0 -1
  65. package/dist/scripts/workspace-start-warning.js +2 -2
  66. package/dist/sdk-types.d.ts +2 -2
  67. package/dist/sdk-types.js +2 -0
  68. package/dist/sdk.d.ts +13 -0
  69. package/dist/sdk.js +40 -0
  70. package/dist/stores/knowledge-coop-store.d.ts +56 -0
  71. package/dist/stores/knowledge-coop-store.js +482 -0
  72. package/dist/treeseed/template-catalog/templates/starter-basic/template/package.json +6 -2
  73. package/dist/treeseed/template-catalog/templates/starter-basic/template/src/api/server.js +4 -0
  74. package/dist/treeseed/template-catalog/templates/starter-basic/template/src/config.yaml +25 -0
  75. package/dist/treeseed/template-catalog/templates/starter-basic/template/src/content/decisions/adopt-initial-proposal-loop.mdx +22 -0
  76. package/dist/treeseed/template-catalog/templates/starter-basic/template/src/content/people/starter-steward.mdx +11 -0
  77. package/dist/treeseed/template-catalog/templates/starter-basic/template/src/content/proposals/establish-initial-proposal-loop.mdx +17 -0
  78. package/dist/treeseed/template-catalog/templates/starter-basic/template/src/manifest.yaml +17 -10
  79. package/dist/treeseed/template-catalog/templates/starter-basic/template/treeseed.site.yaml +69 -7
  80. package/dist/treeseed/template-catalog/templates/starter-basic/template.config.json +1 -0
  81. package/dist/workflow/operations.d.ts +592 -243
  82. package/dist/workflow/operations.js +1908 -219
  83. package/dist/workflow/runs.d.ts +90 -0
  84. package/dist/workflow/runs.js +242 -0
  85. package/dist/workflow/session.d.ts +31 -0
  86. package/dist/workflow/session.js +97 -0
  87. package/dist/workflow-state.d.ts +88 -2
  88. package/dist/workflow-state.js +288 -26
  89. package/dist/workflow-support.d.ts +1 -1
  90. package/dist/workflow-support.js +32 -2
  91. package/dist/workflow.d.ts +93 -3
  92. package/dist/workflow.js +12 -0
  93. package/package.json +1 -1
  94. package/templates/github/deploy.workflow.yml +11 -1
  95. package/dist/scripts/sync-dev-vars.js +0 -6
  96. package/dist/scripts/workspace-close.js +0 -24
  97. package/dist/scripts/workspace-release.js +0 -42
  98. package/dist/scripts/workspace-start.js +0 -71
@@ -1,12 +1,31 @@
1
1
  import { resolveTreeseedWorkflowState } from './workflow-state.ts';
2
2
  import { listTaskBranches } from './operations/services/git-workflow.ts';
3
3
  import { TreeseedWorkflowError, type TreeseedWorkflowErrorCode } from './workflow/operations.ts';
4
- export type TreeseedWorkflowOperationId = 'status' | 'config' | 'tasks' | 'switch' | 'dev' | 'save' | 'close' | 'stage' | 'release' | 'destroy' | 'export';
4
+ export type TreeseedWorkflowOperationId = 'status' | 'config' | 'tasks' | 'switch' | 'dev' | 'save' | 'close' | 'stage' | 'release' | 'resume' | 'recover' | 'destroy' | 'export';
5
5
  export type TreeseedWorkflowNextStep = {
6
6
  operation: string;
7
7
  reason?: string;
8
8
  input?: Record<string, unknown>;
9
9
  };
10
+ export type TreeseedWorkflowFact = {
11
+ label: string;
12
+ value: string | number | boolean | null;
13
+ };
14
+ export type TreeseedWorkflowErrorDetail = {
15
+ code: string;
16
+ message: string;
17
+ details?: Record<string, unknown> | null;
18
+ };
19
+ export type TreeseedWorkflowRecovery = {
20
+ resumable: boolean;
21
+ runId?: string | null;
22
+ command?: string | null;
23
+ message?: string | null;
24
+ recoverCommand?: string | null;
25
+ resumeCommand?: string | null;
26
+ lock?: Record<string, unknown> | null;
27
+ };
28
+ export type TreeseedWorkflowExecutionMode = 'execute' | 'plan';
10
29
  export type TreeseedWorkflowContext = {
11
30
  cwd?: string;
12
31
  env?: NodeJS.ProcessEnv;
@@ -14,12 +33,25 @@ export type TreeseedWorkflowContext = {
14
33
  prompt?: (message: string) => Promise<string> | string;
15
34
  confirm?: (message: string, expected: string) => Promise<boolean> | boolean;
16
35
  transport?: 'sdk' | 'cli' | 'api';
36
+ workflow?: {
37
+ resumeRunId?: string;
38
+ };
17
39
  };
18
40
  export type TreeseedWorkflowResult<TPayload = Record<string, unknown>> = {
41
+ schemaVersion: 1;
42
+ kind: 'treeseed.workflow.result';
43
+ command: TreeseedWorkflowOperationId;
44
+ executionMode: TreeseedWorkflowExecutionMode;
45
+ runId: string | null;
19
46
  ok: boolean;
20
47
  operation: TreeseedWorkflowOperationId;
48
+ summary?: string;
49
+ facts?: TreeseedWorkflowFact[];
21
50
  payload: TPayload;
51
+ result: TPayload;
22
52
  nextSteps?: TreeseedWorkflowNextStep[];
53
+ recovery?: TreeseedWorkflowRecovery | null;
54
+ errors?: TreeseedWorkflowErrorDetail[];
23
55
  };
24
56
  export type TreeseedTaskBranchMetadata = ReturnType<typeof listTaskBranches>[number] & {
25
57
  ageDays: number | null;
@@ -29,6 +61,33 @@ export type TreeseedTaskBranchMetadata = ReturnType<typeof listTaskBranches>[num
29
61
  url: string | null;
30
62
  lastDeploymentTimestamp: string | null;
31
63
  };
64
+ packages?: Array<{
65
+ name: string;
66
+ path: string;
67
+ local: boolean;
68
+ remote: boolean;
69
+ current: boolean;
70
+ head: string | null;
71
+ pointer: string | null;
72
+ aligned: boolean;
73
+ }>;
74
+ };
75
+ export type TreeseedWorkflowWorkstreamSummary = {
76
+ id: string;
77
+ title: string;
78
+ linkedDirectRefs: Array<{
79
+ model: 'objective' | 'question' | 'note';
80
+ id: string;
81
+ }>;
82
+ branch: string;
83
+ local: boolean;
84
+ remote: boolean;
85
+ current: boolean;
86
+ previewUrl: string | null;
87
+ lastSaveAt: string | null;
88
+ verificationResult: 'ready' | 'needs_attention' | 'unknown';
89
+ stagingCandidate: boolean;
90
+ archived: boolean;
32
91
  };
33
92
  export type TreeseedSaveInput = {
34
93
  message: string;
@@ -37,12 +96,16 @@ export type TreeseedSaveInput = {
37
96
  refreshPreview?: boolean;
38
97
  preview?: boolean;
39
98
  rebase?: boolean;
99
+ plan?: boolean;
100
+ dryRun?: boolean;
40
101
  };
41
102
  export type TreeseedCloseInput = {
42
103
  message: string;
43
104
  deletePreview?: boolean;
44
105
  deleteBranch?: boolean;
45
106
  autoSave?: boolean;
107
+ plan?: boolean;
108
+ dryRun?: boolean;
46
109
  };
47
110
  export type TreeseedStageInput = {
48
111
  message: string;
@@ -50,6 +113,8 @@ export type TreeseedStageInput = {
50
113
  deletePreview?: boolean;
51
114
  deleteBranch?: boolean;
52
115
  autoSave?: boolean;
116
+ plan?: boolean;
117
+ dryRun?: boolean;
53
118
  };
54
119
  export type TreeseedSwitchInput = {
55
120
  branch?: string;
@@ -57,6 +122,8 @@ export type TreeseedSwitchInput = {
57
122
  preview?: boolean;
58
123
  createIfMissing?: boolean;
59
124
  baseBranch?: string;
125
+ plan?: boolean;
126
+ dryRun?: boolean;
60
127
  };
61
128
  export type TreeseedConfigScope = 'all' | 'local' | 'staging' | 'prod';
62
129
  export type TreeseedConfigInput = {
@@ -75,6 +142,16 @@ export type TreeseedConfigInput = {
75
142
  printEnvOnly?: boolean;
76
143
  showSecrets?: boolean;
77
144
  rotateMachineKey?: boolean;
145
+ connectMarket?: boolean;
146
+ marketBaseUrl?: string;
147
+ marketTeamId?: string;
148
+ marketTeamSlug?: string;
149
+ marketProjectId?: string;
150
+ marketProjectSlug?: string;
151
+ marketProjectApiBaseUrl?: string;
152
+ marketAccessToken?: string;
153
+ rotateRunnerToken?: boolean;
154
+ installMissingTooling?: boolean;
78
155
  nonInteractive?: boolean;
79
156
  };
80
157
  export type TreeseedExportInput = {
@@ -82,12 +159,21 @@ export type TreeseedExportInput = {
82
159
  };
83
160
  export type TreeseedReleaseInput = {
84
161
  bump: 'major' | 'minor' | 'patch';
162
+ plan?: boolean;
163
+ dryRun?: boolean;
164
+ };
165
+ export type TreeseedResumeInput = {
166
+ runId: string;
167
+ };
168
+ export type TreeseedRecoverInput = {
169
+ runId?: string;
85
170
  };
86
171
  export type TreeseedDestroyInput = {
87
172
  target?: 'local' | 'staging' | 'prod';
88
173
  environment?: 'local' | 'staging' | 'prod';
89
174
  confirm?: boolean | string;
90
175
  dryRun?: boolean;
176
+ plan?: boolean;
91
177
  destroyRemote?: boolean;
92
178
  destroyLocal?: boolean;
93
179
  force?: boolean;
@@ -105,12 +191,14 @@ export declare class TreeseedWorkflowSdk {
105
191
  private readonly context;
106
192
  constructor(context?: TreeseedWorkflowContext);
107
193
  private helpers;
108
- execute(operation: TreeseedWorkflowOperationId, input?: Record<string, unknown>): Promise<TreeseedWorkflowResult<import("./workflow-state.ts").TreeseedWorkflowState> | TreeseedWorkflowResult<Record<string, unknown>> | TreeseedWorkflowResult<{
194
+ execute(operation: TreeseedWorkflowOperationId, input?: Record<string, unknown>): Promise<TreeseedWorkflowResult<import("./workflow-state.ts").TreeseedWorkflowState> | TreeseedWorkflowResult<{
109
195
  tasks: TreeseedTaskBranchMetadata[];
110
- }>>;
196
+ workstreams: TreeseedWorkflowWorkstreamSummary[];
197
+ }> | TreeseedWorkflowResult<Record<string, unknown>>>;
111
198
  status(): Promise<TreeseedWorkflowResult<ReturnType<typeof resolveTreeseedWorkflowState>>>;
112
199
  tasks(): Promise<TreeseedWorkflowResult<{
113
200
  tasks: TreeseedTaskBranchMetadata[];
201
+ workstreams: TreeseedWorkflowWorkstreamSummary[];
114
202
  }>>;
115
203
  config(input?: TreeseedConfigInput): Promise<TreeseedWorkflowResult>;
116
204
  switchTask(input: TreeseedSwitchInput): Promise<TreeseedWorkflowResult>;
@@ -119,6 +207,8 @@ export declare class TreeseedWorkflowSdk {
119
207
  close(input: TreeseedCloseInput): Promise<TreeseedWorkflowResult>;
120
208
  stage(input: TreeseedStageInput): Promise<TreeseedWorkflowResult>;
121
209
  release(input: TreeseedReleaseInput): Promise<TreeseedWorkflowResult>;
210
+ resume(input: TreeseedResumeInput): Promise<TreeseedWorkflowResult>;
211
+ recover(input?: TreeseedRecoverInput): Promise<TreeseedWorkflowResult>;
122
212
  destroy(input: TreeseedDestroyInput): Promise<TreeseedWorkflowResult>;
123
213
  export(input?: TreeseedExportInput): Promise<TreeseedWorkflowResult>;
124
214
  }
package/dist/workflow.js CHANGED
@@ -6,7 +6,9 @@ import {
6
6
  workflowDestroy,
7
7
  workflowDev,
8
8
  workflowExport,
9
+ workflowRecover,
9
10
  workflowRelease,
11
+ workflowResume,
10
12
  workflowSave,
11
13
  workflowStage,
12
14
  workflowStatus,
@@ -56,6 +58,10 @@ class TreeseedWorkflowSdk {
56
58
  return this.stage(input);
57
59
  case "release":
58
60
  return this.release(input);
61
+ case "resume":
62
+ return this.resume(input);
63
+ case "recover":
64
+ return this.recover(input);
59
65
  case "destroy":
60
66
  return this.destroy(input);
61
67
  case "export":
@@ -91,6 +97,12 @@ class TreeseedWorkflowSdk {
91
97
  async release(input) {
92
98
  return workflowRelease(this.helpers(), input);
93
99
  }
100
+ async resume(input) {
101
+ return workflowResume(this.helpers(), input);
102
+ }
103
+ async recover(input = {}) {
104
+ return workflowRecover(this.helpers(), input);
105
+ }
94
106
  async destroy(input) {
95
107
  return workflowDestroy(this.helpers(), input);
96
108
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@treeseed/sdk",
3
- "version": "0.4.12",
3
+ "version": "0.5.0",
4
4
  "description": "Shared Treeseed SDK for content-backed and D1-backed object models.",
5
5
  "license": "AGPL-3.0-only",
6
6
  "repository": {
@@ -98,7 +98,7 @@ jobs:
98
98
  while IFS= read -r path; do
99
99
  [[ -z "${path}" ]] && continue
100
100
  case "${path}" in
101
- src/content/*|content/*|books/*|docs/*|public/books/*|migrations/*)
101
+ src/content/*|content/*|books/*|docs/*|migrations/*)
102
102
  content_changed="true"
103
103
  ;;
104
104
  *)
@@ -287,6 +287,7 @@ __WORKING_DIRECTORY_BLOCK__
287
287
  TREESEED_RAILWAY_PROJECT_ID: ${{ vars.TREESEED_RAILWAY_PROJECT_ID }}
288
288
  TREESEED_RAILWAY_ENVIRONMENT_ID: ${{ vars.TREESEED_RAILWAY_ENVIRONMENT_ID }}
289
289
  TREESEED_RAILWAY_WORKER_SERVICE_ID: ${{ vars.TREESEED_RAILWAY_WORKER_SERVICE_ID }}
290
+ TREESEED_CONTENT_SERVING_MODE: published_runtime
290
291
  TREESEED_WORKFLOW_ACTION: deploy_code
291
292
  TREESEED_WORKFLOW_ENVIRONMENT: ${{ needs.classify.outputs.scope }}
292
293
  TREESEED_WORKFLOW_PROJECT: ${{ inputs.project_id || vars.TREESEED_PROJECT_ID }}
@@ -294,6 +295,15 @@ __WORKING_DIRECTORY_BLOCK__
294
295
  steps:
295
296
  - name: Checkout
296
297
  uses: actions/checkout@v4
298
+ with:
299
+ submodules: false
300
+ sparse-checkout: |
301
+ /*
302
+ !/src/content/
303
+ !/src/content/**
304
+ !/public/books/
305
+ !/public/books/**
306
+ sparse-checkout-cone-mode: false
297
307
 
298
308
  - name: Setup Node
299
309
  uses: actions/setup-node@v4
@@ -1,6 +0,0 @@
1
- import { applyTreeseedEnvironmentToProcess, writeTreeseedLocalEnvironmentFiles } from '../operations/services/config-runtime.js';
2
- const tenantRoot = process.cwd();
3
- applyTreeseedEnvironmentToProcess({ tenantRoot, scope: 'local', override: true });
4
- const result = writeTreeseedLocalEnvironmentFiles(tenantRoot);
5
- console.log(`Wrote ${result.envLocalPath}`);
6
- console.log(`Wrote ${result.devVarsPath}`);
@@ -1,24 +0,0 @@
1
- #!/usr/bin/env node
2
- import { applyTreeseedEnvironmentToProcess } from '../operations/services/config-runtime.js';
3
- import { cleanupDestroyedState, createBranchPreviewDeployTarget, destroyCloudflareResources, loadDeployState, printDestroySummary, validateDestroyPrerequisites, } from '../operations/services/deploy.js';
4
- import { assertFeatureBranch, deleteLocalBranch, deleteRemoteBranch, mergeCurrentBranchIntoStaging, } from '../operations/services/git-workflow.js';
5
- import { loadCliDeployConfig } from '../operations/services/runtime-tools.js';
6
- import { runWorkspaceSavePreflight } from '../operations/services/save-deploy-preflight.js';
7
- const tenantRoot = process.cwd();
8
- const featureBranch = assertFeatureBranch(tenantRoot);
9
- const previewTarget = createBranchPreviewDeployTarget(featureBranch);
10
- const deployConfig = loadCliDeployConfig(tenantRoot);
11
- const previewState = loadDeployState(tenantRoot, deployConfig, { target: previewTarget });
12
- runWorkspaceSavePreflight({ cwd: tenantRoot });
13
- const repoDir = mergeCurrentBranchIntoStaging(tenantRoot, featureBranch);
14
- if (previewState.readiness?.initialized) {
15
- applyTreeseedEnvironmentToProcess({ tenantRoot, scope: 'staging', override: true });
16
- validateDestroyPrerequisites(tenantRoot, { requireRemote: true });
17
- const result = destroyCloudflareResources(tenantRoot, { target: previewTarget });
18
- printDestroySummary(result);
19
- }
20
- cleanupDestroyedState(tenantRoot, { target: previewTarget });
21
- deleteRemoteBranch(repoDir, featureBranch);
22
- deleteLocalBranch(repoDir, featureBranch);
23
- console.log('Treeseed close completed successfully.');
24
- console.log(`Merged ${featureBranch} into staging and removed branch artifacts.`);
@@ -1,42 +0,0 @@
1
- #!/usr/bin/env node
2
- import { readFileSync, writeFileSync } from 'node:fs';
3
- import { resolve } from 'node:path';
4
- import { applyTreeseedEnvironmentToProcess } from '../operations/services/config-runtime.js';
5
- import { PRODUCTION_BRANCH, STAGING_BRANCH, mergeStagingIntoMain, prepareReleaseBranches, pushBranch } from '../operations/services/git-workflow.js';
6
- import { incrementVersion, planWorkspaceReleaseBump, applyWorkspaceVersionChanges, repoRoot } from '../operations/services/workspace-save.js';
7
- import { run, workspaceRoot } from '../operations/services/workspace-tools.js';
8
- import { runWorkspaceSavePreflight } from '../operations/services/save-deploy-preflight.js';
9
- function parseArgs(argv) {
10
- const flags = new Set(argv);
11
- const selected = ['major', 'minor', 'patch'].filter((level) => flags.has(`--${level}`));
12
- if (selected.length !== 1) {
13
- throw new Error('Treeseed release requires exactly one version bump flag: --major, --minor, or --patch.');
14
- }
15
- return { level: selected[0] };
16
- }
17
- function bumpRootPackageJson(root, level) {
18
- const packageJsonPath = resolve(root, 'package.json');
19
- const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf8'));
20
- packageJson.version = incrementVersion(packageJson.version, level);
21
- writeFileSync(packageJsonPath, `${JSON.stringify(packageJson, null, 2)}\n`, 'utf8');
22
- return packageJson.version;
23
- }
24
- const { level } = parseArgs(process.argv.slice(2));
25
- const root = workspaceRoot();
26
- const gitRoot = repoRoot(root);
27
- prepareReleaseBranches(root);
28
- applyTreeseedEnvironmentToProcess({ tenantRoot: root, scope: 'staging', override: true });
29
- runWorkspaceSavePreflight({ cwd: root });
30
- const plan = planWorkspaceReleaseBump(level, root);
31
- applyWorkspaceVersionChanges(plan);
32
- const rootVersion = bumpRootPackageJson(root, level);
33
- run('git', ['checkout', STAGING_BRANCH], { cwd: gitRoot });
34
- run('git', ['add', '-A'], { cwd: gitRoot });
35
- run('git', ['commit', '-m', `release: ${level} bump`], { cwd: gitRoot });
36
- pushBranch(gitRoot, STAGING_BRANCH);
37
- mergeStagingIntoMain(root);
38
- console.log('Treeseed release completed successfully.');
39
- console.log(`Staging branch: ${STAGING_BRANCH}`);
40
- console.log(`Production branch: ${PRODUCTION_BRANCH}`);
41
- console.log(`Release level: ${level}`);
42
- console.log(`Root version: ${rootVersion}`);
@@ -1,71 +0,0 @@
1
- #!/usr/bin/env node
2
- import { spawnSync } from 'node:child_process';
3
- import { applyTreeseedEnvironmentToProcess, assertTreeseedCommandEnvironment } from '../operations/services/config-runtime.js';
4
- import { createBranchPreviewDeployTarget, deployTargetLabel, ensureGeneratedWranglerConfig, finalizeDeploymentState, printDeploySummary, provisionCloudflareResources, runRemoteD1Migrations, syncCloudflareSecrets, validateDeployPrerequisites, } from '../operations/services/deploy.js';
5
- import { createFeatureBranchFromStaging, pushBranch } from '../operations/services/git-workflow.js';
6
- import { packageScriptPath, resolveWranglerBin } from '../operations/services/runtime-tools.js';
7
- function parseArgs(argv) {
8
- const parsed = {
9
- branchName: null,
10
- preview: false,
11
- };
12
- for (const current of argv) {
13
- if (current === '--preview') {
14
- parsed.preview = true;
15
- continue;
16
- }
17
- if (!parsed.branchName) {
18
- parsed.branchName = current;
19
- continue;
20
- }
21
- throw new Error(`Unknown start argument: ${current}`);
22
- }
23
- if (!parsed.branchName) {
24
- throw new Error('Usage: treeseed start <branch-name> [--preview]');
25
- }
26
- return parsed;
27
- }
28
- function runNodeScript(scriptPath, scriptArgs = [], cwd) {
29
- const result = spawnSync(process.execPath, [scriptPath, ...scriptArgs], {
30
- stdio: 'inherit',
31
- cwd,
32
- env: { ...process.env },
33
- });
34
- if (result.status !== 0) {
35
- process.exit(result.status ?? 1);
36
- }
37
- }
38
- function runWranglerDeploy(configPath, cwd) {
39
- const result = spawnSync(process.execPath, [resolveWranglerBin(), 'deploy', '--config', configPath], {
40
- stdio: 'inherit',
41
- cwd,
42
- env: { ...process.env },
43
- });
44
- if (result.status !== 0) {
45
- process.exit(result.status ?? 1);
46
- }
47
- }
48
- const options = parseArgs(process.argv.slice(2));
49
- const tenantRoot = process.cwd();
50
- const result = createFeatureBranchFromStaging(tenantRoot, options.branchName);
51
- pushBranch(result.repoDir, options.branchName, { setUpstream: true });
52
- if (!options.preview) {
53
- console.log(`Created feature branch ${options.branchName} from staging.`);
54
- console.log('Preview mode is disabled. Use local development for this branch.');
55
- process.exit(0);
56
- }
57
- applyTreeseedEnvironmentToProcess({ tenantRoot, scope: 'staging', override: true });
58
- assertTreeseedCommandEnvironment({ tenantRoot, scope: 'staging', purpose: 'deploy' });
59
- validateDeployPrerequisites(tenantRoot, { requireRemote: true });
60
- const target = createBranchPreviewDeployTarget(options.branchName);
61
- const summary = provisionCloudflareResources(tenantRoot, { target });
62
- printDeploySummary(summary);
63
- const { wranglerPath } = ensureGeneratedWranglerConfig(tenantRoot, { target });
64
- syncCloudflareSecrets(tenantRoot, { target });
65
- runRemoteD1Migrations(tenantRoot, { target });
66
- runNodeScript(packageScriptPath('tenant-build'), [], tenantRoot);
67
- runWranglerDeploy(wranglerPath, tenantRoot);
68
- const state = finalizeDeploymentState(tenantRoot, { target });
69
- console.log(`Treeseed start preview completed for ${options.branchName}.`);
70
- console.log(`Target: ${deployTargetLabel(target)}`);
71
- console.log(`Preview URL: ${state.lastDeployedUrl}`);