@savvy-web/silk 2.0.0 → 2.1.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 (155) hide show
  1. package/README.md +7 -5
  2. package/changesets-changelog.cjs +10 -4
  3. package/changesets-changelog.js +54057 -1
  4. package/changesets-markdownlint.cjs +10 -4
  5. package/changesets-markdownlint.js +54057 -1
  6. package/package.json +5 -4
  7. package/tsconfig/node/dist/tsconfig.tsbuildinfo +1 -1
  8. package/_virtual/_rolldown/runtime.cjs +0 -45
  9. package/_virtual/_rolldown/runtime.js +0 -45
  10. package/packages/silk-effects/dist/dev/pkg/_virtual/_rolldown/runtime.cjs +0 -15
  11. package/packages/silk-effects/dist/dev/pkg/_virtual/_rolldown/runtime.js +0 -14
  12. package/packages/silk-effects/dist/dev/pkg/changesets/api/categories.cjs +0 -247
  13. package/packages/silk-effects/dist/dev/pkg/changesets/api/categories.js +0 -247
  14. package/packages/silk-effects/dist/dev/pkg/changesets/api/changelog.cjs +0 -134
  15. package/packages/silk-effects/dist/dev/pkg/changesets/api/changelog.js +0 -134
  16. package/packages/silk-effects/dist/dev/pkg/changesets/api/dependency-table.cjs +0 -163
  17. package/packages/silk-effects/dist/dev/pkg/changesets/api/dependency-table.js +0 -163
  18. package/packages/silk-effects/dist/dev/pkg/changesets/api/linter.cjs +0 -170
  19. package/packages/silk-effects/dist/dev/pkg/changesets/api/linter.js +0 -170
  20. package/packages/silk-effects/dist/dev/pkg/changesets/api/transformer.cjs +0 -134
  21. package/packages/silk-effects/dist/dev/pkg/changesets/api/transformer.js +0 -134
  22. package/packages/silk-effects/dist/dev/pkg/changesets/categories/index.cjs +0 -317
  23. package/packages/silk-effects/dist/dev/pkg/changesets/categories/index.js +0 -299
  24. package/packages/silk-effects/dist/dev/pkg/changesets/categories/types.cjs +0 -65
  25. package/packages/silk-effects/dist/dev/pkg/changesets/categories/types.js +0 -65
  26. package/packages/silk-effects/dist/dev/pkg/changesets/changelog/formatting.cjs +0 -114
  27. package/packages/silk-effects/dist/dev/pkg/changesets/changelog/formatting.js +0 -113
  28. package/packages/silk-effects/dist/dev/pkg/changesets/changelog/getDependencyReleaseLine.cjs +0 -118
  29. package/packages/silk-effects/dist/dev/pkg/changesets/changelog/getDependencyReleaseLine.js +0 -118
  30. package/packages/silk-effects/dist/dev/pkg/changesets/changelog/getReleaseLine.cjs +0 -122
  31. package/packages/silk-effects/dist/dev/pkg/changesets/changelog/getReleaseLine.js +0 -122
  32. package/packages/silk-effects/dist/dev/pkg/changesets/changelog/index.cjs +0 -97
  33. package/packages/silk-effects/dist/dev/pkg/changesets/changelog/index.js +0 -97
  34. package/packages/silk-effects/dist/dev/pkg/changesets/constants.cjs +0 -43
  35. package/packages/silk-effects/dist/dev/pkg/changesets/constants.js +0 -42
  36. package/packages/silk-effects/dist/dev/pkg/changesets/errors.cjs +0 -386
  37. package/packages/silk-effects/dist/dev/pkg/changesets/errors.js +0 -371
  38. package/packages/silk-effects/dist/dev/pkg/changesets/index.cjs +0 -300
  39. package/packages/silk-effects/dist/dev/pkg/changesets/index.js +0 -179
  40. package/packages/silk-effects/dist/dev/pkg/changesets/markdownlint/index.cjs +0 -34
  41. package/packages/silk-effects/dist/dev/pkg/changesets/markdownlint/index.js +0 -29
  42. package/packages/silk-effects/dist/dev/pkg/changesets/markdownlint/rules/content-structure.cjs +0 -98
  43. package/packages/silk-effects/dist/dev/pkg/changesets/markdownlint/rules/content-structure.js +0 -98
  44. package/packages/silk-effects/dist/dev/pkg/changesets/markdownlint/rules/dependency-table-format.cjs +0 -170
  45. package/packages/silk-effects/dist/dev/pkg/changesets/markdownlint/rules/dependency-table-format.js +0 -170
  46. package/packages/silk-effects/dist/dev/pkg/changesets/markdownlint/rules/heading-hierarchy.cjs +0 -61
  47. package/packages/silk-effects/dist/dev/pkg/changesets/markdownlint/rules/heading-hierarchy.js +0 -61
  48. package/packages/silk-effects/dist/dev/pkg/changesets/markdownlint/rules/required-sections.cjs +0 -54
  49. package/packages/silk-effects/dist/dev/pkg/changesets/markdownlint/rules/required-sections.js +0 -54
  50. package/packages/silk-effects/dist/dev/pkg/changesets/markdownlint/rules/uncategorized-content.cjs +0 -54
  51. package/packages/silk-effects/dist/dev/pkg/changesets/markdownlint/rules/uncategorized-content.js +0 -54
  52. package/packages/silk-effects/dist/dev/pkg/changesets/markdownlint/rules/utils.cjs +0 -31
  53. package/packages/silk-effects/dist/dev/pkg/changesets/markdownlint/rules/utils.js +0 -30
  54. package/packages/silk-effects/dist/dev/pkg/changesets/remark/plugins/aggregate-dependency-tables.cjs +0 -47
  55. package/packages/silk-effects/dist/dev/pkg/changesets/remark/plugins/aggregate-dependency-tables.js +0 -47
  56. package/packages/silk-effects/dist/dev/pkg/changesets/remark/plugins/contributor-footnotes.cjs +0 -123
  57. package/packages/silk-effects/dist/dev/pkg/changesets/remark/plugins/contributor-footnotes.js +0 -123
  58. package/packages/silk-effects/dist/dev/pkg/changesets/remark/plugins/deduplicate-items.cjs +0 -32
  59. package/packages/silk-effects/dist/dev/pkg/changesets/remark/plugins/deduplicate-items.js +0 -32
  60. package/packages/silk-effects/dist/dev/pkg/changesets/remark/plugins/issue-link-refs.cjs +0 -59
  61. package/packages/silk-effects/dist/dev/pkg/changesets/remark/plugins/issue-link-refs.js +0 -59
  62. package/packages/silk-effects/dist/dev/pkg/changesets/remark/plugins/maintenance-note.cjs +0 -61
  63. package/packages/silk-effects/dist/dev/pkg/changesets/remark/plugins/maintenance-note.js +0 -61
  64. package/packages/silk-effects/dist/dev/pkg/changesets/remark/plugins/merge-sections.cjs +0 -43
  65. package/packages/silk-effects/dist/dev/pkg/changesets/remark/plugins/merge-sections.js +0 -43
  66. package/packages/silk-effects/dist/dev/pkg/changesets/remark/plugins/normalize-format.cjs +0 -47
  67. package/packages/silk-effects/dist/dev/pkg/changesets/remark/plugins/normalize-format.js +0 -47
  68. package/packages/silk-effects/dist/dev/pkg/changesets/remark/plugins/reorder-sections.cjs +0 -34
  69. package/packages/silk-effects/dist/dev/pkg/changesets/remark/plugins/reorder-sections.js +0 -34
  70. package/packages/silk-effects/dist/dev/pkg/changesets/remark/presets.cjs +0 -120
  71. package/packages/silk-effects/dist/dev/pkg/changesets/remark/presets.js +0 -119
  72. package/packages/silk-effects/dist/dev/pkg/changesets/remark/rules/content-structure.cjs +0 -22
  73. package/packages/silk-effects/dist/dev/pkg/changesets/remark/rules/content-structure.js +0 -22
  74. package/packages/silk-effects/dist/dev/pkg/changesets/remark/rules/dependency-table-format.cjs +0 -40
  75. package/packages/silk-effects/dist/dev/pkg/changesets/remark/rules/dependency-table-format.js +0 -40
  76. package/packages/silk-effects/dist/dev/pkg/changesets/remark/rules/heading-hierarchy.cjs +0 -19
  77. package/packages/silk-effects/dist/dev/pkg/changesets/remark/rules/heading-hierarchy.js +0 -19
  78. package/packages/silk-effects/dist/dev/pkg/changesets/remark/rules/required-sections.cjs +0 -17
  79. package/packages/silk-effects/dist/dev/pkg/changesets/remark/rules/required-sections.js +0 -17
  80. package/packages/silk-effects/dist/dev/pkg/changesets/remark/rules/uncategorized-content.cjs +0 -31
  81. package/packages/silk-effects/dist/dev/pkg/changesets/remark/rules/uncategorized-content.js +0 -31
  82. package/packages/silk-effects/dist/dev/pkg/changesets/schemas/changeset.cjs +0 -148
  83. package/packages/silk-effects/dist/dev/pkg/changesets/schemas/changeset.js +0 -145
  84. package/packages/silk-effects/dist/dev/pkg/changesets/schemas/dependency-table.cjs +0 -203
  85. package/packages/silk-effects/dist/dev/pkg/changesets/schemas/dependency-table.js +0 -198
  86. package/packages/silk-effects/dist/dev/pkg/changesets/schemas/git.cjs +0 -69
  87. package/packages/silk-effects/dist/dev/pkg/changesets/schemas/git.js +0 -68
  88. package/packages/silk-effects/dist/dev/pkg/changesets/schemas/github.cjs +0 -177
  89. package/packages/silk-effects/dist/dev/pkg/changesets/schemas/github.js +0 -174
  90. package/packages/silk-effects/dist/dev/pkg/changesets/schemas/options.cjs +0 -183
  91. package/packages/silk-effects/dist/dev/pkg/changesets/schemas/options.js +0 -181
  92. package/packages/silk-effects/dist/dev/pkg/changesets/schemas/package-scope.cjs +0 -129
  93. package/packages/silk-effects/dist/dev/pkg/changesets/schemas/package-scope.js +0 -127
  94. package/packages/silk-effects/dist/dev/pkg/changesets/schemas/primitives.cjs +0 -72
  95. package/packages/silk-effects/dist/dev/pkg/changesets/schemas/primitives.js +0 -71
  96. package/packages/silk-effects/dist/dev/pkg/changesets/schemas/release-plan.cjs +0 -62
  97. package/packages/silk-effects/dist/dev/pkg/changesets/schemas/release-plan.js +0 -56
  98. package/packages/silk-effects/dist/dev/pkg/changesets/schemas/version-files.cjs +0 -154
  99. package/packages/silk-effects/dist/dev/pkg/changesets/schemas/version-files.js +0 -150
  100. package/packages/silk-effects/dist/dev/pkg/changesets/services/branch-analyzer.cjs +0 -300
  101. package/packages/silk-effects/dist/dev/pkg/changesets/services/branch-analyzer.js +0 -294
  102. package/packages/silk-effects/dist/dev/pkg/changesets/services/changelog.cjs +0 -50
  103. package/packages/silk-effects/dist/dev/pkg/changesets/services/changelog.js +0 -49
  104. package/packages/silk-effects/dist/dev/pkg/changesets/services/config-inspector.cjs +0 -489
  105. package/packages/silk-effects/dist/dev/pkg/changesets/services/config-inspector.js +0 -481
  106. package/packages/silk-effects/dist/dev/pkg/changesets/services/deps-regen.cjs +0 -375
  107. package/packages/silk-effects/dist/dev/pkg/changesets/services/deps-regen.js +0 -371
  108. package/packages/silk-effects/dist/dev/pkg/changesets/services/github.cjs +0 -160
  109. package/packages/silk-effects/dist/dev/pkg/changesets/services/github.js +0 -157
  110. package/packages/silk-effects/dist/dev/pkg/changesets/services/maintenance-reason.cjs +0 -68
  111. package/packages/silk-effects/dist/dev/pkg/changesets/services/maintenance-reason.js +0 -66
  112. package/packages/silk-effects/dist/dev/pkg/changesets/services/markdown.cjs +0 -87
  113. package/packages/silk-effects/dist/dev/pkg/changesets/services/markdown.js +0 -85
  114. package/packages/silk-effects/dist/dev/pkg/changesets/services/release-planner.cjs +0 -352
  115. package/packages/silk-effects/dist/dev/pkg/changesets/services/release-planner.js +0 -348
  116. package/packages/silk-effects/dist/dev/pkg/changesets/utils/commit-parser.cjs +0 -81
  117. package/packages/silk-effects/dist/dev/pkg/changesets/utils/commit-parser.js +0 -80
  118. package/packages/silk-effects/dist/dev/pkg/changesets/utils/dep-diff.cjs +0 -111
  119. package/packages/silk-effects/dist/dev/pkg/changesets/utils/dep-diff.js +0 -111
  120. package/packages/silk-effects/dist/dev/pkg/changesets/utils/dependency-table.cjs +0 -351
  121. package/packages/silk-effects/dist/dev/pkg/changesets/utils/dependency-table.js +0 -347
  122. package/packages/silk-effects/dist/dev/pkg/changesets/utils/git.cjs +0 -51
  123. package/packages/silk-effects/dist/dev/pkg/changesets/utils/git.js +0 -51
  124. package/packages/silk-effects/dist/dev/pkg/changesets/utils/issue-refs.cjs +0 -102
  125. package/packages/silk-effects/dist/dev/pkg/changesets/utils/issue-refs.js +0 -101
  126. package/packages/silk-effects/dist/dev/pkg/changesets/utils/jsonpath.cjs +0 -178
  127. package/packages/silk-effects/dist/dev/pkg/changesets/utils/jsonpath.js +0 -175
  128. package/packages/silk-effects/dist/dev/pkg/changesets/utils/logger.cjs +0 -51
  129. package/packages/silk-effects/dist/dev/pkg/changesets/utils/logger.js +0 -50
  130. package/packages/silk-effects/dist/dev/pkg/changesets/utils/markdown-link.cjs +0 -59
  131. package/packages/silk-effects/dist/dev/pkg/changesets/utils/markdown-link.js +0 -57
  132. package/packages/silk-effects/dist/dev/pkg/changesets/utils/publishability.cjs +0 -50
  133. package/packages/silk-effects/dist/dev/pkg/changesets/utils/publishability.js +0 -50
  134. package/packages/silk-effects/dist/dev/pkg/changesets/utils/remark-pipeline.cjs +0 -81
  135. package/packages/silk-effects/dist/dev/pkg/changesets/utils/remark-pipeline.js +0 -79
  136. package/packages/silk-effects/dist/dev/pkg/changesets/utils/section-parser.cjs +0 -94
  137. package/packages/silk-effects/dist/dev/pkg/changesets/utils/section-parser.js +0 -94
  138. package/packages/silk-effects/dist/dev/pkg/changesets/utils/strip-frontmatter.cjs +0 -47
  139. package/packages/silk-effects/dist/dev/pkg/changesets/utils/strip-frontmatter.js +0 -46
  140. package/packages/silk-effects/dist/dev/pkg/changesets/utils/version-blocks.cjs +0 -110
  141. package/packages/silk-effects/dist/dev/pkg/changesets/utils/version-blocks.js +0 -108
  142. package/packages/silk-effects/dist/dev/pkg/changesets/utils/version-files.cjs +0 -336
  143. package/packages/silk-effects/dist/dev/pkg/changesets/utils/version-files.js +0 -336
  144. package/packages/silk-effects/dist/dev/pkg/changesets/vendor/github-info.cjs +0 -77
  145. package/packages/silk-effects/dist/dev/pkg/changesets/vendor/github-info.js +0 -77
  146. package/packages/silk-effects/dist/dev/pkg/errors/ChangesetConfigError.cjs +0 -21
  147. package/packages/silk-effects/dist/dev/pkg/errors/ChangesetConfigError.js +0 -21
  148. package/packages/silk-effects/dist/dev/pkg/schemas/VersioningSchemas.cjs +0 -101
  149. package/packages/silk-effects/dist/dev/pkg/schemas/VersioningSchemas.js +0 -99
  150. package/packages/silk-effects/dist/dev/pkg/services/ChangesetConfig.cjs +0 -81
  151. package/packages/silk-effects/dist/dev/pkg/services/ChangesetConfig.js +0 -80
  152. package/packages/silk-effects/dist/dev/pkg/services/ChangesetConfigReader.cjs +0 -109
  153. package/packages/silk-effects/dist/dev/pkg/services/ChangesetConfigReader.js +0 -108
  154. package/packages/silk-effects/dist/dev/pkg/services/SilkPublishability.cjs +0 -238
  155. package/packages/silk-effects/dist/dev/pkg/services/SilkPublishability.js +0 -236
