@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.
Files changed (162) hide show
  1. package/ARCHITECTURE.md +93 -0
  2. package/README.md +282 -49
  3. package/SPEC.md +46 -9
  4. package/dist/config/schema.d.ts +4 -0
  5. package/dist/config/schema.d.ts.map +1 -1
  6. package/dist/config/schema.js +13 -0
  7. package/dist/config/schema.js.map +1 -1
  8. package/dist/domain/evidence.d.ts +4 -0
  9. package/dist/domain/evidence.d.ts.map +1 -1
  10. package/dist/domain/evidence.js +4 -0
  11. package/dist/domain/evidence.js.map +1 -1
  12. package/dist/domain/operation.d.ts +1 -0
  13. package/dist/domain/operation.d.ts.map +1 -1
  14. package/dist/domain/operation.js +147 -1
  15. package/dist/domain/operation.js.map +1 -1
  16. package/dist/domain/release.d.ts +1 -0
  17. package/dist/domain/release.d.ts.map +1 -1
  18. package/dist/domain/release.js +1 -0
  19. package/dist/domain/release.js.map +1 -1
  20. package/dist/domain/remote-state.d.ts +90 -0
  21. package/dist/domain/remote-state.d.ts.map +1 -0
  22. package/dist/domain/remote-state.js +85 -0
  23. package/dist/domain/remote-state.js.map +1 -0
  24. package/dist/domain/status.d.ts +43 -0
  25. package/dist/domain/status.d.ts.map +1 -0
  26. package/dist/domain/status.js +50 -0
  27. package/dist/domain/status.js.map +1 -0
  28. package/dist/domain/target.d.ts +32 -2
  29. package/dist/domain/target.d.ts.map +1 -1
  30. package/dist/domain/target.js +35 -2
  31. package/dist/domain/target.js.map +1 -1
  32. package/dist/host/host.d.ts +7 -23
  33. package/dist/host/host.d.ts.map +1 -1
  34. package/dist/host/host.js +3 -22
  35. package/dist/host/host.js.map +1 -1
  36. package/dist/host/http-live.d.ts +1 -2
  37. package/dist/host/http-live.d.ts.map +1 -1
  38. package/dist/host/http-live.js +18 -9
  39. package/dist/host/http-live.js.map +1 -1
  40. package/dist/host/http.d.ts +3 -1
  41. package/dist/host/http.d.ts.map +1 -1
  42. package/dist/host/http.js +3 -1
  43. package/dist/host/http.js.map +1 -1
  44. package/dist/host/platform.d.ts +10 -0
  45. package/dist/host/platform.d.ts.map +1 -0
  46. package/dist/host/platform.js +121 -0
  47. package/dist/host/platform.js.map +1 -0
  48. package/dist/host/test.d.ts +7 -3
  49. package/dist/host/test.d.ts.map +1 -1
  50. package/dist/host/test.js +128 -25
  51. package/dist/host/test.js.map +1 -1
  52. package/dist/internal/workspace-path.d.ts +16 -0
  53. package/dist/internal/workspace-path.d.ts.map +1 -0
  54. package/dist/internal/workspace-path.js +33 -0
  55. package/dist/internal/workspace-path.js.map +1 -0
  56. package/dist/planner/artifact-inventory.d.ts +9 -0
  57. package/dist/planner/artifact-inventory.d.ts.map +1 -0
  58. package/dist/planner/artifact-inventory.js +85 -0
  59. package/dist/planner/artifact-inventory.js.map +1 -0
  60. package/dist/planner/create-release-plan.d.ts +1 -1
  61. package/dist/planner/create-release-plan.d.ts.map +1 -1
  62. package/dist/planner/errors.d.ts +37 -1
  63. package/dist/planner/errors.d.ts.map +1 -1
  64. package/dist/planner/errors.js +30 -0
  65. package/dist/planner/errors.js.map +1 -1
  66. package/dist/planner/evidence-recorder.d.ts +13 -8
  67. package/dist/planner/evidence-recorder.d.ts.map +1 -1
  68. package/dist/planner/evidence-recorder.js +116 -18
  69. package/dist/planner/evidence-recorder.js.map +1 -1
  70. package/dist/planner/executor.d.ts +31 -19
  71. package/dist/planner/executor.d.ts.map +1 -1
  72. package/dist/planner/executor.js +52 -7
  73. package/dist/planner/executor.js.map +1 -1
  74. package/dist/planner/normalize-release.d.ts +2 -2
  75. package/dist/planner/normalize-release.d.ts.map +1 -1
  76. package/dist/planner/normalize-release.js +50 -52
  77. package/dist/planner/normalize-release.js.map +1 -1
  78. package/dist/planner/reconcile.d.ts +17 -0
  79. package/dist/planner/reconcile.d.ts.map +1 -0
  80. package/dist/planner/reconcile.js +337 -0
  81. package/dist/planner/reconcile.js.map +1 -0
  82. package/dist/planner/release-eligibility.d.ts +34 -0
  83. package/dist/planner/release-eligibility.d.ts.map +1 -0
  84. package/dist/planner/release-eligibility.js +179 -0
  85. package/dist/planner/release-eligibility.js.map +1 -0
  86. package/dist/planner/render-plan.d.ts +10 -0
  87. package/dist/planner/render-plan.d.ts.map +1 -1
  88. package/dist/planner/render-plan.js +179 -0
  89. package/dist/planner/render-plan.js.map +1 -1
  90. package/dist/planner/status.d.ts +40 -0
  91. package/dist/planner/status.d.ts.map +1 -0
  92. package/dist/planner/status.js +342 -0
  93. package/dist/planner/status.js.map +1 -0
  94. package/dist/targets/github.d.ts.map +1 -1
  95. package/dist/targets/github.js +28 -13
  96. package/dist/targets/github.js.map +1 -1
  97. package/dist/targets/npm.d.ts +2 -2
  98. package/dist/targets/npm.d.ts.map +1 -1
  99. package/dist/targets/npm.js +74 -14
  100. package/dist/targets/npm.js.map +1 -1
  101. package/dist/workflows/config.d.ts +153 -0
  102. package/dist/workflows/config.d.ts.map +1 -0
  103. package/dist/workflows/config.js +301 -0
  104. package/dist/workflows/config.js.map +1 -0
  105. package/dist/workflows/diagnostics.d.ts +62 -0
  106. package/dist/workflows/diagnostics.d.ts.map +1 -0
  107. package/dist/workflows/diagnostics.js +474 -0
  108. package/dist/workflows/diagnostics.js.map +1 -0
  109. package/dist/workflows/evidence.d.ts +21 -0
  110. package/dist/workflows/evidence.d.ts.map +1 -0
  111. package/dist/workflows/evidence.js +45 -0
  112. package/dist/workflows/evidence.js.map +1 -0
  113. package/dist/workflows/index.d.ts +7 -0
  114. package/dist/workflows/index.d.ts.map +1 -0
  115. package/dist/workflows/index.js +6 -0
  116. package/dist/workflows/index.js.map +1 -0
  117. package/dist/workflows/init.d.ts +71 -0
  118. package/dist/workflows/init.d.ts.map +1 -0
  119. package/dist/workflows/init.js +384 -0
  120. package/dist/workflows/init.js.map +1 -0
  121. package/dist/workflows/live.d.ts +9 -0
  122. package/dist/workflows/live.d.ts.map +1 -0
  123. package/dist/workflows/live.js +7 -0
  124. package/dist/workflows/live.js.map +1 -0
  125. package/dist/workflows/options.d.ts +30 -0
  126. package/dist/workflows/options.d.ts.map +1 -0
  127. package/dist/workflows/options.js +16 -0
  128. package/dist/workflows/options.js.map +1 -0
  129. package/examples/README.md +16 -9
  130. package/examples/github-release/release.config.json +1 -0
  131. package/examples/homebrew-tap/release.config.json +1 -0
  132. package/examples/multi-target/release.config.json +10 -1
  133. package/examples/non-strict-skips/release.config.json +1 -0
  134. package/examples/npm-first-publish/release.config.json +33 -0
  135. package/examples/npm-only/release.config.json +10 -1
  136. package/examples/pypi-registry/release.config.json +1 -0
  137. package/examples/scoop-bucket/release.config.json +1 -0
  138. package/package.json +56 -27
  139. package/templates/README.md +54 -0
  140. package/templates/github-actions/plan-and-approved-execute.yml +53 -0
  141. package/templates/github-actions/plan-only.yml +30 -0
  142. package/templates/github-actions/trusted-publishing.yml +59 -0
  143. package/templates/multi-target-homebrew/release.config.json +70 -0
  144. package/templates/multi-target-scoop/release.config.json +72 -0
  145. package/templates/npm-github/release.config.json +50 -0
  146. package/templates/npm-only/release.config.json +39 -0
  147. package/dist/cli/command.d.ts +0 -4
  148. package/dist/cli/command.d.ts.map +0 -1
  149. package/dist/cli/command.js +0 -125
  150. package/dist/cli/command.js.map +0 -1
  151. package/dist/cli/main.d.ts +0 -3
  152. package/dist/cli/main.d.ts.map +0 -1
  153. package/dist/cli/main.js +0 -15
  154. package/dist/cli/main.js.map +0 -1
  155. package/dist/cli/programmatic.d.ts +0 -25
  156. package/dist/cli/programmatic.d.ts.map +0 -1
  157. package/dist/cli/programmatic.js +0 -53
  158. package/dist/cli/programmatic.js.map +0 -1
  159. package/dist/host/bun.d.ts +0 -9
  160. package/dist/host/bun.d.ts.map +0 -1
  161. package/dist/host/bun.js +0 -156
  162. package/dist/host/bun.js.map +0 -1
