@git.zone/tsdeploy 0.2.0 → 0.3.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.
package/dist_ts/cli.js CHANGED
@@ -4,6 +4,41 @@ const getStringArg = (argvArg, keyArg) => {
4
4
  const value = argvArg[keyArg];
5
5
  return typeof value === 'string' && value.trim() ? value.trim() : undefined;
6
6
  };
7
+ const getStringArgByKeys = (argvArg, keysArg) => {
8
+ for (const key of keysArg) {
9
+ const value = getStringArg(argvArg, key);
10
+ if (value)
11
+ return value;
12
+ }
13
+ return undefined;
14
+ };
15
+ const getBooleanArgByKeys = (argvArg, keysArg) => {
16
+ for (const key of keysArg) {
17
+ const value = argvArg[key];
18
+ if (value === true)
19
+ return true;
20
+ if (typeof value === 'string' && ['1', 'true', 'yes'].includes(value.toLowerCase()))
21
+ return true;
22
+ }
23
+ return false;
24
+ };
25
+ const getNumberArgByKeys = (argvArg, keysArg) => {
26
+ let rawValue;
27
+ for (const key of keysArg) {
28
+ const value = argvArg[key];
29
+ if (typeof value === 'number' || (typeof value === 'string' && value.trim())) {
30
+ rawValue = value;
31
+ break;
32
+ }
33
+ }
34
+ if (rawValue === undefined)
35
+ return undefined;
36
+ const parsed = Number(rawValue);
37
+ if (!Number.isFinite(parsed) || parsed < 0) {
38
+ throw new Error(`Expected a non-negative number for --${keysArg[0]}.`);
39
+ }
40
+ return parsed;
41
+ };
7
42
  const printJson = (valueArg) => {
8
43
  console.log(JSON.stringify(valueArg, null, 2));
9
44
  };
