minutework 0.1.19 → 0.1.20
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/EXTERNAL_ALPHA.md +15 -4
- package/README.md +31 -2
- package/assets/claude-local/CLAUDE.md.template +56 -3
- package/assets/claude-local/bundle.json +4 -1
- package/assets/claude-local/skills/README.md +4 -1
- package/assets/claude-local/skills/app-pack-authoring/SKILL.md +57 -0
- package/assets/claude-local/skills/contract-first-public-intake/SKILL.md +22 -0
- package/assets/claude-local/skills/generated-workspace-architecture/SKILL.md +6 -0
- package/assets/claude-local/skills/published-web-and-mw-core-site/SKILL.md +12 -0
- package/assets/claude-local/skills/runtime-capability-inventory/SKILL.md +17 -0
- package/assets/claude-local/skills/schema-engine/SKILL.md +18 -0
- package/assets/claude-local/skills/vuilder-discovery-output-contract/SKILL.md +136 -0
- package/assets/claude-local/skills/vuilder-public-site-authoring/SKILL.md +76 -0
- package/assets/templates/fastapi-sidecar/README.md +7 -1
- package/assets/templates/fastapi-sidecar/template.schema.json +4 -2
- package/assets/templates/next-tenant-app/README.md +11 -3
- package/assets/templates/next-tenant-app/template.schema.json +4 -2
- package/dist/cli-json.d.ts +28 -0
- package/dist/cli-json.js +20 -0
- package/dist/cli-json.js.map +1 -0
- package/dist/compile.js +71 -7
- package/dist/compile.js.map +1 -1
- package/dist/deploy.js +147 -14
- package/dist/deploy.js.map +1 -1
- package/dist/index.js +35 -14
- package/dist/index.js.map +1 -1
- package/dist/publish.d.ts +13 -0
- package/dist/publish.js +56 -0
- package/dist/publish.js.map +1 -0
- package/dist/runtime-package.d.ts +3 -1
- package/dist/runtime-package.js +13 -0
- package/dist/runtime-package.js.map +1 -1
- package/dist/workspace-assets.js +37 -5
- package/dist/workspace-assets.js.map +1 -1
- package/dist/workspace.js +2 -0
- package/dist/workspace.js.map +1 -1
- package/package.json +2 -2
- package/vendor/workspace-mcp/types.d.ts +8 -0
|
@@ -25,14 +25,16 @@
|
|
|
25
25
|
"enum": [
|
|
26
26
|
"sidecar_nextjs_private",
|
|
27
27
|
"sidecar_fastapi_internal",
|
|
28
|
-
"combined_web"
|
|
28
|
+
"combined_web",
|
|
29
|
+
"public_site"
|
|
29
30
|
]
|
|
30
31
|
},
|
|
31
32
|
"template_profile": {
|
|
32
33
|
"type": "string",
|
|
33
34
|
"enum": [
|
|
34
35
|
"platform_session_bff",
|
|
35
|
-
"bridge_internal"
|
|
36
|
+
"bridge_internal",
|
|
37
|
+
"public_dj_cms"
|
|
36
38
|
]
|
|
37
39
|
},
|
|
38
40
|
"template_version": {
|
|
@@ -8,6 +8,10 @@ In the runtime Builder flow, this bundle materializes into
|
|
|
8
8
|
In the external CLI scaffold flow, the same starter is copied into
|
|
9
9
|
`tenant-app/`.
|
|
10
10
|
|
|
11
|
+
On managed tenant VMs, `BuilderWorkspace.sandbox_root` normally lives under
|
|
12
|
+
`/srv/minutework/workspaces/<workspace_id>/`, so the Builder-edited app copy is
|
|
13
|
+
typically `/srv/minutework/workspaces/<workspace_id>/app/`.
|
|
14
|
+
|
|
11
15
|
`apps/mw-next-client` is still the repo-side seed used to harden and evolve this scaffold. It is not the runtime template location.
|
|
12
16
|
|
|
13
17
|
## Auth profile
|
|
@@ -27,13 +31,16 @@ This template stays fixed to the `platform_session_bff` profile:
|
|
|
27
31
|
|
|
28
32
|
## Direct web hosts
|
|
29
33
|
|
|
30
|
-
When this starter lives inside
|
|
31
|
-
deploy direct web hosts against `tenant-app` only.
|
|
34
|
+
When this starter lives inside an external CLI workspace with an optional
|
|
35
|
+
`sidecar`, deploy direct web hosts against `tenant-app` only.
|
|
32
36
|
|
|
33
37
|
- Root `pnpm install` stays Node-only and does not auto-install sidecar Python deps.
|
|
34
38
|
- If you need the sidecar locally, run `pnpm run install:sidecar` from the workspace root or `cd sidecar && poetry install`.
|
|
35
39
|
- For Vercel, set the project Root Directory to `tenant-app`.
|
|
36
40
|
|
|
41
|
+
Those host-specific instructions apply to the CLI scaffold layout, not the
|
|
42
|
+
runtime Builder sandbox layout under `app/`.
|
|
43
|
+
|
|
37
44
|
## Default route shape
|
|
38
45
|
|
|
39
46
|
The template ships one combined app with two explicit route surfaces:
|
|
@@ -131,7 +138,8 @@ Use `pnpm validate` from this directory. It runs:
|
|
|
131
138
|
`template:validate` validates `template.json` against the bundled `template.schema.json`, so the template remains self-validating after Builder materializes it into a workspace sandbox.
|
|
132
139
|
|
|
133
140
|
When the CLI scaffolds this starter into `tenant-app/`, the same validation
|
|
134
|
-
contract still applies to that copied workspace surface.
|
|
141
|
+
contract still applies to that copied workspace surface. When Runtime Builder
|
|
142
|
+
materializes it into `app/`, the same validation contract applies there too.
|
|
135
143
|
|
|
136
144
|
The validation-only build steps inject fixture values for the required
|
|
137
145
|
production env vars and run against a local public-site fixture server, so the
|
|
@@ -25,14 +25,16 @@
|
|
|
25
25
|
"enum": [
|
|
26
26
|
"sidecar_nextjs_private",
|
|
27
27
|
"sidecar_fastapi_internal",
|
|
28
|
-
"combined_web"
|
|
28
|
+
"combined_web",
|
|
29
|
+
"public_site"
|
|
29
30
|
]
|
|
30
31
|
},
|
|
31
32
|
"template_profile": {
|
|
32
33
|
"type": "string",
|
|
33
34
|
"enum": [
|
|
34
35
|
"platform_session_bff",
|
|
35
|
-
"bridge_internal"
|
|
36
|
+
"bridge_internal",
|
|
37
|
+
"public_dj_cms"
|
|
36
38
|
]
|
|
37
39
|
},
|
|
38
40
|
"template_version": {
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export declare const CLI_JSON_VERSION: 1;
|
|
2
|
+
export type CliJsonCommand = "validate" | "compile" | "codegen" | "deploy" | "publish";
|
|
3
|
+
export type CliJsonEnvelope = {
|
|
4
|
+
cliJsonVersion: typeof CLI_JSON_VERSION;
|
|
5
|
+
command: CliJsonCommand;
|
|
6
|
+
ok: boolean;
|
|
7
|
+
status: string;
|
|
8
|
+
result: unknown;
|
|
9
|
+
error: {
|
|
10
|
+
message: string;
|
|
11
|
+
} | null;
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Render the single, stable JSON envelope that machine-readable CLI verbs emit
|
|
15
|
+
* on stdout under `--json`. An IDE agent parses one shape across every verb:
|
|
16
|
+
* check `ok` (and the process exit code), then read `status` and
|
|
17
|
+
* `result` / `error`. The envelope is the contract; `cliJsonVersion` lets the
|
|
18
|
+
* shape evolve without silently breaking parsers.
|
|
19
|
+
*/
|
|
20
|
+
export declare function renderCliJsonEnvelope(envelope: {
|
|
21
|
+
command: CliJsonCommand;
|
|
22
|
+
ok: boolean;
|
|
23
|
+
status: string;
|
|
24
|
+
result?: unknown;
|
|
25
|
+
error?: {
|
|
26
|
+
message: string;
|
|
27
|
+
} | null;
|
|
28
|
+
}): string;
|
package/dist/cli-json.js
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export const CLI_JSON_VERSION = 1;
|
|
2
|
+
/**
|
|
3
|
+
* Render the single, stable JSON envelope that machine-readable CLI verbs emit
|
|
4
|
+
* on stdout under `--json`. An IDE agent parses one shape across every verb:
|
|
5
|
+
* check `ok` (and the process exit code), then read `status` and
|
|
6
|
+
* `result` / `error`. The envelope is the contract; `cliJsonVersion` lets the
|
|
7
|
+
* shape evolve without silently breaking parsers.
|
|
8
|
+
*/
|
|
9
|
+
export function renderCliJsonEnvelope(envelope) {
|
|
10
|
+
const payload = {
|
|
11
|
+
cliJsonVersion: CLI_JSON_VERSION,
|
|
12
|
+
command: envelope.command,
|
|
13
|
+
ok: envelope.ok,
|
|
14
|
+
status: envelope.status,
|
|
15
|
+
result: envelope.result ?? null,
|
|
16
|
+
error: envelope.error ?? null,
|
|
17
|
+
};
|
|
18
|
+
return `${JSON.stringify(payload, null, 2)}\n`;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=cli-json.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-json.js","sourceRoot":"","sources":["../src/cli-json.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAU,CAAC;AAa3C;;;;;;GAMG;AACH,MAAM,UAAU,qBAAqB,CAAC,QAMrC;IACC,MAAM,OAAO,GAAoB;QAC/B,cAAc,EAAE,gBAAgB;QAChC,OAAO,EAAE,QAAQ,CAAC,OAAO;QACzB,EAAE,EAAE,QAAQ,CAAC,EAAE;QACf,MAAM,EAAE,QAAQ,CAAC,MAAM;QACvB,MAAM,EAAE,QAAQ,CAAC,MAAM,IAAI,IAAI;QAC/B,KAAK,EAAE,QAAQ,CAAC,KAAK,IAAI,IAAI;KAC9B,CAAC;IACF,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC;AACjD,CAAC"}
|
package/dist/compile.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { promises as fs } from "node:fs";
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
import { analyzeCompilerWorkspace, discoverCompilerWorkspaceRoot, } from "@minutework/schema-compiler";
|
|
4
|
+
import { renderCliJsonEnvelope } from "./cli-json.js";
|
|
4
5
|
export async function runValidateCommand(options) {
|
|
5
6
|
const parsed = parseCompilerCommandArgs(options.args, "validate");
|
|
6
7
|
if (parsed.help) {
|
|
@@ -9,8 +10,18 @@ export async function runValidateCommand(options) {
|
|
|
9
10
|
}
|
|
10
11
|
const workspaceRoot = await discoverCompilerWorkspaceRoot(path.resolve(options.cwd, parsed.workspacePath ?? "."));
|
|
11
12
|
const analysis = await analyzeCompilerWorkspace(workspaceRoot);
|
|
13
|
+
const ok = analysis.validateReport.status === "ok";
|
|
14
|
+
if (parsed.json) {
|
|
15
|
+
options.io.stdout(renderCliJsonEnvelope({
|
|
16
|
+
command: "validate",
|
|
17
|
+
ok,
|
|
18
|
+
status: analysis.validateReport.status,
|
|
19
|
+
result: analysis.validateReport,
|
|
20
|
+
}));
|
|
21
|
+
return ok ? 0 : 1;
|
|
22
|
+
}
|
|
12
23
|
options.io.stdout(formatJson(analysis.validateReport));
|
|
13
|
-
return
|
|
24
|
+
return ok ? 0 : 1;
|
|
14
25
|
}
|
|
15
26
|
export async function runCompileCommand(options) {
|
|
16
27
|
const parsed = parseCompilerCommandArgs(options.args, "compile");
|
|
@@ -21,10 +32,29 @@ export async function runCompileCommand(options) {
|
|
|
21
32
|
const workspaceRoot = await discoverCompilerWorkspaceRoot(path.resolve(options.cwd, parsed.workspacePath ?? "."));
|
|
22
33
|
const analysis = await analyzeCompilerWorkspace(workspaceRoot);
|
|
23
34
|
if (!analysis.compileGraph) {
|
|
35
|
+
if (parsed.json) {
|
|
36
|
+
options.io.stdout(renderCliJsonEnvelope({
|
|
37
|
+
command: "compile",
|
|
38
|
+
ok: false,
|
|
39
|
+
status: analysis.validateReport.status,
|
|
40
|
+
result: analysis.validateReport,
|
|
41
|
+
error: { message: "Compile failed: schema source did not validate." },
|
|
42
|
+
}));
|
|
43
|
+
return 1;
|
|
44
|
+
}
|
|
24
45
|
options.io.stderr(formatJson(analysis.validateReport));
|
|
25
46
|
return 1;
|
|
26
47
|
}
|
|
27
48
|
await writeCompileGraph(workspaceRoot, analysis.compileGraph);
|
|
49
|
+
if (parsed.json) {
|
|
50
|
+
options.io.stdout(renderCliJsonEnvelope({
|
|
51
|
+
command: "compile",
|
|
52
|
+
ok: true,
|
|
53
|
+
status: "compiled",
|
|
54
|
+
result: analysis.compileGraph,
|
|
55
|
+
}));
|
|
56
|
+
return 0;
|
|
57
|
+
}
|
|
28
58
|
options.io.stdout(formatJson(analysis.compileGraph));
|
|
29
59
|
return 0;
|
|
30
60
|
}
|
|
@@ -37,16 +67,36 @@ export async function runCodegenCommand(options) {
|
|
|
37
67
|
const workspaceRoot = await discoverCompilerWorkspaceRoot(path.resolve(options.cwd, parsed.workspacePath ?? "."));
|
|
38
68
|
const analysis = await analyzeCompilerWorkspace(workspaceRoot);
|
|
39
69
|
if (!analysis.compileGraph || !analysis.codegenArtifacts) {
|
|
70
|
+
if (parsed.json) {
|
|
71
|
+
options.io.stdout(renderCliJsonEnvelope({
|
|
72
|
+
command: "codegen",
|
|
73
|
+
ok: false,
|
|
74
|
+
status: analysis.validateReport.status,
|
|
75
|
+
result: analysis.validateReport,
|
|
76
|
+
error: { message: "Codegen failed: schema source did not validate." },
|
|
77
|
+
}));
|
|
78
|
+
return 1;
|
|
79
|
+
}
|
|
40
80
|
options.io.stderr(formatJson(analysis.validateReport));
|
|
41
81
|
return 1;
|
|
42
82
|
}
|
|
43
83
|
await writeCompileGraph(workspaceRoot, analysis.compileGraph);
|
|
44
84
|
await writeCodegenArtifacts(workspaceRoot, analysis.compileGraph.artifacts, analysis.codegenArtifacts);
|
|
85
|
+
if (parsed.json) {
|
|
86
|
+
options.io.stdout(renderCliJsonEnvelope({
|
|
87
|
+
command: "codegen",
|
|
88
|
+
ok: true,
|
|
89
|
+
status: "generated",
|
|
90
|
+
result: analysis.compileGraph,
|
|
91
|
+
}));
|
|
92
|
+
return 0;
|
|
93
|
+
}
|
|
45
94
|
options.io.stdout(formatJson(analysis.compileGraph));
|
|
46
95
|
return 0;
|
|
47
96
|
}
|
|
48
97
|
function parseCompilerCommandArgs(args, command) {
|
|
49
98
|
let workspacePath;
|
|
99
|
+
let json = false;
|
|
50
100
|
const setWorkspacePath = (value) => {
|
|
51
101
|
if (workspacePath) {
|
|
52
102
|
throw new Error(`${command} accepts at most one workspace path.`);
|
|
@@ -58,6 +108,10 @@ function parseCompilerCommandArgs(args, command) {
|
|
|
58
108
|
if (arg === "--help" || arg === "-h") {
|
|
59
109
|
return { help: true };
|
|
60
110
|
}
|
|
111
|
+
if (arg === "--json") {
|
|
112
|
+
json = true;
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
61
115
|
if (arg === "--workspace") {
|
|
62
116
|
const next = args[index + 1];
|
|
63
117
|
if (!next || next.startsWith("--")) {
|
|
@@ -82,6 +136,7 @@ function parseCompilerCommandArgs(args, command) {
|
|
|
82
136
|
}
|
|
83
137
|
return {
|
|
84
138
|
help: false,
|
|
139
|
+
json,
|
|
85
140
|
workspacePath,
|
|
86
141
|
};
|
|
87
142
|
}
|
|
@@ -102,20 +157,29 @@ export function formatJson(payload) {
|
|
|
102
157
|
}
|
|
103
158
|
function renderValidateHelp() {
|
|
104
159
|
return `Usage:
|
|
105
|
-
minutework validate [workspace] [--workspace <path>]
|
|
160
|
+
minutework validate [workspace] [--workspace <path>] [--json]
|
|
106
161
|
|
|
107
|
-
Validate the local MinuteWork schema authoring source and print a deterministic validate report
|
|
162
|
+
Validate the local MinuteWork schema authoring source and print a deterministic validate report.
|
|
163
|
+
|
|
164
|
+
Options:
|
|
165
|
+
--json Emit a single machine-readable JSON result envelope (cliJsonVersion, command, ok, status, result, error) on stdout. Exit 0 when valid, 1 otherwise.`;
|
|
108
166
|
}
|
|
109
167
|
function renderCompileHelp() {
|
|
110
168
|
return `Usage:
|
|
111
|
-
minutework compile [workspace] [--workspace <path>]
|
|
169
|
+
minutework compile [workspace] [--workspace <path>] [--json]
|
|
170
|
+
|
|
171
|
+
Compile the local MinuteWork schema source and write the canonical graph.json artifact under the configured local state directory.
|
|
112
172
|
|
|
113
|
-
|
|
173
|
+
Options:
|
|
174
|
+
--json Emit a single machine-readable JSON result envelope on stdout (result is the compile graph on success, the validate report on failure). Exit 0 on success, 1 otherwise.`;
|
|
114
175
|
}
|
|
115
176
|
function renderCodegenHelp() {
|
|
116
177
|
return `Usage:
|
|
117
|
-
minutework codegen [workspace] [--workspace <path>]
|
|
178
|
+
minutework codegen [workspace] [--workspace <path>] [--json]
|
|
179
|
+
|
|
180
|
+
Generate deterministic OpenAPI and client-type artifacts from the local compile graph, refreshing graph.json first when validation succeeds.
|
|
118
181
|
|
|
119
|
-
|
|
182
|
+
Options:
|
|
183
|
+
--json Emit a single machine-readable JSON result envelope on stdout. Exit 0 on success, 1 otherwise.`;
|
|
120
184
|
}
|
|
121
185
|
//# sourceMappingURL=compile.js.map
|
package/dist/compile.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compile.js","sourceRoot":"","sources":["../src/compile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EACL,wBAAwB,EACxB,6BAA6B,GAI9B,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"compile.js","sourceRoot":"","sources":["../src/compile.ts"],"names":[],"mappings":"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"}
|
package/dist/deploy.js
CHANGED
|
@@ -4,7 +4,8 @@ import { analyzeCompilerWorkspace, discoverCompilerWorkspaceRoot, HostedPreviewR
|
|
|
4
4
|
import { writeCompileGraph } from "./compile.js";
|
|
5
5
|
import { MINUTEWORK_PREVIEW_DEPLOY_STATE_VERSION, writePreviewDeployState, } from "./deploy-state.js";
|
|
6
6
|
import { createDeveloperClient, } from "./developer-client.js";
|
|
7
|
-
import {
|
|
7
|
+
import { renderCliJsonEnvelope } from "./cli-json.js";
|
|
8
|
+
import { buildRuntimeAppPackage, buildRuntimePackagePayload } from "./runtime-package.js";
|
|
8
9
|
import { assertWorkspacePlatformMatchesAuthProfile, resolveOptionalCliWorkspaceConfig, } from "./config.js";
|
|
9
10
|
import { loadCurrentAuthProfile, loadWorkspaceBinding, } from "./state.js";
|
|
10
11
|
export async function runDeployCommand(options) {
|
|
@@ -13,8 +14,33 @@ export async function runDeployCommand(options) {
|
|
|
13
14
|
options.io.stdout(renderDeployHelp());
|
|
14
15
|
return 0;
|
|
15
16
|
}
|
|
17
|
+
try {
|
|
18
|
+
return await executeDeployPreview({ options, parsed });
|
|
19
|
+
}
|
|
20
|
+
catch (error) {
|
|
21
|
+
if (!parsed.json) {
|
|
22
|
+
throw error;
|
|
23
|
+
}
|
|
24
|
+
// In --json mode every outcome — including thrown errors — is a single
|
|
25
|
+
// envelope on stdout, so the agent never has to parse free-form stderr.
|
|
26
|
+
options.io.stdout(renderCliJsonEnvelope({
|
|
27
|
+
command: "deploy",
|
|
28
|
+
ok: false,
|
|
29
|
+
status: "error",
|
|
30
|
+
error: { message: error instanceof Error ? error.message : String(error) },
|
|
31
|
+
}));
|
|
32
|
+
return 1;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
async function executeDeployPreview(context) {
|
|
36
|
+
const { options, parsed } = context;
|
|
16
37
|
if (parsed.target === "live") {
|
|
17
|
-
|
|
38
|
+
const message = "`minutework deploy --live` is reserved for follow-on work and is not implemented for the external alpha.";
|
|
39
|
+
if (parsed.json) {
|
|
40
|
+
options.io.stdout(renderCliJsonEnvelope({ command: "deploy", ok: false, status: "not_implemented", error: { message } }));
|
|
41
|
+
return 1;
|
|
42
|
+
}
|
|
43
|
+
options.io.stderr(message);
|
|
18
44
|
return 1;
|
|
19
45
|
}
|
|
20
46
|
const workspaceRoot = await discoverCompilerWorkspaceRoot(path.resolve(options.cwd, parsed.workspacePath ?? "."));
|
|
@@ -37,6 +63,16 @@ export async function runDeployCommand(options) {
|
|
|
37
63
|
}
|
|
38
64
|
const analysis = await analyzeCompilerWorkspace(workspaceRoot);
|
|
39
65
|
if (!analysis.compileGraph) {
|
|
66
|
+
if (parsed.json) {
|
|
67
|
+
options.io.stdout(renderCliJsonEnvelope({
|
|
68
|
+
command: "deploy",
|
|
69
|
+
ok: false,
|
|
70
|
+
status: analysis.validateReport.status,
|
|
71
|
+
result: analysis.validateReport,
|
|
72
|
+
error: { message: "Deploy failed: schema source did not validate." },
|
|
73
|
+
}));
|
|
74
|
+
return 1;
|
|
75
|
+
}
|
|
40
76
|
options.io.stderr(JSON.stringify(analysis.validateReport, null, 2));
|
|
41
77
|
return 1;
|
|
42
78
|
}
|
|
@@ -53,6 +89,7 @@ export async function runDeployCommand(options) {
|
|
|
53
89
|
client,
|
|
54
90
|
dependencies: options.dependencies,
|
|
55
91
|
io: options.io,
|
|
92
|
+
json: parsed.json,
|
|
56
93
|
platform: options.platform,
|
|
57
94
|
workspaceRoot,
|
|
58
95
|
yes: parsed.yes,
|
|
@@ -64,6 +101,7 @@ export async function runDeployCommand(options) {
|
|
|
64
101
|
client,
|
|
65
102
|
dependencies: options.dependencies,
|
|
66
103
|
io: options.io,
|
|
104
|
+
json: parsed.json,
|
|
67
105
|
platform: options.platform,
|
|
68
106
|
workspaceRoot,
|
|
69
107
|
yes: parsed.yes,
|
|
@@ -96,17 +134,47 @@ async function runHostedPreviewDeploy(options) {
|
|
|
96
134
|
},
|
|
97
135
|
workspaceRoot: options.workspaceRoot,
|
|
98
136
|
});
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
137
|
+
if (!options.json) {
|
|
138
|
+
renderPreviewDiff(options.io, {
|
|
139
|
+
local: releaseMetadata,
|
|
140
|
+
remote: remoteStatus,
|
|
141
|
+
});
|
|
142
|
+
}
|
|
103
143
|
if (remoteStatus.current_preview_release?.digest === releaseMetadata.releaseDigest) {
|
|
144
|
+
if (options.json) {
|
|
145
|
+
options.io.stdout(renderCliJsonEnvelope({
|
|
146
|
+
command: "deploy",
|
|
147
|
+
ok: true,
|
|
148
|
+
status: "already_current",
|
|
149
|
+
result: {
|
|
150
|
+
targetKind: "public_site",
|
|
151
|
+
propertyKey: options.binding.propertyKey,
|
|
152
|
+
releaseDigest: releaseMetadata.releaseDigest,
|
|
153
|
+
previewUrl: remoteStatus.preview_url ?? null,
|
|
154
|
+
},
|
|
155
|
+
}));
|
|
156
|
+
return 0;
|
|
157
|
+
}
|
|
104
158
|
options.io.stdout("Preview deploy already matches the local release digest.");
|
|
105
159
|
if (remoteStatus.preview_url) {
|
|
106
160
|
options.io.stdout(`Preview URL: ${remoteStatus.preview_url}`);
|
|
107
161
|
}
|
|
108
162
|
return 0;
|
|
109
163
|
}
|
|
164
|
+
if (options.json && !options.yes) {
|
|
165
|
+
options.io.stdout(renderCliJsonEnvelope({
|
|
166
|
+
command: "deploy",
|
|
167
|
+
ok: false,
|
|
168
|
+
status: "confirmation_required",
|
|
169
|
+
result: {
|
|
170
|
+
targetKind: "public_site",
|
|
171
|
+
localReleaseDigest: releaseMetadata.releaseDigest,
|
|
172
|
+
remoteReleaseDigest: remoteStatus.current_preview_release?.digest ?? null,
|
|
173
|
+
},
|
|
174
|
+
error: { message: "Preview deploy needs confirmation; re-run with --yes (required alongside --json)." },
|
|
175
|
+
}));
|
|
176
|
+
return 1;
|
|
177
|
+
}
|
|
110
178
|
const confirmed = options.yes ||
|
|
111
179
|
(await (options.dependencies?.confirmPreviewDeploy ?? defaultConfirmPreviewDeploy)({
|
|
112
180
|
localReleaseDigest: releaseMetadata.releaseDigest,
|
|
@@ -171,6 +239,19 @@ async function runHostedPreviewDeploy(options) {
|
|
|
171
239
|
},
|
|
172
240
|
workspaceRoot: options.workspaceRoot,
|
|
173
241
|
});
|
|
242
|
+
if (options.json) {
|
|
243
|
+
options.io.stdout(renderCliJsonEnvelope({
|
|
244
|
+
command: "deploy",
|
|
245
|
+
ok: terminalReceipt.deployment_state === "activated",
|
|
246
|
+
status: terminalReceipt.deployment_state,
|
|
247
|
+
result: {
|
|
248
|
+
targetKind: "public_site",
|
|
249
|
+
previewUrl: terminalReceipt.preview_url ?? null,
|
|
250
|
+
receipt: summarizeTerminalReceipt(terminalReceipt),
|
|
251
|
+
},
|
|
252
|
+
}));
|
|
253
|
+
return terminalReceipt.deployment_state === "activated" ? 0 : 1;
|
|
254
|
+
}
|
|
174
255
|
renderTerminalReceipt(options.io, terminalReceipt);
|
|
175
256
|
return terminalReceipt.deployment_state === "activated" ? 0 : 1;
|
|
176
257
|
}
|
|
@@ -207,18 +288,49 @@ async function runRuntimePreviewDeploy(options) {
|
|
|
207
288
|
},
|
|
208
289
|
workspaceRoot: options.workspaceRoot,
|
|
209
290
|
});
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
291
|
+
if (!options.json) {
|
|
292
|
+
renderRuntimePreviewDiff(options.io, {
|
|
293
|
+
local: releaseMetadata,
|
|
294
|
+
remote: remoteStatus,
|
|
295
|
+
});
|
|
296
|
+
}
|
|
214
297
|
if (remoteStatus.app_pack?.status === "active" &&
|
|
215
298
|
String(remoteStatus.current_receipt?.detail?.release_digest || "") === releaseMetadata.releaseDigest) {
|
|
299
|
+
if (options.json) {
|
|
300
|
+
options.io.stdout(renderCliJsonEnvelope({
|
|
301
|
+
command: "deploy",
|
|
302
|
+
ok: true,
|
|
303
|
+
status: "already_current",
|
|
304
|
+
result: {
|
|
305
|
+
targetKind: "runtime_app",
|
|
306
|
+
appId: releaseMetadata.appId,
|
|
307
|
+
releaseDigest: releaseMetadata.releaseDigest,
|
|
308
|
+
previewUrl: remoteStatus.preview_url ?? null,
|
|
309
|
+
},
|
|
310
|
+
}));
|
|
311
|
+
return 0;
|
|
312
|
+
}
|
|
216
313
|
options.io.stdout("Runtime preview deploy already matches the local release digest.");
|
|
217
314
|
if (remoteStatus.preview_url) {
|
|
218
315
|
options.io.stdout(`Preview URL: ${remoteStatus.preview_url}`);
|
|
219
316
|
}
|
|
220
317
|
return 0;
|
|
221
318
|
}
|
|
319
|
+
if (options.json && !options.yes) {
|
|
320
|
+
options.io.stdout(renderCliJsonEnvelope({
|
|
321
|
+
command: "deploy",
|
|
322
|
+
ok: false,
|
|
323
|
+
status: "confirmation_required",
|
|
324
|
+
result: {
|
|
325
|
+
targetKind: "runtime_app",
|
|
326
|
+
appId: releaseMetadata.appId,
|
|
327
|
+
localReleaseDigest: releaseMetadata.releaseDigest,
|
|
328
|
+
remoteReleaseDigest: remoteStatus.app_pack?.app_version ?? null,
|
|
329
|
+
},
|
|
330
|
+
error: { message: "Preview deploy needs confirmation; re-run with --yes (required alongside --json)." },
|
|
331
|
+
}));
|
|
332
|
+
return 1;
|
|
333
|
+
}
|
|
222
334
|
const confirmed = options.yes ||
|
|
223
335
|
(await (options.dependencies?.confirmPreviewDeploy ?? defaultConfirmPreviewDeploy)({
|
|
224
336
|
appId: releaseMetadata.appId,
|
|
@@ -285,14 +397,25 @@ async function runRuntimePreviewDeploy(options) {
|
|
|
285
397
|
},
|
|
286
398
|
workspaceRoot: options.workspaceRoot,
|
|
287
399
|
});
|
|
400
|
+
if (options.json) {
|
|
401
|
+
options.io.stdout(renderCliJsonEnvelope({
|
|
402
|
+
command: "deploy",
|
|
403
|
+
ok: terminalReceipt.deployment_state === "activated",
|
|
404
|
+
status: terminalReceipt.deployment_state,
|
|
405
|
+
result: {
|
|
406
|
+
targetKind: "runtime_app",
|
|
407
|
+
previewUrl: terminalReceipt.preview_url ?? null,
|
|
408
|
+
receipt: summarizeRuntimeTerminalReceipt(terminalReceipt),
|
|
409
|
+
},
|
|
410
|
+
}));
|
|
411
|
+
return terminalReceipt.deployment_state === "activated" ? 0 : 1;
|
|
412
|
+
}
|
|
288
413
|
renderRuntimeTerminalReceipt(options.io, terminalReceipt);
|
|
289
414
|
return terminalReceipt.deployment_state === "activated" ? 0 : 1;
|
|
290
415
|
}
|
|
291
|
-
function buildRuntimePackagePayload(packageArtifact) {
|
|
292
|
-
return JSON.parse(JSON.stringify(packageArtifact));
|
|
293
|
-
}
|
|
294
416
|
function parseDeployCommandArgs(args) {
|
|
295
417
|
let help = false;
|
|
418
|
+
let json = false;
|
|
296
419
|
let target = null;
|
|
297
420
|
let workspacePath;
|
|
298
421
|
let yes = false;
|
|
@@ -320,6 +443,10 @@ function parseDeployCommandArgs(args) {
|
|
|
320
443
|
yes = true;
|
|
321
444
|
continue;
|
|
322
445
|
}
|
|
446
|
+
if (arg === "--json") {
|
|
447
|
+
json = true;
|
|
448
|
+
continue;
|
|
449
|
+
}
|
|
323
450
|
if (arg === "--workspace") {
|
|
324
451
|
const next = args[index + 1];
|
|
325
452
|
if (!next || next.startsWith("--")) {
|
|
@@ -345,7 +472,7 @@ function parseDeployCommandArgs(args) {
|
|
|
345
472
|
if (!help && target === null) {
|
|
346
473
|
throw new Error("The deploy command requires either `--preview` or `--live`.");
|
|
347
474
|
}
|
|
348
|
-
return { help, target, workspacePath, yes };
|
|
475
|
+
return { help, json, target, workspacePath, yes };
|
|
349
476
|
}
|
|
350
477
|
function renderDeployHelp() {
|
|
351
478
|
return `Usage:
|
|
@@ -355,6 +482,12 @@ function renderDeployHelp() {
|
|
|
355
482
|
Current support:
|
|
356
483
|
--preview Uses the linked workspace target (hosted public-site or tenant runtime)
|
|
357
484
|
--live Reserved follow-on work and intentionally blocked
|
|
485
|
+
|
|
486
|
+
Options:
|
|
487
|
+
--yes Skip the interactive confirmation prompt.
|
|
488
|
+
--json Emit a single machine-readable JSON result envelope on stdout and run
|
|
489
|
+
unattended (never prompts). Pair with --yes to authorize the deploy;
|
|
490
|
+
without --yes a "confirmation_required" result is returned (exit 1).
|
|
358
491
|
`;
|
|
359
492
|
}
|
|
360
493
|
async function defaultConfirmPreviewDeploy() {
|