@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.
Files changed (125) hide show
  1. package/README.md +249 -0
  2. package/SPEC.md +254 -0
  3. package/dist/cli/command.d.ts +4 -0
  4. package/dist/cli/command.d.ts.map +1 -0
  5. package/dist/cli/command.js +90 -0
  6. package/dist/cli/command.js.map +1 -0
  7. package/dist/cli/main.d.ts +3 -0
  8. package/dist/cli/main.d.ts.map +1 -0
  9. package/dist/cli/main.js +12 -0
  10. package/dist/cli/main.js.map +1 -0
  11. package/dist/cli/programmatic.d.ts +25 -0
  12. package/dist/cli/programmatic.d.ts.map +1 -0
  13. package/dist/cli/programmatic.js +48 -0
  14. package/dist/cli/programmatic.js.map +1 -0
  15. package/dist/config/errors.d.ts +23 -0
  16. package/dist/config/errors.d.ts.map +1 -0
  17. package/dist/config/errors.js +18 -0
  18. package/dist/config/errors.js.map +1 -0
  19. package/dist/config/load.d.ts +9 -0
  20. package/dist/config/load.d.ts.map +1 -0
  21. package/dist/config/load.js +27 -0
  22. package/dist/config/load.js.map +1 -0
  23. package/dist/config/schema.d.ts +8 -0
  24. package/dist/config/schema.d.ts.map +1 -0
  25. package/dist/config/schema.js +6 -0
  26. package/dist/config/schema.js.map +1 -0
  27. package/dist/domain/artifact.d.ts +36 -0
  28. package/dist/domain/artifact.d.ts.map +1 -0
  29. package/dist/domain/artifact.js +29 -0
  30. package/dist/domain/artifact.js.map +1 -0
  31. package/dist/domain/evidence.d.ts +58 -0
  32. package/dist/domain/evidence.d.ts.map +1 -0
  33. package/dist/domain/evidence.js +50 -0
  34. package/dist/domain/evidence.js.map +1 -0
  35. package/dist/domain/operation.d.ts +98 -0
  36. package/dist/domain/operation.d.ts.map +1 -0
  37. package/dist/domain/operation.js +133 -0
  38. package/dist/domain/operation.js.map +1 -0
  39. package/dist/domain/release.d.ts +66 -0
  40. package/dist/domain/release.d.ts.map +1 -0
  41. package/dist/domain/release.js +56 -0
  42. package/dist/domain/release.js.map +1 -0
  43. package/dist/domain/target.d.ts +75 -0
  44. package/dist/domain/target.d.ts.map +1 -0
  45. package/dist/domain/target.js +67 -0
  46. package/dist/domain/target.js.map +1 -0
  47. package/dist/host/bun.d.ts +9 -0
  48. package/dist/host/bun.d.ts.map +1 -0
  49. package/dist/host/bun.js +156 -0
  50. package/dist/host/bun.js.map +1 -0
  51. package/dist/host/host.d.ts +47 -0
  52. package/dist/host/host.d.ts.map +1 -0
  53. package/dist/host/host.js +42 -0
  54. package/dist/host/host.js.map +1 -0
  55. package/dist/host/test.d.ts +19 -0
  56. package/dist/host/test.d.ts.map +1 -0
  57. package/dist/host/test.js +76 -0
  58. package/dist/host/test.js.map +1 -0
  59. package/dist/index.d.ts +2 -0
  60. package/dist/index.d.ts.map +1 -0
  61. package/dist/index.js +2 -0
  62. package/dist/index.js.map +1 -0
  63. package/dist/planner/create-release-plan.d.ts +5 -0
  64. package/dist/planner/create-release-plan.d.ts.map +1 -0
  65. package/dist/planner/create-release-plan.js +25 -0
  66. package/dist/planner/create-release-plan.js.map +1 -0
  67. package/dist/planner/errors.d.ts +37 -0
  68. package/dist/planner/errors.d.ts.map +1 -0
  69. package/dist/planner/errors.js +30 -0
  70. package/dist/planner/errors.js.map +1 -0
  71. package/dist/planner/evidence-recorder.d.ts +18 -0
  72. package/dist/planner/evidence-recorder.d.ts.map +1 -0
  73. package/dist/planner/evidence-recorder.js +95 -0
  74. package/dist/planner/evidence-recorder.js.map +1 -0
  75. package/dist/planner/executor.d.ts +19 -0
  76. package/dist/planner/executor.d.ts.map +1 -0
  77. package/dist/planner/executor.js +59 -0
  78. package/dist/planner/executor.js.map +1 -0
  79. package/dist/planner/normalize-release.d.ts +7 -0
  80. package/dist/planner/normalize-release.d.ts.map +1 -0
  81. package/dist/planner/normalize-release.js +101 -0
  82. package/dist/planner/normalize-release.js.map +1 -0
  83. package/dist/planner/render-plan.d.ts +5 -0
  84. package/dist/planner/render-plan.d.ts.map +1 -0
  85. package/dist/planner/render-plan.js +49 -0
  86. package/dist/planner/render-plan.js.map +1 -0
  87. package/dist/targets/adapter.d.ts +15 -0
  88. package/dist/targets/adapter.d.ts.map +1 -0
  89. package/dist/targets/adapter.js +2 -0
  90. package/dist/targets/adapter.js.map +1 -0
  91. package/dist/targets/github.d.ts +11 -0
  92. package/dist/targets/github.d.ts.map +1 -0
  93. package/dist/targets/github.js +174 -0
  94. package/dist/targets/github.js.map +1 -0
  95. package/dist/targets/homebrew.d.ts +11 -0
  96. package/dist/targets/homebrew.d.ts.map +1 -0
  97. package/dist/targets/homebrew.js +153 -0
  98. package/dist/targets/homebrew.js.map +1 -0
  99. package/dist/targets/live.d.ts +5 -0
  100. package/dist/targets/live.d.ts.map +1 -0
  101. package/dist/targets/live.js +31 -0
  102. package/dist/targets/live.js.map +1 -0
  103. package/dist/targets/npm.d.ts +11 -0
  104. package/dist/targets/npm.d.ts.map +1 -0
  105. package/dist/targets/npm.js +105 -0
  106. package/dist/targets/npm.js.map +1 -0
  107. package/dist/targets/registry.d.ts +25 -0
  108. package/dist/targets/registry.d.ts.map +1 -0
  109. package/dist/targets/registry.js +34 -0
  110. package/dist/targets/registry.js.map +1 -0
  111. package/dist/types/effect-internal.d.ts +5 -0
  112. package/dist/types/effect-internal.d.ts.map +1 -0
  113. package/dist/types/effect-internal.js +2 -0
  114. package/dist/types/effect-internal.js.map +1 -0
  115. package/examples/README.md +15 -0
  116. package/examples/github-release/artifacts/release-example-github-0.1.0.tgz +1 -0
  117. package/examples/github-release/release.config.json +31 -0
  118. package/examples/homebrew-tap/artifacts/release-example-homebrew-0.1.0.tgz +1 -0
  119. package/examples/homebrew-tap/release.config.json +34 -0
  120. package/examples/non-strict-skips/artifacts/release-example-skips-0.1.0.tgz +1 -0
  121. package/examples/non-strict-skips/release.config.json +29 -0
  122. package/examples/npm-only/index.js +1 -0
  123. package/examples/npm-only/package.json +8 -0
  124. package/examples/npm-only/release.config.json +30 -0
  125. package/package.json +176 -0
