@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.
Files changed (92) hide show
  1. package/README.md +70 -13
  2. package/dist/cli/command.d.ts.map +1 -1
  3. package/dist/cli/command.js +37 -2
  4. package/dist/cli/command.js.map +1 -1
  5. package/dist/cli/main.js +5 -2
  6. package/dist/cli/main.js.map +1 -1
  7. package/dist/cli/programmatic.d.ts +1 -1
  8. package/dist/cli/programmatic.d.ts.map +1 -1
  9. package/dist/cli/programmatic.js +7 -2
  10. package/dist/cli/programmatic.js.map +1 -1
  11. package/dist/domain/evidence.d.ts +49 -3
  12. package/dist/domain/evidence.d.ts.map +1 -1
  13. package/dist/domain/evidence.js +43 -2
  14. package/dist/domain/evidence.js.map +1 -1
  15. package/dist/domain/operation.d.ts +56 -2
  16. package/dist/domain/operation.d.ts.map +1 -1
  17. package/dist/domain/operation.js +47 -1
  18. package/dist/domain/operation.js.map +1 -1
  19. package/dist/domain/release.d.ts +4 -4
  20. package/dist/domain/target.d.ts +31 -1
  21. package/dist/domain/target.d.ts.map +1 -1
  22. package/dist/domain/target.js +40 -3
  23. package/dist/domain/target.js.map +1 -1
  24. package/dist/host/http-live.d.ts +7 -0
  25. package/dist/host/http-live.d.ts.map +1 -0
  26. package/dist/host/http-live.js +76 -0
  27. package/dist/host/http-live.js.map +1 -0
  28. package/dist/host/http.d.ts +40 -0
  29. package/dist/host/http.d.ts.map +1 -0
  30. package/dist/host/http.js +56 -0
  31. package/dist/host/http.js.map +1 -0
  32. package/dist/planner/errors.d.ts +4 -2
  33. package/dist/planner/errors.d.ts.map +1 -1
  34. package/dist/planner/errors.js +5 -3
  35. package/dist/planner/errors.js.map +1 -1
  36. package/dist/planner/evidence-recorder.d.ts +6 -3
  37. package/dist/planner/evidence-recorder.d.ts.map +1 -1
  38. package/dist/planner/evidence-recorder.js +149 -2
  39. package/dist/planner/evidence-recorder.js.map +1 -1
  40. package/dist/planner/executor.d.ts +41 -14
  41. package/dist/planner/executor.d.ts.map +1 -1
  42. package/dist/planner/executor.js +102 -36
  43. package/dist/planner/executor.js.map +1 -1
  44. package/dist/planner/normalize-release.d.ts.map +1 -1
  45. package/dist/planner/normalize-release.js +43 -2
  46. package/dist/planner/normalize-release.js.map +1 -1
  47. package/dist/planner/render-plan.d.ts.map +1 -1
  48. package/dist/planner/render-plan.js +9 -0
  49. package/dist/planner/render-plan.js.map +1 -1
  50. package/dist/targets/adapter-helpers.d.ts +31 -0
  51. package/dist/targets/adapter-helpers.d.ts.map +1 -0
  52. package/dist/targets/adapter-helpers.js +67 -0
  53. package/dist/targets/adapter-helpers.js.map +1 -0
  54. package/dist/targets/adapter.d.ts +3 -1
  55. package/dist/targets/adapter.d.ts.map +1 -1
  56. package/dist/targets/github.d.ts +2 -2
  57. package/dist/targets/github.d.ts.map +1 -1
  58. package/dist/targets/github.js +65 -78
  59. package/dist/targets/github.js.map +1 -1
  60. package/dist/targets/homebrew.d.ts +2 -2
  61. package/dist/targets/homebrew.d.ts.map +1 -1
  62. package/dist/targets/homebrew.js +45 -75
  63. package/dist/targets/homebrew.js.map +1 -1
  64. package/dist/targets/live.d.ts.map +1 -1
  65. package/dist/targets/live.js +10 -0
  66. package/dist/targets/live.js.map +1 -1
  67. package/dist/targets/npm.d.ts +2 -3
  68. package/dist/targets/npm.d.ts.map +1 -1
  69. package/dist/targets/npm.js +24 -49
  70. package/dist/targets/npm.js.map +1 -1
  71. package/dist/targets/pypi.d.ts +11 -0
  72. package/dist/targets/pypi.d.ts.map +1 -0
  73. package/dist/targets/pypi.js +115 -0
  74. package/dist/targets/pypi.js.map +1 -0
  75. package/dist/targets/registry.d.ts +3 -3
  76. package/dist/targets/registry.d.ts.map +1 -1
  77. package/dist/targets/scoop.d.ts +11 -0
  78. package/dist/targets/scoop.d.ts.map +1 -0
  79. package/dist/targets/scoop.js +93 -0
  80. package/dist/targets/scoop.js.map +1 -0
  81. package/examples/README.md +17 -3
  82. package/examples/github-release/release.config.json +2 -1
  83. package/examples/multi-target/artifacts/release-example-multi-target-0.1.0.tgz +1 -0
  84. package/examples/multi-target/index.js +1 -0
  85. package/examples/multi-target/package.json +7 -0
  86. package/examples/multi-target/release.config.json +62 -0
  87. package/examples/non-strict-skips/release.config.json +1 -0
  88. package/examples/pypi-registry/artifacts/release_example_pypi-0.1.0-py3-none-any.whl +1 -0
  89. package/examples/pypi-registry/release.config.json +30 -0
  90. package/examples/scoop-bucket/artifacts/release-example-scoop-0.1.0.zip +1 -0
  91. package/examples/scoop-bucket/release.config.json +36 -0
  92. package/package.json +19 -2