@@ -1,371 +0,0 @@
1
- import { ChangesetConfigReaderLive } from "../../services/ChangesetConfigReader.js";
2
- import { ChangesetConfig, ChangesetConfigLive } from "../../services/ChangesetConfig.js";
3
- import { WorkspaceDiscovery } from "../../../../../../../node_modules/.pnpm/workspaces-effect@2.0.1_@effect_platform@0.96.2_effect@3.21.4__effect@3.21.4/node_modules/workspaces-effect/services/WorkspaceDiscovery.js";
4
- import { PointInTimeWorkspace } from "../../../../../../../node_modules/.pnpm/workspaces-effect@2.0.1_@effect_platform@0.96.2_effect@3.21.4__effect@3.21.4/node_modules/workspaces-effect/services/PointInTimeWorkspace.js";
5
- import { PointInTimeWorkspaceLive } from "../../../../../../../node_modules/.pnpm/workspaces-effect@2.0.1_@effect_platform@0.96.2_effect@3.21.4__effect@3.21.4/node_modules/workspaces-effect/layers/PointInTimeWorkspaceLive.js";
6
- import { PublishabilityDetector } from "../../../../../../../node_modules/.pnpm/workspaces-effect@2.0.1_@effect_platform@0.96.2_effect@3.21.4__effect@3.21.4/node_modules/workspaces-effect/services/PublishabilityDetector.js";
7
- import { WorkspaceDiscoveryLive } from "../../../../../../../node_modules/.pnpm/workspaces-effect@2.0.1_@effect_platform@0.96.2_effect@3.21.4__effect@3.21.4/node_modules/workspaces-effect/layers/WorkspaceDiscoveryLive.js";
8
- import { WorkspaceRootLive } from "../../../../../../../node_modules/.pnpm/workspaces-effect@2.0.1_@effect_platform@0.96.2_effect@3.21.4__effect@3.21.4/node_modules/workspaces-effect/layers/WorkspaceRootLive.js";
9
- import { PublishabilityDetectorAdaptiveLive } from "../../services/SilkPublishability.js";
10
- import { ChangesetIOError } from "../errors.js";
11
- import { serializeDependencyTableToMarkdown, sortDependencyRows } from "../utils/dependency-table.js";
12
- import { ConfigInspector, ConfigInspectorLive } from "./config-inspector.js";
13
- import { computeWorkspaceDependencyDiffs } from "../utils/dep-diff.js";
14
- import { gitMergeBase } from "../utils/git.js";
15
- import { listPublishablePackageNames } from "../utils/publishability.js";
16
- import { Context, Effect, Layer, Option } from "effect";
17
- import { FileSystem } from "@effect/platform";
18
- import { join, resolve } from "node:path";
19
-
20
- //#region ../silk-effects/dist/dev/pkg/changesets/services/deps-regen.js
21
- /**
22
- * `Changesets.DepsRegen` service — lift the `deps regen` / `deps detect`
23
- * orchestration out of the CLI into a `Context.Tag` service with a
24
- * `plan()` / `execute()` split.
25
- *
26
- * @remarks
27
- * `plan()` computes the cumulative dependency diff (merge-base → working
28
- * tree by default, or between two explicit refs) by snapshotting both
29
- * sides through `PointInTimeWorkspace`, which resolves `catalog:` /
30
- * `workspace:` specifiers against each ref's own catalogs and package
31
- * versions before diffing. It drops `devDependency` rows (unless
32
- * `includeDevDeps`), and returns a complete {@link RegenPlan}
33
- * (target filenames + stale-changeset deletes) WITHOUT touching the
34
- * filesystem. `execute()` applies a plan — writing the fresh changesets
35
- * first, then deleting the stale pure-dependency ones (so an interrupted
36
- * run loses nothing and is safely re-runnable).
37
- *
38
- * This is the single source of truth for regen/detect: the CLI commands
39
- * and MCP tools are thin adapters over this service.
40
- *
41
- * @see {@link DepsRegen} for the service tag
42
- * @see {@link DepsRegenLive} for the production layer
43
- *
44
- */
45
- const ADJECTIVES = [
46
- "brave",
47
- "clever",
48
- "swift",
49
- "silver",
50
- "lucky",
51
- "happy",
52
- "calm",
53
- "bright",
54
- "quiet",
55
- "wild"
56
- ];
57
- const NOUNS = [
58
- "dogs",
59
- "cats",
60
- "wolves",
61
- "foxes",
62
- "cups",
63
- "ships",
64
- "trees",
65
- "owls",
66
- "cranes",
67
- "hills"
68
- ];
69
- const VERBS = [
70
- "laugh",
71
- "dream",
72
- "fly",
73
- "sing",
74
- "dance",
75
- "wander",
76
- "soar",
77
- "rest",
78
- "leap",
79
- "ponder"
80
- ];
81
- function pickRandomTriplet() {
82
- return `${ADJECTIVES[Math.floor(Math.random() * ADJECTIVES.length)]}-${NOUNS[Math.floor(Math.random() * NOUNS.length)]}-${VERBS[Math.floor(Math.random() * VERBS.length)]}`;
83
- }
84
- /**
85
- * Pick a `<adjective>-<noun>-<verb>` filename slug that does not collide
86
- * with an existing `.changeset/*.md` OR with a slug already claimed
87
- * earlier in the same {@link RegenPlan.toWrite} computation. `plan()`
88
- * never writes to disk, so an on-disk existence check alone cannot see
89
- * slugs chosen moments earlier in the same call — the `chosen` set closes
90
- * that gap. The triplet space is 1,000 combinations, so a busy repo can
91
- * plausibly exhaust it across runs; fall back to a timestamp suffix after
92
- * 20 unlucky picks.
93
- *
94
- * @param fileExists - Effectful on-disk existence check (never fails; a
95
- * filesystem error is treated as "does not exist" so filename selection
96
- * degrades gracefully rather than blocking the plan).
97
- * @param changesetDir - Directory checked for on-disk collisions.
98
- * @param chosen - Basenames (without extension) already picked within this plan;
99
- * the picked candidate is added to this set before returning.
100
- * @internal
101
- */
102
- function randomFilename(fileExists, changesetDir, chosen) {
103
- return Effect.gen(function* () {
104
- for (let i = 0; i < 20; i++) {
105
- const candidate = pickRandomTriplet();
106
- if (!chosen.has(candidate) && !(yield* fileExists(join(changesetDir, `${candidate}.md`)))) {
107
- chosen.add(candidate);
108
- return candidate;
109
- }
110
- }
111
- let attempt = 0;
112
- let fallback = `${pickRandomTriplet()}-${Date.now()}`;
113
- while (chosen.has(fallback) || (yield* fileExists(join(changesetDir, `${fallback}.md`)))) fallback = `${pickRandomTriplet()}-${Date.now()}-${++attempt}`;
114
- chosen.add(fallback);
115
- return fallback;
116
- });
117
- }
118
- /**
119
- * Strict detection of "pure dependency changesets" per the documented
120
- * rules: single-package frontmatter, single `## Dependencies` heading,
121
- * no other body content beyond that section.
122
- *
123
- * @param content - Raw `.changeset/*.md` file contents.
124
- * @returns `{ isPure, package }` — `isPure` is `true` only for a
125
- * single-package, Dependencies-only changeset; `package` is the sole
126
- * frontmatter package name (or `null` when not pure).
127
- *
128
- * @public
129
- */
130
- function isPureDependencyChangeset(content) {
131
- const fmMatch = content.match(/^---\n([\s\S]*?)\n---\n?([\s\S]*)$/);
132
- if (!fmMatch) return {
133
- isPure: false,
134
- package: null
135
- };
136
- const frontmatter = fmMatch[1];
137
- const body = (fmMatch[2] ?? "").trim();
138
- const fmLines = frontmatter.split(/\r?\n/).filter((l) => l.trim().length > 0 && !/^\s*#/.test(l));
139
- if (fmLines.length !== 1) return {
140
- isPure: false,
141
- package: null
142
- };
143
- const pkgMatch = fmLines[0].match(/^\s*["']?([^"':\s]+)["']?\s*:\s*([a-z]+)\s*$/);
144
- if (!pkgMatch) return {
145
- isPure: false,
146
- package: null
147
- };
148
- const pkg = pkgMatch[1];
149
- const bodyTrimmed = body.replace(/^\s+/, "");
150
- if (!/^## Dependencies\b/.test(bodyTrimmed)) return {
151
- isPure: false,
152
- package: null
153
- };
154
- if ((bodyTrimmed.match(/^## /gm) ?? []).length !== 1) return {
155
- isPure: false,
156
- package: null
157
- };
158
- if (/^# /m.test(bodyTrimmed)) return {
159
- isPure: false,
160
- package: null
161
- };
162
- return {
163
- isPure: true,
164
- package: pkg
165
- };
166
- }
167
- /**
168
- * List `.changeset/*.md` files (excluding `README.md`) in `changesetDir`.
169
- * A missing directory is today's behavior for "no changesets yet" and
170
- * resolves to an empty list; any OTHER failure (e.g. a directory that
171
- * exists but cannot be read) is a loud {@link ChangesetIOError} — an
172
- * unreadable `.changeset` dir must not silently masquerade as "no
173
- * changesets".
174
- */
175
- const listChangesetFiles = (fs, changesetDir) => fs.readDirectory(changesetDir).pipe(Effect.map((names) => names.filter((f) => f.endsWith(".md") && f !== "README.md").map((f) => join(changesetDir, f))), Effect.catchAll((e) => e._tag === "SystemError" && e.reason === "NotFound" ? Effect.succeed([]) : Effect.fail(new ChangesetIOError({
176
- path: changesetDir,
177
- operation: "list",
178
- reason: String(e)
179
- }))));
180
- /**
181
- * Pure-dependency changesets found in `changesetDir`. An individual file
182
- * that cannot be read (e.g. removed mid-scan, permission race) is skipped —
183
- * today's semantics — while a failure to list the directory itself
184
- * propagates as a loud {@link ChangesetIOError}.
185
- */
186
- const findPureDependencyChangesets = (fs, changesetDir) => Effect.gen(function* () {
187
- const files = yield* listChangesetFiles(fs, changesetDir);
188
- const result = [];
189
- for (const file of files) {
190
- const content = yield* fs.readFileString(file).pipe(Effect.option);
191
- if (Option.isNone(content)) continue;
192
- const detection = isPureDependencyChangeset(content.value);
193
- if (detection.isPure && detection.package) result.push({
194
- file,
195
- package: detection.package
196
- });
197
- }
198
- return result;
199
- });
200
- /**
201
- * Mixed dependency changesets (have a `## Dependencies` heading but fail
202
- * the strict pure-changeset test) found in `changesetDir`. Same
203
- * skip-unreadable-file / loud-list-failure semantics as
204
- * {@link findPureDependencyChangesets}.
205
- */
206
- const findMixedDependencyChangesets = (fs, changesetDir) => Effect.gen(function* () {
207
- const files = yield* listChangesetFiles(fs, changesetDir);
208
- const result = [];
209
- for (const file of files) {
210
- const content = yield* fs.readFileString(file).pipe(Effect.option);
211
- if (Option.isNone(content)) continue;
212
- if (/^## Dependencies\b/m.test(content.value) && !isPureDependencyChangeset(content.value).isPure) result.push(file);
213
- }
214
- return result;
215
- });
216
- /**
217
- * Render a single-package, patch-bump changeset for a diff whose rows are
218
- * already resolved (per-side, inside {@link computeWorkspaceDependencyDiffs})
219
- * and devDep-filtered.
220
- */
221
- function renderChangesetContent(diff) {
222
- return `${`---\n"${diff.package}": patch\n---`}\n\n## Dependencies\n\n${serializeDependencyTableToMarkdown([...diff.rows])}\n`;
223
- }
224
- /**
225
- * @internal
226
- */
227
- const DepsRegenBase = Context.Tag("Changesets/DepsRegen")();
228
- /**
229
- * Effect service tag for {@link DepsRegenShape}.
230
- *
231
- * @example
232
- * ```typescript
233
- * import { Effect } from "effect";
234
- * import { Changesets } from "@savvy-web/silk-effects";
235
- *
236
- * const program = Effect.gen(function* () {
237
- * const svc = yield* Changesets.DepsRegen;
238
- * const plan = yield* svc.plan({ cwd: process.cwd() });
239
- * return yield* svc.execute(plan);
240
- * });
241
- * ```
242
- *
243
- * @public
244
- */
245
- var DepsRegen = class extends DepsRegenBase {};
246
- /**
247
- * Build a {@link DepsRegenShape} that closes over already-resolved service
248
- * implementations, keeping the public `plan`/`execute` signatures
249
- * requirement-free (`R = never`).
250
- */
251
- function makeShape(pit, inspector, discovery, detector, config, fs) {
252
- const provideDetector = Layer.succeed(PublishabilityDetector, detector);
253
- const fileExists = (p) => fs.exists(p).pipe(Effect.orElseSucceed(() => false));
254
- const plan = (options) => Effect.gen(function* () {
255
- const resolvedCwd = resolve(options.cwd);
256
- const changesetDir = join(resolvedCwd, ".changeset");
257
- let fromRef = options.from;
258
- if (!fromRef) {
259
- let baseBranch = options.base;
260
- if (!baseBranch) baseBranch = (yield* inspector.inspect(resolvedCwd).pipe(Effect.catchTag("ConfigurationError", () => Effect.succeed({ baseBranch: "main" })))).baseBranch;
261
- fromRef = yield* gitMergeBase(resolvedCwd, baseBranch);
262
- }
263
- const rawDiffs = computeWorkspaceDependencyDiffs(yield* pit.at(fromRef, { cwd: resolvedCwd }), options.to ? yield* pit.at(options.to, { cwd: resolvedCwd }) : yield* pit.worktree({ cwd: resolvedCwd }));
264
- const targetPkg = options.package;
265
- const livePackages = yield* discovery.listPackages(resolvedCwd);
266
- const publishable = yield* listPublishablePackageNames(livePackages, resolvedCwd).pipe(Effect.provide(provideDetector));
267
- const versionPrivate = yield* config.versionPrivate(resolvedCwd);
268
- const inScope = /* @__PURE__ */ new Set();
269
- for (const pkg of livePackages) {
270
- if (yield* config.isIgnored(pkg.name, resolvedCwd)) continue;
271
- if (publishable.has(pkg.name) || versionPrivate) inScope.add(pkg.name);
272
- }
273
- const targetIgnored = targetPkg ? yield* config.isIgnored(targetPkg, resolvedCwd) : false;
274
- const keepDevDeps = options.includeDevDeps === true;
275
- const scoped = targetPkg ? targetIgnored ? [] : rawDiffs.filter((d) => d.package === targetPkg) : rawDiffs.filter((d) => inScope.has(d.package));
276
- const resolved = [];
277
- for (const diff of scoped) {
278
- const rows = keepDevDeps ? [...diff.rows] : diff.rows.filter((r) => r.type !== "devDependency");
279
- if (rows.length > 0) resolved.push({
280
- ...diff,
281
- rows: sortDependencyRows(rows)
282
- });
283
- }
284
- const existingPure = yield* findPureDependencyChangesets(fs, changesetDir);
285
- const skippedMixed = yield* findMixedDependencyChangesets(fs, changesetDir);
286
- const toDelete = targetPkg ? targetIgnored ? [] : existingPure.filter((p) => p.package === targetPkg) : existingPure.filter((p) => inScope.has(p.package));
287
- const chosenFilenames = /* @__PURE__ */ new Set();
288
- const toWrite = [];
289
- for (const diff of resolved) {
290
- const filename = yield* randomFilename(fileExists, changesetDir, chosenFilenames);
291
- toWrite.push({
292
- file: join(changesetDir, `${filename}.md`),
293
- package: diff.package,
294
- diff
295
- });
296
- }
297
- return {
298
- toDelete,
299
- toWrite,
300
- skippedMixed
301
- };
302
- });
303
- const execute = (plan) => Effect.gen(function* () {
304
- const deleted = [];
305
- const written = [];
306
- for (const entry of plan.toWrite) {
307
- yield* fs.writeFileString(entry.file, renderChangesetContent(entry.diff)).pipe(Effect.mapError((e) => new ChangesetIOError({
308
- path: entry.file,
309
- operation: "write",
310
- reason: String(e)
311
- })));
312
- written.push(entry.file);
313
- }
314
- for (const entry of plan.toDelete) if (yield* Effect.isSuccess(fs.remove(entry.file))) deleted.push(entry.file);
315
- return {
316
- deleted,
317
- written,
318
- skippedMixed: plan.skippedMixed
319
- };
320
- });
321
- return {
322
- plan,
323
- execute
324
- };
325
- }
326
- /**
327
- * Live layer for {@link DepsRegen}.
328
- *
329
- * Requires `PointInTimeWorkspace`, `WorkspaceDiscovery`,
330
- * `PublishabilityDetector` (all from `workspaces-effect`),
331
- * {@link ConfigInspector}, {@link ChangesetConfig}, and
332
- * `FileSystem.FileSystem` (resolved once at construction and closed over by
333
- * the shape, keeping `plan`/`execute` themselves requirement-free).
334
- *
335
- * @public
336
- */
337
- const DepsRegenLive = Layer.effect(DepsRegen, Effect.gen(function* () {
338
- return makeShape(yield* PointInTimeWorkspace, yield* ConfigInspector, yield* WorkspaceDiscovery, yield* PublishabilityDetector, yield* ChangesetConfig, yield* FileSystem.FileSystem);
339
- }));
340
- const WorkspaceGraph = Layer.mergeAll(WorkspaceRootLive, WorkspaceDiscoveryLive.pipe(Layer.provide(WorkspaceRootLive)));
341
- const ConfigGraph = ChangesetConfigLive.pipe(Layer.provide(ChangesetConfigReaderLive));
342
- /**
343
- * Batteries-included {@link DepsRegen} layer: silk's opinionated default
344
- * composition of the full dependency graph. Only the platform services
345
- * remain — note that {@link PointInTimeWorkspace} reads git history, so
346
- * this layer genuinely requires `CommandExecutor` in addition to
347
- * `FileSystem`/`Path`: provide a git-capable platform layer
348
- * (`NodeContext.layer`), not a bare filesystem-only layer.
349
- *
350
- * Gating uses silk's adaptive publishability detector
351
- * ({@link PublishabilityDetectorAdaptiveLive}), so the default semantics
352
- * are "versionable minus ignored" — identical to the savvy CLI and MCP
353
- * runtimes. Consumers who need to swap any dependency (test detectors,
354
- * alternate config sources) should keep composing {@link DepsRegenLive}
355
- * directly; this layer is purely additive.
356
- *
357
- * @example
358
- * ```typescript
359
- * import { NodeContext } from "@effect/platform-node";
360
- * import { Layer } from "effect";
361
- * import { Changesets } from "@savvy-web/silk-effects";
362
- *
363
- * const depsRegen = Changesets.DepsRegenDefault.pipe(Layer.provide(NodeContext.layer));
364
- * ```
365
- *
366
- * @public
367
- */
368
- const DepsRegenDefault = DepsRegenLive.pipe(Layer.provide(PointInTimeWorkspaceLive.pipe(Layer.provide(WorkspaceGraph))), Layer.provide(ConfigInspectorLive.pipe(Layer.provide(Layer.mergeAll(ChangesetConfigReaderLive, WorkspaceGraph)))), Layer.provide(PublishabilityDetectorAdaptiveLive.pipe(Layer.provide(ConfigGraph))), Layer.provide(ConfigGraph), Layer.provide(WorkspaceGraph));
369
-
370
- //#endregion
371
- export { DepsRegen, DepsRegenBase, DepsRegenDefault, DepsRegenLive, isPureDependencyChangeset };
@@ -1,160 +0,0 @@
1
- const require_errors = require('../errors.cjs');
2
- const require_github_info = require('../vendor/github-info.cjs');
3
- let effect = require("effect");
4
-
5
- //#region ../silk-effects/dist/dev/pkg/changesets/services/github.js
6
- /**
7
- * Base class for GitHubService.
8
- *
9
- * @privateRemarks
10
- * This export is required for api-extractor documentation generation.
11
- * Effect's Context.Tag creates an anonymous base class that must be
12
- * explicitly exported to avoid "forgotten export" warnings. Do not delete.
13
- *
14
- * @internal
15
- */
16
- const GitHubServiceBase = effect.Context.Tag("GitHubService")();
17
- /**
18
- * Effect service tag for GitHub API operations.
19
- *
20
- * Provides dependency-injected access to GitHub commit metadata lookups.
21
- * Use `yield* GitHubService` inside an `Effect.gen` block to obtain the
22
- * service instance.
23
- *
24
- * @remarks
25
- * This tag follows the standard Effect `Context.Tag` pattern. Two layers
26
- * are provided out of the box:
27
- *
28
- * - {@link GitHubLive} — production layer backed by the GitHub REST API
29
- * - {@link makeGitHubTest} — factory for deterministic test layers
30
- *
31
- * @example
32
- * ```typescript
33
- * import { Effect, Layer } from "effect";
34
- * import { GitHubService, GitHubLive } from "\@savvy-web/changesets";
35
- *
36
- * const program = Effect.gen(function* () {
37
- * const github = yield* GitHubService;
38
- * const info = yield* github.getInfo({
39
- * commit: "abc1234567890",
40
- * repo: "savvy-web/changesets",
41
- * });
42
- * console.log(info.user, info.pull, info.links);
43
- * });
44
- *
45
- * // Provide the live layer and run
46
- * Effect.runPromise(program.pipe(Effect.provide(GitHubLive)));
47
- * ```
48
- *
49
- * @example Creating a test layer with canned responses
50
- * ```typescript
51
- * import { Effect } from "effect";
52
- * import type { GitHubCommitInfo } from "\@savvy-web/changesets";
53
- * import { GitHubService, makeGitHubTest } from "\@savvy-web/changesets";
54
- *
55
- * const testResponses = new Map<string, GitHubCommitInfo>([
56
- * ["abc1234", { user: "octocat", pull: 42, links: { pull: "#42", user: "\@octocat" } }],
57
- * ]);
58
- *
59
- * const TestLayer = makeGitHubTest(testResponses);
60
- *
61
- * const program = Effect.gen(function* () {
62
- * const github = yield* GitHubService;
63
- * return yield* github.getInfo({ commit: "abc1234", repo: "owner/repo" });
64
- * });
65
- *
66
- * Effect.runPromise(program.pipe(Effect.provide(TestLayer)));
67
- * ```
68
- *
69
- * @see {@link GitHubServiceShape} for the service interface
70
- * @see {@link GitHubLive} for the production layer
71
- * @see {@link makeGitHubTest} for creating test layers
72
- * @see {@link GitHubServiceBase} for the api-extractor base class
73
- *
74
- * @public
75
- */
76
- var GitHubService = class extends GitHubServiceBase {};
77
- /**
78
- * Production layer for {@link GitHubService}.
79
- *
80
- * Delegates to `\@changesets/get-github-info` to fetch commit metadata
81
- * from the GitHub REST API. Requires a `GITHUB_TOKEN` environment variable
82
- * to be set for authenticated requests.
83
- *
84
- * @remarks
85
- * This layer is used by the `\@savvy-web/changesets/changelog` entry point
86
- * to resolve commit hashes into PR numbers and author attribution. It is
87
- * composed with {@link MarkdownLive} in the changelog formatter's
88
- * `MainLayer`.
89
- *
90
- * @example
91
- * ```typescript
92
- * import { Effect } from "effect";
93
- * import { GitHubService, GitHubLive } from "\@savvy-web/changesets";
94
- *
95
- * const program = Effect.gen(function* () {
96
- * const github = yield* GitHubService;
97
- * return yield* github.getInfo({ commit: "abc1234", repo: "owner/repo" });
98
- * });
99
- *
100
- * Effect.runPromise(program.pipe(Effect.provide(GitHubLive)));
101
- * ```
102
- *
103
- * @public
104
- */
105
- const GitHubLive = effect.Layer.succeed(GitHubService, { getInfo: require_github_info.getGitHubInfo });
106
- /**
107
- * Create a test layer for {@link GitHubService} with pre-configured responses.
108
- *
109
- * Returns a `Layer` that resolves commit hashes from the provided `Map`.
110
- * Lookups for commits not present in the map fail with a
111
- * {@link GitHubApiError}.
112
- *
113
- * @remarks
114
- * This helper is the recommended way to test code that depends on
115
- * `GitHubService` without making real API calls. Provide the layer
116
- * via `Effect.provide` in your test setup.
117
- *
118
- * @param responses - A `Map` of full commit hash to {@link GitHubCommitInfo} objects
119
- * @returns A `Layer` providing the {@link GitHubService} with deterministic responses
120
- *
121
- * @example
122
- * ```typescript
123
- * import { Effect } from "effect";
124
- * import type { GitHubCommitInfo } from "\@savvy-web/changesets";
125
- * import { GitHubService, makeGitHubTest } from "\@savvy-web/changesets";
126
- *
127
- * const responses = new Map<string, GitHubCommitInfo>([
128
- * ["abc1234", { user: "octocat", pull: 42, links: { pull: "#42", user: "\@octocat" } }],
129
- * ]);
130
- *
131
- * const TestGitHub = makeGitHubTest(responses);
132
- *
133
- * const program = Effect.gen(function* () {
134
- * const github = yield* GitHubService;
135
- * return yield* github.getInfo({ commit: "abc1234", repo: "owner/repo" });
136
- * });
137
- *
138
- * // In a Vitest test:
139
- * const result = await Effect.runPromise(program.pipe(Effect.provide(TestGitHub)));
140
- * // result.user === "octocat"
141
- * ```
142
- *
143
- * @public
144
- */
145
- function makeGitHubTest(responses) {
146
- return effect.Layer.succeed(GitHubService, { getInfo: (params) => {
147
- const info = responses.get(params.commit);
148
- if (info) return effect.Effect.succeed(info);
149
- return effect.Effect.fail(new require_errors.GitHubApiError({
150
- operation: "getInfo",
151
- reason: `No mock response for commit ${params.commit}`
152
- }));
153
- } });
154
- }
155
-
156
- //#endregion
157
- exports.GitHubLive = GitHubLive;
158
- exports.GitHubService = GitHubService;
159
- exports.GitHubServiceBase = GitHubServiceBase;
160
- exports.makeGitHubTest = makeGitHubTest;
@@ -1,157 +0,0 @@
1
- import { GitHubApiError } from "../errors.js";
2
- import { getGitHubInfo } from "../vendor/github-info.js";
3
- import { Context, Effect, Layer } from "effect";
4
-
5
- //#region ../silk-effects/dist/dev/pkg/changesets/services/github.js
6
- /**
7
- * Base class for GitHubService.
8
- *
9
- * @privateRemarks
10
- * This export is required for api-extractor documentation generation.
11
- * Effect's Context.Tag creates an anonymous base class that must be
12
- * explicitly exported to avoid "forgotten export" warnings. Do not delete.
13
- *
14
- * @internal
15
- */
16
- const GitHubServiceBase = Context.Tag("GitHubService")();
17
- /**
18
- * Effect service tag for GitHub API operations.
19
- *
20
- * Provides dependency-injected access to GitHub commit metadata lookups.
21
- * Use `yield* GitHubService` inside an `Effect.gen` block to obtain the
22
- * service instance.
23
- *
24
- * @remarks
25
- * This tag follows the standard Effect `Context.Tag` pattern. Two layers
26
- * are provided out of the box:
27
- *
28
- * - {@link GitHubLive} — production layer backed by the GitHub REST API
29
- * - {@link makeGitHubTest} — factory for deterministic test layers
30
- *
31
- * @example
32
- * ```typescript
33
- * import { Effect, Layer } from "effect";
34
- * import { GitHubService, GitHubLive } from "\@savvy-web/changesets";
35
- *
36
- * const program = Effect.gen(function* () {
37
- * const github = yield* GitHubService;
38
- * const info = yield* github.getInfo({
39
- * commit: "abc1234567890",
40
- * repo: "savvy-web/changesets",
41
- * });
42
- * console.log(info.user, info.pull, info.links);
43
- * });
44
- *
45
- * // Provide the live layer and run
46
- * Effect.runPromise(program.pipe(Effect.provide(GitHubLive)));
47
- * ```
48
- *
49
- * @example Creating a test layer with canned responses
50
- * ```typescript
51
- * import { Effect } from "effect";
52
- * import type { GitHubCommitInfo } from "\@savvy-web/changesets";
53
- * import { GitHubService, makeGitHubTest } from "\@savvy-web/changesets";
54
- *
55
- * const testResponses = new Map<string, GitHubCommitInfo>([
56
- * ["abc1234", { user: "octocat", pull: 42, links: { pull: "#42", user: "\@octocat" } }],
57
- * ]);
58
- *
59
- * const TestLayer = makeGitHubTest(testResponses);
60
- *
61
- * const program = Effect.gen(function* () {
62
- * const github = yield* GitHubService;
63
- * return yield* github.getInfo({ commit: "abc1234", repo: "owner/repo" });
64
- * });
65
- *
66
- * Effect.runPromise(program.pipe(Effect.provide(TestLayer)));
67
- * ```
68
- *
69
- * @see {@link GitHubServiceShape} for the service interface
70
- * @see {@link GitHubLive} for the production layer
71
- * @see {@link makeGitHubTest} for creating test layers
72
- * @see {@link GitHubServiceBase} for the api-extractor base class
73
- *
74
- * @public
75
- */
76
- var GitHubService = class extends GitHubServiceBase {};
77
- /**
78
- * Production layer for {@link GitHubService}.
79
- *
80
- * Delegates to `\@changesets/get-github-info` to fetch commit metadata
81
- * from the GitHub REST API. Requires a `GITHUB_TOKEN` environment variable
82
- * to be set for authenticated requests.
83
- *
84
- * @remarks
85
- * This layer is used by the `\@savvy-web/changesets/changelog` entry point
86
- * to resolve commit hashes into PR numbers and author attribution. It is
87
- * composed with {@link MarkdownLive} in the changelog formatter's
88
- * `MainLayer`.
89
- *
90
- * @example
91
- * ```typescript
92
- * import { Effect } from "effect";
93
- * import { GitHubService, GitHubLive } from "\@savvy-web/changesets";
94
- *
95
- * const program = Effect.gen(function* () {
96
- * const github = yield* GitHubService;
97
- * return yield* github.getInfo({ commit: "abc1234", repo: "owner/repo" });
98
- * });
99
- *
100
- * Effect.runPromise(program.pipe(Effect.provide(GitHubLive)));
101
- * ```
102
- *
103
- * @public
104
- */
105
- const GitHubLive = Layer.succeed(GitHubService, { getInfo: getGitHubInfo });
106
- /**
107
- * Create a test layer for {@link GitHubService} with pre-configured responses.
108
- *
109
- * Returns a `Layer` that resolves commit hashes from the provided `Map`.
110
- * Lookups for commits not present in the map fail with a
111
- * {@link GitHubApiError}.
112
- *
113
- * @remarks
114
- * This helper is the recommended way to test code that depends on
115
- * `GitHubService` without making real API calls. Provide the layer
116
- * via `Effect.provide` in your test setup.
117
- *
118
- * @param responses - A `Map` of full commit hash to {@link GitHubCommitInfo} objects
119
- * @returns A `Layer` providing the {@link GitHubService} with deterministic responses
120
- *
121
- * @example
122
- * ```typescript
123
- * import { Effect } from "effect";
124
- * import type { GitHubCommitInfo } from "\@savvy-web/changesets";
125
- * import { GitHubService, makeGitHubTest } from "\@savvy-web/changesets";
126
- *
127
- * const responses = new Map<string, GitHubCommitInfo>([
128
- * ["abc1234", { user: "octocat", pull: 42, links: { pull: "#42", user: "\@octocat" } }],
129
- * ]);
130
- *
131
- * const TestGitHub = makeGitHubTest(responses);
132
- *
133
- * const program = Effect.gen(function* () {
134
- * const github = yield* GitHubService;
135
- * return yield* github.getInfo({ commit: "abc1234", repo: "owner/repo" });
136
- * });
137
- *
138
- * // In a Vitest test:
139
- * const result = await Effect.runPromise(program.pipe(Effect.provide(TestGitHub)));
140
- * // result.user === "octocat"
141
- * ```
142
- *
143
- * @public
144
- */
145
- function makeGitHubTest(responses) {
146
- return Layer.succeed(GitHubService, { getInfo: (params) => {
147
- const info = responses.get(params.commit);
148
- if (info) return Effect.succeed(info);
149
- return Effect.fail(new GitHubApiError({
150
- operation: "getInfo",
151
- reason: `No mock response for commit ${params.commit}`
152
- }));
153
- } });
154
- }
155
-
156
- //#endregion
157
- export { GitHubLive, GitHubService, GitHubServiceBase, makeGitHubTest };