@mannyc1/ts-release 0.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +249 -0
- package/SPEC.md +254 -0
- package/dist/cli/command.d.ts +4 -0
- package/dist/cli/command.d.ts.map +1 -0
- package/dist/cli/command.js +90 -0
- package/dist/cli/command.js.map +1 -0
- package/dist/cli/main.d.ts +3 -0
- package/dist/cli/main.d.ts.map +1 -0
- package/dist/cli/main.js +12 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/cli/programmatic.d.ts +25 -0
- package/dist/cli/programmatic.d.ts.map +1 -0
- package/dist/cli/programmatic.js +48 -0
- package/dist/cli/programmatic.js.map +1 -0
- package/dist/config/errors.d.ts +23 -0
- package/dist/config/errors.d.ts.map +1 -0
- package/dist/config/errors.js +18 -0
- package/dist/config/errors.js.map +1 -0
- package/dist/config/load.d.ts +9 -0
- package/dist/config/load.d.ts.map +1 -0
- package/dist/config/load.js +27 -0
- package/dist/config/load.js.map +1 -0
- package/dist/config/schema.d.ts +8 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +6 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/domain/artifact.d.ts +36 -0
- package/dist/domain/artifact.d.ts.map +1 -0
- package/dist/domain/artifact.js +29 -0
- package/dist/domain/artifact.js.map +1 -0
- package/dist/domain/evidence.d.ts +58 -0
- package/dist/domain/evidence.d.ts.map +1 -0
- package/dist/domain/evidence.js +50 -0
- package/dist/domain/evidence.js.map +1 -0
- package/dist/domain/operation.d.ts +98 -0
- package/dist/domain/operation.d.ts.map +1 -0
- package/dist/domain/operation.js +133 -0
- package/dist/domain/operation.js.map +1 -0
- package/dist/domain/release.d.ts +66 -0
- package/dist/domain/release.d.ts.map +1 -0
- package/dist/domain/release.js +56 -0
- package/dist/domain/release.js.map +1 -0
- package/dist/domain/target.d.ts +75 -0
- package/dist/domain/target.d.ts.map +1 -0
- package/dist/domain/target.js +67 -0
- package/dist/domain/target.js.map +1 -0
- package/dist/host/bun.d.ts +9 -0
- package/dist/host/bun.d.ts.map +1 -0
- package/dist/host/bun.js +156 -0
- package/dist/host/bun.js.map +1 -0
- package/dist/host/host.d.ts +47 -0
- package/dist/host/host.d.ts.map +1 -0
- package/dist/host/host.js +42 -0
- package/dist/host/host.js.map +1 -0
- package/dist/host/test.d.ts +19 -0
- package/dist/host/test.d.ts.map +1 -0
- package/dist/host/test.js +76 -0
- package/dist/host/test.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/planner/create-release-plan.d.ts +5 -0
- package/dist/planner/create-release-plan.d.ts.map +1 -0
- package/dist/planner/create-release-plan.js +25 -0
- package/dist/planner/create-release-plan.js.map +1 -0
- package/dist/planner/errors.d.ts +37 -0
- package/dist/planner/errors.d.ts.map +1 -0
- package/dist/planner/errors.js +30 -0
- package/dist/planner/errors.js.map +1 -0
- package/dist/planner/evidence-recorder.d.ts +18 -0
- package/dist/planner/evidence-recorder.d.ts.map +1 -0
- package/dist/planner/evidence-recorder.js +95 -0
- package/dist/planner/evidence-recorder.js.map +1 -0
- package/dist/planner/executor.d.ts +19 -0
- package/dist/planner/executor.d.ts.map +1 -0
- package/dist/planner/executor.js +59 -0
- package/dist/planner/executor.js.map +1 -0
- package/dist/planner/normalize-release.d.ts +7 -0
- package/dist/planner/normalize-release.d.ts.map +1 -0
- package/dist/planner/normalize-release.js +101 -0
- package/dist/planner/normalize-release.js.map +1 -0
- package/dist/planner/render-plan.d.ts +5 -0
- package/dist/planner/render-plan.d.ts.map +1 -0
- package/dist/planner/render-plan.js +49 -0
- package/dist/planner/render-plan.js.map +1 -0
- package/dist/targets/adapter.d.ts +15 -0
- package/dist/targets/adapter.d.ts.map +1 -0
- package/dist/targets/adapter.js +2 -0
- package/dist/targets/adapter.js.map +1 -0
- package/dist/targets/github.d.ts +11 -0
- package/dist/targets/github.d.ts.map +1 -0
- package/dist/targets/github.js +174 -0
- package/dist/targets/github.js.map +1 -0
- package/dist/targets/homebrew.d.ts +11 -0
- package/dist/targets/homebrew.d.ts.map +1 -0
- package/dist/targets/homebrew.js +153 -0
- package/dist/targets/homebrew.js.map +1 -0
- package/dist/targets/live.d.ts +5 -0
- package/dist/targets/live.d.ts.map +1 -0
- package/dist/targets/live.js +31 -0
- package/dist/targets/live.js.map +1 -0
- package/dist/targets/npm.d.ts +11 -0
- package/dist/targets/npm.d.ts.map +1 -0
- package/dist/targets/npm.js +105 -0
- package/dist/targets/npm.js.map +1 -0
- package/dist/targets/registry.d.ts +25 -0
- package/dist/targets/registry.d.ts.map +1 -0
- package/dist/targets/registry.js +34 -0
- package/dist/targets/registry.js.map +1 -0
- package/dist/types/effect-internal.d.ts +5 -0
- package/dist/types/effect-internal.d.ts.map +1 -0
- package/dist/types/effect-internal.js +2 -0
- package/dist/types/effect-internal.js.map +1 -0
- package/examples/README.md +15 -0
- package/examples/github-release/artifacts/release-example-github-0.1.0.tgz +1 -0
- package/examples/github-release/release.config.json +31 -0
- package/examples/homebrew-tap/artifacts/release-example-homebrew-0.1.0.tgz +1 -0
- package/examples/homebrew-tap/release.config.json +34 -0
- package/examples/non-strict-skips/artifacts/release-example-skips-0.1.0.tgz +1 -0
- package/examples/non-strict-skips/release.config.json +29 -0
- package/examples/npm-only/index.js +1 -0
- package/examples/npm-only/package.json +8 -0
- package/examples/npm-only/release.config.json +30 -0
- package/package.json +176 -0
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
const commandLine = (operation) => [operation.command.executable, ...operation.command.args].join(" ");
|
|
2
|
+
const artifactLine = (artifact) => {
|
|
3
|
+
const checksum = artifact.checksum === undefined
|
|
4
|
+
? "checksum=none"
|
|
5
|
+
: `checksum=${artifact.checksum.algorithm}:${artifact.checksum.value}`;
|
|
6
|
+
return `- ${artifact.id} ${artifact.path} [${artifact.format}] size=${artifact.sizeBytes} ${checksum}`;
|
|
7
|
+
};
|
|
8
|
+
export const renderPlanJson = (plan) => `${JSON.stringify(plan, null, 2)}\n`;
|
|
9
|
+
export const renderPlanText = (plan) => {
|
|
10
|
+
const lines = [
|
|
11
|
+
`${plan.identity.name}@${plan.identity.version}`,
|
|
12
|
+
`commit: ${plan.identity.commit}`,
|
|
13
|
+
`evidence: ${plan.evidenceDirectory}`,
|
|
14
|
+
`artifacts: ${plan.artifacts.length}`,
|
|
15
|
+
`targets: ${plan.targets.length}`,
|
|
16
|
+
`operations: ${plan.operations.length}`,
|
|
17
|
+
""
|
|
18
|
+
];
|
|
19
|
+
lines.push("artifacts:");
|
|
20
|
+
for (const artifact of plan.artifacts) {
|
|
21
|
+
lines.push(` ${artifactLine(artifact)}`);
|
|
22
|
+
}
|
|
23
|
+
lines.push("");
|
|
24
|
+
lines.push("targets:");
|
|
25
|
+
for (const capability of plan.targetCapabilities) {
|
|
26
|
+
lines.push(` - ${capability.targetId} [${capability.targetTag}] auth=${capability.authRequirement} ` +
|
|
27
|
+
`dry-run=${capability.dryRunSupport} strategy=${capability.validationStrategy} ` +
|
|
28
|
+
`mutability=${capability.mutability} recovery=${capability.recovery}`);
|
|
29
|
+
}
|
|
30
|
+
lines.push("");
|
|
31
|
+
lines.push("operations:");
|
|
32
|
+
for (const operation of plan.operations) {
|
|
33
|
+
lines.push(` - ${operation.id} [${operation.risk}] ${operation.description}`);
|
|
34
|
+
if ("command" in operation) {
|
|
35
|
+
lines.push(` command: ${commandLine(operation)}`);
|
|
36
|
+
}
|
|
37
|
+
if (operation._tag === "RenderFileOperation") {
|
|
38
|
+
lines.push(` write: ${operation.path}`);
|
|
39
|
+
}
|
|
40
|
+
if (operation._tag === "ValidationNoteOperation") {
|
|
41
|
+
lines.push(` note: ${operation.message}`);
|
|
42
|
+
}
|
|
43
|
+
if (operation.gate.requiresExecute) {
|
|
44
|
+
lines.push(` gate: execute${operation.gate.requiresIrreversibleApproval ? " + irreversible approval" : ""}`);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return `${lines.join("\n")}\n`;
|
|
48
|
+
};
|
|
49
|
+
//# sourceMappingURL=render-plan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render-plan.js","sourceRoot":"","sources":["../../src/planner/render-plan.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import * as Effect from "effect/Effect";
|
|
2
|
+
import { Operation } from "../domain/operation.js";
|
|
3
|
+
import { ReleaseModel } from "../domain/release.js";
|
|
4
|
+
import { GitHubReleaseTarget, HomebrewTapTarget, NpmRegistryTarget, TargetCapabilities, TargetConfig } from "../domain/target.js";
|
|
5
|
+
import { PlanConstructionError } from "../planner/errors.js";
|
|
6
|
+
export type * from "../types/effect-internal.js";
|
|
7
|
+
export interface TargetAdapter<Target extends TargetConfig> {
|
|
8
|
+
readonly targetTag: Target["_tag"];
|
|
9
|
+
readonly capabilities: (target: Target) => TargetCapabilities;
|
|
10
|
+
readonly planOperations: (target: Target, model: ReleaseModel) => Effect.Effect<ReadonlyArray<Operation>, PlanConstructionError>;
|
|
11
|
+
}
|
|
12
|
+
export type NpmTargetAdapter = TargetAdapter<NpmRegistryTarget>;
|
|
13
|
+
export type GitHubTargetAdapter = TargetAdapter<GitHubReleaseTarget>;
|
|
14
|
+
export type HomebrewTargetAdapter = TargetAdapter<HomebrewTapTarget>;
|
|
15
|
+
//# sourceMappingURL=adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../src/targets/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAA;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AACnD,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EAClB,YAAY,EACb,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAA;AAE5D,mBAAmB,6BAA6B,CAAA;AAEhD,MAAM,WAAW,aAAa,CAAC,MAAM,SAAS,YAAY;IACxD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,CAAA;IAClC,QAAQ,CAAC,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,kBAAkB,CAAA;IAC7D,QAAQ,CAAC,cAAc,EAAE,CACvB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,YAAY,KAChB,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,EAAE,qBAAqB,CAAC,CAAA;CACpE;AAED,MAAM,MAAM,gBAAgB,GAAG,aAAa,CAAC,iBAAiB,CAAC,CAAA;AAC/D,MAAM,MAAM,mBAAmB,GAAG,aAAa,CAAC,mBAAmB,CAAC,CAAA;AACpE,MAAM,MAAM,qBAAqB,GAAG,aAAa,CAAC,iBAAiB,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../src/targets/adapter.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import * as Effect from "effect/Effect";
|
|
2
|
+
import { PublishCommandOperation, ValidateCommandOperation, ValidationNoteOperation, VerifyRemoteOperation } from "../domain/operation.js";
|
|
3
|
+
import { ReleaseModel } from "../domain/release.js";
|
|
4
|
+
import { GitHubReleaseTarget, TargetCapabilities } from "../domain/target.js";
|
|
5
|
+
import { PlanConstructionError } from "../planner/errors.js";
|
|
6
|
+
import { GitHubTargetAdapter } from "./adapter.js";
|
|
7
|
+
export type * from "../types/effect-internal.js";
|
|
8
|
+
export declare const githubTargetCapabilities: (target: GitHubReleaseTarget) => TargetCapabilities;
|
|
9
|
+
export declare const planGitHubOperations: (target: GitHubReleaseTarget, model: ReleaseModel) => Effect.Effect<(import("../domain/operation.js").RenderFileOperation | ValidateCommandOperation | ValidationNoteOperation | PublishCommandOperation | VerifyRemoteOperation)[], PlanConstructionError, never>;
|
|
10
|
+
export declare const GitHubAdapter: GitHubTargetAdapter;
|
|
11
|
+
//# sourceMappingURL=github.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github.d.ts","sourceRoot":"","sources":["../../src/targets/github.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,EAML,uBAAuB,EACvB,wBAAwB,EACxB,uBAAuB,EACvB,qBAAqB,EACtB,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AACnD,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAGnB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAA;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAElD,mBAAmB,6BAA6B,CAAA;AAoBhD,eAAO,MAAM,wBAAwB,GAAI,QAAQ,mBAAmB,KAAG,kBASnE,CAAA;AAkKJ,eAAO,MAAM,oBAAoB,oQA6C/B,CAAA;AAEF,eAAO,MAAM,aAAa,EAAE,mBAI3B,CAAA"}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
import * as Effect from "effect/Effect";
|
|
2
|
+
import { CommandSpec, executeGate, irreversibleGate, noApprovalGate, PublishCommandOperation, ValidateCommandOperation, ValidationNoteOperation, VerifyRemoteOperation } from "../domain/operation.js";
|
|
3
|
+
import { TargetCapabilities, targetAuthRequirement } from "../domain/target.js";
|
|
4
|
+
import { PlanConstructionError } from "../planner/errors.js";
|
|
5
|
+
const envNames = (target) => target.tokenEnv === undefined ? [] : [target.tokenEnv];
|
|
6
|
+
const ghCommand = (target, args, includeAuth) => CommandSpec.make({
|
|
7
|
+
executable: "gh",
|
|
8
|
+
args: [...args],
|
|
9
|
+
requiredEnv: includeAuth ? envNames(target) : [],
|
|
10
|
+
redactedEnv: includeAuth ? envNames(target) : []
|
|
11
|
+
});
|
|
12
|
+
const githubValidationStrategy = (target) => target.dryRunSupport === "none" ? "skipped" : "simulated-plan";
|
|
13
|
+
export const githubTargetCapabilities = (target) => TargetCapabilities.make({
|
|
14
|
+
targetId: target.id,
|
|
15
|
+
targetTag: target._tag,
|
|
16
|
+
authRequirement: targetAuthRequirement(target),
|
|
17
|
+
dryRunSupport: target.dryRunSupport,
|
|
18
|
+
mutability: target.mutability,
|
|
19
|
+
recovery: target.recovery,
|
|
20
|
+
validationStrategy: githubValidationStrategy(target)
|
|
21
|
+
});
|
|
22
|
+
const targetArtifacts = (target, model) => model.artifacts.filter((artifact) => artifact.consumers.includes(target.id));
|
|
23
|
+
const pathBaseName = (path) => {
|
|
24
|
+
const parts = path.replaceAll("\\", "/").split("/");
|
|
25
|
+
return parts[parts.length - 1] ?? path;
|
|
26
|
+
};
|
|
27
|
+
const jqString = (value) => JSON.stringify(value);
|
|
28
|
+
const jqAssert = (condition, message) => `if ${condition} then empty else error(${jqString(message)}) end`;
|
|
29
|
+
const releaseViewJsonCommand = (target, model, fields, jq) => ghCommand(target, [
|
|
30
|
+
"release",
|
|
31
|
+
"view",
|
|
32
|
+
model.identity.tag ?? model.identity.version,
|
|
33
|
+
"--repo",
|
|
34
|
+
target.repository,
|
|
35
|
+
"--json",
|
|
36
|
+
fields.join(","),
|
|
37
|
+
"--jq",
|
|
38
|
+
jq
|
|
39
|
+
], true);
|
|
40
|
+
const releaseArgs = (target, model) => {
|
|
41
|
+
const args = [
|
|
42
|
+
"release",
|
|
43
|
+
"create",
|
|
44
|
+
model.identity.tag ?? model.identity.version,
|
|
45
|
+
"--repo",
|
|
46
|
+
target.repository,
|
|
47
|
+
"--title",
|
|
48
|
+
`${model.identity.name} ${model.identity.version}`
|
|
49
|
+
];
|
|
50
|
+
if (target.draft === true) {
|
|
51
|
+
args.push("--draft");
|
|
52
|
+
}
|
|
53
|
+
if (target.prerelease === true) {
|
|
54
|
+
args.push("--prerelease");
|
|
55
|
+
}
|
|
56
|
+
if (model.identity.notes !== undefined) {
|
|
57
|
+
args.push("--notes", model.identity.notes);
|
|
58
|
+
}
|
|
59
|
+
for (const artifact of targetArtifacts(target, model)) {
|
|
60
|
+
args.push(artifact.path);
|
|
61
|
+
}
|
|
62
|
+
return args;
|
|
63
|
+
};
|
|
64
|
+
const githubVerificationOperations = (target, model) => {
|
|
65
|
+
const tag = model.identity.tag ?? model.identity.version;
|
|
66
|
+
const title = `${model.identity.name} ${model.identity.version}`;
|
|
67
|
+
const isDraft = target.draft === true;
|
|
68
|
+
const isPrerelease = target.prerelease === true;
|
|
69
|
+
return [
|
|
70
|
+
VerifyRemoteOperation.make({
|
|
71
|
+
id: `${target.id}:gh-release-view`,
|
|
72
|
+
targetId: target.id,
|
|
73
|
+
description: "Verify the GitHub release tag exists.",
|
|
74
|
+
risk: "read-only",
|
|
75
|
+
gate: noApprovalGate("Release verification is read-only."),
|
|
76
|
+
command: releaseViewJsonCommand(target, model, ["tagName"], jqAssert(`.tagName == ${jqString(tag)}`, `Expected release tag ${tag}.`))
|
|
77
|
+
}),
|
|
78
|
+
VerifyRemoteOperation.make({
|
|
79
|
+
id: `${target.id}:gh-release-verify-title`,
|
|
80
|
+
targetId: target.id,
|
|
81
|
+
description: "Verify the GitHub release title.",
|
|
82
|
+
risk: "read-only",
|
|
83
|
+
gate: noApprovalGate("Release title verification is read-only."),
|
|
84
|
+
command: releaseViewJsonCommand(target, model, ["name"], jqAssert(`.name == ${jqString(title)}`, `Expected release title ${title}.`))
|
|
85
|
+
}),
|
|
86
|
+
VerifyRemoteOperation.make({
|
|
87
|
+
id: `${target.id}:gh-release-verify-draft`,
|
|
88
|
+
targetId: target.id,
|
|
89
|
+
description: "Verify the GitHub release draft flag.",
|
|
90
|
+
risk: "read-only",
|
|
91
|
+
gate: noApprovalGate("Release draft verification is read-only."),
|
|
92
|
+
command: releaseViewJsonCommand(target, model, ["isDraft"], jqAssert(`.isDraft == ${isDraft ? "true" : "false"}`, `Expected release draft flag ${isDraft}.`))
|
|
93
|
+
}),
|
|
94
|
+
VerifyRemoteOperation.make({
|
|
95
|
+
id: `${target.id}:gh-release-verify-prerelease`,
|
|
96
|
+
targetId: target.id,
|
|
97
|
+
description: "Verify the GitHub release prerelease flag.",
|
|
98
|
+
risk: "read-only",
|
|
99
|
+
gate: noApprovalGate("Release prerelease verification is read-only."),
|
|
100
|
+
command: releaseViewJsonCommand(target, model, ["isPrerelease"], jqAssert(`.isPrerelease == ${isPrerelease ? "true" : "false"}`, `Expected release prerelease flag ${isPrerelease}.`))
|
|
101
|
+
}),
|
|
102
|
+
...targetArtifacts(target, model).map((artifact) => {
|
|
103
|
+
const assetName = pathBaseName(artifact.path);
|
|
104
|
+
return VerifyRemoteOperation.make({
|
|
105
|
+
id: `${target.id}:gh-release-verify-asset-${artifact.id}`,
|
|
106
|
+
targetId: target.id,
|
|
107
|
+
description: `Verify GitHub release asset ${assetName}.`,
|
|
108
|
+
risk: "read-only",
|
|
109
|
+
gate: noApprovalGate("Release asset verification is read-only."),
|
|
110
|
+
command: releaseViewJsonCommand(target, model, ["assets"], jqAssert(`.assets | map(.name) | index(${jqString(assetName)}) != null`, `Expected release asset ${assetName}`))
|
|
111
|
+
});
|
|
112
|
+
})
|
|
113
|
+
];
|
|
114
|
+
};
|
|
115
|
+
const githubDryRunOperation = (target) => ValidationNoteOperation.make({
|
|
116
|
+
id: `${target.id}:gh-release-dry-run`,
|
|
117
|
+
targetId: target.id,
|
|
118
|
+
description: target.dryRunSupport === "none"
|
|
119
|
+
? "Record skipped GitHub release dry-run validation."
|
|
120
|
+
: "Record simulated GitHub release dry-run validation.",
|
|
121
|
+
risk: "read-only",
|
|
122
|
+
gate: noApprovalGate("Validation notes do not modify local or remote state."),
|
|
123
|
+
message: target.dryRunSupport === "none"
|
|
124
|
+
? "GitHub release dry-run validation was skipped because this target declares no dry-run support."
|
|
125
|
+
: "GitHub release dry-run validation is simulated by the deterministic release plan; gh release create has no native dry-run command.",
|
|
126
|
+
skipped: target.dryRunSupport === "none",
|
|
127
|
+
severity: target.dryRunSupport === "none" ? "warning" : "info"
|
|
128
|
+
});
|
|
129
|
+
export const planGitHubOperations = Effect.fn("planGitHubOperations")(function* (target, model) {
|
|
130
|
+
if (model.strict && target.dryRunSupport === "none") {
|
|
131
|
+
return yield* Effect.fail(PlanConstructionError.make({
|
|
132
|
+
targetId: target.id,
|
|
133
|
+
reason: "GitHub release target declares no dry-run support in strict mode."
|
|
134
|
+
}));
|
|
135
|
+
}
|
|
136
|
+
const publishRisk = target.mutability === "immutable" ? "irreversible" : "externally-visible";
|
|
137
|
+
const publishGate = publishRisk === "irreversible"
|
|
138
|
+
? irreversibleGate("Creating this GitHub release is externally visible and configured as immutable.")
|
|
139
|
+
: executeGate("Creating or updating a GitHub release is externally visible.");
|
|
140
|
+
return [
|
|
141
|
+
ValidateCommandOperation.make({
|
|
142
|
+
id: `${target.id}:gh-version`,
|
|
143
|
+
targetId: target.id,
|
|
144
|
+
description: "Check GitHub CLI availability.",
|
|
145
|
+
risk: "read-only",
|
|
146
|
+
gate: noApprovalGate("CLI availability validation is read-only."),
|
|
147
|
+
command: ghCommand(target, ["--version"], false)
|
|
148
|
+
}),
|
|
149
|
+
ValidateCommandOperation.make({
|
|
150
|
+
id: `${target.id}:gh-auth-status`,
|
|
151
|
+
targetId: target.id,
|
|
152
|
+
description: "Validate GitHub CLI authentication.",
|
|
153
|
+
risk: "read-only",
|
|
154
|
+
gate: noApprovalGate("gh auth status checks authentication without publishing."),
|
|
155
|
+
command: ghCommand(target, ["auth", "status"], true)
|
|
156
|
+
}),
|
|
157
|
+
githubDryRunOperation(target),
|
|
158
|
+
PublishCommandOperation.make({
|
|
159
|
+
id: `${target.id}:gh-release-create`,
|
|
160
|
+
targetId: target.id,
|
|
161
|
+
description: `Create GitHub release for ${model.identity.name}@${model.identity.version}.`,
|
|
162
|
+
risk: publishRisk,
|
|
163
|
+
gate: publishGate,
|
|
164
|
+
command: ghCommand(target, releaseArgs(target, model), true)
|
|
165
|
+
}),
|
|
166
|
+
...githubVerificationOperations(target, model)
|
|
167
|
+
];
|
|
168
|
+
});
|
|
169
|
+
export const GitHubAdapter = {
|
|
170
|
+
targetTag: "GitHubReleaseTarget",
|
|
171
|
+
capabilities: githubTargetCapabilities,
|
|
172
|
+
planOperations: planGitHubOperations
|
|
173
|
+
};
|
|
174
|
+
//# sourceMappingURL=github.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github.js","sourceRoot":"","sources":["../../src/targets/github.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import * as Effect from "effect/Effect";
|
|
2
|
+
import { PublishCommandOperation, RenderFileOperation, ValidateCommandOperation, ValidationNoteOperation } from "../domain/operation.js";
|
|
3
|
+
import { ReleaseModel } from "../domain/release.js";
|
|
4
|
+
import { HomebrewTapTarget, TargetCapabilities } from "../domain/target.js";
|
|
5
|
+
import { PlanConstructionError } from "../planner/errors.js";
|
|
6
|
+
import { HomebrewTargetAdapter } from "./adapter.js";
|
|
7
|
+
export type * from "../types/effect-internal.js";
|
|
8
|
+
export declare const homebrewTargetCapabilities: (target: HomebrewTapTarget) => TargetCapabilities;
|
|
9
|
+
export declare const planHomebrewOperations: (target: HomebrewTapTarget, model: ReleaseModel) => Effect.Effect<(RenderFileOperation | ValidateCommandOperation | ValidationNoteOperation | PublishCommandOperation | import("../domain/operation.js").VerifyRemoteOperation)[], PlanConstructionError, never>;
|
|
10
|
+
export declare const HomebrewAdapter: HomebrewTargetAdapter;
|
|
11
|
+
//# sourceMappingURL=homebrew.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"homebrew.d.ts","sourceRoot":"","sources":["../../src/targets/homebrew.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,EAML,uBAAuB,EACvB,mBAAmB,EACnB,wBAAwB,EACxB,uBAAuB,EACxB,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AACnD,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAGnB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAA;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAA;AAEpD,mBAAmB,6BAA6B,CAAA;AA8BhD,eAAO,MAAM,0BAA0B,GAAI,QAAQ,iBAAiB,KAAG,kBASnE,CAAA;AA2FJ,eAAO,MAAM,sBAAsB,kQAyDjC,CAAA;AAEF,eAAO,MAAM,eAAe,EAAE,qBAI7B,CAAA"}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import * as Effect from "effect/Effect";
|
|
2
|
+
import { CommandSpec, executeGate, irreversibleGate, noApprovalGate, PublishCommandOperation, RenderFileOperation, ValidateCommandOperation, ValidationNoteOperation } from "../domain/operation.js";
|
|
3
|
+
import { TargetCapabilities, targetAuthRequirement } from "../domain/target.js";
|
|
4
|
+
import { PlanConstructionError } from "../planner/errors.js";
|
|
5
|
+
const envNames = (target) => target.tokenEnv === undefined ? [] : [target.tokenEnv];
|
|
6
|
+
const command = (target, executable, args, includeAuth, cwd = undefined) => CommandSpec.make({
|
|
7
|
+
executable,
|
|
8
|
+
args: [...args],
|
|
9
|
+
...(cwd === undefined ? {} : { cwd }),
|
|
10
|
+
requiredEnv: includeAuth ? envNames(target) : [],
|
|
11
|
+
redactedEnv: includeAuth ? envNames(target) : []
|
|
12
|
+
});
|
|
13
|
+
const validationStrategy = (target) => {
|
|
14
|
+
if (target.dryRunSupport === "native") {
|
|
15
|
+
return "native-command";
|
|
16
|
+
}
|
|
17
|
+
if (target.dryRunSupport === "simulated") {
|
|
18
|
+
return "simulated-plan";
|
|
19
|
+
}
|
|
20
|
+
return "skipped";
|
|
21
|
+
};
|
|
22
|
+
export const homebrewTargetCapabilities = (target) => TargetCapabilities.make({
|
|
23
|
+
targetId: target.id,
|
|
24
|
+
targetTag: target._tag,
|
|
25
|
+
authRequirement: targetAuthRequirement(target),
|
|
26
|
+
dryRunSupport: target.dryRunSupport,
|
|
27
|
+
mutability: target.mutability,
|
|
28
|
+
recovery: target.recovery,
|
|
29
|
+
validationStrategy: validationStrategy(target)
|
|
30
|
+
});
|
|
31
|
+
const pathBaseName = (path) => {
|
|
32
|
+
const parts = path.replaceAll("\\", "/").split("/");
|
|
33
|
+
return parts[parts.length - 1] ?? path;
|
|
34
|
+
};
|
|
35
|
+
const rubyString = (value) => JSON.stringify(value);
|
|
36
|
+
const formulaClassName = (formulaName) => {
|
|
37
|
+
const parts = formulaName.split(/[^A-Za-z0-9]+/).filter((part) => part.length > 0);
|
|
38
|
+
const className = parts.map((part) => `${part.slice(0, 1).toUpperCase()}${part.slice(1)}`).join("");
|
|
39
|
+
return className.length === 0 ? "GeneratedFormula" : className;
|
|
40
|
+
};
|
|
41
|
+
const renderFormula = (target, model) => Effect.gen(function* () {
|
|
42
|
+
const artifact = model.artifacts.find((item) => item.id === target.artifactId);
|
|
43
|
+
if (artifact === undefined) {
|
|
44
|
+
return yield* Effect.fail(PlanConstructionError.make({
|
|
45
|
+
targetId: target.id,
|
|
46
|
+
reason: `Homebrew target references missing artifact ${target.artifactId}.`
|
|
47
|
+
}));
|
|
48
|
+
}
|
|
49
|
+
if (artifact.format === "directory") {
|
|
50
|
+
return yield* Effect.fail(PlanConstructionError.make({
|
|
51
|
+
targetId: target.id,
|
|
52
|
+
reason: "Homebrew formula artifacts must be file-like, not directories."
|
|
53
|
+
}));
|
|
54
|
+
}
|
|
55
|
+
if (artifact.checksum === undefined || artifact.checksum.algorithm !== "sha256") {
|
|
56
|
+
return yield* Effect.fail(PlanConstructionError.make({
|
|
57
|
+
targetId: target.id,
|
|
58
|
+
reason: "Homebrew formula rendering requires a sha256 artifact checksum."
|
|
59
|
+
}));
|
|
60
|
+
}
|
|
61
|
+
const installLines = target.installPath === undefined
|
|
62
|
+
? [" prefix.install Dir[\"*\"]"]
|
|
63
|
+
: [` bin.install ${rubyString(target.installPath)} => ${rubyString(target.formulaName)}`];
|
|
64
|
+
const homepage = target.homepage ?? `https://github.com/${target.repository}`;
|
|
65
|
+
const url = target.url ?? artifact.path;
|
|
66
|
+
return [
|
|
67
|
+
`class ${formulaClassName(target.formulaName)} < Formula`,
|
|
68
|
+
` desc ${rubyString(`${model.identity.name} ${model.identity.version} release artifact`)}`,
|
|
69
|
+
` homepage ${rubyString(homepage)}`,
|
|
70
|
+
` url ${rubyString(url)}`,
|
|
71
|
+
` sha256 ${rubyString(artifact.checksum.value)}`,
|
|
72
|
+
` version ${rubyString(model.identity.version)}`,
|
|
73
|
+
"",
|
|
74
|
+
" def install",
|
|
75
|
+
...installLines,
|
|
76
|
+
" end",
|
|
77
|
+
"end",
|
|
78
|
+
""
|
|
79
|
+
].join("\n");
|
|
80
|
+
});
|
|
81
|
+
const dryRunOperation = (target) => target.dryRunSupport === "native"
|
|
82
|
+
? ValidateCommandOperation.make({
|
|
83
|
+
id: `${target.id}:brew-audit`,
|
|
84
|
+
targetId: target.id,
|
|
85
|
+
description: "Validate generated Homebrew formula with brew audit.",
|
|
86
|
+
risk: "read-only",
|
|
87
|
+
gate: noApprovalGate("brew audit validates the generated formula without publishing."),
|
|
88
|
+
command: command(target, "brew", ["audit", "--strict", "--formula", target.formulaPath], false)
|
|
89
|
+
})
|
|
90
|
+
: ValidationNoteOperation.make({
|
|
91
|
+
id: `${target.id}:brew-audit`,
|
|
92
|
+
targetId: target.id,
|
|
93
|
+
description: target.dryRunSupport === "simulated"
|
|
94
|
+
? "Record simulated Homebrew formula validation."
|
|
95
|
+
: "Record skipped Homebrew formula validation.",
|
|
96
|
+
risk: "read-only",
|
|
97
|
+
gate: noApprovalGate("Validation notes do not modify local or remote state."),
|
|
98
|
+
message: target.dryRunSupport === "simulated"
|
|
99
|
+
? "Homebrew formula validation is simulated by the deterministic release plan."
|
|
100
|
+
: "Homebrew formula validation was skipped because this target declares no dry-run support.",
|
|
101
|
+
skipped: target.dryRunSupport === "none",
|
|
102
|
+
severity: target.dryRunSupport === "none" ? "warning" : "info"
|
|
103
|
+
});
|
|
104
|
+
export const planHomebrewOperations = Effect.fn("planHomebrewOperations")(function* (target, model) {
|
|
105
|
+
if (model.strict && target.dryRunSupport === "none") {
|
|
106
|
+
return yield* Effect.fail(PlanConstructionError.make({
|
|
107
|
+
targetId: target.id,
|
|
108
|
+
reason: "Homebrew tap target declares no dry-run support in strict mode."
|
|
109
|
+
}));
|
|
110
|
+
}
|
|
111
|
+
const formula = yield* renderFormula(target, model);
|
|
112
|
+
const publishRisk = target.mutability === "immutable" ? "irreversible" : "externally-visible";
|
|
113
|
+
const publishGate = publishRisk === "irreversible"
|
|
114
|
+
? irreversibleGate("Pushing a Homebrew tap update is configured as irreversible.")
|
|
115
|
+
: executeGate("Pushing a Homebrew tap update is externally visible.");
|
|
116
|
+
const tapDirectory = target.tapDirectory ?? ".";
|
|
117
|
+
const operations = [
|
|
118
|
+
RenderFileOperation.make({
|
|
119
|
+
id: `${target.id}:homebrew-render-formula`,
|
|
120
|
+
targetId: target.id,
|
|
121
|
+
description: `Render Homebrew formula ${pathBaseName(target.formulaPath)}.`,
|
|
122
|
+
risk: "writes-local",
|
|
123
|
+
gate: executeGate("Rendering a Homebrew formula writes a local generated file."),
|
|
124
|
+
path: target.formulaPath,
|
|
125
|
+
contents: formula
|
|
126
|
+
})
|
|
127
|
+
];
|
|
128
|
+
if (target.dryRunSupport === "native") {
|
|
129
|
+
operations.push(ValidateCommandOperation.make({
|
|
130
|
+
id: `${target.id}:brew-version`,
|
|
131
|
+
targetId: target.id,
|
|
132
|
+
description: "Check Homebrew CLI availability.",
|
|
133
|
+
risk: "read-only",
|
|
134
|
+
gate: noApprovalGate("CLI availability validation is read-only."),
|
|
135
|
+
command: command(target, "brew", ["--version"], false)
|
|
136
|
+
}));
|
|
137
|
+
}
|
|
138
|
+
operations.push(dryRunOperation(target), PublishCommandOperation.make({
|
|
139
|
+
id: `${target.id}:homebrew-push`,
|
|
140
|
+
targetId: target.id,
|
|
141
|
+
description: `Push Homebrew tap update for ${model.identity.name}@${model.identity.version}.`,
|
|
142
|
+
risk: publishRisk,
|
|
143
|
+
gate: publishGate,
|
|
144
|
+
command: command(target, "git", ["-C", tapDirectory, "push"], true)
|
|
145
|
+
}));
|
|
146
|
+
return operations;
|
|
147
|
+
});
|
|
148
|
+
export const HomebrewAdapter = {
|
|
149
|
+
targetTag: "HomebrewTapTarget",
|
|
150
|
+
capabilities: homebrewTargetCapabilities,
|
|
151
|
+
planOperations: planHomebrewOperations
|
|
152
|
+
};
|
|
153
|
+
//# sourceMappingURL=homebrew.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"homebrew.js","sourceRoot":"","sources":["../../src/targets/homebrew.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"live.d.ts","sourceRoot":"","sources":["../../src/targets/live.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AAMrC,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAE9C,mBAAmB,6BAA6B,CAAA;AA2BhD,eAAO,MAAM,uBAAuB,EAAE,KAAK,CAAC,KAAK,CAAC,cAAc,CAG9D,CAAA"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import * as Effect from "effect/Effect";
|
|
2
|
+
import * as Layer from "effect/Layer";
|
|
3
|
+
import { GitHubAdapter } from "./github.js";
|
|
4
|
+
import { HomebrewAdapter } from "./homebrew.js";
|
|
5
|
+
import { NpmAdapter } from "./npm.js";
|
|
6
|
+
import { TargetRegistry } from "./registry.js";
|
|
7
|
+
const planLiveTargetOperations = Effect.fn("planLiveTargetOperations")(function* (target, model) {
|
|
8
|
+
switch (target._tag) {
|
|
9
|
+
case "NpmRegistryTarget":
|
|
10
|
+
return yield* NpmAdapter.planOperations(target, model);
|
|
11
|
+
case "GitHubReleaseTarget":
|
|
12
|
+
return yield* GitHubAdapter.planOperations(target, model);
|
|
13
|
+
case "HomebrewTapTarget":
|
|
14
|
+
return yield* HomebrewAdapter.planOperations(target, model);
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
const liveTargetCapabilities = (target) => {
|
|
18
|
+
switch (target._tag) {
|
|
19
|
+
case "NpmRegistryTarget":
|
|
20
|
+
return NpmAdapter.capabilities(target);
|
|
21
|
+
case "GitHubReleaseTarget":
|
|
22
|
+
return GitHubAdapter.capabilities(target);
|
|
23
|
+
case "HomebrewTapTarget":
|
|
24
|
+
return HomebrewAdapter.capabilities(target);
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
export const LiveTargetRegistryLayer = Layer.succeed(TargetRegistry)({
|
|
28
|
+
targetCapabilities: liveTargetCapabilities,
|
|
29
|
+
planTargetOperations: planLiveTargetOperations
|
|
30
|
+
});
|
|
31
|
+
//# sourceMappingURL=live.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"live.js","sourceRoot":"","sources":["../../src/targets/live.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AAGrC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AACrC,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAI9C,MAAM,wBAAwB,GAAG,MAAM,CAAC,EAAE,CAAC,0BAA0B,CAAC,CAAC,QAAQ,CAAC,EAC9E,MAAoB,EACpB,KAAmB;IAEnB,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,mBAAmB;YACtB,OAAO,KAAK,CAAC,CAAC,UAAU,CAAC,cAAc,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;QACxD,KAAK,qBAAqB;YACxB,OAAO,KAAK,CAAC,CAAC,aAAa,CAAC,cAAc,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;QAC3D,KAAK,mBAAmB;YACtB,OAAO,KAAK,CAAC,CAAC,eAAe,CAAC,cAAc,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;IAC/D,CAAC;AACH,CAAC,CAAC,CAAA;AAEF,MAAM,sBAAsB,GAAG,CAAC,MAAoB,EAAE,EAAE;IACtD,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,mBAAmB;YACtB,OAAO,UAAU,CAAC,YAAY,CAAC,MAAM,CAAC,CAAA;QACxC,KAAK,qBAAqB;YACxB,OAAO,aAAa,CAAC,YAAY,CAAC,MAAM,CAAC,CAAA;QAC3C,KAAK,mBAAmB;YACtB,OAAO,eAAe,CAAC,YAAY,CAAC,MAAM,CAAC,CAAA;IAC/C,CAAC;AACH,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,uBAAuB,GAAgC,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IAChG,kBAAkB,EAAE,sBAAsB;IAC1C,oBAAoB,EAAE,wBAAwB;CAC/C,CAAC,CAAA"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import * as Effect from "effect/Effect";
|
|
2
|
+
import { PublishCommandOperation, ValidateCommandOperation, ValidationNoteOperation } from "../domain/operation.js";
|
|
3
|
+
import { ReleaseModel } from "../domain/release.js";
|
|
4
|
+
import { NpmRegistryTarget, TargetCapabilities } from "../domain/target.js";
|
|
5
|
+
import { PlanConstructionError } from "../planner/errors.js";
|
|
6
|
+
import { NpmTargetAdapter } from "./adapter.js";
|
|
7
|
+
export type * from "../types/effect-internal.js";
|
|
8
|
+
export declare const npmTargetCapabilities: (target: NpmRegistryTarget) => TargetCapabilities;
|
|
9
|
+
export declare const planNpmOperations: (target: NpmRegistryTarget, model: ReleaseModel) => Effect.Effect<(import("../domain/operation.js").RenderFileOperation | ValidateCommandOperation | ValidationNoteOperation | PublishCommandOperation | import("../domain/operation.js").VerifyRemoteOperation)[], PlanConstructionError, never>;
|
|
10
|
+
export declare const NpmAdapter: NpmTargetAdapter;
|
|
11
|
+
//# sourceMappingURL=npm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"npm.d.ts","sourceRoot":"","sources":["../../src/targets/npm.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,EAKL,uBAAuB,EACvB,wBAAwB,EACxB,uBAAuB,EACxB,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AACnD,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAmD,MAAM,qBAAqB,CAAA;AAC5H,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAA;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAE/C,mBAAmB,6BAA6B,CAAA;AA6BhD,eAAO,MAAM,qBAAqB,GAAI,QAAQ,iBAAiB,KAAG,kBAS9D,CAAA;AAsCJ,eAAO,MAAM,iBAAiB,mSAyC5B,CAAA;AAEF,eAAO,MAAM,UAAU,EAAE,gBAIxB,CAAA"}
|