@@ -68,6 +103,24 @@ const runPlan = async () => {
68
103
  const runDoctor = async () => {
69
104
  printJson(await createTsDeploy().doctor());
70
105
  };
106
+ const runDeploy = async (argvArg) => {
107
+ const tsDeploy = createTsDeploy();
108
+ const result = await tsDeploy.deploy({
109
+ dryRun: getBooleanArgByKeys(argvArg, ['dryRun', 'dry-run']),
110
+ skipChecks: getBooleanArgByKeys(argvArg, ['skipChecks', 'skip-checks']),
111
+ skipPush: getBooleanArgByKeys(argvArg, ['skipPush', 'skip-push']),
112
+ tag: getStringArg(argvArg, 'tag'),
113
+ image: getStringArg(argvArg, 'image'),
114
+ platform: getStringArg(argvArg, 'platform'),
115
+ builder: getStringArg(argvArg, 'builder'),
116
+ verifyUrl: getStringArgByKeys(argvArg, ['verifyUrl', 'verify-url']),
117
+ waitSeconds: getNumberArgByKeys(argvArg, ['waitSeconds', 'wait-seconds']),
118
+ token: getStringArg(argvArg, 'token'),
119
+ username: getStringArg(argvArg, 'username'),
120
+ password: getStringArg(argvArg, 'password'),
121
+ });
122
+ printJson(result);
123
+ };
71
124
  const printHelp = () => {
72
125
  console.log(`
73
126
  Usage: tsdeploy <command> [options]
@@ -79,10 +132,13 @@ Commands:
79
132
  status
80
133
  doctor
81
134
  plan
135
+ deploy [--dryRun] [--skipChecks] [--skipPush] [--tag <tag>] [--platform <platform>] [--builder <name>]
136
+ [--verifyUrl <url>] [--waitSeconds <seconds>] [--token <token>]
82
137
 
83
138
  Notes:
84
139
  tsdeploy stores only the project pointer in .nogit/tsdeploy.json.
85
- Remote deployment mutations are disabled until Cloudly/Onebox APIs are verified.
140
+ Cloudly workload deployment builds and pushes the linked OCI image after validating deployOnPush.
141
+ Onebox deployment mutations are not implemented yet.
86
142
  `);
87
143
  };
88
144
  export const runCli = async () => {
@@ -101,7 +157,8 @@ export const runCli = async () => {
101
157
  cli.addCommand('status').subscribe(runStatus);
102
158
  cli.addCommand('doctor').subscribe(runDoctor);
103
159
  cli.addCommand('plan').subscribe(runPlan);
160
+ cli.addCommand('deploy').subscribe(runDeploy);
104
161
  cli.addCommand('help').subscribe(async () => printHelp());
105
162
  cli.startParse(getSmartcliArgv());
106
163
  };
107
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvY2xpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUVqRCxNQUFNLFlBQVksR0FBRyxDQUFDLE9BQVksRUFBRSxNQUFjLEVBQXNCLEVBQUU7SUFDeEUsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzlCLE9BQU8sT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDOUUsQ0FBQyxDQUFDO0FBRUYsTUFBTSxTQUFTLEdBQUcsQ0FBQyxRQUFpQixFQUFRLEVBQUU7SUFDNUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqRCxDQUFDLENBQUM7QUFFRixNQUFNLGdCQUFnQixHQUFHLENBQUMsT0FBWSxFQUFFLE1BQWMsRUFBVSxFQUFFO0lBQ2hFLE1BQU0sS0FBSyxHQUFHLFlBQVksQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDNUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ1gsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQkFBc0IsTUFBTSxVQUFVLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDLENBQUM7QUFFRixNQUFNLGNBQWMsR0FBRyxHQUFhLEVBQUUsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxFQUFFLFVBQVUsRUFBRSxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBRW5GLE1BQU0sZUFBZSxH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VCxDQUFDO1FBQ0QsTUFBTSxTQUFTLEVBQUUsQ0FBQztJQUNwQixDQUFDLENBQUMsQ0FBQztJQUNILEdBQUcsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzVDLEdBQUcsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzlDLEdBQUcsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzlDLEdBQUcsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztJQUMxRCxHQUFHLENBQUMsVUFBVSxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUM7QUFDcEMsQ0FBQyxDQUFDIn0=
164
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvY2xpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUVqRCxNQUFNLFlBQVksR0FBRyxDQUFDLE9BQVksRUFBRSxNQUFjLEVBQXNCLEVBQUU7SUFDeEUsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzlCLE9BQU8sT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDOUUsQ0FBQyxDQUFDO0FBRUYsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLE9BQVksRUFBRSxPQUFpQixFQUFzQixFQUFFO0lBQ2pGLEtBQUssTUFBTSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7UUFDMUIsTUFBTSxLQUFLLEdBQUcsWUFBWSxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN6QyxJQUFJLEtBQUs7WUFBRSxPQUFPLEtBQUssQ0FBQztJQUMxQixDQUFDO0lBQ0QsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQyxDQUFDO0FBRUYsTUFBTSxtQkFBbUIsR0FBRyxDQUFDLE9BQVksRUFBRSxPQUFpQixFQUFXLEVBQUU7SUFDdkUsS0FBSyxNQUFNLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUMxQixNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDM0IsSUFBSSxLQUFLLEtBQUssSUFBSTtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ2hDLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQyxR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
@@ -1,8 +1,14 @@
1
1
  import * as fs from 'node:fs/promises';
2
2
  import * as fsSync from 'node:fs';
3
+ import * as childProcess from 'node:child_process';
4
+ import * as crypto from 'node:crypto';
3
5
  import * as os from 'node:os';
4
6
  import * as path from 'node:path';
5
- export { fs, fsSync, os, path };
7
+ export { fs, fsSync, childProcess, crypto, os, path };
8
+ import * as typedrequest from '@api.global/typedrequest';
9
+ export { typedrequest };
6
10
  import * as smartcli from '@push.rocks/smartcli';
7
11
  import * as smartconfig from '@push.rocks/smartconfig';
8
12
  export { smartcli, smartconfig };
13
+ import * as servezoneInterfaces from '@serve.zone/interfaces';
14
+ export { servezoneInterfaces };
@@ -1,11 +1,19 @@
1
1
  // node native scope
2
2
  import * as fs from 'node:fs/promises';
3
3
  import * as fsSync from 'node:fs';
4
+ import * as childProcess from 'node:child_process';
5
+ import * as crypto from 'node:crypto';
4
6
  import * as os from 'node:os';
5
7
  import * as path from 'node:path';
6
- export { fs, fsSync, os, path };
8
+ export { fs, fsSync, childProcess, crypto, os, path };
9
+ // @api.global scope
10
+ import * as typedrequest from '@api.global/typedrequest';
11
+ export { typedrequest };
7
12
  // @push.rocks scope
8
13
  import * as smartcli from '@push.rocks/smartcli';
9
14
  import * as smartconfig from '@push.rocks/smartconfig';
10
15
  export { smartcli, smartconfig };
11
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3BsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsb0JBQW9CO0FBQ3BCLE9BQU8sS0FBSyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDdkMsT0FBTyxLQUFLLE1BQU0sTUFBTSxTQUFTLENBQUM7QUFDbEMsT0FBTyxLQUFLLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDOUIsT0FBTyxLQUFLLElBQUksTUFBTSxXQUFXLENBQUM7QUFFbEMsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDO0FBRWhDLG9CQUFvQjtBQUNwQixPQUFPLEtBQUssUUFBUSxNQUFNLHNCQUFzQixDQUFDO0FBQ2pELE9BQU8sS0FBSyxXQUFXLE1BQU0seUJBQXlCLENBQUM7QUFFdkQsT0FBTyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsQ0FBQyJ9
16
+ // @serve.zone scope
17
+ import * as servezoneInterfaces from '@serve.zone/interfaces';
18
+ export { servezoneInterfaces };
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3BsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsb0JBQW9CO0FBQ3BCLE9BQU8sS0FBSyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDdkMsT0FBTyxLQUFLLE1BQU0sTUFBTSxTQUFTLENBQUM7QUFDbEMsT0FBTyxLQUFLLFlBQVksTUFBTSxvQkFBb0IsQ0FBQztBQUNuRCxPQUFPLEtBQUssTUFBTSxNQUFNLGFBQWEsQ0FBQztBQUN0QyxPQUFPLEtBQUssRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUM5QixPQUFPLEtBQUssSUFBSSxNQUFNLFdBQVcsQ0FBQztBQUVsQyxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUV0RCxvQkFBb0I7QUFDcEIsT0FBTyxLQUFLLFlBQVksTUFBTSwwQkFBMEIsQ0FBQztBQUV6RCxPQUFPLEVBQUUsWUFBWSxFQUFFLENBQUM7QUFFeEIsb0JBQW9CO0FBQ3BCLE9BQU8sS0FBSyxRQUFRLE1BQU0sc0JBQXNCLENBQUM7QUFDakQsT0FBTyxLQUFLLFdBQVcsTUFBTSx5QkFBeUIsQ0FBQztBQUV2RCxPQUFPLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxDQUFDO0FBRWpDLG9CQUFvQjtBQUNwQixPQUFPLEtBQUssbUJBQW1CLE1BQU0sd0JBQXdCLENBQUM7QUFFOUQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLENBQUMifQ==
@@ -40,14 +40,14 @@ export interface ITsDeployStatus {
40
40
  warnings: string[];
41
41
  }
42
42
  export interface ITsDeployPlanAction {
43
- type: 'inspect' | 'noop';
43
+ type: 'inspect' | 'deploy' | 'noop';
44
44
  title: string;
45
45
  description: string;
46
46
  }
47
47
  export interface ITsDeployPlan {
48
48
  schemaVersion: 1;
49
49
  projectDir: string;
50
- mutationAllowed: false;
50
+ mutationAllowed: boolean;
51
51
  summary: string;
52
52
  profile?: string;
53
53
  deploymentId?: string;
@@ -65,3 +65,80 @@ export interface ITsDeployDoctorResult {
65
65
  checks: ITsDeployDoctorCheck[];
66
66
  warnings: string[];
67
67
  }
68
+ export interface ITsDeployCommandRunOptions {
69
+ command: string;
70
+ args: string[];
71
+ cwd: string;
72
+ env?: Record<string, string | undefined>;
73
+ timeoutMs?: number;
74
+ maxOutputBytes?: number;
75
+ }
76
+ export interface ITsDeployCommandRunResult {
77
+ command: string;
78
+ args: string[];
79
+ exitCode: number;
80
+ stdout: string;
81
+ stderr: string;
82
+ }
83
+ export interface ITsDeployDeployOptions {
84
+ dryRun?: boolean;
85
+ skipChecks?: boolean;
86
+ skipPush?: boolean;
87
+ tag?: string;
88
+ image?: string;
89
+ platform?: string;
90
+ builder?: string;
91
+ verifyUrl?: string;
92
+ waitSeconds?: number;
93
+ token?: string;
94
+ username?: string;
95
+ password?: string;
96
+ }
97
+ export interface ITsDeployDeployStep {
98
+ name: string;
99
+ status: 'skipped' | 'passed' | 'failed';
100
+ message: string;
101
+ }
102
+ export interface ITsDeployCloudlyServiceSummary {
103
+ serviceId: string;
104
+ serviceName: string;
105
+ deployOnPush: boolean;
106
+ registryTarget?: {
107
+ registryHost?: string;
108
+ repository?: string;
109
+ tag?: string;
110
+ imageUrl?: string;
111
+ };
112
+ }
113
+ export interface ITsDeployDeploymentSummary {
114
+ deploymentId: string;
115
+ serviceId: string;
116
+ serviceName?: string;
117
+ status: string;
118
+ healthStatus?: string;
119
+ nodeName?: string;
120
+ version?: string;
121
+ containerId?: string;
122
+ deployedAt?: number;
123
+ updatedAt?: number;
124
+ }
125
+ export interface ITsDeployDeployResult {
126
+ schemaVersion: 1;
127
+ projectDir: string;
128
+ profile: string;
129
+ serviceId: string;
130
+ deploymentId?: string;
131
+ dryRun: boolean;
132
+ image: string;
133
+ tag: string;
134
+ platform: string;
135
+ pushed: boolean;
136
+ triggered: boolean;
137
+ verified: boolean;
138
+ digest?: string;
139
+ verifyStatus?: number;
140
+ service?: ITsDeployCloudlyServiceSummary;
141
+ deployments: ITsDeployDeploymentSummary[];
142
+ steps: ITsDeployDeployStep[];
143
+ warnings: string[];
144
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@git.zone/tsdeploy",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "private": false,
5
5
  "description": "Cloudly and Onebox first deployment orchestration CLI for git.zone TypeScript tooling.",
6
6
  "main": "dist_ts/index.js",
@@ -29,8 +29,10 @@
29
29
  },
30
30
  "homepage": "https://code.foss.global/git.zone/tsdeploy#readme",
31
31
  "dependencies": {
32
+ "@api.global/typedrequest": "^3.3.2",
32
33
  "@push.rocks/smartcli": "^4.3.0",
33
- "@push.rocks/smartconfig": "^6.1.1"
34
+ "@push.rocks/smartconfig": "^6.1.1",
35
+ "@serve.zone/interfaces": "^7.24.0"
34
36
  },
35
37
  "devDependencies": {
36
38
  "@git.zone/tsbuild": "^4.4.2",
package/readme.md CHANGED
@@ -14,7 +14,7 @@ pnpm add -g @git.zone/tsdeploy
14
14
 
15
15
  ## Usage
16
16
 
17
- `tsdeploy` stores deployment intent locally and produces safe, non-mutating plans. Cloudly or Onebox remains the source of truth for actual deployment instances.
17
+ `tsdeploy` stores a small local deployment pointer and uses Cloudly as the source of truth for workload deployment state. Cloudly workload deploys validate the linked service and registry target, then build and push the OCI image that Cloudly deploys through `deployOnPush`.
18
18
 
19
19
  Create or update a local profile in the user config store:
20
20
 
@@ -22,12 +22,12 @@ Create or update a local profile in the user config store:
22
22
  tsdeploy login --profile prod --target cloudly --origin https://cloudly.example.com
23
23
  ```
24
24
 
25
- Link a project to a Cloudly or Onebox deployment pointer. Use either `init` for the first pointer write or `link` to replace the current pointer:
25
+ Link a project to a Cloudly or Onebox pointer. Cloudly workload deploys require `serviceId`; `deploymentId` is optional status context only. Use either `init` for the first pointer write or `link` to replace the current pointer:
26
26
 
27
27
  ```bash
28
- tsdeploy init --profile prod --deploymentId deployment-123
28
+ tsdeploy init --profile prod --serviceId service-123
29
29
  # or
30
- tsdeploy link --profile prod --serviceId service-123
30
+ tsdeploy link --profile prod --serviceId service-123 --deploymentId deployment-123
31
31
  ```
32
32
 
33
33
  Inspect current local state:
@@ -38,12 +38,30 @@ tsdeploy doctor
38
38
  tsdeploy plan
39
39
  ```
40
40
 
41
+ Deploy a linked Cloudly workload:
42
+
43
+ ```bash
44
+ tsdeploy deploy
45
+ ```
46
+
47
+ Useful deploy flags:
48
+
49
+ ```bash
50
+ tsdeploy deploy --dryRun
51
+ tsdeploy deploy --tag latest --platform linux/amd64
52
+ tsdeploy deploy --builder default-builder
53
+ tsdeploy deploy --skipChecks
54
+ tsdeploy deploy --skipPush
55
+ tsdeploy deploy --verifyUrl https://app.example.com --waitSeconds 120
56
+ ```
57
+
41
58
  The project pointer is written to `.nogit/tsdeploy.json` and is intentionally small:
42
59
 
43
60
  ```json
44
61
  {
45
62
  "schemaVersion": 1,
46
63
  "profile": "prod",
64
+ "serviceId": "service-123",
47
65
  "deploymentId": "deployment-123"
48
66
  }
49
67
  ```
@@ -52,9 +70,23 @@ Profiles are stored in the user smartconfig key-value store. Tokens are never pr
52
70
 
53
71
  ## Current Scope
54
72
 
55
- This MVP does not install, update, upgrade, or mutate remote deployments. It prepares the local UX and state model for Cloudly/Onebox-backed deployment flows while avoiding duplicate release, Docker, App Store, or remote-authority semantics.
73
+ Implemented deployment scope is Cloudly workload image deployment only. `tsdeploy deploy` does not create App Store installs, perform Cloudly service upgrades, run Onebox installs, or duplicate `gitzone release` / `tsdocker` release semantics.
56
74
 
57
- Remote deployment mutations should only be added after the exact Cloudly and Onebox typed APIs for install, update, upgrade, and status are verified upstream.
75
+ For a real Cloudly deploy, credentials can be provided through a saved profile token or one of these deploy-time inputs:
76
+
77
+ ```bash
78
+ TSDEPLOY_TOKEN=... tsdeploy deploy
79
+ tsdeploy deploy --token ...
80
+ TSDEPLOY_CLOUDLY_USERNAME=... TSDEPLOY_CLOUDLY_PASSWORD=... tsdeploy deploy
81
+ tsdeploy deploy --username ... --password ...
82
+ CLOUDLY_USERNAME=... CLOUDLY_PASSWORD=... tsdeploy deploy
83
+ ```
84
+
85
+ `deploy` refuses to push when the linked Cloudly service has `deployOnPush` disabled or when an explicit `--image` does not match Cloudly's registry target for the service. Docker build-arg values configured in `.smartconfig.json` must be available as environment variables; values are passed through the process environment and are not printed in JSON output.
86
+
87
+ `--dryRun` stays local: it reads project config and reports the local image that would be pushed without contacting Cloudly, running project checks, or invoking Docker. If the image cannot be resolved locally, it returns a placeholder and warning instead of requiring Cloudly credentials.
88
+
89
+ Onebox deployment mutations are intentionally not implemented until the exact Onebox deployment APIs are verified upstream.
58
90
 
59
91
  ## Programmatic API
60
92
 
@@ -71,11 +103,14 @@ await tsDeploy.saveProfile({
71
103
 
72
104
  await tsDeploy.writeProjectLink({
73
105
  profile: 'prod',
74
- deploymentId: 'deployment-123',
106
+ serviceId: 'service-123',
75
107
  });
76
108
 
77
109
  const plan = await tsDeploy.buildPlan();
78
- console.log(plan.mutationAllowed); // false
110
+ console.log(plan.mutationAllowed); // true for linked Cloudly workloads
111
+
112
+ const result = await tsDeploy.deploy({ dryRun: true });
113
+ console.log(result.image);
79
114
  ```
80
115
 
81
116
  ## License and Legal Information
@@ -3,6 +3,6 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@git.zone/tsdeploy',
6
- version: '0.2.0',
6
+ version: '0.3.0',
7
7
  description: 'Cloudly and Onebox first deployment orchestration CLI for git.zone TypeScript tooling.'
8
8
  }