@@ -0,0 +1,105 @@
1
+ import * as Effect from "effect/Effect";
2
+ import { CommandSpec, irreversibleGate, noApprovalGate, PublishCommandOperation, 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 npmCommand = (target, args, cwd, includeAuth) => CommandSpec.make({
7
+ executable: "npm",
8
+ args: [...args],
9
+ ...(cwd === undefined ? {} : { cwd }),
10
+ requiredEnv: includeAuth ? envNames(target) : [],
11
+ redactedEnv: includeAuth ? envNames(target) : []
12
+ });
13
+ const npmValidationStrategy = (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 npmTargetCapabilities = (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: npmValidationStrategy(target)
30
+ });
31
+ const npmDryRunOperation = (target) => target.dryRunSupport === "native"
32
+ ? ValidateCommandOperation.make({
33
+ id: `${target.id}:npm-pack-dry-run`,
34
+ targetId: target.id,
35
+ description: "Validate npm package contents with npm pack dry-run.",
36
+ risk: "read-only",
37
+ gate: noApprovalGate("npm pack --dry-run validates package contents without publishing."),
38
+ command: npmCommand(target, ["pack", "--dry-run", "--json", target.packagePath], undefined, false)
39
+ })
40
+ : ValidationNoteOperation.make({
41
+ id: `${target.id}:npm-pack-dry-run`,
42
+ targetId: target.id,
43
+ description: target.dryRunSupport === "simulated"
44
+ ? "Record simulated npm dry-run validation."
45
+ : "Record skipped npm dry-run validation.",
46
+ risk: "read-only",
47
+ gate: noApprovalGate("Validation notes do not modify local or remote state."),
48
+ message: target.dryRunSupport === "simulated"
49
+ ? "npm dry-run validation is marked as simulated by target configuration; no npm pack --dry-run command was planned."
50
+ : "npm dry-run validation was skipped because this target declares no dry-run support.",
51
+ skipped: target.dryRunSupport === "none",
52
+ severity: "warning"
53
+ });
54
+ const npmPublishArgs = (target) => {
55
+ const args = ["publish", target.packagePath, "--registry", target.registry];
56
+ if (target.access !== undefined) {
57
+ args.push("--access", target.access);
58
+ }
59
+ if (target.provenance === true) {
60
+ args.push("--provenance");
61
+ }
62
+ return args;
63
+ };
64
+ export const planNpmOperations = Effect.fn("planNpmOperations")(function* (target, model) {
65
+ if (model.strict && target.dryRunSupport === "none") {
66
+ return yield* Effect.fail(PlanConstructionError.make({
67
+ targetId: target.id,
68
+ reason: "npm target declares no dry-run support in strict mode."
69
+ }));
70
+ }
71
+ const operations = [
72
+ ValidateCommandOperation.make({
73
+ id: `${target.id}:npm-version`,
74
+ targetId: target.id,
75
+ description: "Check npm CLI availability.",
76
+ risk: "read-only",
77
+ gate: noApprovalGate("CLI availability validation is read-only."),
78
+ command: npmCommand(target, ["--version"], undefined, false)
79
+ }),
80
+ ValidateCommandOperation.make({
81
+ id: `${target.id}:npm-whoami`,
82
+ targetId: target.id,
83
+ description: "Validate npm CLI authentication.",
84
+ risk: "read-only",
85
+ gate: noApprovalGate("npm whoami checks CLI authentication without publishing."),
86
+ command: npmCommand(target, ["whoami", "--registry", target.registry], undefined, true)
87
+ }),
88
+ npmDryRunOperation(target),
89
+ PublishCommandOperation.make({
90
+ id: `${target.id}:npm-publish`,
91
+ targetId: target.id,
92
+ description: `Publish ${model.identity.name}@${model.identity.version} to npm.`,
93
+ risk: "irreversible",
94
+ gate: irreversibleGate("npm package versions are immutable once published."),
95
+ command: npmCommand(target, npmPublishArgs(target), undefined, true)
96
+ })
97
+ ];
98
+ return operations;
99
+ });
100
+ export const NpmAdapter = {
101
+ targetTag: "NpmRegistryTarget",
102
+ capabilities: npmTargetCapabilities,
103
+ planOperations: planNpmOperations
104
+ };
105
+ //# sourceMappingURL=npm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"npm.js","sourceRoot":"","sources":["../../src/targets/npm.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import * as Context from "effect/Context";
2
+ import * as Effect from "effect/Effect";
3
+ import * as Schema from "effect/Schema";
4
+ import { Operation } from "../domain/operation.js";
5
+ import { ReleaseModel } from "../domain/release.js";
6
+ import { TargetCapabilities, TargetConfig } from "../domain/target.js";
7
+ import { PlanConstructionError } from "../planner/errors.js";
8
+ export type * from "../types/effect-internal.js";
9
+ declare const MissingTargetAdapterError_base: Schema.Class<MissingTargetAdapterError, Schema.TaggedStruct<"MissingTargetAdapterError", {
10
+ readonly targetTag: Schema.String;
11
+ }>, import("effect/Cause").YieldableError>;
12
+ export declare class MissingTargetAdapterError extends MissingTargetAdapterError_base {
13
+ }
14
+ export interface TargetRegistryShape {
15
+ readonly targetCapabilities: (target: TargetConfig) => TargetCapabilities;
16
+ readonly planTargetOperations: (target: TargetConfig, model: ReleaseModel) => Effect.Effect<ReadonlyArray<Operation>, MissingTargetAdapterError | PlanConstructionError>;
17
+ }
18
+ declare const TargetRegistry_base: Context.ServiceClass<TargetRegistry, "TargetRegistry", TargetRegistryShape>;
19
+ export declare class TargetRegistry extends TargetRegistry_base {
20
+ }
21
+ export declare const targetCapabilities: (target: import("../domain/target.js").NpmRegistryTarget | import("../domain/target.js").GitHubReleaseTarget | import("../domain/target.js").HomebrewTapTarget) => Effect.Effect<TargetCapabilities, never, TargetRegistry>;
22
+ export declare const allTargetCapabilities: (model: ReleaseModel) => Effect.Effect<TargetCapabilities[], never, TargetRegistry>;
23
+ export declare const planTargetOperations: (target: import("../domain/target.js").NpmRegistryTarget | import("../domain/target.js").GitHubReleaseTarget | import("../domain/target.js").HomebrewTapTarget, model: ReleaseModel) => Effect.Effect<readonly (import("../domain/operation.js").RenderFileOperation | import("../domain/operation.js").ValidateCommandOperation | import("../domain/operation.js").ValidationNoteOperation | import("../domain/operation.js").PublishCommandOperation | import("../domain/operation.js").VerifyRemoteOperation)[], PlanConstructionError | MissingTargetAdapterError, TargetRegistry>;
24
+ export declare const planAllTargetOperations: (model: ReleaseModel) => Effect.Effect<(import("../domain/operation.js").RenderFileOperation | import("../domain/operation.js").ValidateCommandOperation | import("../domain/operation.js").ValidationNoteOperation | import("../domain/operation.js").PublishCommandOperation | import("../domain/operation.js").VerifyRemoteOperation)[], PlanConstructionError | MissingTargetAdapterError, TargetRegistry>;
25
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/targets/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAA;AACzC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAA;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AACnD,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAA2B,MAAM,qBAAqB,CAAA;AAC/F,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAA;AAE5D,mBAAmB,6BAA6B,CAAA;;;;AAEhD,qBAAa,yBAA0B,SAAQ,8BAK9C;CAAG;AAEJ,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,kBAAkB,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,kBAAkB,CAAA;IACzE,QAAQ,CAAC,oBAAoB,EAAE,CAC7B,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,YAAY,KAChB,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,EAAE,yBAAyB,GAAG,qBAAqB,CAAC,CAAA;CAChG;;AAED,qBAAa,cAAe,SAAQ,mBAAwE;CAAG;AAE/G,eAAO,MAAM,kBAAkB,6NAG7B,CAAA;AAEF,eAAO,MAAM,qBAAqB,qFAMhC,CAAA;AAEF,eAAO,MAAM,oBAAoB,wjBAG/B,CAAA;AAEF,eAAO,MAAM,uBAAuB,gZASlC,CAAA"}
@@ -0,0 +1,34 @@
1
+ import * as Context from "effect/Context";
2
+ import * as Effect from "effect/Effect";
3
+ import * as Schema from "effect/Schema";
4
+ import { targetCapabilitiesOrder } from "../domain/target.js";
5
+ export class MissingTargetAdapterError extends Schema.TaggedErrorClass()("MissingTargetAdapterError", {
6
+ targetTag: Schema.String
7
+ }) {
8
+ }
9
+ export class TargetRegistry extends Context.Service()("TargetRegistry") {
10
+ }
11
+ export const targetCapabilities = Effect.fn("targetCapabilities")(function* (target) {
12
+ const registry = yield* TargetRegistry;
13
+ return registry.targetCapabilities(target);
14
+ });
15
+ export const allTargetCapabilities = Effect.fn("allTargetCapabilities")(function* (model) {
16
+ const capabilities = [];
17
+ for (const target of model.targets) {
18
+ capabilities.push(yield* targetCapabilities(target));
19
+ }
20
+ return capabilities.sort(targetCapabilitiesOrder);
21
+ });
22
+ export const planTargetOperations = Effect.fn("planTargetOperations")(function* (target, model) {
23
+ const registry = yield* TargetRegistry;
24
+ return yield* registry.planTargetOperations(target, model);
25
+ });
26
+ export const planAllTargetOperations = Effect.fn("planAllTargetOperations")(function* (model) {
27
+ const operations = [];
28
+ for (const target of model.targets) {
29
+ const targetOperations = yield* planTargetOperations(target, model);
30
+ operations.push(...targetOperations);
31
+ }
32
+ return operations;
33
+ });
34
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/targets/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAA;AACzC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAGvC,OAAO,EAAoC,uBAAuB,EAAE,MAAM,qBAAqB,CAAA;AAK/F,MAAM,OAAO,yBAA0B,SAAQ,MAAM,CAAC,gBAAgB,EAA6B,CACjG,2BAA2B,EAC3B;IACE,SAAS,EAAE,MAAM,CAAC,MAAM;CACzB,CACF;CAAG;AAUJ,MAAM,OAAO,cAAe,SAAQ,OAAO,CAAC,OAAO,EAAuC,CAAC,gBAAgB,CAAC;CAAG;AAE/G,MAAM,CAAC,MAAM,kBAAkB,GAAG,MAAM,CAAC,EAAE,CAAC,oBAAoB,CAAC,CAAC,QAAQ,CAAC,EAAC,MAAoB;IAC9F,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,cAAc,CAAA;IACtC,OAAO,QAAQ,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAA;AAC5C,CAAC,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAAG,MAAM,CAAC,EAAE,CAAC,uBAAuB,CAAC,CAAC,QAAQ,CAAC,EAAC,KAAmB;IACnG,MAAM,YAAY,GAA8B,EAAE,CAAA;IAClD,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QACnC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAA;IACtD,CAAC;IACD,OAAO,YAAY,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAA;AACnD,CAAC,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAG,MAAM,CAAC,EAAE,CAAC,sBAAsB,CAAC,CAAC,QAAQ,CAAC,EAAC,MAAoB,EAAE,KAAmB;IACvH,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,cAAc,CAAA;IACtC,OAAO,KAAK,CAAC,CAAC,QAAQ,CAAC,oBAAoB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;AAC5D,CAAC,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,uBAAuB,GAAG,MAAM,CAAC,EAAE,CAAC,yBAAyB,CAAC,CAAC,QAAQ,CAAC,EACnF,KAAmB;IAEnB,MAAM,UAAU,GAAqB,EAAE,CAAA;IACvC,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QACnC,MAAM,gBAAgB,GAAG,KAAK,CAAC,CAAC,oBAAoB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;QACnE,UAAU,CAAC,IAAI,CAAC,GAAG,gBAAgB,CAAC,CAAA;IACtC,CAAC;IACD,OAAO,UAAU,CAAA;AACnB,CAAC,CAAC,CAAA"}
@@ -0,0 +1,5 @@
1
+ declare global {
2
+ const SchemaErrorTypeId: unique symbol;
3
+ }
4
+ export {};
5
+ //# sourceMappingURL=effect-internal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"effect-internal.d.ts","sourceRoot":"","sources":["../../src/types/effect-internal.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,CAAC;IACb,MAAM,iBAAiB,EAAE,OAAO,MAAM,CAAA;CACvC;AAED,OAAO,EAAE,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=effect-internal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"effect-internal.js","sourceRoot":"","sources":["../../src/types/effect-internal.ts"],"names":[],"mappings":""}
@@ -0,0 +1,15 @@
1
+ # release examples
2
+
3
+ Each example is self-contained enough to run from its own directory.
4
+
5
+ ```sh
6
+ cd examples/npm-only
7
+ bun ../../dist/cli/main.js plan --config release.config.json --format text
8
+ ```
9
+
10
+ The examples are intentionally small:
11
+
12
+ - `npm-only`: npm package directory with native npm dry-run validation.
13
+ - `github-release`: GitHub release asset with simulated GitHub dry-run validation.
14
+ - `homebrew-tap`: Homebrew tap formula rendering with simulated formula validation.
15
+ - `non-strict-skips`: non-strict config that records skipped dry-run evidence.
@@ -0,0 +1 @@
1
+ example github release artifact
@@ -0,0 +1,31 @@
1
+ {
2
+ "identity": {
3
+ "name": "release-example-github",
4
+ "version": "0.1.0",
5
+ "commit": "example",
6
+ "tag": "v0.1.0",
7
+ "notes": "Example GitHub release"
8
+ },
9
+ "artifacts": [
10
+ {
11
+ "id": "archive",
12
+ "path": "artifacts/release-example-github-0.1.0.tgz",
13
+ "format": "tarball",
14
+ "consumers": ["github"]
15
+ }
16
+ ],
17
+ "targets": [
18
+ {
19
+ "_tag": "GitHubReleaseTarget",
20
+ "id": "github",
21
+ "repository": "owner/repo",
22
+ "draft": true,
23
+ "prerelease": false,
24
+ "dryRunSupport": "native",
25
+ "mutability": "mutable-release",
26
+ "recovery": "delete-and-recreate"
27
+ }
28
+ ],
29
+ "strict": true,
30
+ "evidenceDirectory": ".release/evidence"
31
+ }
@@ -0,0 +1 @@
1
+ homebrew example artifact
@@ -0,0 +1,34 @@
1
+ {
2
+ "identity": {
3
+ "name": "release-example-homebrew",
4
+ "version": "0.1.0",
5
+ "commit": "example",
6
+ "tag": "v0.1.0"
7
+ },
8
+ "artifacts": [
9
+ {
10
+ "id": "archive",
11
+ "path": "artifacts/release-example-homebrew-0.1.0.tgz",
12
+ "format": "tarball",
13
+ "consumers": ["homebrew"]
14
+ }
15
+ ],
16
+ "targets": [
17
+ {
18
+ "_tag": "HomebrewTapTarget",
19
+ "id": "homebrew",
20
+ "repository": "owner/homebrew-tap",
21
+ "formulaName": "release-example-homebrew",
22
+ "formulaPath": ".release/generated/release-example-homebrew.rb",
23
+ "artifactId": "archive",
24
+ "homepage": "https://github.com/owner/release-example-homebrew",
25
+ "url": "https://github.com/owner/release-example-homebrew/releases/download/v0.1.0/release-example-homebrew-0.1.0.tgz",
26
+ "installPath": "bin/release-example-homebrew",
27
+ "dryRunSupport": "simulated",
28
+ "mutability": "mutable-index",
29
+ "recovery": "manual"
30
+ }
31
+ ],
32
+ "strict": true,
33
+ "evidenceDirectory": ".release/evidence"
34
+ }
@@ -0,0 +1 @@
1
+ example non-strict skipped validator artifact
@@ -0,0 +1,29 @@
1
+ {
2
+ "identity": {
3
+ "name": "release-example-skips",
4
+ "version": "0.1.0",
5
+ "commit": "example",
6
+ "tag": "v0.1.0"
7
+ },
8
+ "artifacts": [
9
+ {
10
+ "id": "archive",
11
+ "path": "artifacts/release-example-skips-0.1.0.tgz",
12
+ "format": "tarball",
13
+ "consumers": ["github"]
14
+ }
15
+ ],
16
+ "targets": [
17
+ {
18
+ "_tag": "GitHubReleaseTarget",
19
+ "id": "github",
20
+ "repository": "owner/repo",
21
+ "draft": true,
22
+ "dryRunSupport": "none",
23
+ "mutability": "mutable-release",
24
+ "recovery": "manual"
25
+ }
26
+ ],
27
+ "strict": false,
28
+ "evidenceDirectory": ".release/evidence"
29
+ }
@@ -0,0 +1 @@
1
+ export const example = "npm-only"
@@ -0,0 +1,8 @@
1
+ {
2
+ "name": "release-example-npm-only",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "files": [
6
+ "index.js"
7
+ ]
8
+ }
@@ -0,0 +1,30 @@
1
+ {
2
+ "identity": {
3
+ "name": "release-example-npm-only",
4
+ "version": "0.1.0",
5
+ "commit": "example",
6
+ "tag": "v0.1.0"
7
+ },
8
+ "artifacts": [
9
+ {
10
+ "id": "package",
11
+ "path": ".",
12
+ "format": "directory",
13
+ "consumers": ["npm"]
14
+ }
15
+ ],
16
+ "targets": [
17
+ {
18
+ "_tag": "NpmRegistryTarget",
19
+ "id": "npm",
20
+ "registry": "https://registry.npmjs.org",
21
+ "packagePath": ".",
22
+ "tokenEnv": "NPM_TOKEN",
23
+ "dryRunSupport": "native",
24
+ "mutability": "immutable",
25
+ "recovery": "publish-new-version"
26
+ }
27
+ ],
28
+ "strict": true,
29
+ "evidenceDirectory": ".release/evidence"
30
+ }
package/package.json ADDED
@@ -0,0 +1,176 @@
1
+ {
2
+ "name": "@mannyc1/ts-release",
3
+ "version": "0.0.0",
4
+ "type": "module",
5
+ "packageManager": "bun@1.3.14",
6
+ "description": "Plan-first release orchestration with explicit validation, evidence, and execution gates.",
7
+ "license": "MIT",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "git+https://github.com/mannyc2/ts-release.git"
11
+ },
12
+ "homepage": "https://github.com/mannyc2/ts-release#readme",
13
+ "bugs": {
14
+ "url": "https://github.com/mannyc2/ts-release/issues"
15
+ },
16
+ "publishConfig": {
17
+ "access": "public",
18
+ "registry": "https://registry.npmjs.org"
19
+ },
20
+ "keywords": [
21
+ "ts-release",
22
+ "publishing",
23
+ "effect",
24
+ "bun",
25
+ "cli"
26
+ ],
27
+ "engines": {
28
+ "bun": ">=1.3.14"
29
+ },
30
+ "bin": {
31
+ "release": "dist/cli/main.js"
32
+ },
33
+ "sideEffects": [
34
+ "./dist/cli/main.js"
35
+ ],
36
+ "exports": {
37
+ ".": {
38
+ "types": "./dist/index.d.ts",
39
+ "default": "./dist/index.js"
40
+ },
41
+ "./cli": {
42
+ "types": "./dist/cli/command.d.ts",
43
+ "default": "./dist/cli/command.js"
44
+ },
45
+ "./cli/command": {
46
+ "types": "./dist/cli/command.d.ts",
47
+ "default": "./dist/cli/command.js"
48
+ },
49
+ "./cli/programmatic": {
50
+ "types": "./dist/cli/programmatic.d.ts",
51
+ "default": "./dist/cli/programmatic.js"
52
+ },
53
+ "./config/errors": {
54
+ "types": "./dist/config/errors.d.ts",
55
+ "default": "./dist/config/errors.js"
56
+ },
57
+ "./config/load": {
58
+ "types": "./dist/config/load.d.ts",
59
+ "default": "./dist/config/load.js"
60
+ },
61
+ "./config/schema": {
62
+ "types": "./dist/config/schema.d.ts",
63
+ "default": "./dist/config/schema.js"
64
+ },
65
+ "./domain/artifact": {
66
+ "types": "./dist/domain/artifact.d.ts",
67
+ "default": "./dist/domain/artifact.js"
68
+ },
69
+ "./domain/evidence": {
70
+ "types": "./dist/domain/evidence.d.ts",
71
+ "default": "./dist/domain/evidence.js"
72
+ },
73
+ "./domain/operation": {
74
+ "types": "./dist/domain/operation.d.ts",
75
+ "default": "./dist/domain/operation.js"
76
+ },
77
+ "./domain/release": {
78
+ "types": "./dist/domain/release.d.ts",
79
+ "default": "./dist/domain/release.js"
80
+ },
81
+ "./domain/target": {
82
+ "types": "./dist/domain/target.d.ts",
83
+ "default": "./dist/domain/target.js"
84
+ },
85
+ "./host": {
86
+ "types": "./dist/host/host.d.ts",
87
+ "default": "./dist/host/host.js"
88
+ },
89
+ "./host/bun": {
90
+ "types": "./dist/host/bun.d.ts",
91
+ "default": "./dist/host/bun.js"
92
+ },
93
+ "./host/test": {
94
+ "types": "./dist/host/test.d.ts",
95
+ "default": "./dist/host/test.js"
96
+ },
97
+ "./planner/create-release-plan": {
98
+ "types": "./dist/planner/create-release-plan.d.ts",
99
+ "default": "./dist/planner/create-release-plan.js"
100
+ },
101
+ "./planner/errors": {
102
+ "types": "./dist/planner/errors.d.ts",
103
+ "default": "./dist/planner/errors.js"
104
+ },
105
+ "./planner/evidence-recorder": {
106
+ "types": "./dist/planner/evidence-recorder.d.ts",
107
+ "default": "./dist/planner/evidence-recorder.js"
108
+ },
109
+ "./planner/executor": {
110
+ "types": "./dist/planner/executor.d.ts",
111
+ "default": "./dist/planner/executor.js"
112
+ },
113
+ "./planner/normalize-release": {
114
+ "types": "./dist/planner/normalize-release.d.ts",
115
+ "default": "./dist/planner/normalize-release.js"
116
+ },
117
+ "./planner/render-plan": {
118
+ "types": "./dist/planner/render-plan.d.ts",
119
+ "default": "./dist/planner/render-plan.js"
120
+ },
121
+ "./targets/adapter": {
122
+ "types": "./dist/targets/adapter.d.ts",
123
+ "default": "./dist/targets/adapter.js"
124
+ },
125
+ "./targets/github": {
126
+ "types": "./dist/targets/github.d.ts",
127
+ "default": "./dist/targets/github.js"
128
+ },
129
+ "./targets/homebrew": {
130
+ "types": "./dist/targets/homebrew.d.ts",
131
+ "default": "./dist/targets/homebrew.js"
132
+ },
133
+ "./targets/live": {
134
+ "types": "./dist/targets/live.d.ts",
135
+ "default": "./dist/targets/live.js"
136
+ },
137
+ "./targets/npm": {
138
+ "types": "./dist/targets/npm.d.ts",
139
+ "default": "./dist/targets/npm.js"
140
+ },
141
+ "./targets/registry": {
142
+ "types": "./dist/targets/registry.d.ts",
143
+ "default": "./dist/targets/registry.js"
144
+ }
145
+ },
146
+ "files": [
147
+ "dist",
148
+ "examples",
149
+ "SPEC.md",
150
+ "README.md"
151
+ ],
152
+ "scripts": {
153
+ "check": "tsc --noEmit",
154
+ "build": "bun run scripts/clean-dist.ts && tsc -p tsconfig.build.json",
155
+ "test": "bun test",
156
+ "test:integration:tools": "RELEASE_INTEGRATION_TOOLS=1 bun test integration-tools.test.ts",
157
+ "test:integration:github": "RELEASE_INTEGRATION_TOOLS=1 RELEASE_INTEGRATION_GITHUB=1 bun test integration-tools.test.ts",
158
+ "test:coverage": "bun test --coverage",
159
+ "check:package-exports": "bun run scripts/check-package-exports.ts",
160
+ "check:effect-imports": "bun run scripts/check-effect-imports.ts",
161
+ "check:tree-shaking": "bun run scripts/check-tree-shaking.ts",
162
+ "check:examples": "bun run scripts/check-examples.ts",
163
+ "check:self-release-config": "bun run scripts/check-self-release-config.ts",
164
+ "check:portable": "bun run check && bun test && bun audit && bun run check:effect-imports && bun run check:tree-shaking && bun run build && bun run check:examples && bun run check:package-exports && bun dist/cli/main.js --help",
165
+ "check:release": "bun run check:self-release-config && bun run check:portable",
166
+ "cli": "bun run src/cli/main.ts"
167
+ },
168
+ "dependencies": {
169
+ "@effect/platform-bun": "4.0.0-beta.83",
170
+ "effect": "4.0.0-beta.83"
171
+ },
172
+ "devDependencies": {
173
+ "@types/bun": "^1.3.14",
174
+ "typescript": "^6.0.3"
175
+ }
176
+ }