@zauso-ai/capstan-release 0.1.2
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/index.d.ts +234 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +956 -0
- package/dist/index.js.map +1 -0
- package/package.json +44 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
import { type VerifyReport } from "@zauso-ai/capstan-feedback";
|
|
2
|
+
export type ReleasePlanStatus = "ready" | "blocked";
|
|
3
|
+
export type ReleaseGateStatus = "passed" | "failed";
|
|
4
|
+
export type ReleaseRunTarget = "preview" | "release";
|
|
5
|
+
export type ReleaseExecutionTarget = ReleaseRunTarget | "rollback";
|
|
6
|
+
export type ReleaseRunStatus = "completed" | "blocked" | "failed";
|
|
7
|
+
export type ReleaseRunStepStatus = "completed" | "failed" | "skipped";
|
|
8
|
+
export interface ReleaseEnvironmentVariable {
|
|
9
|
+
key: string;
|
|
10
|
+
title: string;
|
|
11
|
+
description?: string;
|
|
12
|
+
required?: boolean;
|
|
13
|
+
defaultValue?: string;
|
|
14
|
+
}
|
|
15
|
+
export interface ReleaseSecret {
|
|
16
|
+
key: string;
|
|
17
|
+
title: string;
|
|
18
|
+
description?: string;
|
|
19
|
+
required?: boolean;
|
|
20
|
+
}
|
|
21
|
+
export interface ReleaseArtifact {
|
|
22
|
+
key: string;
|
|
23
|
+
title: string;
|
|
24
|
+
kind: "directory" | "json" | "html" | "file";
|
|
25
|
+
path: string;
|
|
26
|
+
required?: boolean;
|
|
27
|
+
}
|
|
28
|
+
export interface ReleaseHealthCheck {
|
|
29
|
+
key: string;
|
|
30
|
+
title: string;
|
|
31
|
+
kind: "verify_pass" | "path_exists" | "json_parse";
|
|
32
|
+
target?: string;
|
|
33
|
+
description?: string;
|
|
34
|
+
required?: boolean;
|
|
35
|
+
}
|
|
36
|
+
export interface ReleaseStep {
|
|
37
|
+
key: string;
|
|
38
|
+
title: string;
|
|
39
|
+
description?: string;
|
|
40
|
+
command?: string;
|
|
41
|
+
}
|
|
42
|
+
export interface ReleaseEnvironment {
|
|
43
|
+
key: string;
|
|
44
|
+
title: string;
|
|
45
|
+
strategy: "ephemeral" | "managed";
|
|
46
|
+
baseUrl?: string;
|
|
47
|
+
variables: readonly ReleaseEnvironmentVariable[];
|
|
48
|
+
secrets: readonly ReleaseSecret[];
|
|
49
|
+
}
|
|
50
|
+
export interface ReleaseInputReference {
|
|
51
|
+
path: string;
|
|
52
|
+
title: string;
|
|
53
|
+
description?: string;
|
|
54
|
+
}
|
|
55
|
+
export interface ReleaseEnvironmentSnapshotEntry {
|
|
56
|
+
key: string;
|
|
57
|
+
variables: Record<string, string>;
|
|
58
|
+
secrets: readonly string[];
|
|
59
|
+
}
|
|
60
|
+
export interface ReleaseEnvironmentSnapshot {
|
|
61
|
+
version: 1;
|
|
62
|
+
environments: readonly ReleaseEnvironmentSnapshotEntry[];
|
|
63
|
+
}
|
|
64
|
+
export interface ReleaseMigrationStep {
|
|
65
|
+
key: string;
|
|
66
|
+
title: string;
|
|
67
|
+
status: "applied" | "pending" | "unsafe";
|
|
68
|
+
description?: string;
|
|
69
|
+
command?: string;
|
|
70
|
+
}
|
|
71
|
+
export interface ReleaseMigrationPlan {
|
|
72
|
+
version: 1;
|
|
73
|
+
generatedBy: "capstan";
|
|
74
|
+
status: "safe" | "pending" | "unsafe";
|
|
75
|
+
steps: readonly ReleaseMigrationStep[];
|
|
76
|
+
}
|
|
77
|
+
export interface ReleaseRollbackPlan {
|
|
78
|
+
strategy: string;
|
|
79
|
+
steps: readonly string[];
|
|
80
|
+
}
|
|
81
|
+
export interface ReleaseTraceSpec {
|
|
82
|
+
captures: readonly string[];
|
|
83
|
+
}
|
|
84
|
+
export interface ReleaseContract {
|
|
85
|
+
version: 1;
|
|
86
|
+
domain: {
|
|
87
|
+
key: string;
|
|
88
|
+
title: string;
|
|
89
|
+
description?: string;
|
|
90
|
+
};
|
|
91
|
+
application: {
|
|
92
|
+
key: string;
|
|
93
|
+
title: string;
|
|
94
|
+
generatedBy: "capstan";
|
|
95
|
+
};
|
|
96
|
+
environments: readonly ReleaseEnvironment[];
|
|
97
|
+
inputs: {
|
|
98
|
+
environmentSnapshot: ReleaseInputReference;
|
|
99
|
+
migrationPlan: ReleaseInputReference;
|
|
100
|
+
};
|
|
101
|
+
artifacts: readonly ReleaseArtifact[];
|
|
102
|
+
healthChecks: readonly ReleaseHealthCheck[];
|
|
103
|
+
preview: {
|
|
104
|
+
steps: readonly ReleaseStep[];
|
|
105
|
+
};
|
|
106
|
+
release: {
|
|
107
|
+
steps: readonly ReleaseStep[];
|
|
108
|
+
};
|
|
109
|
+
rollback: ReleaseRollbackPlan;
|
|
110
|
+
trace: ReleaseTraceSpec;
|
|
111
|
+
}
|
|
112
|
+
export interface ReleaseGate {
|
|
113
|
+
key: string;
|
|
114
|
+
label: string;
|
|
115
|
+
status: ReleaseGateStatus;
|
|
116
|
+
summary: string;
|
|
117
|
+
detail?: string;
|
|
118
|
+
hint?: string;
|
|
119
|
+
}
|
|
120
|
+
export interface ReleasePlanSection {
|
|
121
|
+
environment?: ReleaseEnvironment;
|
|
122
|
+
steps: readonly ReleaseStep[];
|
|
123
|
+
}
|
|
124
|
+
export interface ReleasePlanTrace {
|
|
125
|
+
generatedAt: string;
|
|
126
|
+
captures: readonly string[];
|
|
127
|
+
contractPath: string;
|
|
128
|
+
environmentSnapshotPath: string;
|
|
129
|
+
migrationPlanPath: string;
|
|
130
|
+
verifyStatus: VerifyReport["status"];
|
|
131
|
+
}
|
|
132
|
+
export interface ReleasePlanReport {
|
|
133
|
+
appRoot: string;
|
|
134
|
+
status: ReleasePlanStatus;
|
|
135
|
+
contract: ReleaseContract;
|
|
136
|
+
verify: VerifyReport;
|
|
137
|
+
gates: readonly ReleaseGate[];
|
|
138
|
+
preview: ReleasePlanSection;
|
|
139
|
+
release: ReleasePlanSection;
|
|
140
|
+
rollback: ReleaseRollbackPlan;
|
|
141
|
+
trace: ReleasePlanTrace;
|
|
142
|
+
}
|
|
143
|
+
export interface ReleasePlanOptions {
|
|
144
|
+
cwd?: string;
|
|
145
|
+
environmentPath?: string;
|
|
146
|
+
migrationPath?: string;
|
|
147
|
+
}
|
|
148
|
+
export interface ReleaseArtifactInventoryItem {
|
|
149
|
+
key: string;
|
|
150
|
+
title: string;
|
|
151
|
+
kind: ReleaseArtifact["kind"];
|
|
152
|
+
path: string;
|
|
153
|
+
required: boolean;
|
|
154
|
+
exists: boolean;
|
|
155
|
+
}
|
|
156
|
+
export interface ReleaseRunStepResult {
|
|
157
|
+
key: string;
|
|
158
|
+
label: string;
|
|
159
|
+
status: ReleaseRunStepStatus;
|
|
160
|
+
durationMs: number;
|
|
161
|
+
summary: string;
|
|
162
|
+
detail?: string;
|
|
163
|
+
hint?: string;
|
|
164
|
+
command?: string;
|
|
165
|
+
artifactKeys?: readonly string[];
|
|
166
|
+
}
|
|
167
|
+
export interface ReleaseRunTrace {
|
|
168
|
+
generatedAt: string;
|
|
169
|
+
tracePath: string;
|
|
170
|
+
target: ReleaseRunTarget;
|
|
171
|
+
captures: readonly string[];
|
|
172
|
+
environmentSnapshotPath: string;
|
|
173
|
+
migrationPlanPath: string;
|
|
174
|
+
}
|
|
175
|
+
export interface ReleaseRunReport {
|
|
176
|
+
appRoot: string;
|
|
177
|
+
target: ReleaseRunTarget;
|
|
178
|
+
status: ReleaseRunStatus;
|
|
179
|
+
plan: ReleasePlanReport;
|
|
180
|
+
steps: readonly ReleaseRunStepResult[];
|
|
181
|
+
artifactInventory: readonly ReleaseArtifactInventoryItem[];
|
|
182
|
+
trace: ReleaseRunTrace;
|
|
183
|
+
}
|
|
184
|
+
export interface ReleaseHistoryEntry {
|
|
185
|
+
appRoot: string;
|
|
186
|
+
target: ReleaseExecutionTarget;
|
|
187
|
+
status: ReleaseRunStatus;
|
|
188
|
+
generatedAt: string;
|
|
189
|
+
tracePath: string;
|
|
190
|
+
stepCount: number;
|
|
191
|
+
sourceTracePath?: string;
|
|
192
|
+
}
|
|
193
|
+
export interface ReleaseHistoryReport {
|
|
194
|
+
appRoot: string;
|
|
195
|
+
runs: readonly ReleaseHistoryEntry[];
|
|
196
|
+
}
|
|
197
|
+
export interface ReleaseRollbackRunTrace {
|
|
198
|
+
generatedAt: string;
|
|
199
|
+
tracePath: string;
|
|
200
|
+
target: "rollback";
|
|
201
|
+
captures: readonly string[];
|
|
202
|
+
sourceTracePath?: string;
|
|
203
|
+
}
|
|
204
|
+
export interface ReleaseRollbackRunReport {
|
|
205
|
+
appRoot: string;
|
|
206
|
+
target: "rollback";
|
|
207
|
+
status: ReleaseRunStatus;
|
|
208
|
+
summary: string;
|
|
209
|
+
detail?: string;
|
|
210
|
+
contract: ReleaseContract;
|
|
211
|
+
rollback: ReleaseRollbackPlan;
|
|
212
|
+
sourceRun?: ReleaseHistoryEntry;
|
|
213
|
+
steps: readonly ReleaseRunStepResult[];
|
|
214
|
+
artifactInventory: readonly ReleaseArtifactInventoryItem[];
|
|
215
|
+
trace: ReleaseRollbackRunTrace;
|
|
216
|
+
}
|
|
217
|
+
export declare function createReleasePlan(appRoot: string, options?: ReleasePlanOptions): Promise<ReleasePlanReport>;
|
|
218
|
+
export declare function createReleaseRun(appRoot: string, target: ReleaseRunTarget, options?: ReleasePlanOptions): Promise<ReleaseRunReport>;
|
|
219
|
+
export declare function listReleaseRuns(appRoot: string, options?: {
|
|
220
|
+
cwd?: string;
|
|
221
|
+
}): Promise<ReleaseHistoryReport>;
|
|
222
|
+
export declare function createRollbackRun(appRoot: string, options?: {
|
|
223
|
+
cwd?: string;
|
|
224
|
+
tracePath?: string;
|
|
225
|
+
}): Promise<ReleaseRollbackRunReport>;
|
|
226
|
+
export declare function readReleaseContract(appRoot: string): Promise<ReleaseContract>;
|
|
227
|
+
export declare function validateReleaseContract(contract: ReleaseContract): string[];
|
|
228
|
+
export declare function validateReleaseEnvironmentSnapshot(snapshot: ReleaseEnvironmentSnapshot): string[];
|
|
229
|
+
export declare function validateReleaseMigrationPlan(plan: ReleaseMigrationPlan): string[];
|
|
230
|
+
export declare function renderReleasePlanText(report: ReleasePlanReport): string;
|
|
231
|
+
export declare function renderReleaseRunText(report: ReleaseRunReport): string;
|
|
232
|
+
export declare function renderReleaseHistoryText(report: ReleaseHistoryReport): string;
|
|
233
|
+
export declare function renderRollbackRunText(report: ReleaseRollbackRunReport): string;
|
|
234
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,956 @@
|
|
|
1
|
+
import { access, constants } from "node:fs";
|
|
2
|
+
import { mkdir, readFile, readdir, writeFile } from "node:fs/promises";
|
|
3
|
+
import { execFile } from "node:child_process";
|
|
4
|
+
import { dirname, resolve } from "node:path";
|
|
5
|
+
import { fileURLToPath } from "node:url";
|
|
6
|
+
import { promisify } from "node:util";
|
|
7
|
+
import { verifyGeneratedApp } from "@zauso-ai/capstan-feedback";
|
|
8
|
+
const accessAsync = promisify(access);
|
|
9
|
+
const execFileAsync = promisify(execFile);
|
|
10
|
+
const packageDir = dirname(fileURLToPath(import.meta.url));
|
|
11
|
+
const repoRoot = resolve(packageDir, "../../..");
|
|
12
|
+
const tscBinary = resolve(repoRoot, "node_modules/.bin/tsc");
|
|
13
|
+
export async function createReleasePlan(appRoot, options = {}) {
|
|
14
|
+
const root = resolve(options.cwd ?? process.cwd(), appRoot);
|
|
15
|
+
const contractPath = resolve(root, "capstan.release.json");
|
|
16
|
+
const contract = await readReleaseContract(root);
|
|
17
|
+
const environmentSnapshotPath = resolve(root, options.environmentPath ?? contract.inputs.environmentSnapshot.path);
|
|
18
|
+
const migrationPlanPath = resolve(root, options.migrationPath ?? contract.inputs.migrationPlan.path);
|
|
19
|
+
const verify = await verifyGeneratedApp(root);
|
|
20
|
+
const gates = [];
|
|
21
|
+
const previewEnvironment = contract.environments.find((environment) => environment.key === "preview");
|
|
22
|
+
const releaseEnvironment = contract.environments.find((environment) => environment.key === "release");
|
|
23
|
+
gates.push({
|
|
24
|
+
key: "verify",
|
|
25
|
+
label: "Capstan Verify",
|
|
26
|
+
status: verify.status === "passed" ? "passed" : "failed",
|
|
27
|
+
summary: verify.status === "passed"
|
|
28
|
+
? "Capstan verify passed for this generated app."
|
|
29
|
+
: "Capstan verify must pass before preview or release can continue.",
|
|
30
|
+
...(verify.status === "failed"
|
|
31
|
+
? {
|
|
32
|
+
hint: "Resolve the reported verify diagnostics before attempting a preview or release plan."
|
|
33
|
+
}
|
|
34
|
+
: {})
|
|
35
|
+
});
|
|
36
|
+
const environmentSnapshotResult = await loadReleaseEnvironmentSnapshot(environmentSnapshotPath);
|
|
37
|
+
if (environmentSnapshotResult.gate) {
|
|
38
|
+
gates.push(environmentSnapshotResult.gate);
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
gates.push(...evaluateEnvironmentSnapshot(contract, environmentSnapshotResult.snapshot));
|
|
42
|
+
}
|
|
43
|
+
const migrationPlanResult = await loadReleaseMigrationPlan(migrationPlanPath);
|
|
44
|
+
if (migrationPlanResult.gate) {
|
|
45
|
+
gates.push(migrationPlanResult.gate);
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
gates.push(evaluateMigrationPlan(migrationPlanResult.plan));
|
|
49
|
+
}
|
|
50
|
+
for (const artifact of contract.artifacts) {
|
|
51
|
+
if (!artifact.required) {
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
const target = resolve(root, artifact.path);
|
|
55
|
+
const exists = await pathExists(target);
|
|
56
|
+
gates.push({
|
|
57
|
+
key: `artifact:${artifact.key}`,
|
|
58
|
+
label: `Artifact · ${artifact.title}`,
|
|
59
|
+
status: exists ? "passed" : "failed",
|
|
60
|
+
summary: exists
|
|
61
|
+
? `Required artifact "${artifact.path}" is present.`
|
|
62
|
+
: `Required artifact "${artifact.path}" is missing.`,
|
|
63
|
+
...(exists
|
|
64
|
+
? {}
|
|
65
|
+
: {
|
|
66
|
+
hint: "Rebuild or regenerate the application so required release artifacts exist again."
|
|
67
|
+
})
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
for (const check of contract.healthChecks) {
|
|
71
|
+
const gate = await evaluateHealthCheck(root, check, verify);
|
|
72
|
+
gates.push(gate);
|
|
73
|
+
}
|
|
74
|
+
const status = gates.some((gate) => gate.status === "failed")
|
|
75
|
+
? "blocked"
|
|
76
|
+
: "ready";
|
|
77
|
+
return {
|
|
78
|
+
appRoot: root,
|
|
79
|
+
status,
|
|
80
|
+
contract,
|
|
81
|
+
verify,
|
|
82
|
+
gates,
|
|
83
|
+
preview: {
|
|
84
|
+
...(previewEnvironment ? { environment: previewEnvironment } : {}),
|
|
85
|
+
steps: contract.preview.steps
|
|
86
|
+
},
|
|
87
|
+
release: {
|
|
88
|
+
...(releaseEnvironment ? { environment: releaseEnvironment } : {}),
|
|
89
|
+
steps: contract.release.steps
|
|
90
|
+
},
|
|
91
|
+
rollback: contract.rollback,
|
|
92
|
+
trace: {
|
|
93
|
+
generatedAt: new Date().toISOString(),
|
|
94
|
+
captures: contract.trace.captures,
|
|
95
|
+
contractPath,
|
|
96
|
+
environmentSnapshotPath,
|
|
97
|
+
migrationPlanPath,
|
|
98
|
+
verifyStatus: verify.status
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
export async function createReleaseRun(appRoot, target, options = {}) {
|
|
103
|
+
const plan = await createReleasePlan(appRoot, options);
|
|
104
|
+
const section = target === "preview" ? plan.preview : plan.release;
|
|
105
|
+
const artifactInventory = await collectArtifactInventory(plan.appRoot, plan.contract.artifacts);
|
|
106
|
+
const steps = [];
|
|
107
|
+
const generatedAt = new Date().toISOString();
|
|
108
|
+
const tracePath = resolve(plan.appRoot, ".capstan/release-runs", `${formatTraceStamp(generatedAt)}-${target}.json`);
|
|
109
|
+
if (plan.status === "blocked") {
|
|
110
|
+
const report = {
|
|
111
|
+
appRoot: plan.appRoot,
|
|
112
|
+
target,
|
|
113
|
+
status: "blocked",
|
|
114
|
+
plan,
|
|
115
|
+
steps,
|
|
116
|
+
artifactInventory,
|
|
117
|
+
trace: {
|
|
118
|
+
generatedAt,
|
|
119
|
+
tracePath,
|
|
120
|
+
target,
|
|
121
|
+
captures: plan.trace.captures,
|
|
122
|
+
environmentSnapshotPath: plan.trace.environmentSnapshotPath,
|
|
123
|
+
migrationPlanPath: plan.trace.migrationPlanPath
|
|
124
|
+
}
|
|
125
|
+
};
|
|
126
|
+
await writeReleaseRunTrace(report);
|
|
127
|
+
return report;
|
|
128
|
+
}
|
|
129
|
+
for (const step of section.steps) {
|
|
130
|
+
const result = await executeReleaseStep(plan, target, step, artifactInventory);
|
|
131
|
+
steps.push(result);
|
|
132
|
+
if (result.status === "failed") {
|
|
133
|
+
for (const pendingStep of section.steps.slice(steps.length)) {
|
|
134
|
+
steps.push(skippedReleaseRunStep(pendingStep, `Release run stopped after "${step.title}" failed.`));
|
|
135
|
+
}
|
|
136
|
+
break;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
const status = steps.some((step) => step.status === "failed")
|
|
140
|
+
? "failed"
|
|
141
|
+
: "completed";
|
|
142
|
+
const report = {
|
|
143
|
+
appRoot: plan.appRoot,
|
|
144
|
+
target,
|
|
145
|
+
status,
|
|
146
|
+
plan,
|
|
147
|
+
steps,
|
|
148
|
+
artifactInventory,
|
|
149
|
+
trace: {
|
|
150
|
+
generatedAt,
|
|
151
|
+
tracePath,
|
|
152
|
+
target,
|
|
153
|
+
captures: plan.trace.captures,
|
|
154
|
+
environmentSnapshotPath: plan.trace.environmentSnapshotPath,
|
|
155
|
+
migrationPlanPath: plan.trace.migrationPlanPath
|
|
156
|
+
}
|
|
157
|
+
};
|
|
158
|
+
await writeReleaseRunTrace(report);
|
|
159
|
+
return report;
|
|
160
|
+
}
|
|
161
|
+
export async function listReleaseRuns(appRoot, options = {}) {
|
|
162
|
+
const root = resolve(options.cwd ?? process.cwd(), appRoot);
|
|
163
|
+
const runsDir = resolve(root, ".capstan/release-runs");
|
|
164
|
+
let entries;
|
|
165
|
+
try {
|
|
166
|
+
entries = await readdir(runsDir);
|
|
167
|
+
}
|
|
168
|
+
catch {
|
|
169
|
+
return {
|
|
170
|
+
appRoot: root,
|
|
171
|
+
runs: []
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
const runs = (await Promise.all(entries
|
|
175
|
+
.filter((entry) => entry.endsWith(".json"))
|
|
176
|
+
.map(async (entry) => normalizeReleaseHistoryEntry(resolve(runsDir, entry), root))))
|
|
177
|
+
.filter((entry) => Boolean(entry))
|
|
178
|
+
.sort((left, right) => right.generatedAt.localeCompare(left.generatedAt));
|
|
179
|
+
return {
|
|
180
|
+
appRoot: root,
|
|
181
|
+
runs
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
export async function createRollbackRun(appRoot, options = {}) {
|
|
185
|
+
const root = resolve(options.cwd ?? process.cwd(), appRoot);
|
|
186
|
+
const contract = await readReleaseContract(root);
|
|
187
|
+
const history = await listReleaseRuns(root);
|
|
188
|
+
const generatedAt = new Date().toISOString();
|
|
189
|
+
const tracePath = resolve(root, ".capstan/release-runs", `${formatTraceStamp(generatedAt)}-rollback.json`);
|
|
190
|
+
const sourceRun = await resolveRollbackSourceRun(history, options.tracePath);
|
|
191
|
+
const artifactInventory = sourceRun
|
|
192
|
+
? await loadArtifactInventoryFromTrace(sourceRun.tracePath, contract.artifacts)
|
|
193
|
+
: await collectArtifactInventory(root, contract.artifacts);
|
|
194
|
+
if (!sourceRun) {
|
|
195
|
+
const blockedReport = {
|
|
196
|
+
appRoot: root,
|
|
197
|
+
target: "rollback",
|
|
198
|
+
status: "blocked",
|
|
199
|
+
summary: "No completed preview or release run is available for rollback.",
|
|
200
|
+
detail: "Run a successful preview or release before attempting rollback, or pass --trace to target a persisted run explicitly.",
|
|
201
|
+
contract,
|
|
202
|
+
rollback: contract.rollback,
|
|
203
|
+
steps: [],
|
|
204
|
+
artifactInventory,
|
|
205
|
+
trace: {
|
|
206
|
+
generatedAt,
|
|
207
|
+
tracePath,
|
|
208
|
+
target: "rollback",
|
|
209
|
+
captures: contract.trace.captures
|
|
210
|
+
}
|
|
211
|
+
};
|
|
212
|
+
await writeRollbackRunTrace(blockedReport);
|
|
213
|
+
return blockedReport;
|
|
214
|
+
}
|
|
215
|
+
const steps = contract.rollback.steps.map((step, index) => completeRollbackRunStep(step, index, sourceRun, artifactInventory));
|
|
216
|
+
const report = {
|
|
217
|
+
appRoot: root,
|
|
218
|
+
target: "rollback",
|
|
219
|
+
status: "completed",
|
|
220
|
+
summary: `Rollback steps completed using source run "${sourceRun.target}" from ${sourceRun.generatedAt}.`,
|
|
221
|
+
contract,
|
|
222
|
+
rollback: contract.rollback,
|
|
223
|
+
sourceRun,
|
|
224
|
+
steps,
|
|
225
|
+
artifactInventory,
|
|
226
|
+
trace: {
|
|
227
|
+
generatedAt,
|
|
228
|
+
tracePath,
|
|
229
|
+
target: "rollback",
|
|
230
|
+
captures: contract.trace.captures,
|
|
231
|
+
sourceTracePath: sourceRun.tracePath
|
|
232
|
+
}
|
|
233
|
+
};
|
|
234
|
+
await writeRollbackRunTrace(report);
|
|
235
|
+
return report;
|
|
236
|
+
}
|
|
237
|
+
export async function readReleaseContract(appRoot) {
|
|
238
|
+
const contractPath = resolve(appRoot, "capstan.release.json");
|
|
239
|
+
const source = await readFile(contractPath, "utf8");
|
|
240
|
+
const parsed = JSON.parse(source);
|
|
241
|
+
const issues = validateReleaseContract(parsed);
|
|
242
|
+
if (issues.length) {
|
|
243
|
+
throw new Error(`Invalid Capstan release contract:\n${issues.map((issue) => `- ${issue}`).join("\n")}`);
|
|
244
|
+
}
|
|
245
|
+
return parsed;
|
|
246
|
+
}
|
|
247
|
+
export function validateReleaseContract(contract) {
|
|
248
|
+
const issues = [];
|
|
249
|
+
if (contract.version !== 1) {
|
|
250
|
+
issues.push("`version` must be 1.");
|
|
251
|
+
}
|
|
252
|
+
if (!contract.domain?.key || !contract.domain?.title) {
|
|
253
|
+
issues.push("`domain.key` and `domain.title` are required.");
|
|
254
|
+
}
|
|
255
|
+
if (!contract.application?.key || !contract.application?.title) {
|
|
256
|
+
issues.push("`application.key` and `application.title` are required.");
|
|
257
|
+
}
|
|
258
|
+
if (!Array.isArray(contract.environments) || !contract.environments.length) {
|
|
259
|
+
issues.push("At least one release environment is required.");
|
|
260
|
+
}
|
|
261
|
+
if (!contract.inputs?.environmentSnapshot?.path) {
|
|
262
|
+
issues.push("`inputs.environmentSnapshot.path` is required.");
|
|
263
|
+
}
|
|
264
|
+
if (!contract.inputs?.migrationPlan?.path) {
|
|
265
|
+
issues.push("`inputs.migrationPlan.path` is required.");
|
|
266
|
+
}
|
|
267
|
+
if (!Array.isArray(contract.artifacts) || !contract.artifacts.length) {
|
|
268
|
+
issues.push("At least one release artifact is required.");
|
|
269
|
+
}
|
|
270
|
+
if (!Array.isArray(contract.healthChecks) || !contract.healthChecks.length) {
|
|
271
|
+
issues.push("At least one health check is required.");
|
|
272
|
+
}
|
|
273
|
+
if (!Array.isArray(contract.preview?.steps) || !contract.preview.steps.length) {
|
|
274
|
+
issues.push("Preview steps are required.");
|
|
275
|
+
}
|
|
276
|
+
if (!Array.isArray(contract.release?.steps) || !contract.release.steps.length) {
|
|
277
|
+
issues.push("Release steps are required.");
|
|
278
|
+
}
|
|
279
|
+
if (!contract.rollback?.strategy || !Array.isArray(contract.rollback.steps)) {
|
|
280
|
+
issues.push("Rollback strategy and steps are required.");
|
|
281
|
+
}
|
|
282
|
+
if (!Array.isArray(contract.trace?.captures) || !contract.trace.captures.length) {
|
|
283
|
+
issues.push("Release trace captures are required.");
|
|
284
|
+
}
|
|
285
|
+
return issues;
|
|
286
|
+
}
|
|
287
|
+
export function validateReleaseEnvironmentSnapshot(snapshot) {
|
|
288
|
+
const issues = [];
|
|
289
|
+
if (snapshot.version !== 1) {
|
|
290
|
+
issues.push("`version` must be 1.");
|
|
291
|
+
}
|
|
292
|
+
if (!Array.isArray(snapshot.environments) || !snapshot.environments.length) {
|
|
293
|
+
issues.push("At least one environment snapshot entry is required.");
|
|
294
|
+
return issues;
|
|
295
|
+
}
|
|
296
|
+
for (const environment of snapshot.environments) {
|
|
297
|
+
if (!environment.key) {
|
|
298
|
+
issues.push("Every environment snapshot entry must have a `key`.");
|
|
299
|
+
}
|
|
300
|
+
if (!environment.variables ||
|
|
301
|
+
typeof environment.variables !== "object" ||
|
|
302
|
+
Array.isArray(environment.variables)) {
|
|
303
|
+
issues.push(`Environment "${environment.key || "unknown"}" must define a variables object.`);
|
|
304
|
+
}
|
|
305
|
+
else {
|
|
306
|
+
for (const [key, value] of Object.entries(environment.variables)) {
|
|
307
|
+
if (typeof value !== "string") {
|
|
308
|
+
issues.push(`Environment "${environment.key || "unknown"}" variable "${key}" must be a string.`);
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
if (!Array.isArray(environment.secrets)) {
|
|
313
|
+
issues.push(`Environment "${environment.key || "unknown"}" must define a secrets array.`);
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
return issues;
|
|
317
|
+
}
|
|
318
|
+
export function validateReleaseMigrationPlan(plan) {
|
|
319
|
+
const issues = [];
|
|
320
|
+
if (plan.version !== 1) {
|
|
321
|
+
issues.push("`version` must be 1.");
|
|
322
|
+
}
|
|
323
|
+
if (plan.generatedBy !== "capstan") {
|
|
324
|
+
issues.push("`generatedBy` must be \"capstan\".");
|
|
325
|
+
}
|
|
326
|
+
if (!["safe", "pending", "unsafe"].includes(plan.status)) {
|
|
327
|
+
issues.push("`status` must be one of \"safe\", \"pending\", or \"unsafe\".");
|
|
328
|
+
}
|
|
329
|
+
if (!Array.isArray(plan.steps)) {
|
|
330
|
+
issues.push("`steps` must be an array.");
|
|
331
|
+
return issues;
|
|
332
|
+
}
|
|
333
|
+
for (const step of plan.steps) {
|
|
334
|
+
if (!step.key || !step.title) {
|
|
335
|
+
issues.push("Every migration step must have a `key` and `title`.");
|
|
336
|
+
}
|
|
337
|
+
if (!["applied", "pending", "unsafe"].includes(step.status)) {
|
|
338
|
+
issues.push(`Migration step "${step.key || "unknown"}" must use a supported status.`);
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
return issues;
|
|
342
|
+
}
|
|
343
|
+
export function renderReleasePlanText(report) {
|
|
344
|
+
const lines = [
|
|
345
|
+
"Capstan Release Plan",
|
|
346
|
+
`App: ${report.appRoot}`,
|
|
347
|
+
`Status: ${report.status}`,
|
|
348
|
+
`Domain: ${report.contract.domain.title} (${report.contract.domain.key})`
|
|
349
|
+
];
|
|
350
|
+
lines.push("");
|
|
351
|
+
lines.push("Safety Gates");
|
|
352
|
+
for (const gate of report.gates) {
|
|
353
|
+
lines.push(`- [${gate.status}] ${gate.label}: ${gate.summary}`);
|
|
354
|
+
if (gate.detail) {
|
|
355
|
+
lines.push(` detail: ${gate.detail}`);
|
|
356
|
+
}
|
|
357
|
+
if (gate.hint) {
|
|
358
|
+
lines.push(` next: ${gate.hint}`);
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
lines.push("");
|
|
362
|
+
lines.push("Preview");
|
|
363
|
+
for (const step of report.preview.steps) {
|
|
364
|
+
lines.push(`- ${step.title}`);
|
|
365
|
+
if (step.command) {
|
|
366
|
+
lines.push(` command: ${step.command}`);
|
|
367
|
+
}
|
|
368
|
+
if (step.description) {
|
|
369
|
+
lines.push(` detail: ${step.description}`);
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
lines.push("");
|
|
373
|
+
lines.push("Release");
|
|
374
|
+
for (const step of report.release.steps) {
|
|
375
|
+
lines.push(`- ${step.title}`);
|
|
376
|
+
if (step.command) {
|
|
377
|
+
lines.push(` command: ${step.command}`);
|
|
378
|
+
}
|
|
379
|
+
if (step.description) {
|
|
380
|
+
lines.push(` detail: ${step.description}`);
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
lines.push("");
|
|
384
|
+
lines.push("Rollback");
|
|
385
|
+
lines.push(`- Strategy: ${report.rollback.strategy}`);
|
|
386
|
+
for (const step of report.rollback.steps) {
|
|
387
|
+
lines.push(`- ${step}`);
|
|
388
|
+
}
|
|
389
|
+
lines.push("");
|
|
390
|
+
lines.push("Trace");
|
|
391
|
+
lines.push(`- generatedAt: ${report.trace.generatedAt}`);
|
|
392
|
+
lines.push(`- verifyStatus: ${report.trace.verifyStatus}`);
|
|
393
|
+
lines.push(`- contractPath: ${report.trace.contractPath}`);
|
|
394
|
+
lines.push(`- environmentSnapshotPath: ${report.trace.environmentSnapshotPath}`);
|
|
395
|
+
lines.push(`- migrationPlanPath: ${report.trace.migrationPlanPath}`);
|
|
396
|
+
lines.push(`- captures: ${report.trace.captures.join(", ")}`);
|
|
397
|
+
return `${lines.join("\n")}\n`;
|
|
398
|
+
}
|
|
399
|
+
export function renderReleaseRunText(report) {
|
|
400
|
+
const lines = [
|
|
401
|
+
"Capstan Release Run",
|
|
402
|
+
`App: ${report.appRoot}`,
|
|
403
|
+
`Target: ${report.target}`,
|
|
404
|
+
`Status: ${report.status}`,
|
|
405
|
+
`Plan Status: ${report.plan.status}`
|
|
406
|
+
];
|
|
407
|
+
lines.push("");
|
|
408
|
+
lines.push("Steps");
|
|
409
|
+
if (!report.steps.length) {
|
|
410
|
+
lines.push("- No release steps were executed because the release plan was blocked.");
|
|
411
|
+
}
|
|
412
|
+
else {
|
|
413
|
+
for (const step of report.steps) {
|
|
414
|
+
lines.push(`- [${step.status}] ${step.label}: ${step.summary}`);
|
|
415
|
+
if (step.command) {
|
|
416
|
+
lines.push(` command: ${step.command}`);
|
|
417
|
+
}
|
|
418
|
+
if (step.detail) {
|
|
419
|
+
lines.push(` detail: ${step.detail}`);
|
|
420
|
+
}
|
|
421
|
+
if (step.hint) {
|
|
422
|
+
lines.push(` next: ${step.hint}`);
|
|
423
|
+
}
|
|
424
|
+
if (step.artifactKeys?.length) {
|
|
425
|
+
lines.push(` artifacts: ${step.artifactKeys.join(", ")}`);
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
lines.push("");
|
|
430
|
+
lines.push("Artifact Inventory");
|
|
431
|
+
for (const artifact of report.artifactInventory) {
|
|
432
|
+
lines.push(`- [${artifact.exists ? "present" : "missing"}] ${artifact.title}: ${artifact.path}`);
|
|
433
|
+
}
|
|
434
|
+
lines.push("");
|
|
435
|
+
lines.push("Trace");
|
|
436
|
+
lines.push(`- generatedAt: ${report.trace.generatedAt}`);
|
|
437
|
+
lines.push(`- tracePath: ${report.trace.tracePath}`);
|
|
438
|
+
lines.push(`- target: ${report.trace.target}`);
|
|
439
|
+
lines.push(`- environmentSnapshotPath: ${report.trace.environmentSnapshotPath}`);
|
|
440
|
+
lines.push(`- migrationPlanPath: ${report.trace.migrationPlanPath}`);
|
|
441
|
+
return `${lines.join("\n")}\n`;
|
|
442
|
+
}
|
|
443
|
+
export function renderReleaseHistoryText(report) {
|
|
444
|
+
const lines = ["Capstan Release History", `App: ${report.appRoot}`];
|
|
445
|
+
if (!report.runs.length) {
|
|
446
|
+
lines.push("");
|
|
447
|
+
lines.push("No persisted release runs were found.");
|
|
448
|
+
return `${lines.join("\n")}\n`;
|
|
449
|
+
}
|
|
450
|
+
lines.push("");
|
|
451
|
+
for (const run of report.runs) {
|
|
452
|
+
lines.push(`- [${run.status}] ${run.target} @ ${run.generatedAt} (${run.stepCount} steps)`);
|
|
453
|
+
lines.push(` trace: ${run.tracePath}`);
|
|
454
|
+
if (run.sourceTracePath) {
|
|
455
|
+
lines.push(` source: ${run.sourceTracePath}`);
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
return `${lines.join("\n")}\n`;
|
|
459
|
+
}
|
|
460
|
+
export function renderRollbackRunText(report) {
|
|
461
|
+
const lines = [
|
|
462
|
+
"Capstan Rollback Run",
|
|
463
|
+
`App: ${report.appRoot}`,
|
|
464
|
+
`Status: ${report.status}`,
|
|
465
|
+
`Strategy: ${report.rollback.strategy}`,
|
|
466
|
+
`Summary: ${report.summary}`
|
|
467
|
+
];
|
|
468
|
+
if (report.detail) {
|
|
469
|
+
lines.push(`Detail: ${report.detail}`);
|
|
470
|
+
}
|
|
471
|
+
lines.push("");
|
|
472
|
+
lines.push("Steps");
|
|
473
|
+
if (!report.steps.length) {
|
|
474
|
+
lines.push("- No rollback steps were executed.");
|
|
475
|
+
}
|
|
476
|
+
else {
|
|
477
|
+
for (const step of report.steps) {
|
|
478
|
+
lines.push(`- [${step.status}] ${step.label}: ${step.summary}`);
|
|
479
|
+
if (step.detail) {
|
|
480
|
+
lines.push(` detail: ${step.detail}`);
|
|
481
|
+
}
|
|
482
|
+
if (step.artifactKeys?.length) {
|
|
483
|
+
lines.push(` artifacts: ${step.artifactKeys.join(", ")}`);
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
lines.push("");
|
|
488
|
+
lines.push("Trace");
|
|
489
|
+
lines.push(`- generatedAt: ${report.trace.generatedAt}`);
|
|
490
|
+
lines.push(`- tracePath: ${report.trace.tracePath}`);
|
|
491
|
+
if (report.trace.sourceTracePath) {
|
|
492
|
+
lines.push(`- sourceTracePath: ${report.trace.sourceTracePath}`);
|
|
493
|
+
}
|
|
494
|
+
return `${lines.join("\n")}\n`;
|
|
495
|
+
}
|
|
496
|
+
async function loadReleaseEnvironmentSnapshot(snapshotPath) {
|
|
497
|
+
try {
|
|
498
|
+
const source = await readFile(snapshotPath, "utf8");
|
|
499
|
+
const parsed = JSON.parse(source);
|
|
500
|
+
const issues = validateReleaseEnvironmentSnapshot(parsed);
|
|
501
|
+
if (issues.length) {
|
|
502
|
+
return {
|
|
503
|
+
gate: {
|
|
504
|
+
key: "environment:contract",
|
|
505
|
+
label: "Environment Snapshot",
|
|
506
|
+
status: "failed",
|
|
507
|
+
summary: "The release environment snapshot is invalid.",
|
|
508
|
+
detail: issues.join(" "),
|
|
509
|
+
hint: "Repair the environment snapshot so every expected environment, variable, and secret handle is machine-readable."
|
|
510
|
+
}
|
|
511
|
+
};
|
|
512
|
+
}
|
|
513
|
+
return { snapshot: parsed };
|
|
514
|
+
}
|
|
515
|
+
catch (error) {
|
|
516
|
+
return {
|
|
517
|
+
gate: {
|
|
518
|
+
key: "environment:contract",
|
|
519
|
+
label: "Environment Snapshot",
|
|
520
|
+
status: "failed",
|
|
521
|
+
summary: "The release environment snapshot could not be loaded.",
|
|
522
|
+
detail: error instanceof Error ? error.message : String(error),
|
|
523
|
+
hint: "Regenerate or repair the environment snapshot before attempting release."
|
|
524
|
+
}
|
|
525
|
+
};
|
|
526
|
+
}
|
|
527
|
+
}
|
|
528
|
+
async function executeReleaseStep(plan, target, step, artifactInventory) {
|
|
529
|
+
const startedAt = Date.now();
|
|
530
|
+
switch (step.key) {
|
|
531
|
+
case "verify":
|
|
532
|
+
return completeReleaseRunStep(step, startedAt, plan.verify.status === "passed"
|
|
533
|
+
? "Capstan verify was already satisfied by the release plan."
|
|
534
|
+
: "Capstan verify failed.", {
|
|
535
|
+
detail: `passedSteps=${plan.verify.summary.passedSteps}; failedSteps=${plan.verify.summary.failedSteps}`
|
|
536
|
+
});
|
|
537
|
+
case "build": {
|
|
538
|
+
const build = await runGeneratedBuild(plan.appRoot);
|
|
539
|
+
if (build.ok) {
|
|
540
|
+
return completeReleaseRunStep(step, startedAt, "Generated application build completed for the release run.", {
|
|
541
|
+
command: formatTypeScriptBuildCommand(plan.appRoot)
|
|
542
|
+
});
|
|
543
|
+
}
|
|
544
|
+
return failedReleaseRunStep(step, startedAt, "Generated application build failed during the release run.", {
|
|
545
|
+
command: formatTypeScriptBuildCommand(plan.appRoot),
|
|
546
|
+
detail: build.detail,
|
|
547
|
+
hint: "Repair the generated TypeScript build before attempting preview or release again."
|
|
548
|
+
});
|
|
549
|
+
}
|
|
550
|
+
case "inspectPreviewArtifacts": {
|
|
551
|
+
const missingArtifacts = artifactInventory.filter((artifact) => artifact.required && !artifact.exists);
|
|
552
|
+
if (missingArtifacts.length) {
|
|
553
|
+
return failedReleaseRunStep(step, startedAt, "Preview artifact inspection failed because required artifacts are missing.", {
|
|
554
|
+
detail: missingArtifacts.map((artifact) => artifact.path).join(", "),
|
|
555
|
+
hint: "Regenerate or rebuild the application so preview artifacts exist before inspection."
|
|
556
|
+
});
|
|
557
|
+
}
|
|
558
|
+
return completeReleaseRunStep(step, startedAt, "Preview artifacts are present and ready for operator inspection.", {
|
|
559
|
+
artifactKeys: artifactInventory.filter((artifact) => artifact.exists).map((artifact) => artifact.key)
|
|
560
|
+
});
|
|
561
|
+
}
|
|
562
|
+
case "publishArtifacts": {
|
|
563
|
+
const publishableArtifacts = artifactInventory.filter((artifact) => artifact.required && artifact.exists);
|
|
564
|
+
const missingArtifacts = artifactInventory.filter((artifact) => artifact.required && !artifact.exists);
|
|
565
|
+
if (missingArtifacts.length) {
|
|
566
|
+
return failedReleaseRunStep(step, startedAt, "Release promotion cannot continue because required artifacts are missing.", {
|
|
567
|
+
detail: missingArtifacts.map((artifact) => artifact.path).join(", "),
|
|
568
|
+
hint: "Restore the missing artifacts or rerun the build before publishing."
|
|
569
|
+
});
|
|
570
|
+
}
|
|
571
|
+
return completeReleaseRunStep(step, startedAt, `Simulated ${target} publication is ready to promote the compiled artifacts.`, {
|
|
572
|
+
artifactKeys: publishableArtifacts.map((artifact) => artifact.key),
|
|
573
|
+
detail: publishableArtifacts.map((artifact) => artifact.path).join(", ")
|
|
574
|
+
});
|
|
575
|
+
}
|
|
576
|
+
case "confirmHealth": {
|
|
577
|
+
const healthFailures = plan.gates.filter((gate) => gate.key.startsWith("health:") && gate.status === "failed");
|
|
578
|
+
if (healthFailures.length) {
|
|
579
|
+
return failedReleaseRunStep(step, startedAt, "Health confirmation failed during the release run.", {
|
|
580
|
+
detail: healthFailures.map((gate) => gate.label).join(", "),
|
|
581
|
+
hint: "Fix the failing health checks before promoting the release."
|
|
582
|
+
});
|
|
583
|
+
}
|
|
584
|
+
return completeReleaseRunStep(step, startedAt, "Release health gates are satisfied.", {
|
|
585
|
+
detail: `${plan.gates.filter((gate) => gate.key.startsWith("health:")).length} health checks passed.`
|
|
586
|
+
});
|
|
587
|
+
}
|
|
588
|
+
default:
|
|
589
|
+
return completeReleaseRunStep(step, startedAt, `Simulated release step "${step.title}" completed without a dedicated framework executor yet.`, {
|
|
590
|
+
...(step.command ? { command: step.command } : {}),
|
|
591
|
+
hint: "Add a dedicated Capstan release step executor as this workflow matures."
|
|
592
|
+
});
|
|
593
|
+
}
|
|
594
|
+
}
|
|
595
|
+
async function resolveRollbackSourceRun(history, tracePath) {
|
|
596
|
+
if (tracePath) {
|
|
597
|
+
const resolvedTracePath = resolve(process.cwd(), tracePath);
|
|
598
|
+
return history.runs.find((run) => run.tracePath === resolvedTracePath);
|
|
599
|
+
}
|
|
600
|
+
return (history.runs.find((run) => run.target === "release" && run.status === "completed") ??
|
|
601
|
+
history.runs.find((run) => (run.target === "release" || run.target === "preview") && run.status === "completed"));
|
|
602
|
+
}
|
|
603
|
+
function completeRollbackRunStep(step, index, sourceRun, artifactInventory) {
|
|
604
|
+
return {
|
|
605
|
+
key: `rollback:${index + 1}`,
|
|
606
|
+
label: `Rollback Step ${index + 1}`,
|
|
607
|
+
status: "completed",
|
|
608
|
+
durationMs: 0,
|
|
609
|
+
summary: step,
|
|
610
|
+
detail: `Simulated against source run "${sourceRun.target}" from ${sourceRun.generatedAt}.`,
|
|
611
|
+
artifactKeys: artifactInventory.filter((artifact) => artifact.exists).map((artifact) => artifact.key)
|
|
612
|
+
};
|
|
613
|
+
}
|
|
614
|
+
async function loadReleaseMigrationPlan(migrationPath) {
|
|
615
|
+
try {
|
|
616
|
+
const source = await readFile(migrationPath, "utf8");
|
|
617
|
+
const parsed = JSON.parse(source);
|
|
618
|
+
const issues = validateReleaseMigrationPlan(parsed);
|
|
619
|
+
if (issues.length) {
|
|
620
|
+
return {
|
|
621
|
+
gate: {
|
|
622
|
+
key: "migration:contract",
|
|
623
|
+
label: "Migration Plan",
|
|
624
|
+
status: "failed",
|
|
625
|
+
summary: "The migration plan is invalid.",
|
|
626
|
+
detail: issues.join(" "),
|
|
627
|
+
hint: "Repair the migration plan so release safety can reason about pending or unsafe changes."
|
|
628
|
+
}
|
|
629
|
+
};
|
|
630
|
+
}
|
|
631
|
+
return { plan: parsed };
|
|
632
|
+
}
|
|
633
|
+
catch (error) {
|
|
634
|
+
return {
|
|
635
|
+
gate: {
|
|
636
|
+
key: "migration:contract",
|
|
637
|
+
label: "Migration Plan",
|
|
638
|
+
status: "failed",
|
|
639
|
+
summary: "The migration plan could not be loaded.",
|
|
640
|
+
detail: error instanceof Error ? error.message : String(error),
|
|
641
|
+
hint: "Regenerate or repair the migration plan before attempting release."
|
|
642
|
+
}
|
|
643
|
+
};
|
|
644
|
+
}
|
|
645
|
+
}
|
|
646
|
+
function evaluateEnvironmentSnapshot(contract, snapshot) {
|
|
647
|
+
const gates = [];
|
|
648
|
+
const snapshotByKey = new Map(snapshot.environments.map((environment) => [environment.key, environment]));
|
|
649
|
+
const knownEnvironmentKeys = new Set(contract.environments.map((environment) => environment.key));
|
|
650
|
+
const unknownEnvironmentKeys = snapshot.environments
|
|
651
|
+
.map((environment) => environment.key)
|
|
652
|
+
.filter((key) => !knownEnvironmentKeys.has(key));
|
|
653
|
+
if (unknownEnvironmentKeys.length) {
|
|
654
|
+
gates.push({
|
|
655
|
+
key: "environment:unknown",
|
|
656
|
+
label: "Environment Snapshot Drift",
|
|
657
|
+
status: "failed",
|
|
658
|
+
summary: `Unknown environment snapshot entries were found: ${unknownEnvironmentKeys.join(", ")}.`,
|
|
659
|
+
hint: "Remove unknown environments or add them to the release contract before attempting release."
|
|
660
|
+
});
|
|
661
|
+
}
|
|
662
|
+
for (const environment of contract.environments) {
|
|
663
|
+
const snapshotEntry = snapshotByKey.get(environment.key);
|
|
664
|
+
if (!snapshotEntry) {
|
|
665
|
+
gates.push({
|
|
666
|
+
key: `environment:${environment.key}`,
|
|
667
|
+
label: `Environment · ${environment.title}`,
|
|
668
|
+
status: "failed",
|
|
669
|
+
summary: `No environment snapshot entry exists for "${environment.key}".`,
|
|
670
|
+
hint: "Add the missing environment entry to the release environment snapshot."
|
|
671
|
+
});
|
|
672
|
+
continue;
|
|
673
|
+
}
|
|
674
|
+
const knownVariables = new Set(environment.variables.map((variable) => variable.key));
|
|
675
|
+
const knownSecrets = new Set(environment.secrets.map((secret) => secret.key));
|
|
676
|
+
const missingVariables = environment.variables
|
|
677
|
+
.filter((variable) => variable.required)
|
|
678
|
+
.filter((variable) => !hasSnapshotValue(snapshotEntry.variables[variable.key]))
|
|
679
|
+
.map((variable) => variable.key);
|
|
680
|
+
const missingSecrets = environment.secrets
|
|
681
|
+
.filter((secret) => secret.required)
|
|
682
|
+
.filter((secret) => !snapshotEntry.secrets.includes(secret.key))
|
|
683
|
+
.map((secret) => secret.key);
|
|
684
|
+
const unknownVariables = Object.keys(snapshotEntry.variables).filter((variableKey) => !knownVariables.has(variableKey));
|
|
685
|
+
const unknownSecrets = snapshotEntry.secrets.filter((secretKey) => !knownSecrets.has(secretKey));
|
|
686
|
+
const drift = [];
|
|
687
|
+
if (missingVariables.length) {
|
|
688
|
+
drift.push(`missing variables: ${missingVariables.join(", ")}`);
|
|
689
|
+
}
|
|
690
|
+
if (missingSecrets.length) {
|
|
691
|
+
drift.push(`missing secrets: ${missingSecrets.join(", ")}`);
|
|
692
|
+
}
|
|
693
|
+
if (unknownVariables.length) {
|
|
694
|
+
drift.push(`unknown variables: ${unknownVariables.join(", ")}`);
|
|
695
|
+
}
|
|
696
|
+
if (unknownSecrets.length) {
|
|
697
|
+
drift.push(`unknown secrets: ${unknownSecrets.join(", ")}`);
|
|
698
|
+
}
|
|
699
|
+
gates.push({
|
|
700
|
+
key: `environment:${environment.key}`,
|
|
701
|
+
label: `Environment · ${environment.title}`,
|
|
702
|
+
status: drift.length ? "failed" : "passed",
|
|
703
|
+
summary: drift.length
|
|
704
|
+
? `Environment snapshot drift detected for "${environment.key}".`
|
|
705
|
+
: `Environment snapshot matches the "${environment.key}" contract.`,
|
|
706
|
+
...(drift.length
|
|
707
|
+
? {
|
|
708
|
+
detail: drift.join("; "),
|
|
709
|
+
hint: "Align the environment snapshot with the release contract before attempting preview or release."
|
|
710
|
+
}
|
|
711
|
+
: {
|
|
712
|
+
detail: `variables=${Object.keys(snapshotEntry.variables).length}; secrets=${snapshotEntry.secrets.length}`
|
|
713
|
+
})
|
|
714
|
+
});
|
|
715
|
+
}
|
|
716
|
+
return gates;
|
|
717
|
+
}
|
|
718
|
+
function evaluateMigrationPlan(plan) {
|
|
719
|
+
const pendingSteps = plan.steps.filter((step) => step.status === "pending");
|
|
720
|
+
const unsafeSteps = plan.steps.filter((step) => step.status === "unsafe");
|
|
721
|
+
if (!unsafeSteps.length && !pendingSteps.length && plan.status === "safe") {
|
|
722
|
+
return {
|
|
723
|
+
key: "migration:status",
|
|
724
|
+
label: "Migration Safety",
|
|
725
|
+
status: "passed",
|
|
726
|
+
summary: "Migration plan is safe for preview and release.",
|
|
727
|
+
detail: `steps=${plan.steps.length}`
|
|
728
|
+
};
|
|
729
|
+
}
|
|
730
|
+
return {
|
|
731
|
+
key: "migration:status",
|
|
732
|
+
label: "Migration Safety",
|
|
733
|
+
status: "failed",
|
|
734
|
+
summary: plan.status === "unsafe"
|
|
735
|
+
? "Migration plan is marked unsafe."
|
|
736
|
+
: pendingSteps.length
|
|
737
|
+
? "Migration plan still has pending steps."
|
|
738
|
+
: "Migration plan is not safe for release.",
|
|
739
|
+
detail: [...unsafeSteps, ...pendingSteps].map((step) => step.title).join(", "),
|
|
740
|
+
hint: unsafeSteps.length > 0
|
|
741
|
+
? "Resolve or manually review the unsafe migration steps before release."
|
|
742
|
+
: "Apply or clear pending migrations before release."
|
|
743
|
+
};
|
|
744
|
+
}
|
|
745
|
+
async function evaluateHealthCheck(appRoot, check, verify) {
|
|
746
|
+
switch (check.kind) {
|
|
747
|
+
case "verify_pass":
|
|
748
|
+
return {
|
|
749
|
+
key: `health:${check.key}`,
|
|
750
|
+
label: `Health Check · ${check.title}`,
|
|
751
|
+
status: verify.status === "passed" ? "passed" : "failed",
|
|
752
|
+
summary: verify.status === "passed"
|
|
753
|
+
? check.description ?? "Capstan verify passed."
|
|
754
|
+
: check.description ?? "Capstan verify failed.",
|
|
755
|
+
...(verify.status === "passed"
|
|
756
|
+
? {}
|
|
757
|
+
: {
|
|
758
|
+
hint: "Fix the verify failures before attempting a preview or release."
|
|
759
|
+
})
|
|
760
|
+
};
|
|
761
|
+
case "path_exists": {
|
|
762
|
+
const target = resolve(appRoot, check.target ?? "");
|
|
763
|
+
const exists = Boolean(check.target) && (await pathExists(target));
|
|
764
|
+
return {
|
|
765
|
+
key: `health:${check.key}`,
|
|
766
|
+
label: `Health Check · ${check.title}`,
|
|
767
|
+
status: exists ? "passed" : "failed",
|
|
768
|
+
summary: exists
|
|
769
|
+
? check.description ?? `Required path "${check.target}" exists.`
|
|
770
|
+
: check.description ?? `Required path "${check.target ?? "unknown"}" is missing.`,
|
|
771
|
+
...(exists
|
|
772
|
+
? {}
|
|
773
|
+
: {
|
|
774
|
+
hint: "Restore the missing release artifact or rebuild the application before release."
|
|
775
|
+
})
|
|
776
|
+
};
|
|
777
|
+
}
|
|
778
|
+
case "json_parse": {
|
|
779
|
+
const target = resolve(appRoot, check.target ?? "");
|
|
780
|
+
try {
|
|
781
|
+
const contents = await readFile(target, "utf8");
|
|
782
|
+
JSON.parse(contents);
|
|
783
|
+
return {
|
|
784
|
+
key: `health:${check.key}`,
|
|
785
|
+
label: `Health Check · ${check.title}`,
|
|
786
|
+
status: "passed",
|
|
787
|
+
summary: check.description ?? `JSON file "${check.target}" parsed successfully.`
|
|
788
|
+
};
|
|
789
|
+
}
|
|
790
|
+
catch (error) {
|
|
791
|
+
return {
|
|
792
|
+
key: `health:${check.key}`,
|
|
793
|
+
label: `Health Check · ${check.title}`,
|
|
794
|
+
status: "failed",
|
|
795
|
+
summary: check.description ?? `JSON file "${check.target ?? "unknown"}" could not be parsed.`,
|
|
796
|
+
detail: error instanceof Error ? error.message : String(error),
|
|
797
|
+
hint: "Regenerate or repair the JSON artifact before attempting release."
|
|
798
|
+
};
|
|
799
|
+
}
|
|
800
|
+
}
|
|
801
|
+
default:
|
|
802
|
+
return {
|
|
803
|
+
key: `health:${check.key}`,
|
|
804
|
+
label: `Health Check · ${check.title}`,
|
|
805
|
+
status: "failed",
|
|
806
|
+
summary: `Unsupported health check kind "${String(check.kind)}".`,
|
|
807
|
+
hint: "Use a supported release health check kind before attempting release."
|
|
808
|
+
};
|
|
809
|
+
}
|
|
810
|
+
}
|
|
811
|
+
async function collectArtifactInventory(appRoot, artifacts) {
|
|
812
|
+
const inventory = [];
|
|
813
|
+
for (const artifact of artifacts) {
|
|
814
|
+
inventory.push({
|
|
815
|
+
key: artifact.key,
|
|
816
|
+
title: artifact.title,
|
|
817
|
+
kind: artifact.kind,
|
|
818
|
+
path: artifact.path,
|
|
819
|
+
required: artifact.required ?? false,
|
|
820
|
+
exists: await pathExists(resolve(appRoot, artifact.path))
|
|
821
|
+
});
|
|
822
|
+
}
|
|
823
|
+
return inventory;
|
|
824
|
+
}
|
|
825
|
+
async function loadArtifactInventoryFromTrace(tracePath, fallbackArtifacts) {
|
|
826
|
+
try {
|
|
827
|
+
const source = await readFile(tracePath, "utf8");
|
|
828
|
+
const parsed = JSON.parse(source);
|
|
829
|
+
if (Array.isArray(parsed.artifactInventory) && parsed.artifactInventory.length) {
|
|
830
|
+
return parsed.artifactInventory.map((artifact) => ({
|
|
831
|
+
key: artifact.key,
|
|
832
|
+
title: artifact.title,
|
|
833
|
+
kind: artifact.kind,
|
|
834
|
+
path: artifact.path,
|
|
835
|
+
required: artifact.required,
|
|
836
|
+
exists: artifact.exists
|
|
837
|
+
}));
|
|
838
|
+
}
|
|
839
|
+
if (typeof parsed.appRoot === "string") {
|
|
840
|
+
return collectArtifactInventory(parsed.appRoot, fallbackArtifacts);
|
|
841
|
+
}
|
|
842
|
+
}
|
|
843
|
+
catch {
|
|
844
|
+
// Fall back to the current app root inventory below.
|
|
845
|
+
}
|
|
846
|
+
const fallbackRoot = resolve(dirname(dirname(tracePath)), "..");
|
|
847
|
+
return collectArtifactInventory(fallbackRoot, fallbackArtifacts);
|
|
848
|
+
}
|
|
849
|
+
async function normalizeReleaseHistoryEntry(tracePath, fallbackAppRoot) {
|
|
850
|
+
try {
|
|
851
|
+
const source = await readFile(tracePath, "utf8");
|
|
852
|
+
const parsed = JSON.parse(source);
|
|
853
|
+
const target = parsed.target;
|
|
854
|
+
const status = parsed.status;
|
|
855
|
+
const generatedAt = parsed.trace?.generatedAt;
|
|
856
|
+
if (!isExecutionTarget(target) ||
|
|
857
|
+
!isRunStatus(status) ||
|
|
858
|
+
typeof generatedAt !== "string") {
|
|
859
|
+
return null;
|
|
860
|
+
}
|
|
861
|
+
return {
|
|
862
|
+
appRoot: typeof parsed.appRoot === "string" ? parsed.appRoot : fallbackAppRoot,
|
|
863
|
+
target,
|
|
864
|
+
status,
|
|
865
|
+
generatedAt,
|
|
866
|
+
tracePath: typeof parsed.trace?.tracePath === "string" ? parsed.trace.tracePath : tracePath,
|
|
867
|
+
stepCount: Array.isArray(parsed.steps) ? parsed.steps.length : 0,
|
|
868
|
+
...(typeof parsed.trace?.sourceTracePath === "string"
|
|
869
|
+
? { sourceTracePath: parsed.trace.sourceTracePath }
|
|
870
|
+
: {})
|
|
871
|
+
};
|
|
872
|
+
}
|
|
873
|
+
catch {
|
|
874
|
+
return null;
|
|
875
|
+
}
|
|
876
|
+
}
|
|
877
|
+
async function runGeneratedBuild(appRoot) {
|
|
878
|
+
try {
|
|
879
|
+
await execFileAsync(tscBinary, ["-p", resolve(appRoot, "tsconfig.json")], {
|
|
880
|
+
cwd: appRoot
|
|
881
|
+
});
|
|
882
|
+
return { ok: true };
|
|
883
|
+
}
|
|
884
|
+
catch (error) {
|
|
885
|
+
const failed = error;
|
|
886
|
+
return {
|
|
887
|
+
ok: false,
|
|
888
|
+
detail: [failed.stdout, failed.stderr, failed.message]
|
|
889
|
+
.filter((value) => Boolean(value?.trim()))
|
|
890
|
+
.join("\n") || "Unknown TypeScript build failure."
|
|
891
|
+
};
|
|
892
|
+
}
|
|
893
|
+
}
|
|
894
|
+
function completeReleaseRunStep(step, startedAt, summary, extras = {}) {
|
|
895
|
+
return {
|
|
896
|
+
key: step.key,
|
|
897
|
+
label: step.title,
|
|
898
|
+
status: "completed",
|
|
899
|
+
durationMs: Date.now() - startedAt,
|
|
900
|
+
summary,
|
|
901
|
+
...extras
|
|
902
|
+
};
|
|
903
|
+
}
|
|
904
|
+
function failedReleaseRunStep(step, startedAt, summary, extras = {}) {
|
|
905
|
+
return {
|
|
906
|
+
key: step.key,
|
|
907
|
+
label: step.title,
|
|
908
|
+
status: "failed",
|
|
909
|
+
durationMs: Date.now() - startedAt,
|
|
910
|
+
summary,
|
|
911
|
+
...extras
|
|
912
|
+
};
|
|
913
|
+
}
|
|
914
|
+
function skippedReleaseRunStep(step, summary) {
|
|
915
|
+
return {
|
|
916
|
+
key: step.key,
|
|
917
|
+
label: step.title,
|
|
918
|
+
status: "skipped",
|
|
919
|
+
durationMs: 0,
|
|
920
|
+
summary,
|
|
921
|
+
...(step.command ? { command: step.command } : {})
|
|
922
|
+
};
|
|
923
|
+
}
|
|
924
|
+
async function writeReleaseRunTrace(report) {
|
|
925
|
+
await mkdir(dirname(report.trace.tracePath), { recursive: true });
|
|
926
|
+
await writeFile(report.trace.tracePath, `${JSON.stringify(report, null, 2)}\n`, "utf8");
|
|
927
|
+
}
|
|
928
|
+
async function writeRollbackRunTrace(report) {
|
|
929
|
+
await mkdir(dirname(report.trace.tracePath), { recursive: true });
|
|
930
|
+
await writeFile(report.trace.tracePath, `${JSON.stringify(report, null, 2)}\n`, "utf8");
|
|
931
|
+
}
|
|
932
|
+
async function pathExists(target) {
|
|
933
|
+
try {
|
|
934
|
+
await accessAsync(target, constants.F_OK);
|
|
935
|
+
return true;
|
|
936
|
+
}
|
|
937
|
+
catch {
|
|
938
|
+
return false;
|
|
939
|
+
}
|
|
940
|
+
}
|
|
941
|
+
function hasSnapshotValue(value) {
|
|
942
|
+
return typeof value === "string" && value.trim().length > 0;
|
|
943
|
+
}
|
|
944
|
+
function formatTypeScriptBuildCommand(appRoot) {
|
|
945
|
+
return `${tscBinary} -p ${resolve(appRoot, "tsconfig.json")}`;
|
|
946
|
+
}
|
|
947
|
+
function formatTraceStamp(isoString) {
|
|
948
|
+
return isoString.replace(/[:.]/g, "-");
|
|
949
|
+
}
|
|
950
|
+
function isExecutionTarget(value) {
|
|
951
|
+
return value === "preview" || value === "release" || value === "rollback";
|
|
952
|
+
}
|
|
953
|
+
function isRunStatus(value) {
|
|
954
|
+
return value === "completed" || value === "blocked" || value === "failed";
|
|
955
|
+
}
|
|
956
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@zauso-ai/capstan-release",
|
|
3
|
+
"version": "0.1.2",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"main": "./dist/index.js",
|
|
6
|
+
"types": "./dist/index.d.ts",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": {
|
|
9
|
+
"types": "./dist/index.d.ts",
|
|
10
|
+
"default": "./dist/index.js"
|
|
11
|
+
}
|
|
12
|
+
},
|
|
13
|
+
"files": [
|
|
14
|
+
"dist"
|
|
15
|
+
],
|
|
16
|
+
"scripts": {
|
|
17
|
+
"build": "tsc -p tsconfig.json",
|
|
18
|
+
"typecheck": "tsc -p tsconfig.json --noEmit"
|
|
19
|
+
},
|
|
20
|
+
"dependencies": {
|
|
21
|
+
"@zauso-ai/capstan-feedback": "0.1.2"
|
|
22
|
+
},
|
|
23
|
+
"description": "Release planning and rollback for Capstan",
|
|
24
|
+
"repository": {
|
|
25
|
+
"type": "git",
|
|
26
|
+
"url": "https://github.com/barry3406/capstan.git",
|
|
27
|
+
"directory": "packages/release"
|
|
28
|
+
},
|
|
29
|
+
"license": "MIT",
|
|
30
|
+
"author": "barry3406",
|
|
31
|
+
"homepage": "https://github.com/barry3406/capstan",
|
|
32
|
+
"keywords": [
|
|
33
|
+
"capstan",
|
|
34
|
+
"ai-agent",
|
|
35
|
+
"full-stack",
|
|
36
|
+
"framework",
|
|
37
|
+
"mcp",
|
|
38
|
+
"a2a",
|
|
39
|
+
"typescript"
|
|
40
|
+
],
|
|
41
|
+
"publishConfig": {
|
|
42
|
+
"access": "public"
|
|
43
|
+
}
|
|
44
|
+
}
|