@mannyc1/ts-release 0.0.0 → 0.0.1
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 +70 -13
- package/dist/cli/command.d.ts.map +1 -1
- package/dist/cli/command.js +37 -2
- package/dist/cli/command.js.map +1 -1
- package/dist/cli/main.js +5 -2
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/programmatic.d.ts +1 -1
- package/dist/cli/programmatic.d.ts.map +1 -1
- package/dist/cli/programmatic.js +7 -2
- package/dist/cli/programmatic.js.map +1 -1
- package/dist/domain/evidence.d.ts +49 -3
- package/dist/domain/evidence.d.ts.map +1 -1
- package/dist/domain/evidence.js +43 -2
- package/dist/domain/evidence.js.map +1 -1
- package/dist/domain/operation.d.ts +56 -2
- package/dist/domain/operation.d.ts.map +1 -1
- package/dist/domain/operation.js +47 -1
- package/dist/domain/operation.js.map +1 -1
- package/dist/domain/release.d.ts +4 -4
- package/dist/domain/target.d.ts +31 -1
- package/dist/domain/target.d.ts.map +1 -1
- package/dist/domain/target.js +40 -3
- package/dist/domain/target.js.map +1 -1
- package/dist/host/http-live.d.ts +7 -0
- package/dist/host/http-live.d.ts.map +1 -0
- package/dist/host/http-live.js +76 -0
- package/dist/host/http-live.js.map +1 -0
- package/dist/host/http.d.ts +40 -0
- package/dist/host/http.d.ts.map +1 -0
- package/dist/host/http.js +56 -0
- package/dist/host/http.js.map +1 -0
- package/dist/planner/errors.d.ts +4 -2
- package/dist/planner/errors.d.ts.map +1 -1
- package/dist/planner/errors.js +5 -3
- package/dist/planner/errors.js.map +1 -1
- package/dist/planner/evidence-recorder.d.ts +6 -3
- package/dist/planner/evidence-recorder.d.ts.map +1 -1
- package/dist/planner/evidence-recorder.js +149 -2
- package/dist/planner/evidence-recorder.js.map +1 -1
- package/dist/planner/executor.d.ts +41 -14
- package/dist/planner/executor.d.ts.map +1 -1
- package/dist/planner/executor.js +102 -36
- package/dist/planner/executor.js.map +1 -1
- package/dist/planner/normalize-release.d.ts.map +1 -1
- package/dist/planner/normalize-release.js +43 -2
- package/dist/planner/normalize-release.js.map +1 -1
- package/dist/planner/render-plan.d.ts.map +1 -1
- package/dist/planner/render-plan.js +9 -0
- package/dist/planner/render-plan.js.map +1 -1
- package/dist/targets/adapter-helpers.d.ts +31 -0
- package/dist/targets/adapter-helpers.d.ts.map +1 -0
- package/dist/targets/adapter-helpers.js +67 -0
- package/dist/targets/adapter-helpers.js.map +1 -0
- package/dist/targets/adapter.d.ts +3 -1
- package/dist/targets/adapter.d.ts.map +1 -1
- package/dist/targets/github.d.ts +2 -2
- package/dist/targets/github.d.ts.map +1 -1
- package/dist/targets/github.js +65 -78
- package/dist/targets/github.js.map +1 -1
- package/dist/targets/homebrew.d.ts +2 -2
- package/dist/targets/homebrew.d.ts.map +1 -1
- package/dist/targets/homebrew.js +45 -75
- package/dist/targets/homebrew.js.map +1 -1
- package/dist/targets/live.d.ts.map +1 -1
- package/dist/targets/live.js +10 -0
- package/dist/targets/live.js.map +1 -1
- package/dist/targets/npm.d.ts +2 -3
- package/dist/targets/npm.d.ts.map +1 -1
- package/dist/targets/npm.js +24 -49
- package/dist/targets/npm.js.map +1 -1
- package/dist/targets/pypi.d.ts +11 -0
- package/dist/targets/pypi.d.ts.map +1 -0
- package/dist/targets/pypi.js +115 -0
- package/dist/targets/pypi.js.map +1 -0
- package/dist/targets/registry.d.ts +3 -3
- package/dist/targets/registry.d.ts.map +1 -1
- package/dist/targets/scoop.d.ts +11 -0
- package/dist/targets/scoop.d.ts.map +1 -0
- package/dist/targets/scoop.js +93 -0
- package/dist/targets/scoop.js.map +1 -0
- package/examples/README.md +17 -3
- package/examples/github-release/release.config.json +2 -1
- package/examples/multi-target/artifacts/release-example-multi-target-0.1.0.tgz +1 -0
- package/examples/multi-target/index.js +1 -0
- package/examples/multi-target/package.json +7 -0
- package/examples/multi-target/release.config.json +62 -0
- package/examples/non-strict-skips/release.config.json +1 -0
- package/examples/pypi-registry/artifacts/release_example_pypi-0.1.0-py3-none-any.whl +1 -0
- package/examples/pypi-registry/release.config.json +30 -0
- package/examples/scoop-bucket/artifacts/release-example-scoop-0.1.0.zip +1 -0
- package/examples/scoop-bucket/release.config.json +36 -0
- package/package.json +19 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render-plan.js","sourceRoot":"","sources":["../../src/planner/render-plan.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,GAAG,CAAC,SAAgE,EAAU,EAAE,CAC/F,CAAC,SAAS,CAAC,OAAO,CAAC,UAAU,EAAE,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AAErE,MAAM,YAAY,GAAG,CAAC,QAA0C,EAAU,EAAE;IAC1E,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,KAAK,SAAS;QAC9C,CAAC,CAAC,eAAe;QACjB,CAAC,CAAC,YAAY,QAAQ,CAAC,QAAQ,CAAC,SAAS,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAA;IACxE,OAAO,KAAK,QAAQ,CAAC,EAAE,IAAI,QAAQ,CAAC,IAAI,KAAK,QAAQ,CAAC,MAAM,UAAU,QAAQ,CAAC,SAAS,IAAI,QAAQ,EAAE,CAAA;AACxG,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,IAAiB,EAAU,EAAE,CAC1D,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAA;AAEtC,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,IAAiB,EAAU,EAAE;IAC1D,MAAM,KAAK,GAAkB;QAC3B,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE;QAChD,WAAW,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE;QACjC,aAAa,IAAI,CAAC,iBAAiB,EAAE;QACrC,cAAc,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE;QACrC,YAAY,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE;QACjC,eAAe,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE;QACvC,EAAE;KACH,CAAA;IAED,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;IACxB,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;QACtC,KAAK,CAAC,IAAI,CAAC,KAAK,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;IAC3C,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAEd,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;IACtB,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACjD,KAAK,CAAC,IAAI,CACR,OAAO,UAAU,CAAC,QAAQ,KAAK,UAAU,CAAC,SAAS,UAAU,UAAU,CAAC,eAAe,GAAG;YACxF,WAAW,UAAU,CAAC,aAAa,aAAa,UAAU,CAAC,kBAAkB,GAAG;YAChF,cAAc,UAAU,CAAC,UAAU,aAAa,UAAU,CAAC,QAAQ,EAAE,CACxE,CAAA;IACH,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAEd,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;IACzB,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QACxC,KAAK,CAAC,IAAI,CAAC,OAAO,SAAS,CAAC,EAAE,KAAK,SAAS,CAAC,IAAI,KAAK,SAAS,CAAC,WAAW,EAAE,CAAC,CAAA;QAC9E,IAAI,SAAS,IAAI,SAAS,EAAE,CAAC;YAC3B,KAAK,CAAC,IAAI,CAAC,cAAc,WAAW,CAAC,SAAS,CAAC,EAAE,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"render-plan.js","sourceRoot":"","sources":["../../src/planner/render-plan.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import * as Effect from "effect/Effect";
|
|
2
|
+
import { ArtifactInventoryItem, Checksum } from "../domain/artifact.js";
|
|
3
|
+
import { ValidationNoteOperation } from "../domain/operation.js";
|
|
4
|
+
import { ReleaseModel } from "../domain/release.js";
|
|
5
|
+
import { TargetCapabilities, TargetConfig, TargetDryRunSupport, TargetValidationStrategy } from "../domain/target.js";
|
|
6
|
+
import { PlanConstructionError } from "../planner/errors.js";
|
|
7
|
+
export type * from "../types/effect-internal.js";
|
|
8
|
+
interface DryRunValidationNoteOptions {
|
|
9
|
+
readonly id: string;
|
|
10
|
+
readonly targetId: string;
|
|
11
|
+
readonly dryRunSupport: Exclude<TargetDryRunSupport, "native">;
|
|
12
|
+
readonly simulatedDescription: string;
|
|
13
|
+
readonly skippedDescription: string;
|
|
14
|
+
readonly simulatedMessage: string;
|
|
15
|
+
readonly skippedMessage: string;
|
|
16
|
+
}
|
|
17
|
+
interface ArtifactErrorReasons {
|
|
18
|
+
readonly targetId: string;
|
|
19
|
+
readonly directoryReason: string;
|
|
20
|
+
readonly checksumReason: string;
|
|
21
|
+
}
|
|
22
|
+
export declare const validationStrategyForDryRun: (dryRunSupport: TargetDryRunSupport) => TargetValidationStrategy;
|
|
23
|
+
export declare const targetCapabilitiesFor: (target: TargetConfig, validationStrategy: TargetValidationStrategy) => TargetCapabilities;
|
|
24
|
+
export declare const validationNoteOperation: (options: DryRunValidationNoteOptions) => ValidationNoteOperation;
|
|
25
|
+
export declare const rejectNoDryRunInStrictMode: (target: import("../domain/target.js").NpmRegistryTarget | import("../domain/target.js").GitHubReleaseTarget | import("../domain/target.js").HomebrewTapTarget | import("../domain/target.js").PyPiRegistryTarget | import("../domain/target.js").ScoopBucketTarget, model: ReleaseModel, reason: string) => Effect.Effect<undefined, PlanConstructionError, never>;
|
|
26
|
+
export declare const findRequiredArtifact: (model: ReleaseModel, targetId: string, artifactId: string, missingReason: string) => Effect.Effect<ArtifactInventoryItem, PlanConstructionError, never>;
|
|
27
|
+
export declare const requireSha256FileArtifact: (artifact: ArtifactInventoryItem, reasons: ArtifactErrorReasons) => Effect.Effect<{
|
|
28
|
+
artifact: ArtifactInventoryItem;
|
|
29
|
+
checksum: Checksum;
|
|
30
|
+
}, PlanConstructionError, never>;
|
|
31
|
+
//# sourceMappingURL=adapter-helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter-helpers.d.ts","sourceRoot":"","sources":["../../src/targets/adapter-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,qBAAqB,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AACvE,OAAO,EAAE,uBAAuB,EAAkB,MAAM,wBAAwB,CAAA;AAChF,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AACnD,OAAO,EACL,kBAAkB,EAClB,YAAY,EACZ,mBAAmB,EACnB,wBAAwB,EAEzB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAA;AAE5D,mBAAmB,6BAA6B,CAAA;AAEhD,UAAU,2BAA2B;IACnC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC,mBAAmB,EAAE,QAAQ,CAAC,CAAA;IAC9D,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAA;IACrC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAA;IACnC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAA;IACjC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAA;CAChC;AAED,UAAU,oBAAoB;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAA;IAChC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAA;CAChC;AAED,eAAO,MAAM,2BAA2B,GAAI,eAAe,mBAAmB,KAAG,wBAQhF,CAAA;AAED,eAAO,MAAM,qBAAqB,GAChC,QAAQ,YAAY,EACpB,oBAAoB,wBAAwB,KAC3C,kBASC,CAAA;AAEJ,eAAO,MAAM,uBAAuB,GAAI,SAAS,2BAA2B,KAAG,uBAU3E,CAAA;AAEJ,eAAO,MAAM,0BAA0B,qWAarC,CAAA;AAEF,eAAO,MAAM,oBAAoB,0JAgB/B,CAAA;AAEF,eAAO,MAAM,yBAAyB;;;gCAsBpC,CAAA"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import * as Effect from "effect/Effect";
|
|
2
|
+
import { ValidationNoteOperation, noApprovalGate } from "../domain/operation.js";
|
|
3
|
+
import { TargetCapabilities, targetAuthRequirement } from "../domain/target.js";
|
|
4
|
+
import { PlanConstructionError } from "../planner/errors.js";
|
|
5
|
+
export const validationStrategyForDryRun = (dryRunSupport) => {
|
|
6
|
+
if (dryRunSupport === "native") {
|
|
7
|
+
return "native-command";
|
|
8
|
+
}
|
|
9
|
+
if (dryRunSupport === "simulated") {
|
|
10
|
+
return "simulated-plan";
|
|
11
|
+
}
|
|
12
|
+
return "skipped";
|
|
13
|
+
};
|
|
14
|
+
export const targetCapabilitiesFor = (target, validationStrategy) => TargetCapabilities.make({
|
|
15
|
+
targetId: target.id,
|
|
16
|
+
targetTag: target._tag,
|
|
17
|
+
authRequirement: targetAuthRequirement(target),
|
|
18
|
+
dryRunSupport: target.dryRunSupport,
|
|
19
|
+
mutability: target.mutability,
|
|
20
|
+
recovery: target.recovery,
|
|
21
|
+
validationStrategy
|
|
22
|
+
});
|
|
23
|
+
export const validationNoteOperation = (options) => ValidationNoteOperation.make({
|
|
24
|
+
id: options.id,
|
|
25
|
+
targetId: options.targetId,
|
|
26
|
+
description: options.dryRunSupport === "simulated" ? options.simulatedDescription : options.skippedDescription,
|
|
27
|
+
risk: "read-only",
|
|
28
|
+
gate: noApprovalGate("Validation notes do not modify local or remote state."),
|
|
29
|
+
message: options.dryRunSupport === "simulated" ? options.simulatedMessage : options.skippedMessage,
|
|
30
|
+
skipped: options.dryRunSupport === "none",
|
|
31
|
+
severity: options.dryRunSupport === "simulated" ? "info" : "warning"
|
|
32
|
+
});
|
|
33
|
+
export const rejectNoDryRunInStrictMode = Effect.fn("rejectNoDryRunInStrictMode")(function* (target, model, reason) {
|
|
34
|
+
if (model.strict && target.dryRunSupport === "none") {
|
|
35
|
+
return yield* Effect.fail(PlanConstructionError.make({
|
|
36
|
+
targetId: target.id,
|
|
37
|
+
reason
|
|
38
|
+
}));
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
export const findRequiredArtifact = Effect.fn("findRequiredArtifact")(function* (model, targetId, artifactId, missingReason) {
|
|
42
|
+
const artifact = model.artifacts.find((item) => item.id === artifactId);
|
|
43
|
+
if (artifact === undefined) {
|
|
44
|
+
return yield* Effect.fail(PlanConstructionError.make({
|
|
45
|
+
targetId,
|
|
46
|
+
reason: missingReason
|
|
47
|
+
}));
|
|
48
|
+
}
|
|
49
|
+
return artifact;
|
|
50
|
+
});
|
|
51
|
+
export const requireSha256FileArtifact = Effect.fn("requireSha256FileArtifact")(function* (artifact, reasons) {
|
|
52
|
+
if (artifact.format === "directory") {
|
|
53
|
+
return yield* Effect.fail(PlanConstructionError.make({
|
|
54
|
+
targetId: reasons.targetId,
|
|
55
|
+
reason: reasons.directoryReason
|
|
56
|
+
}));
|
|
57
|
+
}
|
|
58
|
+
if (artifact.checksum === undefined || artifact.checksum.algorithm !== "sha256") {
|
|
59
|
+
return yield* Effect.fail(PlanConstructionError.make({
|
|
60
|
+
targetId: reasons.targetId,
|
|
61
|
+
reason: reasons.checksumReason
|
|
62
|
+
}));
|
|
63
|
+
}
|
|
64
|
+
const checksum = artifact.checksum;
|
|
65
|
+
return { artifact, checksum };
|
|
66
|
+
});
|
|
67
|
+
//# sourceMappingURL=adapter-helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter-helpers.js","sourceRoot":"","sources":["../../src/targets/adapter-helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as Effect from "effect/Effect";
|
|
2
2
|
import { Operation } from "../domain/operation.js";
|
|
3
3
|
import { ReleaseModel } from "../domain/release.js";
|
|
4
|
-
import { GitHubReleaseTarget, HomebrewTapTarget, NpmRegistryTarget, TargetCapabilities, TargetConfig } from "../domain/target.js";
|
|
4
|
+
import { GitHubReleaseTarget, HomebrewTapTarget, NpmRegistryTarget, PyPiRegistryTarget, ScoopBucketTarget, TargetCapabilities, TargetConfig } from "../domain/target.js";
|
|
5
5
|
import { PlanConstructionError } from "../planner/errors.js";
|
|
6
6
|
export type * from "../types/effect-internal.js";
|
|
7
7
|
export interface TargetAdapter<Target extends TargetConfig> {
|
|
@@ -12,4 +12,6 @@ export interface TargetAdapter<Target extends TargetConfig> {
|
|
|
12
12
|
export type NpmTargetAdapter = TargetAdapter<NpmRegistryTarget>;
|
|
13
13
|
export type GitHubTargetAdapter = TargetAdapter<GitHubReleaseTarget>;
|
|
14
14
|
export type HomebrewTargetAdapter = TargetAdapter<HomebrewTapTarget>;
|
|
15
|
+
export type PyPiTargetAdapter = TargetAdapter<PyPiRegistryTarget>;
|
|
16
|
+
export type ScoopTargetAdapter = TargetAdapter<ScoopBucketTarget>;
|
|
15
17
|
//# sourceMappingURL=adapter.d.ts.map
|
|
@@ -1 +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"}
|
|
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,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;AACpE,MAAM,MAAM,iBAAiB,GAAG,aAAa,CAAC,kBAAkB,CAAC,CAAA;AACjE,MAAM,MAAM,kBAAkB,GAAG,aAAa,CAAC,iBAAiB,CAAC,CAAA"}
|
package/dist/targets/github.d.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import * as Effect from "effect/Effect";
|
|
2
|
-
import { PublishCommandOperation, ValidateCommandOperation,
|
|
2
|
+
import { PublishCommandOperation, ValidateCommandOperation, VerifyHttpOperation } from "../domain/operation.js";
|
|
3
3
|
import { ReleaseModel } from "../domain/release.js";
|
|
4
4
|
import { GitHubReleaseTarget, TargetCapabilities } from "../domain/target.js";
|
|
5
5
|
import { PlanConstructionError } from "../planner/errors.js";
|
|
6
6
|
import { GitHubTargetAdapter } from "./adapter.js";
|
|
7
7
|
export type * from "../types/effect-internal.js";
|
|
8
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>;
|
|
9
|
+
export declare const planGitHubOperations: (target: GitHubReleaseTarget, model: ReleaseModel) => Effect.Effect<(import("../domain/operation.js").RenderFileOperation | ValidateCommandOperation | import("../domain/operation.js").ValidationNoteOperation | PublishCommandOperation | import("../domain/operation.js").VerifyRemoteOperation | VerifyHttpOperation)[], PlanConstructionError, never>;
|
|
10
10
|
export declare const GitHubAdapter: GitHubTargetAdapter;
|
|
11
11
|
//# sourceMappingURL=github.d.ts.map
|
|
@@ -1 +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,
|
|
1
|
+
{"version":3,"file":"github.d.ts","sourceRoot":"","sources":["../../src/targets/github.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,EAWL,uBAAuB,EACvB,wBAAwB,EACxB,mBAAmB,EACpB,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;AAGlD,mBAAmB,6BAA6B,CAAA;AAoBhD,eAAO,MAAM,wBAAwB,GAAI,QAAQ,mBAAmB,KAAG,kBACN,CAAA;AA4HjE,eAAO,MAAM,oBAAoB,4VAmD/B,CAAA;AAEF,eAAO,MAAM,aAAa,EAAE,mBAI3B,CAAA"}
|
package/dist/targets/github.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as Effect from "effect/Effect";
|
|
2
|
-
import { CommandSpec, executeGate, irreversibleGate, noApprovalGate, PublishCommandOperation, ValidateCommandOperation,
|
|
3
|
-
import { TargetCapabilities, targetAuthRequirement } from "../domain/target.js";
|
|
2
|
+
import { CommandSpec, executeGate, HttpEnvHeader, HttpHeader, HttpJsonArrayObjectFieldEqualsCheck, HttpJsonEqualsCheck, HttpRequestSpec, irreversibleGate, noApprovalGate, PublishCommandOperation, ValidateCommandOperation, VerifyHttpOperation } from "../domain/operation.js";
|
|
4
3
|
import { PlanConstructionError } from "../planner/errors.js";
|
|
4
|
+
import { rejectNoDryRunInStrictMode, targetCapabilitiesFor, validationNoteOperation } from "./adapter-helpers.js";
|
|
5
5
|
const envNames = (target) => target.tokenEnv === undefined ? [] : [target.tokenEnv];
|
|
6
6
|
const ghCommand = (target, args, includeAuth) => CommandSpec.make({
|
|
7
7
|
executable: "gh",
|
|
@@ -10,33 +10,12 @@ const ghCommand = (target, args, includeAuth) => CommandSpec.make({
|
|
|
10
10
|
redactedEnv: includeAuth ? envNames(target) : []
|
|
11
11
|
});
|
|
12
12
|
const githubValidationStrategy = (target) => target.dryRunSupport === "none" ? "skipped" : "simulated-plan";
|
|
13
|
-
export const githubTargetCapabilities = (target) =>
|
|
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
|
-
});
|
|
13
|
+
export const githubTargetCapabilities = (target) => targetCapabilitiesFor(target, githubValidationStrategy(target));
|
|
22
14
|
const targetArtifacts = (target, model) => model.artifacts.filter((artifact) => artifact.consumers.includes(target.id));
|
|
23
15
|
const pathBaseName = (path) => {
|
|
24
16
|
const parts = path.replaceAll("\\", "/").split("/");
|
|
25
17
|
return parts[parts.length - 1] ?? path;
|
|
26
18
|
};
|
|
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
19
|
const releaseArgs = (target, model) => {
|
|
41
20
|
const args = [
|
|
42
21
|
"release",
|
|
@@ -61,78 +40,86 @@ const releaseArgs = (target, model) => {
|
|
|
61
40
|
}
|
|
62
41
|
return args;
|
|
63
42
|
};
|
|
43
|
+
const githubReleaseApiUrl = (target, tag) => `https://api.github.com/repos/${target.repository}/releases/tags/${encodeURIComponent(tag)}`;
|
|
44
|
+
const githubApiHeaders = () => [
|
|
45
|
+
HttpHeader.make({ name: "Accept", value: "application/vnd.github+json" }),
|
|
46
|
+
HttpHeader.make({ name: "X-GitHub-Api-Version", value: "2022-11-28" })
|
|
47
|
+
];
|
|
48
|
+
const githubApiEnvHeaders = (target) => target.tokenEnv === undefined
|
|
49
|
+
? []
|
|
50
|
+
: [
|
|
51
|
+
HttpEnvHeader.make({
|
|
52
|
+
name: "Authorization",
|
|
53
|
+
valueEnv: target.tokenEnv,
|
|
54
|
+
prefix: "Bearer "
|
|
55
|
+
})
|
|
56
|
+
];
|
|
64
57
|
const githubVerificationOperations = (target, model) => {
|
|
65
58
|
const tag = model.identity.tag ?? model.identity.version;
|
|
66
59
|
const title = `${model.identity.name} ${model.identity.version}`;
|
|
67
60
|
const isDraft = target.draft === true;
|
|
68
61
|
const isPrerelease = target.prerelease === true;
|
|
62
|
+
const artifactChecks = targetArtifacts(target, model).map((artifact) => HttpJsonArrayObjectFieldEqualsCheck.make({
|
|
63
|
+
path: ["assets"],
|
|
64
|
+
field: "name",
|
|
65
|
+
expected: pathBaseName(artifact.path)
|
|
66
|
+
}));
|
|
69
67
|
return [
|
|
70
|
-
|
|
71
|
-
id: `${target.id}:
|
|
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`,
|
|
68
|
+
VerifyHttpOperation.make({
|
|
69
|
+
id: `${target.id}:github-release-verify-http`,
|
|
80
70
|
targetId: target.id,
|
|
81
|
-
description: "Verify the GitHub release
|
|
71
|
+
description: "Verify the GitHub release through the GitHub API.",
|
|
82
72
|
risk: "read-only",
|
|
83
|
-
gate: noApprovalGate("
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
73
|
+
gate: noApprovalGate("GitHub API release verification is read-only."),
|
|
74
|
+
request: HttpRequestSpec.make({
|
|
75
|
+
method: "GET",
|
|
76
|
+
url: githubReleaseApiUrl(target, tag),
|
|
77
|
+
headers: githubApiHeaders(),
|
|
78
|
+
envHeaders: githubApiEnvHeaders(target),
|
|
79
|
+
requiredEnv: envNames(target),
|
|
80
|
+
redactedEnv: envNames(target)
|
|
81
|
+
}),
|
|
82
|
+
expectedStatus: 200,
|
|
83
|
+
checks: [
|
|
84
|
+
HttpJsonEqualsCheck.make({
|
|
85
|
+
path: ["tag_name"],
|
|
86
|
+
expected: tag
|
|
87
|
+
}),
|
|
88
|
+
HttpJsonEqualsCheck.make({
|
|
89
|
+
path: ["name"],
|
|
90
|
+
expected: title
|
|
91
|
+
}),
|
|
92
|
+
HttpJsonEqualsCheck.make({
|
|
93
|
+
path: ["draft"],
|
|
94
|
+
expected: isDraft
|
|
95
|
+
}),
|
|
96
|
+
HttpJsonEqualsCheck.make({
|
|
97
|
+
path: ["prerelease"],
|
|
98
|
+
expected: isPrerelease
|
|
99
|
+
}),
|
|
100
|
+
...artifactChecks
|
|
101
|
+
]
|
|
112
102
|
})
|
|
113
103
|
];
|
|
114
104
|
};
|
|
115
|
-
const githubDryRunOperation = (target) =>
|
|
105
|
+
const githubDryRunOperation = (target, dryRunSupport) => validationNoteOperation({
|
|
116
106
|
id: `${target.id}:gh-release-dry-run`,
|
|
117
107
|
targetId: target.id,
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
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"
|
|
108
|
+
dryRunSupport,
|
|
109
|
+
simulatedDescription: "Record simulated GitHub release dry-run validation.",
|
|
110
|
+
skippedDescription: "Record skipped GitHub release dry-run validation.",
|
|
111
|
+
simulatedMessage: "GitHub release dry-run validation is simulated by the deterministic release plan; gh release create has no native dry-run command.",
|
|
112
|
+
skippedMessage: "GitHub release dry-run validation was skipped because this target declares no dry-run support."
|
|
128
113
|
});
|
|
129
114
|
export const planGitHubOperations = Effect.fn("planGitHubOperations")(function* (target, model) {
|
|
130
|
-
|
|
115
|
+
const dryRunSupport = target.dryRunSupport;
|
|
116
|
+
if (dryRunSupport === "native") {
|
|
131
117
|
return yield* Effect.fail(PlanConstructionError.make({
|
|
132
118
|
targetId: target.id,
|
|
133
|
-
reason: "GitHub release
|
|
119
|
+
reason: "GitHub release targets do not support native dry-run; use simulated dry-run support."
|
|
134
120
|
}));
|
|
135
121
|
}
|
|
122
|
+
yield* rejectNoDryRunInStrictMode(target, model, "GitHub release target declares no dry-run support in strict mode.");
|
|
136
123
|
const publishRisk = target.mutability === "immutable" ? "irreversible" : "externally-visible";
|
|
137
124
|
const publishGate = publishRisk === "irreversible"
|
|
138
125
|
? irreversibleGate("Creating this GitHub release is externally visible and configured as immutable.")
|
|
@@ -154,7 +141,7 @@ export const planGitHubOperations = Effect.fn("planGitHubOperations")(function*
|
|
|
154
141
|
gate: noApprovalGate("gh auth status checks authentication without publishing."),
|
|
155
142
|
command: ghCommand(target, ["auth", "status"], true)
|
|
156
143
|
}),
|
|
157
|
-
githubDryRunOperation(target),
|
|
144
|
+
githubDryRunOperation(target, dryRunSupport),
|
|
158
145
|
PublishCommandOperation.make({
|
|
159
146
|
id: `${target.id}:gh-release-create`,
|
|
160
147
|
targetId: target.id,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"github.js","sourceRoot":"","sources":["../../src/targets/github.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,EACL,WAAW,EACX,WAAW,EACX,gBAAgB,EAChB,cAAc,EAEd,uBAAuB,EACvB,wBAAwB,EACxB,
|
|
1
|
+
{"version":3,"file":"github.js","sourceRoot":"","sources":["../../src/targets/github.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import * as Effect from "effect/Effect";
|
|
2
|
-
import { PublishCommandOperation, RenderFileOperation, ValidateCommandOperation
|
|
2
|
+
import { PublishCommandOperation, RenderFileOperation, ValidateCommandOperation } from "../domain/operation.js";
|
|
3
3
|
import { ReleaseModel } from "../domain/release.js";
|
|
4
4
|
import { HomebrewTapTarget, TargetCapabilities } from "../domain/target.js";
|
|
5
5
|
import { PlanConstructionError } from "../planner/errors.js";
|
|
6
6
|
import { HomebrewTargetAdapter } from "./adapter.js";
|
|
7
7
|
export type * from "../types/effect-internal.js";
|
|
8
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>;
|
|
9
|
+
export declare const planHomebrewOperations: (target: HomebrewTapTarget, model: ReleaseModel) => Effect.Effect<(RenderFileOperation | ValidateCommandOperation | import("../domain/operation.js").ValidationNoteOperation | PublishCommandOperation | import("../domain/operation.js").VerifyRemoteOperation | import("../domain/operation.js").VerifyHttpOperation)[], PlanConstructionError, never>;
|
|
10
10
|
export declare const HomebrewAdapter: HomebrewTargetAdapter;
|
|
11
11
|
//# sourceMappingURL=homebrew.d.ts.map
|
|
@@ -1 +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,
|
|
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,EACzB,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AACnD,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EACnB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAA;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAA;AAUpD,mBAAmB,6BAA6B,CAAA;AAyBhD,eAAO,MAAM,0BAA0B,GAAI,QAAQ,iBAAiB,KAAG,kBACW,CAAA;AA0ElF,eAAO,MAAM,sBAAsB,0VAmDjC,CAAA;AAEF,eAAO,MAAM,eAAe,EAAE,qBAI7B,CAAA"}
|
package/dist/targets/homebrew.js
CHANGED
|
@@ -1,33 +1,22 @@
|
|
|
1
1
|
import * as Effect from "effect/Effect";
|
|
2
|
-
import { CommandSpec, executeGate, irreversibleGate, noApprovalGate, PublishCommandOperation, RenderFileOperation, ValidateCommandOperation
|
|
3
|
-
import { TargetCapabilities, targetAuthRequirement } from "../domain/target.js";
|
|
2
|
+
import { CommandSpec, executeGate, irreversibleGate, noApprovalGate, PublishCommandOperation, RenderFileOperation, ValidateCommandOperation } from "../domain/operation.js";
|
|
4
3
|
import { PlanConstructionError } from "../planner/errors.js";
|
|
5
|
-
|
|
6
|
-
const command = (
|
|
4
|
+
import { findRequiredArtifact, requireSha256FileArtifact, rejectNoDryRunInStrictMode, targetCapabilitiesFor, validationNoteOperation, validationStrategyForDryRun } from "./adapter-helpers.js";
|
|
5
|
+
const command = (executable, args) => CommandSpec.make({
|
|
7
6
|
executable,
|
|
8
7
|
args: [...args],
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
redactedEnv: includeAuth ? envNames(target) : []
|
|
8
|
+
requiredEnv: [],
|
|
9
|
+
redactedEnv: []
|
|
12
10
|
});
|
|
13
|
-
const
|
|
14
|
-
if (target.
|
|
15
|
-
return
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
11
|
+
const rejectUnsupportedTokenEnv = Effect.fn("rejectUnsupportedHomebrewTokenEnv")(function* (target) {
|
|
12
|
+
if (target.tokenEnv !== undefined) {
|
|
13
|
+
return yield* Effect.fail(PlanConstructionError.make({
|
|
14
|
+
targetId: target.id,
|
|
15
|
+
reason: "Homebrew tap targets currently publish with plain git push and require Git credentials to be configured outside the release plan; tokenEnv is not supported yet."
|
|
16
|
+
}));
|
|
19
17
|
}
|
|
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
18
|
});
|
|
19
|
+
export const homebrewTargetCapabilities = (target) => targetCapabilitiesFor(target, validationStrategyForDryRun(target.dryRunSupport));
|
|
31
20
|
const pathBaseName = (path) => {
|
|
32
21
|
const parts = path.replaceAll("\\", "/").split("/");
|
|
33
22
|
return parts[parts.length - 1] ?? path;
|
|
@@ -39,36 +28,23 @@ const formulaClassName = (formulaName) => {
|
|
|
39
28
|
return className.length === 0 ? "GeneratedFormula" : className;
|
|
40
29
|
};
|
|
41
30
|
const renderFormula = (target, model) => Effect.gen(function* () {
|
|
42
|
-
const artifact = model.
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
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
|
-
}
|
|
31
|
+
const artifact = yield* findRequiredArtifact(model, target.id, target.artifactId, `Homebrew target references missing artifact ${target.artifactId}.`);
|
|
32
|
+
const validated = yield* requireSha256FileArtifact(artifact, {
|
|
33
|
+
targetId: target.id,
|
|
34
|
+
directoryReason: "Homebrew formula artifacts must be file-like, not directories.",
|
|
35
|
+
checksumReason: "Homebrew formula rendering requires a sha256 artifact checksum."
|
|
36
|
+
});
|
|
61
37
|
const installLines = target.installPath === undefined
|
|
62
38
|
? [" prefix.install Dir[\"*\"]"]
|
|
63
39
|
: [` bin.install ${rubyString(target.installPath)} => ${rubyString(target.formulaName)}`];
|
|
64
40
|
const homepage = target.homepage ?? `https://github.com/${target.repository}`;
|
|
65
|
-
const url = target.url ?? artifact.path;
|
|
41
|
+
const url = target.url ?? validated.artifact.path;
|
|
66
42
|
return [
|
|
67
43
|
`class ${formulaClassName(target.formulaName)} < Formula`,
|
|
68
44
|
` desc ${rubyString(`${model.identity.name} ${model.identity.version} release artifact`)}`,
|
|
69
45
|
` homepage ${rubyString(homepage)}`,
|
|
70
46
|
` url ${rubyString(url)}`,
|
|
71
|
-
` sha256 ${rubyString(
|
|
47
|
+
` sha256 ${rubyString(validated.checksum.value)}`,
|
|
72
48
|
` version ${rubyString(model.identity.version)}`,
|
|
73
49
|
"",
|
|
74
50
|
" def install",
|
|
@@ -78,36 +54,30 @@ const renderFormula = (target, model) => Effect.gen(function* () {
|
|
|
78
54
|
""
|
|
79
55
|
].join("\n");
|
|
80
56
|
});
|
|
81
|
-
const dryRunOperation = (target) =>
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
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({
|
|
57
|
+
const dryRunOperation = (target) => {
|
|
58
|
+
const dryRunSupport = target.dryRunSupport;
|
|
59
|
+
return dryRunSupport === "native"
|
|
60
|
+
? ValidateCommandOperation.make({
|
|
61
|
+
id: `${target.id}:brew-audit`,
|
|
107
62
|
targetId: target.id,
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
63
|
+
description: "Validate generated Homebrew formula with brew audit.",
|
|
64
|
+
risk: "read-only",
|
|
65
|
+
gate: noApprovalGate("brew audit validates the generated formula without publishing."),
|
|
66
|
+
command: command("brew", ["audit", "--strict", "--formula", target.formulaPath])
|
|
67
|
+
})
|
|
68
|
+
: validationNoteOperation({
|
|
69
|
+
id: `${target.id}:brew-audit`,
|
|
70
|
+
targetId: target.id,
|
|
71
|
+
dryRunSupport,
|
|
72
|
+
simulatedDescription: "Record simulated Homebrew formula validation.",
|
|
73
|
+
skippedDescription: "Record skipped Homebrew formula validation.",
|
|
74
|
+
simulatedMessage: "Homebrew formula validation is simulated by the deterministic release plan.",
|
|
75
|
+
skippedMessage: "Homebrew formula validation was skipped because this target declares no dry-run support."
|
|
76
|
+
});
|
|
77
|
+
};
|
|
78
|
+
export const planHomebrewOperations = Effect.fn("planHomebrewOperations")(function* (target, model) {
|
|
79
|
+
yield* rejectUnsupportedTokenEnv(target);
|
|
80
|
+
yield* rejectNoDryRunInStrictMode(target, model, "Homebrew tap target declares no dry-run support in strict mode.");
|
|
111
81
|
const formula = yield* renderFormula(target, model);
|
|
112
82
|
const publishRisk = target.mutability === "immutable" ? "irreversible" : "externally-visible";
|
|
113
83
|
const publishGate = publishRisk === "irreversible"
|
|
@@ -132,7 +102,7 @@ export const planHomebrewOperations = Effect.fn("planHomebrewOperations")(functi
|
|
|
132
102
|
description: "Check Homebrew CLI availability.",
|
|
133
103
|
risk: "read-only",
|
|
134
104
|
gate: noApprovalGate("CLI availability validation is read-only."),
|
|
135
|
-
command: command(
|
|
105
|
+
command: command("brew", ["--version"])
|
|
136
106
|
}));
|
|
137
107
|
}
|
|
138
108
|
operations.push(dryRunOperation(target), PublishCommandOperation.make({
|
|
@@ -141,7 +111,7 @@ export const planHomebrewOperations = Effect.fn("planHomebrewOperations")(functi
|
|
|
141
111
|
description: `Push Homebrew tap update for ${model.identity.name}@${model.identity.version}.`,
|
|
142
112
|
risk: publishRisk,
|
|
143
113
|
gate: publishGate,
|
|
144
|
-
command: command(
|
|
114
|
+
command: command("git", ["-C", tapDirectory, "push"])
|
|
145
115
|
}));
|
|
146
116
|
return operations;
|
|
147
117
|
});
|