@@ -0,0 +1,474 @@
1
+ import * as Config from "effect/Config";
2
+ import * as Effect from "effect/Effect";
3
+ import * as FileSystem from "effect/FileSystem";
4
+ import * as Option from "effect/Option";
5
+ import * as Path from "effect/Path";
6
+ import * as Schema from "effect/Schema";
7
+ import { PlanReleaseConfigOptions, planReleaseConfig, ValidateReleaseConfigFileOptions, validateReleaseConfigFile } from "./config.js";
8
+ import { releaseConfigFields, releaseFormatField } from "./options.js";
9
+ export const ReleaseDiagnosticStatus = Schema.Literals(["ok", "warn", "fail", "info"]);
10
+ export const ReleaseDiagnosticConfidence = Schema.Literals(["confirmed", "inferred", "not-checked"]);
11
+ export const ReleaseDiagnosticsFormat = Schema.Literals(["json", "text", "markdown"]);
12
+ export const ReleaseCiProvider = Schema.Literals(["github-actions"]);
13
+ export class ReleaseDiagnosticCheck extends Schema.Class("ReleaseDiagnosticCheck")({
14
+ id: Schema.String,
15
+ targetId: Schema.optionalKey(Schema.String),
16
+ status: ReleaseDiagnosticStatus,
17
+ confidence: ReleaseDiagnosticConfidence,
18
+ message: Schema.String
19
+ }) {
20
+ }
21
+ export class ReleaseDiagnosticReport extends Schema.Class("ReleaseDiagnosticReport")({
22
+ schemaVersion: Schema.Literal("release-diagnostics/v1"),
23
+ releaseName: Schema.String,
24
+ releaseVersion: Schema.String,
25
+ checks: Schema.Array(ReleaseDiagnosticCheck)
26
+ }) {
27
+ }
28
+ export class ReleaseDiagnosticsOptions extends Schema.Class("ReleaseDiagnosticsOptions")({
29
+ root: Schema.optionalKey(Schema.String),
30
+ configPath: Schema.optionalKey(Schema.String),
31
+ target: Schema.optionalKey(Schema.String),
32
+ provider: Schema.optionalKey(ReleaseCiProvider),
33
+ workflow: Schema.optionalKey(Schema.String),
34
+ format: Schema.optionalKey(ReleaseDiagnosticsFormat),
35
+ missingCiIsNotChecked: Schema.optionalKey(Schema.Boolean)
36
+ }) {
37
+ }
38
+ const releaseDiagnosticsOptionsFromInput = (input = {}) => ReleaseDiagnosticsOptions.make({
39
+ ...releaseConfigFields(input),
40
+ ...(input.target === undefined ? {} : { target: input.target }),
41
+ ...(input.provider === undefined ? {} : { provider: input.provider }),
42
+ ...(input.workflow === undefined ? {} : { workflow: input.workflow }),
43
+ ...releaseFormatField(input),
44
+ ...(input.missingCiIsNotChecked === undefined ? {} : { missingCiIsNotChecked: input.missingCiIsNotChecked })
45
+ });
46
+ const formatUnknown = (cause) => cause instanceof Error ? cause.message : String(cause);
47
+ const readOptionalEnv = (name) => Config.string(name).pipe(Effect.option, Effect.map(Option.getOrUndefined));
48
+ const envExists = Effect.fn("diagnostics.envExists")(function* (name) {
49
+ const value = yield* readOptionalEnv(name);
50
+ return value !== undefined;
51
+ });
52
+ const check = (input) => ReleaseDiagnosticCheck.make({
53
+ id: input.id,
54
+ ...(input.targetId === undefined ? {} : { targetId: input.targetId }),
55
+ status: input.status,
56
+ confidence: input.confidence,
57
+ message: input.message
58
+ });
59
+ const reportForPlan = (plan, checks) => ReleaseDiagnosticReport.make({
60
+ schemaVersion: "release-diagnostics/v1",
61
+ releaseName: plan.identity.name,
62
+ releaseVersion: plan.identity.version,
63
+ checks: [...checks]
64
+ });
65
+ const plannedFailure = (message) => ({
66
+ _tag: "Failed",
67
+ message
68
+ });
69
+ const plannedSuccess = (plan) => ({
70
+ _tag: "Ok",
71
+ plan
72
+ });
73
+ const targetMatches = (target, filter) => filter === undefined ||
74
+ target.id === filter ||
75
+ target._tag.toLowerCase().includes(filter.toLowerCase());
76
+ const operationsForTarget = (plan, targetId) => plan.operations.filter((operation) => operation.targetId === targetId);
77
+ const commandEnvNames = (operations) => {
78
+ const names = new Set();
79
+ for (const operation of operations) {
80
+ if ("command" in operation) {
81
+ for (const name of operation.command.requiredEnv) {
82
+ names.add(name);
83
+ }
84
+ }
85
+ if (operation._tag === "VerifyHttpOperation") {
86
+ for (const name of operation.request.requiredEnv) {
87
+ names.add(name);
88
+ }
89
+ }
90
+ }
91
+ return [...names].sort();
92
+ };
93
+ const commandExecutables = (operations) => {
94
+ const names = new Set();
95
+ for (const operation of operations) {
96
+ if ("command" in operation) {
97
+ names.add(operation.command.executable);
98
+ }
99
+ }
100
+ return [...names].sort();
101
+ };
102
+ const authChecksForPlan = Effect.fn("diagnostics.authChecksForPlan")(function* (plan, targetFilter) {
103
+ const checks = [];
104
+ for (const target of plan.targets.filter((candidate) => targetMatches(candidate, targetFilter))) {
105
+ const capability = plan.targetCapabilities.find((candidate) => candidate.targetId === target.id);
106
+ const operations = operationsForTarget(plan, target.id);
107
+ if (capability?.authRequirement === "env-token") {
108
+ for (const name of commandEnvNames(operations)) {
109
+ const present = yield* envExists(name);
110
+ checks.push(check({
111
+ id: `${target.id}:env:${name}`,
112
+ targetId: target.id,
113
+ status: present ? "ok" : "fail",
114
+ confidence: "confirmed",
115
+ message: present
116
+ ? `${target.id} requires ${name}; the variable is present.`
117
+ : `${target.id} requires ${name}; the variable is missing.`
118
+ }));
119
+ }
120
+ continue;
121
+ }
122
+ if (capability?.authRequirement === "trusted-publishing") {
123
+ const hasOidcUrl = yield* envExists("ACTIONS_ID_TOKEN_REQUEST_URL");
124
+ const hasOidcToken = yield* envExists("ACTIONS_ID_TOKEN_REQUEST_TOKEN");
125
+ checks.push(check({
126
+ id: `${target.id}:trusted-publishing`,
127
+ targetId: target.id,
128
+ status: hasOidcUrl && hasOidcToken ? "ok" : "info",
129
+ confidence: hasOidcUrl && hasOidcToken ? "confirmed" : "inferred",
130
+ message: hasOidcUrl && hasOidcToken
131
+ ? `${target.id} has GitHub Actions OIDC request environment available.`
132
+ : `${target.id} uses npm trusted publishing; provider setup is confirmed only inside GitHub Actions.`
133
+ }));
134
+ if (capability.authSetup !== undefined) {
135
+ checks.push(check({
136
+ id: `${target.id}:trusted-publishing-setup`,
137
+ targetId: target.id,
138
+ status: "info",
139
+ confidence: "inferred",
140
+ message: `${target.id} expects workflow ${capability.authSetup.workflow}, ` +
141
+ `permissions ${capability.authSetup.requiredPermissions.map((permission) => `${permission.name}: ${permission.value}`).join(", ")}, ` +
142
+ `and prerequisites ${capability.authSetup.prerequisites.join(", ")}.`
143
+ }));
144
+ }
145
+ continue;
146
+ }
147
+ const executables = commandExecutables(operations);
148
+ checks.push(check({
149
+ id: `${target.id}:cli-auth`,
150
+ targetId: target.id,
151
+ status: "info",
152
+ confidence: "inferred",
153
+ message: executables.length === 0
154
+ ? `${target.id} has no command-line authentication checks in the plan.`
155
+ : `${target.id} expects local CLI/auth readiness for: ${executables.join(", ")}.`
156
+ }));
157
+ }
158
+ if (checks.length === 0) {
159
+ checks.push(check({
160
+ id: "auth:no-targets",
161
+ status: "info",
162
+ confidence: "not-checked",
163
+ message: targetFilter === undefined
164
+ ? "No release targets were found."
165
+ : `No release target matched ${targetFilter}.`
166
+ }));
167
+ }
168
+ return checks;
169
+ });
170
+ const basename = (pathName) => {
171
+ const parts = pathName.replaceAll("\\", "/").split("/");
172
+ return parts[parts.length - 1] ?? pathName;
173
+ };
174
+ const workspacePath = (path, root, pathName) => path.isAbsolute(pathName) ? pathName : path.resolve(root, pathName);
175
+ const configRoot = (path, options) => {
176
+ if (options.root !== undefined) {
177
+ return options.root;
178
+ }
179
+ if (options.configPath !== undefined && path.isAbsolute(options.configPath)) {
180
+ return path.dirname(options.configPath);
181
+ }
182
+ return ".";
183
+ };
184
+ const planOptionsFromDiagnostics = (options) => PlanReleaseConfigOptions.make(releaseConfigFields(options));
185
+ const validationOptionsFromDiagnostics = (options) => ValidateReleaseConfigFileOptions.make(releaseConfigFields(options));
186
+ const inferredTrustedPublishingWorkflow = (plan) => {
187
+ for (const target of plan.targets) {
188
+ if (target._tag === "NpmRegistryTarget" && target.trustedPublishing !== undefined) {
189
+ return target.trustedPublishing.workflow;
190
+ }
191
+ }
192
+ return undefined;
193
+ };
194
+ const defaultWorkflowPath = (plan) => {
195
+ const workflow = inferredTrustedPublishingWorkflow(plan);
196
+ return workflow === undefined ? undefined : `.github/workflows/${workflow}`;
197
+ };
198
+ const jobBlock = (contents, jobName) => {
199
+ const lines = contents.split(/\r?\n/);
200
+ const start = lines.findIndex((line) => line === ` ${jobName}:`);
201
+ if (start < 0) {
202
+ return undefined;
203
+ }
204
+ const collected = [];
205
+ for (let index = start; index < lines.length; index += 1) {
206
+ const line = lines[index] ?? "";
207
+ if (index > start && /^ [A-Za-z0-9_-]+:\s*$/.test(line)) {
208
+ break;
209
+ }
210
+ collected.push(line);
211
+ }
212
+ return collected.join("\n");
213
+ };
214
+ const hasPermission = (block, name, value) => {
215
+ const pattern = new RegExp(`^\\s+${name}:\\s*${value}\\s*$`, "m");
216
+ return pattern.test(block);
217
+ };
218
+ const hasUploadAlways = (block) => block.includes("actions/upload-artifact") && /^\s+if:\s*always\(\)\s*$/m.test(block);
219
+ const hasTsReleaseAction = (block) => /^\s+-\s+uses:\s+(mannyc2\/ts-release-action@v1|\.\/apps\/ts-release-action)\s*$/m.test(block);
220
+ const hasYamlValue = (block, name, value) => {
221
+ const escaped = value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
222
+ return new RegExp(`^\\s+${name}:\\s*["']?${escaped}["']?\\s*$`, "m").test(block);
223
+ };
224
+ const hasActionCommand = (block, command) => hasTsReleaseAction(block) && hasYamlValue(block, "command", command);
225
+ const hasActionTruthyInput = (block, name) => hasTsReleaseAction(block) && hasYamlValue(block, name, "true");
226
+ const hasCliPlanReview = (block) => block.includes("validate-config") && block.includes("--format markdown");
227
+ const hasActionPlanReview = (block) => hasActionCommand(block, "plan") && hasYamlValue(block, "format", "markdown");
228
+ const planJobExecutes = (block) => block.includes("--execute") ||
229
+ hasActionTruthyInput(block, "execute") ||
230
+ hasActionCommand(block, "run") ||
231
+ hasActionCommand(block, "resume") ||
232
+ hasActionCommand(block, "reconcile");
233
+ const hasCliApprovedExecution = (block) => block.includes("run") && block.includes("--execute") && block.includes("--approve-irreversible");
234
+ const hasActionApprovedExecution = (block) => hasActionCommand(block, "run") &&
235
+ hasActionTruthyInput(block, "execute") &&
236
+ hasActionTruthyInput(block, "approve-irreversible");
237
+ const hasWorkflowTrustedTarget = (plan) => plan.targets.some((target) => target._tag === "NpmRegistryTarget" && target.trustedPublishing !== undefined);
238
+ const hasGitHubReleaseTarget = (plan) => plan.targets.some((target) => target._tag === "GitHubReleaseTarget");
239
+ const ciChecksForContents = (plan, workflowPath, contents) => {
240
+ const checks = [
241
+ check({
242
+ id: "ci:workflow-file",
243
+ status: "ok",
244
+ confidence: "confirmed",
245
+ message: `Workflow file ${workflowPath} exists.`
246
+ })
247
+ ];
248
+ const expectedWorkflow = inferredTrustedPublishingWorkflow(plan);
249
+ if (expectedWorkflow !== undefined) {
250
+ const matches = basename(workflowPath) === expectedWorkflow;
251
+ checks.push(check({
252
+ id: "ci:workflow-name",
253
+ status: matches ? "ok" : "fail",
254
+ confidence: "confirmed",
255
+ message: matches
256
+ ? `Workflow filename matches trusted publishing workflow ${expectedWorkflow}.`
257
+ : `Workflow filename ${basename(workflowPath)} does not match trusted publishing workflow ${expectedWorkflow}.`
258
+ }));
259
+ }
260
+ const planJob = jobBlock(contents, "plan");
261
+ const executeJob = jobBlock(contents, "execute");
262
+ checks.push(check({
263
+ id: "ci:plan-job",
264
+ status: planJob === undefined ? "fail" : "ok",
265
+ confidence: "confirmed",
266
+ message: planJob === undefined ? "Workflow is missing a plan job." : "Workflow has a plan job."
267
+ }));
268
+ if (planJob !== undefined) {
269
+ const reviewReady = hasCliPlanReview(planJob) || hasActionPlanReview(planJob);
270
+ checks.push(check({
271
+ id: "ci:plan-job-no-execute",
272
+ status: planJobExecutes(planJob) ? "fail" : "ok",
273
+ confidence: "confirmed",
274
+ message: planJobExecutes(planJob)
275
+ ? "Plan job includes release execution."
276
+ : "Plan job does not execute release operations."
277
+ }));
278
+ checks.push(check({
279
+ id: "ci:plan-review",
280
+ status: reviewReady ? "ok" : "warn",
281
+ confidence: "confirmed",
282
+ message: reviewReady
283
+ ? "Plan job records a Markdown release plan."
284
+ : "Plan job should validate config and record a Markdown plan."
285
+ }));
286
+ checks.push(check({
287
+ id: "ci:plan-artifact",
288
+ status: hasUploadAlways(planJob) ? "ok" : "warn",
289
+ confidence: "confirmed",
290
+ message: hasUploadAlways(planJob)
291
+ ? "Plan job uploads review artifacts with if: always()."
292
+ : "Plan job should upload review artifacts with if: always()."
293
+ }));
294
+ }
295
+ checks.push(check({
296
+ id: "ci:execute-job",
297
+ status: executeJob === undefined ? "fail" : "ok",
298
+ confidence: "confirmed",
299
+ message: executeJob === undefined ? "Workflow is missing an execute job." : "Workflow has an execute job."
300
+ }));
301
+ if (executeJob !== undefined) {
302
+ checks.push(check({
303
+ id: "ci:execute-environment",
304
+ status: /^\s+environment:\s*\S+/m.test(executeJob) ? "ok" : "fail",
305
+ confidence: "confirmed",
306
+ message: /^\s+environment:\s*\S+/m.test(executeJob)
307
+ ? "Execute job is protected by a GitHub environment."
308
+ : "Execute job must configure a GitHub environment."
309
+ }));
310
+ if (hasWorkflowTrustedTarget(plan)) {
311
+ checks.push(check({
312
+ id: "ci:execute-id-token",
313
+ status: hasPermission(executeJob, "id-token", "write") ? "ok" : "fail",
314
+ confidence: "confirmed",
315
+ message: hasPermission(executeJob, "id-token", "write")
316
+ ? "Execute job grants id-token: write for trusted publishing."
317
+ : "Execute job must grant id-token: write for trusted publishing."
318
+ }));
319
+ }
320
+ if (hasGitHubReleaseTarget(plan)) {
321
+ checks.push(check({
322
+ id: "ci:execute-contents",
323
+ status: hasPermission(executeJob, "contents", "write") ? "ok" : "fail",
324
+ confidence: "confirmed",
325
+ message: hasPermission(executeJob, "contents", "write")
326
+ ? "Execute job grants contents: write for GitHub Releases."
327
+ : "Execute job must grant contents: write for GitHub Releases."
328
+ }));
329
+ }
330
+ checks.push(check({
331
+ id: "ci:execute-approval",
332
+ status: hasCliApprovedExecution(executeJob) || hasActionApprovedExecution(executeJob) ? "ok" : "fail",
333
+ confidence: "confirmed",
334
+ message: hasCliApprovedExecution(executeJob) || hasActionApprovedExecution(executeJob)
335
+ ? "Execute job runs approved release execution."
336
+ : "Execute job must run release execution with execute and irreversible approval."
337
+ }));
338
+ checks.push(check({
339
+ id: "ci:execute-evidence",
340
+ status: hasUploadAlways(executeJob) ? "ok" : "warn",
341
+ confidence: "confirmed",
342
+ message: hasUploadAlways(executeJob)
343
+ ? "Execute job uploads evidence with if: always()."
344
+ : "Execute job should upload evidence with if: always()."
345
+ }));
346
+ }
347
+ return checks;
348
+ };
349
+ const readWorkflowChecks = Effect.fn("diagnostics.readWorkflowChecks")(function* (plan, options) {
350
+ const fs = yield* FileSystem.FileSystem;
351
+ const path = yield* Path.Path;
352
+ const root = configRoot(path, options);
353
+ const workflowPath = options.workflow ?? defaultWorkflowPath(plan) ?? ".github/workflows/release.yml";
354
+ const absolutePath = workspacePath(path, root, workflowPath);
355
+ const exists = yield* fs.exists(absolutePath);
356
+ if (!exists) {
357
+ return [
358
+ check({
359
+ id: "ci:workflow-file",
360
+ status: options.missingCiIsNotChecked === true ? "info" : "fail",
361
+ confidence: "not-checked",
362
+ message: options.missingCiIsNotChecked === true
363
+ ? `Workflow file ${workflowPath} was not found; CI was not checked.`
364
+ : `Workflow file ${workflowPath} was not found.`
365
+ })
366
+ ];
367
+ }
368
+ const contents = yield* fs.readFileString(absolutePath);
369
+ return ciChecksForContents(plan, workflowPath, contents);
370
+ });
371
+ export const checkAuthReleaseConfig = Effect.fn("diagnostics.checkAuthReleaseConfig")(function* (input = {}) {
372
+ const options = releaseDiagnosticsOptionsFromInput(input);
373
+ const plan = yield* planReleaseConfig(planOptionsFromDiagnostics(options));
374
+ const checks = yield* authChecksForPlan(plan, options.target);
375
+ return reportForPlan(plan, checks);
376
+ });
377
+ export const checkCiReleaseConfig = Effect.fn("diagnostics.checkCiReleaseConfig")(function* (input = {}) {
378
+ const options = releaseDiagnosticsOptionsFromInput(input);
379
+ const plan = yield* planReleaseConfig(planOptionsFromDiagnostics(options));
380
+ const checks = yield* readWorkflowChecks(plan, options);
381
+ return reportForPlan(plan, checks);
382
+ });
383
+ export const doctorReleaseConfig = Effect.fn("diagnostics.doctorReleaseConfig")(function* (input = {}) {
384
+ const options = releaseDiagnosticsOptionsFromInput(input);
385
+ const validation = yield* validateReleaseConfigFile(validationOptionsFromDiagnostics(options)).pipe(Effect.match({
386
+ onFailure: (error) => check({
387
+ id: "config:validation",
388
+ status: "fail",
389
+ confidence: "confirmed",
390
+ message: `Config validation failed: ${formatUnknown(error)}`
391
+ }),
392
+ onSuccess: (result) => check({
393
+ id: "config:validation",
394
+ status: "ok",
395
+ confidence: "confirmed",
396
+ message: `Config ${result.path} is valid.`
397
+ })
398
+ }));
399
+ const planned = yield* planReleaseConfig(planOptionsFromDiagnostics(options)).pipe(Effect.match({
400
+ onFailure: (error) => plannedFailure(formatUnknown(error)),
401
+ onSuccess: plannedSuccess
402
+ }));
403
+ if (planned._tag === "Failed") {
404
+ return ReleaseDiagnosticReport.make({
405
+ schemaVersion: "release-diagnostics/v1",
406
+ releaseName: "unknown",
407
+ releaseVersion: "unknown",
408
+ checks: [
409
+ validation,
410
+ check({
411
+ id: "plan:construction",
412
+ status: "fail",
413
+ confidence: "confirmed",
414
+ message: `Plan construction failed: ${planned.message}`
415
+ })
416
+ ]
417
+ });
418
+ }
419
+ const authChecks = yield* authChecksForPlan(planned.plan, options.target);
420
+ const workflow = options.workflow ?? defaultWorkflowPath(planned.plan);
421
+ const ciChecks = yield* readWorkflowChecks(planned.plan, ReleaseDiagnosticsOptions.make({
422
+ ...releaseConfigFields(options),
423
+ ...(workflow === undefined ? {} : { workflow }),
424
+ missingCiIsNotChecked: true
425
+ }));
426
+ return reportForPlan(planned.plan, [
427
+ validation,
428
+ check({
429
+ id: "plan:construction",
430
+ status: "ok",
431
+ confidence: "confirmed",
432
+ message: "Release plan can be constructed."
433
+ }),
434
+ ...authChecks,
435
+ ...ciChecks
436
+ ]);
437
+ });
438
+ export const renderReleaseDiagnosticsJson = (report) => `${JSON.stringify(report, null, 2)}\n`;
439
+ export const renderReleaseDiagnosticsText = (report) => {
440
+ const lines = [
441
+ `diagnostics: ${report.releaseName}@${report.releaseVersion}`
442
+ ];
443
+ for (const item of report.checks) {
444
+ lines.push(`${item.status.padEnd(4)} ${item.confidence.padEnd(11)} ${item.id}: ${item.message}`);
445
+ }
446
+ return `${lines.join("\n")}\n`;
447
+ };
448
+ export const renderReleaseDiagnosticsMarkdown = (report) => {
449
+ const lines = [
450
+ `# Release Diagnostics ${report.releaseName}@${report.releaseVersion}`,
451
+ "",
452
+ "| Status | Confidence | Check | Message |",
453
+ "| --- | --- | --- | --- |"
454
+ ];
455
+ for (const item of report.checks) {
456
+ lines.push(`| ${item.status} | ${item.confidence} | ${item.id} | ${item.message.replaceAll("|", "\\|")} |`);
457
+ }
458
+ return `${lines.join("\n")}\n`;
459
+ };
460
+ export const renderReleaseDiagnostics = (report, format = "text") => {
461
+ switch (format) {
462
+ case "json":
463
+ return renderReleaseDiagnosticsJson(report);
464
+ case "markdown":
465
+ return renderReleaseDiagnosticsMarkdown(report);
466
+ case "text":
467
+ return renderReleaseDiagnosticsText(report);
468
+ }
469
+ };
470
+ export const checkAuth = checkAuthReleaseConfig;
471
+ export const checkCi = checkCiReleaseConfig;
472
+ export const doctor = doctorReleaseConfig;
473
+ export const render = renderReleaseDiagnostics;
474
+ //# sourceMappingURL=diagnostics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../../src/workflows/diagnostics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import * as Effect from "effect/Effect";
2
+ import * as Schema from "effect/Schema";
3
+ import { EvidenceBundle, ReleaseWorkflowEvidence, ReleaseWorkflowFailureEvidence } from "../domain/evidence.js";
4
+ import { ReleasePlan } from "../domain/release.js";
5
+ export type * from "../types/effect-internal.js";
6
+ declare const WorkflowEvidencePathsWritten_base: Schema.Class<WorkflowEvidencePathsWritten, Schema.Struct<{
7
+ readonly render: Schema.optionalKey<Schema.String>;
8
+ readonly validation: Schema.optionalKey<Schema.String>;
9
+ readonly execution: Schema.optionalKey<Schema.String>;
10
+ readonly verification: Schema.optionalKey<Schema.String>;
11
+ }>, {}>;
12
+ export declare class WorkflowEvidencePathsWritten extends WorkflowEvidencePathsWritten_base {
13
+ }
14
+ export declare const releaseEvidencePath: (plan: ReleasePlan, name: string) => string;
15
+ export declare const writeNamedEvidence: (plan: ReleasePlan, name: string, evidence: EvidenceBundle) => Effect.Effect<string, import("../planner/errors.js").EvidenceWriteError, import("effect/FileSystem").FileSystem | import("effect/Path").Path>;
16
+ export declare const writeFailedOperationEvidence: (plan: ReleasePlan, name: string, error: {
17
+ readonly evidence?: EvidenceBundle | undefined;
18
+ }) => Effect.Effect<string | undefined, import("../planner/errors.js").EvidenceWriteError, import("effect/FileSystem").FileSystem | import("effect/Path").Path>;
19
+ type WritableWorkflowEvidence = ReleaseWorkflowEvidence | ReleaseWorkflowFailureEvidence;
20
+ export declare const writeWorkflowEvidence: (plan: ReleasePlan, evidence: WritableWorkflowEvidence) => Effect.Effect<WorkflowEvidencePathsWritten, import("../planner/errors.js").EvidenceWriteError, import("effect/FileSystem").FileSystem | import("effect/Path").Path>;
21
+ //# sourceMappingURL=evidence.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evidence.d.ts","sourceRoot":"","sources":["../../src/workflows/evidence.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,cAAc,EAAE,uBAAuB,EAAE,8BAA8B,EAAE,MAAM,uBAAuB,CAAA;AAC/G,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAIlD,mBAAmB,6BAA6B,CAAA;;;;;;;AAEhD,qBAAa,4BAA6B,SAAQ,iCAOhD;CAAG;AAEL,eAAO,MAAM,mBAAmB,GAAI,MAAM,WAAW,EAAE,MAAM,MAAM,KAAG,MAC5B,CAAA;AAE1C,eAAO,MAAM,kBAAkB,8MAQ7B,CAAA;AAEF,eAAO,MAAM,4BAA4B;wBAGV,cAAc,GAAG,SAAS;+JAMvD,CAAA;AAEF,KAAK,wBAAwB,GAAG,uBAAuB,GAAG,8BAA8B,CAAA;AAExF,eAAO,MAAM,qBAAqB,gOA8BhC,CAAA"}
@@ -0,0 +1,45 @@
1
+ import * as Effect from "effect/Effect";
2
+ import * as Schema from "effect/Schema";
3
+ import { writeEvidenceBundle } from "../planner/evidence-recorder.js";
4
+ import { workflowEvidencePaths } from "../planner/status.js";
5
+ export class WorkflowEvidencePathsWritten extends Schema.Class("WorkflowEvidencePathsWritten")({
6
+ render: Schema.optionalKey(Schema.String),
7
+ validation: Schema.optionalKey(Schema.String),
8
+ execution: Schema.optionalKey(Schema.String),
9
+ verification: Schema.optionalKey(Schema.String)
10
+ }) {
11
+ }
12
+ export const releaseEvidencePath = (plan, name) => `${plan.evidenceDirectory}/${name}.json`;
13
+ export const writeNamedEvidence = Effect.fn("workflows.evidence.writeNamedEvidence")(function* (plan, name, evidence) {
14
+ const path = releaseEvidencePath(plan, name);
15
+ yield* writeEvidenceBundle(path, evidence, plan.source.root);
16
+ return path;
17
+ });
18
+ export const writeFailedOperationEvidence = Effect.fn("workflows.evidence.writeFailedOperationEvidence")(function* (plan, name, error) {
19
+ if (error.evidence === undefined) {
20
+ return undefined;
21
+ }
22
+ return yield* writeNamedEvidence(plan, name, error.evidence);
23
+ });
24
+ export const writeWorkflowEvidence = Effect.fn("workflows.evidence.writeWorkflowEvidence")(function* (plan, evidence) {
25
+ const paths = workflowEvidencePaths(plan);
26
+ const written = {};
27
+ if (evidence.render !== undefined) {
28
+ written.render = paths.render;
29
+ yield* writeEvidenceBundle(paths.render, evidence.render, plan.source.root);
30
+ }
31
+ if (evidence.validation !== undefined) {
32
+ written.validation = paths.validation;
33
+ yield* writeEvidenceBundle(paths.validation, evidence.validation, plan.source.root);
34
+ }
35
+ if (evidence.execution !== undefined) {
36
+ written.execution = paths.execution;
37
+ yield* writeEvidenceBundle(paths.execution, evidence.execution, plan.source.root);
38
+ }
39
+ if (evidence.verification !== undefined) {
40
+ written.verification = paths.verification;
41
+ yield* writeEvidenceBundle(paths.verification, evidence.verification, plan.source.root);
42
+ }
43
+ return WorkflowEvidencePathsWritten.make(written);
44
+ });
45
+ //# sourceMappingURL=evidence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evidence.js","sourceRoot":"","sources":["../../src/workflows/evidence.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export type * from "../types/effect-internal.js";
2
+ export * as Config from "./config.js";
3
+ export * as Diagnostics from "./diagnostics.js";
4
+ export * as Evidence from "./evidence.js";
5
+ export * as Init from "./init.js";
6
+ export * as Live from "./live.js";
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/workflows/index.ts"],"names":[],"mappings":"AAAA,mBAAmB,6BAA6B,CAAA;AAEhD,OAAO,KAAK,MAAM,MAAM,aAAa,CAAA;AACrC,OAAO,KAAK,WAAW,MAAM,kBAAkB,CAAA;AAC/C,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAA;AACzC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAA;AACjC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAA"}
@@ -0,0 +1,6 @@
1
+ export * as Config from "./config.js";
2
+ export * as Diagnostics from "./diagnostics.js";
3
+ export * as Evidence from "./evidence.js";
4
+ export * as Init from "./init.js";
5
+ export * as Live from "./live.js";
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/workflows/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,MAAM,aAAa,CAAA;AACrC,OAAO,KAAK,WAAW,MAAM,kBAAkB,CAAA;AAC/C,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAA;AACzC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAA;AACjC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAA"}