@mannyc1/ts-release 0.0.1 → 0.0.3
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/ARCHITECTURE.md +93 -0
- package/README.md +282 -49
- package/SPEC.md +46 -9
- package/dist/config/schema.d.ts +4 -0
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +13 -0
- package/dist/config/schema.js.map +1 -1
- package/dist/domain/evidence.d.ts +4 -0
- package/dist/domain/evidence.d.ts.map +1 -1
- package/dist/domain/evidence.js +4 -0
- package/dist/domain/evidence.js.map +1 -1
- package/dist/domain/operation.d.ts +1 -0
- package/dist/domain/operation.d.ts.map +1 -1
- package/dist/domain/operation.js +147 -1
- package/dist/domain/operation.js.map +1 -1
- package/dist/domain/release.d.ts +1 -0
- package/dist/domain/release.d.ts.map +1 -1
- package/dist/domain/release.js +1 -0
- package/dist/domain/release.js.map +1 -1
- package/dist/domain/remote-state.d.ts +90 -0
- package/dist/domain/remote-state.d.ts.map +1 -0
- package/dist/domain/remote-state.js +85 -0
- package/dist/domain/remote-state.js.map +1 -0
- package/dist/domain/status.d.ts +43 -0
- package/dist/domain/status.d.ts.map +1 -0
- package/dist/domain/status.js +50 -0
- package/dist/domain/status.js.map +1 -0
- package/dist/domain/target.d.ts +32 -2
- package/dist/domain/target.d.ts.map +1 -1
- package/dist/domain/target.js +35 -2
- package/dist/domain/target.js.map +1 -1
- package/dist/host/host.d.ts +7 -23
- package/dist/host/host.d.ts.map +1 -1
- package/dist/host/host.js +3 -22
- package/dist/host/host.js.map +1 -1
- package/dist/host/http-live.d.ts +1 -2
- package/dist/host/http-live.d.ts.map +1 -1
- package/dist/host/http-live.js +18 -9
- package/dist/host/http-live.js.map +1 -1
- package/dist/host/http.d.ts +3 -1
- package/dist/host/http.d.ts.map +1 -1
- package/dist/host/http.js +3 -1
- package/dist/host/http.js.map +1 -1
- package/dist/host/platform.d.ts +10 -0
- package/dist/host/platform.d.ts.map +1 -0
- package/dist/host/platform.js +121 -0
- package/dist/host/platform.js.map +1 -0
- package/dist/host/test.d.ts +7 -3
- package/dist/host/test.d.ts.map +1 -1
- package/dist/host/test.js +128 -25
- package/dist/host/test.js.map +1 -1
- package/dist/internal/workspace-path.d.ts +16 -0
- package/dist/internal/workspace-path.d.ts.map +1 -0
- package/dist/internal/workspace-path.js +33 -0
- package/dist/internal/workspace-path.js.map +1 -0
- package/dist/planner/artifact-inventory.d.ts +9 -0
- package/dist/planner/artifact-inventory.d.ts.map +1 -0
- package/dist/planner/artifact-inventory.js +85 -0
- package/dist/planner/artifact-inventory.js.map +1 -0
- package/dist/planner/create-release-plan.d.ts +1 -1
- package/dist/planner/create-release-plan.d.ts.map +1 -1
- package/dist/planner/errors.d.ts +37 -1
- package/dist/planner/errors.d.ts.map +1 -1
- package/dist/planner/errors.js +30 -0
- package/dist/planner/errors.js.map +1 -1
- package/dist/planner/evidence-recorder.d.ts +13 -8
- package/dist/planner/evidence-recorder.d.ts.map +1 -1
- package/dist/planner/evidence-recorder.js +116 -18
- package/dist/planner/evidence-recorder.js.map +1 -1
- package/dist/planner/executor.d.ts +31 -19
- package/dist/planner/executor.d.ts.map +1 -1
- package/dist/planner/executor.js +52 -7
- package/dist/planner/executor.js.map +1 -1
- package/dist/planner/normalize-release.d.ts +2 -2
- package/dist/planner/normalize-release.d.ts.map +1 -1
- package/dist/planner/normalize-release.js +50 -52
- package/dist/planner/normalize-release.js.map +1 -1
- package/dist/planner/reconcile.d.ts +17 -0
- package/dist/planner/reconcile.d.ts.map +1 -0
- package/dist/planner/reconcile.js +337 -0
- package/dist/planner/reconcile.js.map +1 -0
- package/dist/planner/release-eligibility.d.ts +34 -0
- package/dist/planner/release-eligibility.d.ts.map +1 -0
- package/dist/planner/release-eligibility.js +179 -0
- package/dist/planner/release-eligibility.js.map +1 -0
- package/dist/planner/render-plan.d.ts +10 -0
- package/dist/planner/render-plan.d.ts.map +1 -1
- package/dist/planner/render-plan.js +179 -0
- package/dist/planner/render-plan.js.map +1 -1
- package/dist/planner/status.d.ts +40 -0
- package/dist/planner/status.d.ts.map +1 -0
- package/dist/planner/status.js +342 -0
- package/dist/planner/status.js.map +1 -0
- package/dist/targets/github.d.ts.map +1 -1
- package/dist/targets/github.js +28 -13
- package/dist/targets/github.js.map +1 -1
- package/dist/targets/npm.d.ts +2 -2
- package/dist/targets/npm.d.ts.map +1 -1
- package/dist/targets/npm.js +74 -14
- package/dist/targets/npm.js.map +1 -1
- package/dist/workflows/config.d.ts +153 -0
- package/dist/workflows/config.d.ts.map +1 -0
- package/dist/workflows/config.js +301 -0
- package/dist/workflows/config.js.map +1 -0
- package/dist/workflows/diagnostics.d.ts +62 -0
- package/dist/workflows/diagnostics.d.ts.map +1 -0
- package/dist/workflows/diagnostics.js +474 -0
- package/dist/workflows/diagnostics.js.map +1 -0
- package/dist/workflows/evidence.d.ts +21 -0
- package/dist/workflows/evidence.d.ts.map +1 -0
- package/dist/workflows/evidence.js +45 -0
- package/dist/workflows/evidence.js.map +1 -0
- package/dist/workflows/index.d.ts +7 -0
- package/dist/workflows/index.d.ts.map +1 -0
- package/dist/workflows/index.js +6 -0
- package/dist/workflows/index.js.map +1 -0
- package/dist/workflows/init.d.ts +71 -0
- package/dist/workflows/init.d.ts.map +1 -0
- package/dist/workflows/init.js +384 -0
- package/dist/workflows/init.js.map +1 -0
- package/dist/workflows/live.d.ts +9 -0
- package/dist/workflows/live.d.ts.map +1 -0
- package/dist/workflows/live.js +7 -0
- package/dist/workflows/live.js.map +1 -0
- package/dist/workflows/options.d.ts +30 -0
- package/dist/workflows/options.d.ts.map +1 -0
- package/dist/workflows/options.js +16 -0
- package/dist/workflows/options.js.map +1 -0
- package/examples/README.md +16 -9
- package/examples/github-release/release.config.json +1 -0
- package/examples/homebrew-tap/release.config.json +1 -0
- package/examples/multi-target/release.config.json +10 -1
- package/examples/non-strict-skips/release.config.json +1 -0
- package/examples/npm-first-publish/release.config.json +33 -0
- package/examples/npm-only/release.config.json +10 -1
- package/examples/pypi-registry/release.config.json +1 -0
- package/examples/scoop-bucket/release.config.json +1 -0
- package/package.json +56 -27
- package/templates/README.md +54 -0
- package/templates/github-actions/plan-and-approved-execute.yml +53 -0
- package/templates/github-actions/plan-only.yml +30 -0
- package/templates/github-actions/trusted-publishing.yml +59 -0
- package/templates/multi-target-homebrew/release.config.json +70 -0
- package/templates/multi-target-scoop/release.config.json +72 -0
- package/templates/npm-github/release.config.json +50 -0
- package/templates/npm-only/release.config.json +39 -0
- package/dist/cli/command.d.ts +0 -4
- package/dist/cli/command.d.ts.map +0 -1
- package/dist/cli/command.js +0 -125
- package/dist/cli/command.js.map +0 -1
- package/dist/cli/main.d.ts +0 -3
- package/dist/cli/main.d.ts.map +0 -1
- package/dist/cli/main.js +0 -15
- package/dist/cli/main.js.map +0 -1
- package/dist/cli/programmatic.d.ts +0 -25
- package/dist/cli/programmatic.d.ts.map +0 -1
- package/dist/cli/programmatic.js +0 -53
- package/dist/cli/programmatic.js.map +0 -1
- package/dist/host/bun.d.ts +0 -9
- package/dist/host/bun.d.ts.map +0 -1
- package/dist/host/bun.js +0 -156
- package/dist/host/bun.js.map +0 -1
|
@@ -0,0 +1,337 @@
|
|
|
1
|
+
import * as Effect from "effect/Effect";
|
|
2
|
+
import * as Schema from "effect/Schema";
|
|
3
|
+
import { GitHubReconcileBlock, GitHubReconcileCreateRelease, GitHubReconcilePublishDraft, GitHubReconcileSkip, GitHubReleaseDraft, GitHubReleaseMissing, GitHubReleasePublished } from "../domain/remote-state.js";
|
|
4
|
+
import { CommandSpec, executeGate, ExecutionApproval, HttpEnvHeader, HttpHeader, HttpRequestSpec, PublishCommandOperation } from "../domain/operation.js";
|
|
5
|
+
import { ReleaseHttp } from "../host/http.js";
|
|
6
|
+
import { emptyEvidenceBundle } from "./evidence-recorder.js";
|
|
7
|
+
import { runOperations } from "./executor.js";
|
|
8
|
+
import { ReconciliationBlockedError, RemoteStateInspectionError } from "./errors.js";
|
|
9
|
+
class GitHubReleaseAssetResponse extends Schema.Class("GitHubReleaseAssetResponse")({
|
|
10
|
+
name: Schema.String
|
|
11
|
+
}) {
|
|
12
|
+
}
|
|
13
|
+
class GitHubReleaseResponse extends Schema.Class("GitHubReleaseResponse")({
|
|
14
|
+
tag_name: Schema.String,
|
|
15
|
+
name: Schema.String,
|
|
16
|
+
draft: Schema.Boolean,
|
|
17
|
+
prerelease: Schema.Boolean,
|
|
18
|
+
assets: Schema.Array(GitHubReleaseAssetResponse)
|
|
19
|
+
}) {
|
|
20
|
+
}
|
|
21
|
+
export class ReleaseReconcileOptions extends Schema.Class("ReleaseReconcileOptions")({
|
|
22
|
+
execute: Schema.Boolean
|
|
23
|
+
}) {
|
|
24
|
+
}
|
|
25
|
+
const decodeGitHubReleaseResponse = Schema.decodeUnknownEffect(GitHubReleaseResponse);
|
|
26
|
+
const decodeGitHubReleaseResponses = Schema.decodeUnknownEffect(Schema.Array(GitHubReleaseResponse));
|
|
27
|
+
const githubTargets = (plan) => plan.targets.filter((target) => target._tag === "GitHubReleaseTarget");
|
|
28
|
+
const envNames = (target) => target.tokenEnv === undefined ? [] : [target.tokenEnv];
|
|
29
|
+
const ghCommand = (target, args, includeAuth) => CommandSpec.make({
|
|
30
|
+
executable: "gh",
|
|
31
|
+
args: [...args],
|
|
32
|
+
requiredEnv: includeAuth ? envNames(target) : [],
|
|
33
|
+
redactedEnv: includeAuth ? envNames(target) : []
|
|
34
|
+
});
|
|
35
|
+
const pathBaseName = (path) => {
|
|
36
|
+
const parts = path.replaceAll("\\", "/").split("/");
|
|
37
|
+
return parts[parts.length - 1] ?? path;
|
|
38
|
+
};
|
|
39
|
+
const targetArtifacts = (target, plan) => plan.artifacts.filter((artifact) => artifact.consumers.includes(target.id));
|
|
40
|
+
const githubReleaseTag = (plan) => plan.identity.tag ?? plan.identity.version;
|
|
41
|
+
const githubReleaseTitle = (plan) => `${plan.identity.name} ${plan.identity.version}`;
|
|
42
|
+
const githubTargetArtifactNames = (target, plan) => targetArtifacts(target, plan).map((artifact) => pathBaseName(artifact.path)).sort();
|
|
43
|
+
const releaseArgs = (target, plan) => {
|
|
44
|
+
const args = [
|
|
45
|
+
"release",
|
|
46
|
+
"create",
|
|
47
|
+
githubReleaseTag(plan),
|
|
48
|
+
"--repo",
|
|
49
|
+
target.repository,
|
|
50
|
+
"--title",
|
|
51
|
+
githubReleaseTitle(plan)
|
|
52
|
+
];
|
|
53
|
+
if (target.draft === true) {
|
|
54
|
+
args.push("--draft");
|
|
55
|
+
}
|
|
56
|
+
if (target.prerelease === true) {
|
|
57
|
+
args.push("--prerelease");
|
|
58
|
+
}
|
|
59
|
+
if (plan.identity.notes !== undefined) {
|
|
60
|
+
args.push("--notes", plan.identity.notes);
|
|
61
|
+
}
|
|
62
|
+
for (const artifact of targetArtifacts(target, plan)) {
|
|
63
|
+
args.push(artifact.path);
|
|
64
|
+
}
|
|
65
|
+
return args;
|
|
66
|
+
};
|
|
67
|
+
const githubReleaseApiUrl = (target, tag) => `https://api.github.com/repos/${target.repository}/releases/tags/${encodeURIComponent(tag)}`;
|
|
68
|
+
const githubReleaseListApiUrl = (target) => `https://api.github.com/repos/${target.repository}/releases?per_page=100`;
|
|
69
|
+
const githubReleaseListApiPath = (target) => `/repos/${target.repository}/releases`;
|
|
70
|
+
const githubApiHeaders = () => [
|
|
71
|
+
HttpHeader.make({ name: "Accept", value: "application/vnd.github+json" }),
|
|
72
|
+
HttpHeader.make({ name: "X-GitHub-Api-Version", value: "2022-11-28" })
|
|
73
|
+
];
|
|
74
|
+
const githubApiEnvHeaders = (target) => target.tokenEnv === undefined
|
|
75
|
+
? []
|
|
76
|
+
: [
|
|
77
|
+
HttpEnvHeader.make({
|
|
78
|
+
name: "Authorization",
|
|
79
|
+
valueEnv: target.tokenEnv,
|
|
80
|
+
prefix: "Bearer "
|
|
81
|
+
})
|
|
82
|
+
];
|
|
83
|
+
const githubReleaseRequestSpec = (target, tag) => HttpRequestSpec.make({
|
|
84
|
+
method: "GET",
|
|
85
|
+
url: githubReleaseApiUrl(target, tag),
|
|
86
|
+
headers: githubApiHeaders(),
|
|
87
|
+
envHeaders: githubApiEnvHeaders(target),
|
|
88
|
+
requiredEnv: envNames(target),
|
|
89
|
+
redactedEnv: envNames(target)
|
|
90
|
+
});
|
|
91
|
+
const githubReleaseListRequestSpec = (target, url = githubReleaseListApiUrl(target)) => HttpRequestSpec.make({
|
|
92
|
+
method: "GET",
|
|
93
|
+
url,
|
|
94
|
+
headers: githubApiHeaders(),
|
|
95
|
+
envHeaders: githubApiEnvHeaders(target),
|
|
96
|
+
requiredEnv: envNames(target),
|
|
97
|
+
redactedEnv: envNames(target)
|
|
98
|
+
});
|
|
99
|
+
const githubReleaseCreateCommand = (target, plan) => ghCommand(target, releaseArgs(target, plan), true);
|
|
100
|
+
const githubReleaseReconcileCreateOperation = (target, plan) => PublishCommandOperation.make({
|
|
101
|
+
id: `${target.id}:gh-release-reconcile-create`,
|
|
102
|
+
targetId: target.id,
|
|
103
|
+
description: `Create missing GitHub release for ${plan.identity.name}@${plan.identity.version}.`,
|
|
104
|
+
risk: "externally-visible",
|
|
105
|
+
gate: executeGate("Creating this GitHub release is externally visible."),
|
|
106
|
+
command: githubReleaseCreateCommand(target, plan)
|
|
107
|
+
});
|
|
108
|
+
const githubReleasePublishDraftOperation = (target, plan) => PublishCommandOperation.make({
|
|
109
|
+
id: `${target.id}:gh-release-publish-draft`,
|
|
110
|
+
targetId: target.id,
|
|
111
|
+
description: `Publish existing GitHub draft release for ${plan.identity.name}@${plan.identity.version}.`,
|
|
112
|
+
risk: "externally-visible",
|
|
113
|
+
gate: executeGate("Publishing this GitHub draft release is externally visible."),
|
|
114
|
+
command: ghCommand(target, [
|
|
115
|
+
"release",
|
|
116
|
+
"edit",
|
|
117
|
+
githubReleaseTag(plan),
|
|
118
|
+
"--repo",
|
|
119
|
+
target.repository,
|
|
120
|
+
"--draft=false"
|
|
121
|
+
], true)
|
|
122
|
+
});
|
|
123
|
+
const sortedAssetNames = (response) => response.assets.map((asset) => asset.name).sort();
|
|
124
|
+
const remoteStateError = (target, reason) => RemoteStateInspectionError.make({
|
|
125
|
+
targetId: target.id,
|
|
126
|
+
reason
|
|
127
|
+
});
|
|
128
|
+
const releaseStateFromResponse = (target, response) => {
|
|
129
|
+
const fields = {
|
|
130
|
+
targetId: target.id,
|
|
131
|
+
repository: target.repository,
|
|
132
|
+
tag: response.tag_name,
|
|
133
|
+
title: response.name,
|
|
134
|
+
prerelease: response.prerelease,
|
|
135
|
+
assetNames: sortedAssetNames(response)
|
|
136
|
+
};
|
|
137
|
+
return response.draft
|
|
138
|
+
? GitHubReleaseDraft.make({
|
|
139
|
+
...fields,
|
|
140
|
+
draft: true
|
|
141
|
+
})
|
|
142
|
+
: GitHubReleasePublished.make({
|
|
143
|
+
...fields,
|
|
144
|
+
draft: false
|
|
145
|
+
});
|
|
146
|
+
};
|
|
147
|
+
const linkHeaderNextUrl = (value) => {
|
|
148
|
+
for (const entry of value.split(",")) {
|
|
149
|
+
const parts = entry.split(";").map((part) => part.trim());
|
|
150
|
+
const urlPart = parts[0];
|
|
151
|
+
if (urlPart === undefined || !urlPart.startsWith("<") || !urlPart.endsWith(">")) {
|
|
152
|
+
continue;
|
|
153
|
+
}
|
|
154
|
+
const hasNextRelation = parts.slice(1).some((part) => part.toLowerCase() === "rel=\"next\"");
|
|
155
|
+
if (hasNextRelation) {
|
|
156
|
+
return urlPart.slice(1, -1);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
return undefined;
|
|
160
|
+
};
|
|
161
|
+
const responseNextUrl = (headers) => {
|
|
162
|
+
for (const header of headers) {
|
|
163
|
+
if (header.name.toLowerCase() !== "link") {
|
|
164
|
+
continue;
|
|
165
|
+
}
|
|
166
|
+
const nextUrl = linkHeaderNextUrl(header.value);
|
|
167
|
+
if (nextUrl !== undefined) {
|
|
168
|
+
return nextUrl;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
return undefined;
|
|
172
|
+
};
|
|
173
|
+
const validateReleaseListNextUrl = Effect.fn("validateReleaseListNextUrl")(function* (target, url) {
|
|
174
|
+
const parsed = yield* Effect.try({
|
|
175
|
+
try: () => new URL(url),
|
|
176
|
+
catch: () => remoteStateError(target, "GitHub release list next link is not a valid URL.")
|
|
177
|
+
});
|
|
178
|
+
if (parsed.protocol !== "https:" ||
|
|
179
|
+
parsed.hostname !== "api.github.com" ||
|
|
180
|
+
parsed.pathname !== githubReleaseListApiPath(target)) {
|
|
181
|
+
return yield* Effect.fail(remoteStateError(target, "GitHub release list next link does not point to the expected releases endpoint."));
|
|
182
|
+
}
|
|
183
|
+
return parsed.toString();
|
|
184
|
+
});
|
|
185
|
+
const releaseListNextUrl = Effect.fn("releaseListNextUrl")(function* (target, headers) {
|
|
186
|
+
const nextUrl = responseNextUrl(headers);
|
|
187
|
+
return nextUrl === undefined
|
|
188
|
+
? undefined
|
|
189
|
+
: yield* validateReleaseListNextUrl(target, nextUrl);
|
|
190
|
+
});
|
|
191
|
+
const inspectGitHubReleaseListForTag = Effect.fn("inspectGitHubReleaseListForTag")(function* (target, plan) {
|
|
192
|
+
const tag = githubReleaseTag(plan);
|
|
193
|
+
const http = yield* ReleaseHttp;
|
|
194
|
+
const visitedUrls = new Set();
|
|
195
|
+
let request = githubReleaseListRequestSpec(target);
|
|
196
|
+
while (true) {
|
|
197
|
+
const result = yield* http.runJson(request).pipe(Effect.mapError((error) => remoteStateError(target, error.reason)));
|
|
198
|
+
if (result.status !== 200) {
|
|
199
|
+
return yield* Effect.fail(remoteStateError(target, `GitHub release list lookup returned HTTP ${result.status}.`));
|
|
200
|
+
}
|
|
201
|
+
const releases = yield* decodeGitHubReleaseResponses(result.json).pipe(Effect.mapError((error) => remoteStateError(target, `GitHub release list response did not match the expected schema: ${error.message}`)));
|
|
202
|
+
const release = releases.find((item) => item.tag_name === tag);
|
|
203
|
+
if (release !== undefined) {
|
|
204
|
+
return releaseStateFromResponse(target, release);
|
|
205
|
+
}
|
|
206
|
+
visitedUrls.add(request.url);
|
|
207
|
+
const nextUrl = yield* releaseListNextUrl(target, result.responseHeaders);
|
|
208
|
+
if (nextUrl === undefined) {
|
|
209
|
+
return GitHubReleaseMissing.make({
|
|
210
|
+
targetId: target.id,
|
|
211
|
+
repository: target.repository,
|
|
212
|
+
tag
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
if (visitedUrls.has(nextUrl)) {
|
|
216
|
+
return yield* Effect.fail(remoteStateError(target, "GitHub release list pagination loop detected."));
|
|
217
|
+
}
|
|
218
|
+
request = githubReleaseListRequestSpec(target, nextUrl);
|
|
219
|
+
}
|
|
220
|
+
});
|
|
221
|
+
export const inspectGitHubReleaseState = Effect.fn("inspectGitHubReleaseState")(function* (target, plan) {
|
|
222
|
+
const tag = githubReleaseTag(plan);
|
|
223
|
+
const request = githubReleaseRequestSpec(target, tag);
|
|
224
|
+
const http = yield* ReleaseHttp;
|
|
225
|
+
const result = yield* http.runJson(request).pipe(Effect.mapError((error) => remoteStateError(target, error.reason)));
|
|
226
|
+
if (result.status === 404) {
|
|
227
|
+
return yield* inspectGitHubReleaseListForTag(target, plan);
|
|
228
|
+
}
|
|
229
|
+
if (result.status !== 200) {
|
|
230
|
+
return yield* Effect.fail(remoteStateError(target, `GitHub release lookup returned HTTP ${result.status}.`));
|
|
231
|
+
}
|
|
232
|
+
const release = yield* decodeGitHubReleaseResponse(result.json).pipe(Effect.mapError((error) => remoteStateError(target, `GitHub release response did not match the expected schema: ${error.message}`)));
|
|
233
|
+
return releaseStateFromResponse(target, release);
|
|
234
|
+
});
|
|
235
|
+
const listLabel = (values) => values.length === 0 ? "(none)" : values.join(", ");
|
|
236
|
+
const sameStrings = (left, right) => left.length === right.length && left.every((value, index) => value === right[index]);
|
|
237
|
+
const existingMismatchReasons = (target, plan, state) => {
|
|
238
|
+
const reasons = [];
|
|
239
|
+
const expectedTag = githubReleaseTag(plan);
|
|
240
|
+
const expectedTitle = githubReleaseTitle(plan);
|
|
241
|
+
const expectedPrerelease = target.prerelease === true;
|
|
242
|
+
const expectedAssets = githubTargetArtifactNames(target, plan);
|
|
243
|
+
if (state.tag !== expectedTag) {
|
|
244
|
+
reasons.push(`GitHub release tag ${state.tag} does not match expected ${expectedTag}.`);
|
|
245
|
+
}
|
|
246
|
+
if (state.title !== expectedTitle) {
|
|
247
|
+
reasons.push(`GitHub release title ${state.title} does not match expected ${expectedTitle}.`);
|
|
248
|
+
}
|
|
249
|
+
if (state.prerelease !== expectedPrerelease) {
|
|
250
|
+
reasons.push(`GitHub release prerelease=${state.prerelease} does not match expected prerelease=${expectedPrerelease}.`);
|
|
251
|
+
}
|
|
252
|
+
if (!sameStrings(state.assetNames, expectedAssets)) {
|
|
253
|
+
reasons.push(`GitHub release assets ${listLabel(state.assetNames)} do not match expected assets ${listLabel(expectedAssets)}.`);
|
|
254
|
+
}
|
|
255
|
+
return reasons;
|
|
256
|
+
};
|
|
257
|
+
const blockDecision = (target, reasons) => GitHubReconcileBlock.make({
|
|
258
|
+
targetId: target.id,
|
|
259
|
+
reasons: [...reasons]
|
|
260
|
+
});
|
|
261
|
+
export const decideGitHubReleaseReconciliation = (target, plan, state) => {
|
|
262
|
+
switch (state._tag) {
|
|
263
|
+
case "GitHubReleaseMissing":
|
|
264
|
+
return GitHubReconcileCreateRelease.make({
|
|
265
|
+
targetId: target.id,
|
|
266
|
+
reason: `GitHub release ${githubReleaseTag(plan)} is missing.`
|
|
267
|
+
});
|
|
268
|
+
case "GitHubReleaseMismatch":
|
|
269
|
+
return blockDecision(target, state.reasons);
|
|
270
|
+
case "GitHubReleaseDraft": {
|
|
271
|
+
const reasons = existingMismatchReasons(target, plan, state);
|
|
272
|
+
if (reasons.length > 0) {
|
|
273
|
+
return blockDecision(target, reasons);
|
|
274
|
+
}
|
|
275
|
+
if (target.draft === true) {
|
|
276
|
+
return GitHubReconcileSkip.make({
|
|
277
|
+
targetId: target.id,
|
|
278
|
+
reason: `GitHub release ${githubReleaseTag(plan)} already matches the draft target.`
|
|
279
|
+
});
|
|
280
|
+
}
|
|
281
|
+
return GitHubReconcilePublishDraft.make({
|
|
282
|
+
targetId: target.id,
|
|
283
|
+
reason: `GitHub release ${githubReleaseTag(plan)} is a matching draft and can be published.`
|
|
284
|
+
});
|
|
285
|
+
}
|
|
286
|
+
case "GitHubReleasePublished": {
|
|
287
|
+
const reasons = [...existingMismatchReasons(target, plan, state)];
|
|
288
|
+
if (target.draft === true) {
|
|
289
|
+
reasons.push("GitHub release is public, but the target expects a draft.");
|
|
290
|
+
}
|
|
291
|
+
if (reasons.length > 0) {
|
|
292
|
+
return blockDecision(target, reasons);
|
|
293
|
+
}
|
|
294
|
+
return GitHubReconcileSkip.make({
|
|
295
|
+
targetId: target.id,
|
|
296
|
+
reason: `GitHub release ${githubReleaseTag(plan)} already matches the target.`
|
|
297
|
+
});
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
};
|
|
301
|
+
const operationForDecision = (target, plan, decision) => {
|
|
302
|
+
switch (decision._tag) {
|
|
303
|
+
case "GitHubReconcileCreateRelease":
|
|
304
|
+
return githubReleaseReconcileCreateOperation(target, plan);
|
|
305
|
+
case "GitHubReconcilePublishDraft":
|
|
306
|
+
return githubReleasePublishDraftOperation(target, plan);
|
|
307
|
+
case "GitHubReconcileSkip":
|
|
308
|
+
case "GitHubReconcileBlock":
|
|
309
|
+
return undefined;
|
|
310
|
+
}
|
|
311
|
+
};
|
|
312
|
+
const failBlockedDecision = (decision) => Effect.fail(ReconciliationBlockedError.make({
|
|
313
|
+
targetId: decision.targetId,
|
|
314
|
+
reasons: decision.reasons
|
|
315
|
+
}));
|
|
316
|
+
export const reconcileReleasePlan = Effect.fn("reconcileReleasePlan")(function* (plan, options) {
|
|
317
|
+
const operations = [];
|
|
318
|
+
for (const target of githubTargets(plan)) {
|
|
319
|
+
const state = yield* inspectGitHubReleaseState(target, plan);
|
|
320
|
+
const decision = decideGitHubReleaseReconciliation(target, plan, state);
|
|
321
|
+
if (decision._tag === "GitHubReconcileBlock") {
|
|
322
|
+
return yield* failBlockedDecision(decision);
|
|
323
|
+
}
|
|
324
|
+
const operation = operationForDecision(target, plan, decision);
|
|
325
|
+
if (operation !== undefined) {
|
|
326
|
+
operations.push(operation);
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
if (operations.length === 0) {
|
|
330
|
+
return emptyEvidenceBundle(plan);
|
|
331
|
+
}
|
|
332
|
+
return yield* runOperations(plan, operations, ExecutionApproval.make({
|
|
333
|
+
execute: options.execute,
|
|
334
|
+
approveIrreversible: false
|
|
335
|
+
}));
|
|
336
|
+
});
|
|
337
|
+
//# sourceMappingURL=reconcile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reconcile.js","sourceRoot":"","sources":["../../src/planner/reconcile.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import * as Effect from "effect/Effect";
|
|
2
|
+
import * as Schema from "effect/Schema";
|
|
3
|
+
import { ReleaseEligibilityDecision, ReleaseEligibilityInput } from "../domain/remote-state.js";
|
|
4
|
+
import { ReleaseIntent } from "../domain/release.js";
|
|
5
|
+
import { ReleaseCommandRunner } from "../host/host.js";
|
|
6
|
+
import { ReleaseEligibilityCheckError } from "./errors.js";
|
|
7
|
+
export type * from "../types/effect-internal.js";
|
|
8
|
+
declare const ReleasePackageManifest_base: Schema.Class<ReleasePackageManifest, Schema.Struct<{
|
|
9
|
+
readonly name: Schema.String;
|
|
10
|
+
readonly version: Schema.String;
|
|
11
|
+
}>, {}>;
|
|
12
|
+
export declare class ReleasePackageManifest extends ReleasePackageManifest_base {
|
|
13
|
+
}
|
|
14
|
+
declare const ReleaseEligibilityRemoteCheck_base: Schema.Class<ReleaseEligibilityRemoteCheck, Schema.Struct<{
|
|
15
|
+
readonly packageName: Schema.String;
|
|
16
|
+
readonly packageVersion: Schema.String;
|
|
17
|
+
readonly npmTargetId: Schema.String;
|
|
18
|
+
readonly npmRegistry: Schema.String;
|
|
19
|
+
readonly githubTargetId: Schema.String;
|
|
20
|
+
readonly githubRepository: Schema.String;
|
|
21
|
+
readonly githubTag: Schema.String;
|
|
22
|
+
readonly githubTokenEnv: Schema.optionalKey<Schema.String>;
|
|
23
|
+
readonly expectedGithubDraft: Schema.Boolean;
|
|
24
|
+
}>, {}>;
|
|
25
|
+
export declare class ReleaseEligibilityRemoteCheck extends ReleaseEligibilityRemoteCheck_base {
|
|
26
|
+
}
|
|
27
|
+
export declare const decideReleaseEligibility: (input: ReleaseEligibilityInput) => ReleaseEligibilityDecision;
|
|
28
|
+
export declare const releaseEligibilityRemoteCheckFromIntent: (manifest: ReleasePackageManifest, intent: ReleaseIntent) => Effect.Effect<ReleaseEligibilityRemoteCheck, ReleaseEligibilityCheckError, never>;
|
|
29
|
+
export declare const classifyNpmRemoteState: (input: ReleaseEligibilityRemoteCheck) => Effect.Effect<"missing" | "published", import("../host/host.js").CommandRunnerError | ReleaseEligibilityCheckError, ReleaseCommandRunner>;
|
|
30
|
+
export declare const classifyGitHubReleaseAvailability: (input: ReleaseEligibilityRemoteCheck) => Effect.Effect<"missing" | "published" | "draft", import("../host/host.js").CommandRunnerError | ReleaseEligibilityCheckError, ReleaseCommandRunner>;
|
|
31
|
+
export declare const checkReleaseEligibility: (input: ReleaseEligibilityRemoteCheck) => Effect.Effect<ReleaseEligibilityDecision, import("../host/host.js").CommandRunnerError | ReleaseEligibilityCheckError, ReleaseCommandRunner>;
|
|
32
|
+
export declare const renderReleaseEligibilityText: (decision: ReleaseEligibilityDecision) => string;
|
|
33
|
+
export declare const renderReleaseEligibilityJson: (decision: ReleaseEligibilityDecision) => string;
|
|
34
|
+
//# sourceMappingURL=release-eligibility.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"release-eligibility.d.ts","sourceRoot":"","sources":["../../src/planner/release-eligibility.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAEvC,OAAO,EAGL,0BAA0B,EAC1B,uBAAuB,EACxB,MAAM,2BAA2B,CAAA;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAEpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAA;AACtD,OAAO,EAAE,4BAA4B,EAAE,MAAM,aAAa,CAAA;AAE1D,mBAAmB,6BAA6B,CAAA;;;;;AAEhD,qBAAa,sBAAuB,SAAQ,2BAG1C;CAAG;;;;;;;;;;;;AAEL,qBAAa,6BAA8B,SAAQ,kCAYjD;CAAG;AAgBL,eAAO,MAAM,wBAAwB,GACnC,OAAO,uBAAuB,KAC7B,0BAwCF,CAAA;AA8BD,eAAO,MAAM,uCAAuC,gJAqClD,CAAA;AAkEF,eAAO,MAAM,sBAAsB,qLAiBjC,CAAA;AAEF,eAAO,MAAM,iCAAiC,+LAiB5C,CAAA;AAEF,eAAO,MAAM,uBAAuB,wLAclC,CAAA;AAEF,eAAO,MAAM,4BAA4B,GAAI,UAAU,0BAA0B,KAAG,MACkD,CAAA;AAEtI,eAAO,MAAM,4BAA4B,GAAI,UAAU,0BAA0B,KAAG,MAC1C,CAAA"}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import * as Effect from "effect/Effect";
|
|
2
|
+
import * as Schema from "effect/Schema";
|
|
3
|
+
import { CommandSpec } from "../domain/operation.js";
|
|
4
|
+
import { ReleaseEligibilityDecision, ReleaseEligibilityInput } from "../domain/remote-state.js";
|
|
5
|
+
import { ReleaseCommandRunner } from "../host/host.js";
|
|
6
|
+
import { ReleaseEligibilityCheckError } from "./errors.js";
|
|
7
|
+
export class ReleasePackageManifest extends Schema.Class("ReleasePackageManifest")({
|
|
8
|
+
name: Schema.String,
|
|
9
|
+
version: Schema.String
|
|
10
|
+
}) {
|
|
11
|
+
}
|
|
12
|
+
export class ReleaseEligibilityRemoteCheck extends Schema.Class("ReleaseEligibilityRemoteCheck")({
|
|
13
|
+
packageName: Schema.String,
|
|
14
|
+
packageVersion: Schema.String,
|
|
15
|
+
npmTargetId: Schema.String,
|
|
16
|
+
npmRegistry: Schema.String,
|
|
17
|
+
githubTargetId: Schema.String,
|
|
18
|
+
githubRepository: Schema.String,
|
|
19
|
+
githubTag: Schema.String,
|
|
20
|
+
githubTokenEnv: Schema.optionalKey(Schema.String),
|
|
21
|
+
expectedGithubDraft: Schema.Boolean
|
|
22
|
+
}) {
|
|
23
|
+
}
|
|
24
|
+
class GitHubCliReleaseViewResponse extends Schema.Class("GitHubCliReleaseViewResponse")({
|
|
25
|
+
isDraft: Schema.Boolean
|
|
26
|
+
}) {
|
|
27
|
+
}
|
|
28
|
+
const decodeGitHubCliReleaseViewResponse = Schema.decodeUnknownEffect(GitHubCliReleaseViewResponse);
|
|
29
|
+
const releaseLabel = (input) => `${input.packageName}@${input.packageVersion}`;
|
|
30
|
+
const expectedGithubState = (input) => input.expectedGithubDraft ? "draft" : "published";
|
|
31
|
+
export const decideReleaseEligibility = (input) => {
|
|
32
|
+
if (input.npm === "missing" && input.github === "missing") {
|
|
33
|
+
return ReleaseEligibilityDecision.make({
|
|
34
|
+
shouldRelease: true,
|
|
35
|
+
status: "ready",
|
|
36
|
+
reason: `${releaseLabel(input)} is missing from npm and GitHub.`
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
const expectedGithub = expectedGithubState(input);
|
|
40
|
+
if (input.npm === "published" && input.github === expectedGithub) {
|
|
41
|
+
return ReleaseEligibilityDecision.make({
|
|
42
|
+
shouldRelease: false,
|
|
43
|
+
status: "complete",
|
|
44
|
+
reason: `${releaseLabel(input)} is already published to npm and GitHub.`
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
if (input.npm === "published" && input.github === "draft" && !input.expectedGithubDraft) {
|
|
48
|
+
return ReleaseEligibilityDecision.make({
|
|
49
|
+
shouldRelease: false,
|
|
50
|
+
status: "partial",
|
|
51
|
+
reason: `${releaseLabel(input)} is published to npm, but GitHub release v${input.packageVersion} is still a draft.`
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
if (input.npm === "published" && input.github === "published" && input.expectedGithubDraft) {
|
|
55
|
+
return ReleaseEligibilityDecision.make({
|
|
56
|
+
shouldRelease: false,
|
|
57
|
+
status: "partial",
|
|
58
|
+
reason: `${releaseLabel(input)} is published to npm, but GitHub release v${input.packageVersion} is public while the target expects a draft.`
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
return ReleaseEligibilityDecision.make({
|
|
62
|
+
shouldRelease: false,
|
|
63
|
+
status: "partial",
|
|
64
|
+
reason: `${releaseLabel(input)} has partial remote state: npm=${input.npm}, github=${input.github}, expected-github=${expectedGithub}.`
|
|
65
|
+
});
|
|
66
|
+
};
|
|
67
|
+
const eligibilityError = (reason, targetId) => ReleaseEligibilityCheckError.make({
|
|
68
|
+
...(targetId === undefined ? {} : { targetId }),
|
|
69
|
+
reason
|
|
70
|
+
});
|
|
71
|
+
const findNpmTarget = (intent, packageName) => intent.targets.find((target) => target._tag === "NpmRegistryTarget" && target.packageName === packageName);
|
|
72
|
+
const findNpmTargetById = (intent, targetId) => intent.targets.find((target) => target._tag === "NpmRegistryTarget" && target.id === targetId);
|
|
73
|
+
const findGitHubTarget = (intent) => intent.targets.find((target) => target._tag === "GitHubReleaseTarget");
|
|
74
|
+
export const releaseEligibilityRemoteCheckFromIntent = Effect.fn("releaseEligibilityRemoteCheckFromIntent")(function* (manifest, intent) {
|
|
75
|
+
const npmTarget = findNpmTarget(intent, manifest.name);
|
|
76
|
+
if (npmTarget === undefined) {
|
|
77
|
+
const npmTargetById = findNpmTargetById(intent, "npm");
|
|
78
|
+
if (npmTargetById !== undefined) {
|
|
79
|
+
return yield* Effect.fail(eligibilityError(`npm target ${npmTargetById.id} packageName ${npmTargetById.packageName} does not match package manifest ${manifest.name}.`, npmTargetById.id));
|
|
80
|
+
}
|
|
81
|
+
return yield* Effect.fail(eligibilityError(`release config must include an npm target for ${manifest.name}`));
|
|
82
|
+
}
|
|
83
|
+
const githubTarget = findGitHubTarget(intent);
|
|
84
|
+
if (githubTarget === undefined) {
|
|
85
|
+
return yield* Effect.fail(eligibilityError("release config must include a GitHub release target"));
|
|
86
|
+
}
|
|
87
|
+
return ReleaseEligibilityRemoteCheck.make({
|
|
88
|
+
packageName: manifest.name,
|
|
89
|
+
packageVersion: manifest.version,
|
|
90
|
+
npmTargetId: npmTarget.id,
|
|
91
|
+
npmRegistry: npmTarget.registry,
|
|
92
|
+
githubTargetId: githubTarget.id,
|
|
93
|
+
githubRepository: githubTarget.repository,
|
|
94
|
+
githubTag: intent.identity.tag ?? intent.identity.version,
|
|
95
|
+
...(githubTarget.tokenEnv === undefined ? {} : { githubTokenEnv: githubTarget.tokenEnv }),
|
|
96
|
+
expectedGithubDraft: githubTarget.draft ?? false
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
const looksMissing = (stdout, stderr) => {
|
|
100
|
+
const text = `${stdout}\n${stderr}`.toLowerCase();
|
|
101
|
+
return text.includes("not found") || text.includes("404") || text.includes("e404");
|
|
102
|
+
};
|
|
103
|
+
const firstDiagnosticLine = (result) => {
|
|
104
|
+
const lines = `${result.stderr}\n${result.stdout}`
|
|
105
|
+
.split(/\r?\n/)
|
|
106
|
+
.map((line) => line.trim())
|
|
107
|
+
.filter((line) => line.length > 0);
|
|
108
|
+
return lines[0] ?? `exit code ${result.exitCode}`;
|
|
109
|
+
};
|
|
110
|
+
const npmViewCommand = (input) => CommandSpec.make({
|
|
111
|
+
executable: "npm",
|
|
112
|
+
args: [
|
|
113
|
+
"view",
|
|
114
|
+
`${input.packageName}@${input.packageVersion}`,
|
|
115
|
+
"version",
|
|
116
|
+
"--registry",
|
|
117
|
+
input.npmRegistry
|
|
118
|
+
],
|
|
119
|
+
requiredEnv: [],
|
|
120
|
+
redactedEnv: []
|
|
121
|
+
});
|
|
122
|
+
const githubReleaseViewCommand = (input) => CommandSpec.make({
|
|
123
|
+
executable: "gh",
|
|
124
|
+
args: [
|
|
125
|
+
"release",
|
|
126
|
+
"view",
|
|
127
|
+
input.githubTag,
|
|
128
|
+
"--repo",
|
|
129
|
+
input.githubRepository,
|
|
130
|
+
"--json",
|
|
131
|
+
"isDraft,tagName,publishedAt"
|
|
132
|
+
],
|
|
133
|
+
requiredEnv: input.githubTokenEnv === undefined ? [] : [input.githubTokenEnv],
|
|
134
|
+
redactedEnv: input.githubTokenEnv === undefined ? [] : [input.githubTokenEnv]
|
|
135
|
+
});
|
|
136
|
+
const parseGitHubCliReleaseView = Effect.fn("parseGitHubCliReleaseView")(function* (input, stdout) {
|
|
137
|
+
const parsed = yield* Effect.try({
|
|
138
|
+
try: () => JSON.parse(stdout),
|
|
139
|
+
catch: (cause) => eligibilityError(cause instanceof Error ? cause.message : String(cause), input.githubTargetId)
|
|
140
|
+
});
|
|
141
|
+
const response = yield* decodeGitHubCliReleaseViewResponse(parsed).pipe(Effect.mapError((error) => eligibilityError(`gh release view returned malformed JSON: ${error.message}`, input.githubTargetId)));
|
|
142
|
+
return response.isDraft ? "draft" : "published";
|
|
143
|
+
});
|
|
144
|
+
export const classifyNpmRemoteState = Effect.fn("classifyNpmRemoteState")(function* (input) {
|
|
145
|
+
const commandRunner = yield* ReleaseCommandRunner;
|
|
146
|
+
const result = yield* commandRunner.runCommand(npmViewCommand(input));
|
|
147
|
+
if (result.exitCode === 0) {
|
|
148
|
+
return "published";
|
|
149
|
+
}
|
|
150
|
+
if (looksMissing(result.stdout, result.stderr)) {
|
|
151
|
+
return "missing";
|
|
152
|
+
}
|
|
153
|
+
return yield* Effect.fail(eligibilityError(`npm view failed while checking package state: ${firstDiagnosticLine(result)}`, input.npmTargetId));
|
|
154
|
+
});
|
|
155
|
+
export const classifyGitHubReleaseAvailability = Effect.fn("classifyGitHubReleaseAvailability")(function* (input) {
|
|
156
|
+
const commandRunner = yield* ReleaseCommandRunner;
|
|
157
|
+
const result = yield* commandRunner.runCommand(githubReleaseViewCommand(input));
|
|
158
|
+
if (result.exitCode === 0) {
|
|
159
|
+
return yield* parseGitHubCliReleaseView(input, result.stdout);
|
|
160
|
+
}
|
|
161
|
+
if (looksMissing(result.stdout, result.stderr)) {
|
|
162
|
+
return "missing";
|
|
163
|
+
}
|
|
164
|
+
return yield* Effect.fail(eligibilityError(`gh release view failed while checking release state: ${firstDiagnosticLine(result)}`, input.githubTargetId));
|
|
165
|
+
});
|
|
166
|
+
export const checkReleaseEligibility = Effect.fn("checkReleaseEligibility")(function* (input) {
|
|
167
|
+
const npm = yield* classifyNpmRemoteState(input);
|
|
168
|
+
const github = yield* classifyGitHubReleaseAvailability(input);
|
|
169
|
+
return decideReleaseEligibility(ReleaseEligibilityInput.make({
|
|
170
|
+
packageName: input.packageName,
|
|
171
|
+
packageVersion: input.packageVersion,
|
|
172
|
+
expectedGithubDraft: input.expectedGithubDraft,
|
|
173
|
+
npm,
|
|
174
|
+
github
|
|
175
|
+
}));
|
|
176
|
+
});
|
|
177
|
+
export const renderReleaseEligibilityText = (decision) => `release eligibility status=${decision.status} should-release=${decision.shouldRelease} reason=${JSON.stringify(decision.reason)}\n`;
|
|
178
|
+
export const renderReleaseEligibilityJson = (decision) => `${JSON.stringify(decision, null, 2)}\n`;
|
|
179
|
+
//# sourceMappingURL=release-eligibility.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"release-eligibility.js","sourceRoot":"","sources":["../../src/planner/release-eligibility.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,15 @@
|
|
|
1
|
+
import * as Effect from "effect/Effect";
|
|
2
|
+
import * as Schema from "effect/Schema";
|
|
1
3
|
import { ReleasePlan } from "../domain/release.js";
|
|
2
4
|
export type * from "../types/effect-internal.js";
|
|
5
|
+
declare const PlanOperationNotFoundError_base: Schema.Class<PlanOperationNotFoundError, Schema.TaggedStruct<"PlanOperationNotFoundError", {
|
|
6
|
+
readonly operationId: Schema.String;
|
|
7
|
+
}>, import("effect/Cause").YieldableError>;
|
|
8
|
+
export declare class PlanOperationNotFoundError extends PlanOperationNotFoundError_base {
|
|
9
|
+
}
|
|
3
10
|
export declare const renderPlanJson: (plan: ReleasePlan) => string;
|
|
4
11
|
export declare const renderPlanText: (plan: ReleasePlan) => string;
|
|
12
|
+
export declare const renderPlanSummary: (plan: ReleasePlan) => string;
|
|
13
|
+
export declare const renderPlanMarkdown: (plan: ReleasePlan) => string;
|
|
14
|
+
export declare const renderPlanOperationExplanation: (plan: ReleasePlan, operationId: string) => Effect.Effect<string, PlanOperationNotFoundError, never>;
|
|
5
15
|
//# sourceMappingURL=render-plan.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render-plan.d.ts","sourceRoot":"","sources":["../../src/planner/render-plan.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"render-plan.d.ts","sourceRoot":"","sources":["../../src/planner/render-plan.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAEvC,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAElD,mBAAmB,6BAA6B,CAAA;;;;AAEhD,qBAAa,0BAA2B,SAAQ,+BAK/C;CAAG;AAsFJ,eAAO,MAAM,cAAc,GAAI,MAAM,WAAW,KAAG,MACb,CAAA;AAEtC,eAAO,MAAM,cAAc,GAAI,MAAM,WAAW,KAAG,MAoDlD,CAAA;AAED,eAAO,MAAM,iBAAiB,GAAI,MAAM,WAAW,KAAG,MA0CrD,CAAA;AAED,eAAO,MAAM,kBAAkB,GAAI,MAAM,WAAW,KAAG,MAiDtD,CAAA;AA2BD,eAAO,MAAM,8BAA8B,sGASzC,CAAA"}
|