@@ -1 +1 @@
1
- {"version":3,"file":"render-plan.js","sourceRoot":"","sources":["../../src/planner/render-plan.ts"],"names":[],"mappings":"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"}
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"}
@@ -1,11 +1,11 @@
1
1
  import * as Effect from "effect/Effect";
2
- import { PublishCommandOperation, ValidateCommandOperation, ValidationNoteOperation, VerifyRemoteOperation } from "../domain/operation.js";
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,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"}
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"}
@@ -1,7 +1,7 @@
1
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";
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) => 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
- });
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
- 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`,
68
+ VerifyHttpOperation.make({
69
+ id: `${target.id}:github-release-verify-http`,
80
70
  targetId: target.id,
81
- description: "Verify the GitHub release title.",
71
+ description: "Verify the GitHub release through the GitHub API.",
82
72
  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
- });
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) => ValidationNoteOperation.make({
105
+ const githubDryRunOperation = (target, dryRunSupport) => validationNoteOperation({
116
106
  id: `${target.id}:gh-release-dry-run`,
117
107
  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"
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
- if (model.strict && target.dryRunSupport === "none") {
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 target declares no dry-run support in strict mode."
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,uBAAuB,EACvB,qBAAqB,EACtB,MAAM,wBAAwB,CAAA;AAE/B,OAAO,EAEL,kBAAkB,EAClB,qBAAqB,EAEtB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAA;AAK5D,MAAM,QAAQ,GAAG,CAAC,MAA2B,EAAyB,EAAE,CACtE,MAAM,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;AAExD,MAAM,SAAS,GAAG,CAChB,MAA2B,EAC3B,IAA2B,EAC3B,WAAoB,EACP,EAAE,CACf,WAAW,CAAC,IAAI,CAAC;IACf,UAAU,EAAE,IAAI;IAChB,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;IACf,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE;IAChD,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE;CACjD,CAAC,CAAA;AAEJ,MAAM,wBAAwB,GAAG,CAAC,MAA2B,EAA4B,EAAE,CACzF,MAAM,CAAC,aAAa,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,gBAAgB,CAAA;AAEhE,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,MAA2B,EAAsB,EAAE,CAC1F,kBAAkB,CAAC,IAAI,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC,EAAE;IACnB,SAAS,EAAE,MAAM,CAAC,IAAI;IACtB,eAAe,EAAE,qBAAqB,CAAC,MAAM,CAAC;IAC9C,aAAa,EAAE,MAAM,CAAC,aAAa;IACnC,UAAU,EAAE,MAAM,CAAC,UAAU;IAC7B,QAAQ,EAAE,MAAM,CAAC,QAAQ;IACzB,kBAAkB,EAAE,wBAAwB,CAAC,MAAM,CAAC;CACrD,CAAC,CAAA;AAEJ,MAAM,eAAe,GAAG,CAAC,MAA2B,EAAE,KAAmB,EAAE,EAAE,CAC3E,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAA;AAE9E,MAAM,YAAY,GAAG,CAAC,IAAY,EAAU,EAAE;IAC5C,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IACnD,OAAO,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,IAAI,CAAA;AACxC,CAAC,CAAA;AAED,MAAM,QAAQ,GAAG,CAAC,KAAa,EAAU,EAAE,CACzC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;AAEvB,MAAM,QAAQ,GAAG,CAAC,SAAiB,EAAE,OAAe,EAAU,EAAE,CAC9D,MAAM,SAAS,0BAA0B,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAA;AAEnE,MAAM,sBAAsB,GAAG,CAC7B,MAA2B,EAC3B,KAAmB,EACnB,MAA6B,EAC7B,EAAU,EACG,EAAE,CACf,SAAS,CAAC,MAAM,EAAE;IAChB,SAAS;IACT,MAAM;IACN,KAAK,CAAC,QAAQ,CAAC,GAAG,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO;IAC5C,QAAQ;IACR,MAAM,CAAC,UAAU;IACjB,QAAQ;IACR,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;IAChB,MAAM;IACN,EAAE;CACH,EAAE,IAAI,CAAC,CAAA;AAEV,MAAM,WAAW,GAAG,CAAC,MAA2B,EAAE,KAAmB,EAAyB,EAAE;IAC9F,MAAM,IAAI,GAAkB;QAC1B,SAAS;QACT,QAAQ;QACR,KAAK,CAAC,QAAQ,CAAC,GAAG,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO;QAC5C,QAAQ;QACR,MAAM,CAAC,UAAU;QACjB,SAAS;QACT,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,EAAE;KACnD,CAAA;IACD,IAAI,MAAM,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;QAC1B,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IACtB,CAAC;IACD,IAAI,MAAM,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;QAC/B,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;IAC3B,CAAC;IACD,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QACvC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;IAC5C,CAAC;IACD,KAAK,MAAM,QAAQ,IAAI,eAAe,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC;QACtD,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;IAC1B,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC,CAAA;AAED,MAAM,4BAA4B,GAAG,CACnC,MAA2B,EAC3B,KAAmB,EACO,EAAE;IAC5B,MAAM,GAAG,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAA;IACxD,MAAM,KAAK,GAAG,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAA;IAChE,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,KAAK,IAAI,CAAA;IACrC,MAAM,YAAY,GAAG,MAAM,CAAC,UAAU,KAAK,IAAI,CAAA;IAE/C,OAAO;QACL,qBAAqB,CAAC,IAAI,CAAC;YACzB,EAAE,EAAE,GAAG,MAAM,CAAC,EAAE,kBAAkB;YAClC,QAAQ,EAAE,MAAM,CAAC,EAAE;YACnB,WAAW,EAAE,uCAAuC;YACpD,IAAI,EAAE,WAAW;YACjB,IAAI,EAAE,cAAc,CAAC,oCAAoC,CAAC;YAC1D,OAAO,EAAE,sBAAsB,CAC7B,MAAM,EACN,KAAK,EACL,CAAC,SAAS,CAAC,EACX,QAAQ,CAAC,eAAe,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,wBAAwB,GAAG,GAAG,CAAC,CACzE;SACF,CAAC;QACF,qBAAqB,CAAC,IAAI,CAAC;YACzB,EAAE,EAAE,GAAG,MAAM,CAAC,EAAE,0BAA0B;YAC1C,QAAQ,EAAE,MAAM,CAAC,EAAE;YACnB,WAAW,EAAE,kCAAkC;YAC/C,IAAI,EAAE,WAAW;YACjB,IAAI,EAAE,cAAc,CAAC,0CAA0C,CAAC;YAChE,OAAO,EAAE,sBAAsB,CAC7B,MAAM,EACN,KAAK,EACL,CAAC,MAAM,CAAC,EACR,QAAQ,CAAC,YAAY,QAAQ,CAAC,KAAK,CAAC,EAAE,EAAE,0BAA0B,KAAK,GAAG,CAAC,CAC5E;SACF,CAAC;QACF,qBAAqB,CAAC,IAAI,CAAC;YACzB,EAAE,EAAE,GAAG,MAAM,CAAC,EAAE,0BAA0B;YAC1C,QAAQ,EAAE,MAAM,CAAC,EAAE;YACnB,WAAW,EAAE,uCAAuC;YACpD,IAAI,EAAE,WAAW;YACjB,IAAI,EAAE,cAAc,CAAC,0CAA0C,CAAC;YAChE,OAAO,EAAE,sBAAsB,CAC7B,MAAM,EACN,KAAK,EACL,CAAC,SAAS,CAAC,EACX,QAAQ,CAAC,eAAe,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,EAAE,+BAA+B,OAAO,GAAG,CAAC,CACjG;SACF,CAAC;QACF,qBAAqB,CAAC,IAAI,CAAC;YACzB,EAAE,EAAE,GAAG,MAAM,CAAC,EAAE,+BAA+B;YAC/C,QAAQ,EAAE,MAAM,CAAC,EAAE;YACnB,WAAW,EAAE,4CAA4C;YACzD,IAAI,EAAE,WAAW;YACjB,IAAI,EAAE,cAAc,CAAC,+CAA+C,CAAC;YACrE,OAAO,EAAE,sBAAsB,CAC7B,MAAM,EACN,KAAK,EACL,CAAC,cAAc,CAAC,EAChB,QAAQ,CACN,oBAAoB,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,EACrD,oCAAoC,YAAY,GAAG,CACpD,CACF;SACF,CAAC;QACF,GAAG,eAAe,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE;YACjD,MAAM,SAAS,GAAG,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;YAC7C,OAAO,qBAAqB,CAAC,IAAI,CAAC;gBAChC,EAAE,EAAE,GAAG,MAAM,CAAC,EAAE,4BAA4B,QAAQ,CAAC,EAAE,EAAE;gBACzD,QAAQ,EAAE,MAAM,CAAC,EAAE;gBACnB,WAAW,EAAE,+BAA+B,SAAS,GAAG;gBACxD,IAAI,EAAE,WAAW;gBACjB,IAAI,EAAE,cAAc,CAAC,0CAA0C,CAAC;gBAChE,OAAO,EAAE,sBAAsB,CAC7B,MAAM,EACN,KAAK,EACL,CAAC,QAAQ,CAAC,EACV,QAAQ,CACN,gCAAgC,QAAQ,CAAC,SAAS,CAAC,WAAW,EAC9D,0BAA0B,SAAS,EAAE,CACtC,CACF;aACF,CAAC,CAAA;QACJ,CAAC,CAAC;KACH,CAAA;AACH,CAAC,CAAA;AAED,MAAM,qBAAqB,GAAG,CAAC,MAA2B,EAAa,EAAE,CACvE,uBAAuB,CAAC,IAAI,CAAC;IAC3B,EAAE,EAAE,GAAG,MAAM,CAAC,EAAE,qBAAqB;IACrC,QAAQ,EAAE,MAAM,CAAC,EAAE;IACnB,WAAW,EAAE,MAAM,CAAC,aAAa,KAAK,MAAM;QAC1C,CAAC,CAAC,mDAAmD;QACrD,CAAC,CAAC,qDAAqD;IACzD,IAAI,EAAE,WAAW;IACjB,IAAI,EAAE,cAAc,CAAC,uDAAuD,CAAC;IAC7E,OAAO,EAAE,MAAM,CAAC,aAAa,KAAK,MAAM;QACtC,CAAC,CAAC,gGAAgG;QAClG,CAAC,CAAC,oIAAoI;IACxI,OAAO,EAAE,MAAM,CAAC,aAAa,KAAK,MAAM;IACxC,QAAQ,EAAE,MAAM,CAAC,aAAa,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM;CAC/D,CAAC,CAAA;AAEJ,MAAM,CAAC,MAAM,oBAAoB,GAAG,MAAM,CAAC,EAAE,CAAC,sBAAsB,CAAC,CAAC,QAAQ,CAAC,EAC7E,MAA2B,EAC3B,KAAmB;IAEnB,IAAI,KAAK,CAAC,MAAM,IAAI,MAAM,CAAC,aAAa,KAAK,MAAM,EAAE,CAAC;QACpD,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CACvB,qBAAqB,CAAC,IAAI,CAAC;YACzB,QAAQ,EAAE,MAAM,CAAC,EAAE;YACnB,MAAM,EAAE,mEAAmE;SAC5E,CAAC,CACH,CAAA;IACH,CAAC;IACD,MAAM,WAAW,GAAG,MAAM,CAAC,UAAU,KAAK,WAAW,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,oBAAoB,CAAA;IAC7F,MAAM,WAAW,GAAG,WAAW,KAAK,cAAc;QAChD,CAAC,CAAC,gBAAgB,CAAC,iFAAiF,CAAC;QACrG,CAAC,CAAC,WAAW,CAAC,8DAA8D,CAAC,CAAA;IAE/E,OAAO;QACL,wBAAwB,CAAC,IAAI,CAAC;YAC5B,EAAE,EAAE,GAAG,MAAM,CAAC,EAAE,aAAa;YAC7B,QAAQ,EAAE,MAAM,CAAC,EAAE;YACnB,WAAW,EAAE,gCAAgC;YAC7C,IAAI,EAAE,WAAW;YACjB,IAAI,EAAE,cAAc,CAAC,2CAA2C,CAAC;YACjE,OAAO,EAAE,SAAS,CAAC,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE,KAAK,CAAC;SACjD,CAAC;QACF,wBAAwB,CAAC,IAAI,CAAC;YAC5B,EAAE,EAAE,GAAG,MAAM,CAAC,EAAE,iBAAiB;YACjC,QAAQ,EAAE,MAAM,CAAC,EAAE;YACnB,WAAW,EAAE,qCAAqC;YAClD,IAAI,EAAE,WAAW;YACjB,IAAI,EAAE,cAAc,CAAC,0DAA0D,CAAC;YAChF,OAAO,EAAE,SAAS,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,IAAI,CAAC;SACrD,CAAC;QACF,qBAAqB,CAAC,MAAM,CAAC;QAC7B,uBAAuB,CAAC,IAAI,CAAC;YAC3B,EAAE,EAAE,GAAG,MAAM,CAAC,EAAE,oBAAoB;YACpC,QAAQ,EAAE,MAAM,CAAC,EAAE;YACnB,WAAW,EAAE,6BAA6B,KAAK,CAAC,QAAQ,CAAC,IAAI,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,GAAG;YAC1F,IAAI,EAAE,WAAW;YACjB,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,SAAS,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,IAAI,CAAC;SAC7D,CAAC;QACF,GAAG,4BAA4B,CAAC,MAAM,EAAE,KAAK,CAAC;KACZ,CAAA;AACtC,CAAC,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,aAAa,GAAwB;IAChD,SAAS,EAAE,qBAAqB;IAChC,YAAY,EAAE,wBAAwB;IACtC,cAAc,EAAE,oBAAoB;CACrC,CAAA"}
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, ValidationNoteOperation } from "../domain/operation.js";
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,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"}
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"}
@@ -1,33 +1,22 @@
1
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";
2
+ import { CommandSpec, executeGate, irreversibleGate, noApprovalGate, PublishCommandOperation, RenderFileOperation, ValidateCommandOperation } from "../domain/operation.js";
4
3
  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({
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
- ...(cwd === undefined ? {} : { cwd }),
10
- requiredEnv: includeAuth ? envNames(target) : [],
11
- redactedEnv: includeAuth ? envNames(target) : []
8
+ requiredEnv: [],
9
+ redactedEnv: []
12
10
  });
13
- const validationStrategy = (target) => {
14
- if (target.dryRunSupport === "native") {
15
- return "native-command";
16
- }
17
- if (target.dryRunSupport === "simulated") {
18
- return "simulated-plan";
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.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
- }
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(artifact.checksum.value)}`,
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) => 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({
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
- reason: "Homebrew tap target declares no dry-run support in strict mode."
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(target, "brew", ["--version"], false)
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(target, "git", ["-C", tapDirectory, "push"], true)
114
+ command: command("git", ["-C", tapDirectory, "push"])
145
115
  }));
146
116
  return operations;
147
117
  });