@savvy-web/silk-effects 1.5.2 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { Context, Data, Effect, Equal, Hash, Layer, Option, Schema, Stream } from "effect";
2
- import { Command, CommandExecutor, FileSystem } from "@effect/platform";
3
- import { PackageManagerDetector, PublishConfig, PublishTarget, PublishabilityDetector, TopologicalSorter, WorkspaceDiscovery, WorkspaceDiscoveryError, WorkspacePackage, WorkspaceRoot } from "workspaces-effect";
2
+ import { Command, CommandExecutor, FileSystem, Path } from "@effect/platform";
3
+ import { PackageManagerDetector, PointInTimeReadError, PointInTimeWorkspace, PublishConfig, PublishTarget, PublishabilityDetector, TopologicalSorter, WorkspaceDiscovery, WorkspaceDiscoveryError, WorkspacePackage, WorkspaceRoot, WorkspaceStateSnapshot } from "workspaces-effect";
4
4
  import { Plugin } from "unified";
5
5
  import { PlatformError } from "@effect/platform/Error";
6
6
 
@@ -1571,6 +1571,16 @@ declare const DependencyTableTypeSchema: Schema.Literal<["dependency", "devDepen
1571
1571
  * @public
1572
1572
  */
1573
1573
  type DependencyTableType = typeof DependencyTableTypeSchema.Type;
1574
+ /**
1575
+ * The canonical accepted-value pattern for a dependency-table From/To cell:
1576
+ * the em-dash sentinel (U+2014), a bare/`~`/`^` semver, or — as a last-resort
1577
+ * fallback when a `catalog:`/`workspace:` specifier could not be resolved to a
1578
+ * concrete version — a pnpm protocol string. Non-overlapping alternatives keep
1579
+ * this free of polynomial backtracking (CodeQL).
1580
+ *
1581
+ * @public
1582
+ */
1583
+ declare const VERSION_RE: RegExp;
1574
1584
  /**
1575
1585
  * Version string or em dash (U+2014) sentinel for added/removed entries.
1576
1586
  *
@@ -1845,7 +1855,7 @@ declare class DependencyTable {
1845
1855
  /**
1846
1856
  * Class-based API wrapper for changeset linting.
1847
1857
  *
1848
- * Provides a static class interface that runs all remark-lint rules
1858
+ * Provides a static class interface that runs all five remark-lint rules
1849
1859
  * against changeset markdown files and returns structured diagnostics.
1850
1860
  *
1851
1861
  * @internal
@@ -1859,11 +1869,12 @@ declare class DependencyTable {
1859
1869
  * (file, line, column) for integration with editors, CI reporters, and
1860
1870
  * the Effect CLI's `lint` and `check` commands.
1861
1871
  *
1862
- * The four rules that produce lint messages are:
1872
+ * The five rules that produce lint messages are:
1863
1873
  *
1864
1874
  * - **heading-hierarchy** -- ensures headings follow a valid nesting order
1865
1875
  * - **required-sections** -- checks that mandatory sections are present
1866
1876
  * - **content-structure** -- validates the structure of section content
1877
+ * - **dependency-table-format** -- enforces the machine-generated dependency-table format for `## Dependencies` sections
1867
1878
  * - **uncategorized-content** -- flags content outside recognized section headings
1868
1879
  *
1869
1880
  * @public
@@ -1882,9 +1893,10 @@ interface LintMessage {
1882
1893
  * Identifier of the remark-lint rule that produced this message.
1883
1894
  *
1884
1895
  * @remarks
1885
- * Corresponds to one of the four built-in rules: `"heading-hierarchy"`,
1886
- * `"required-sections"`, `"content-structure"`, or `"uncategorized-content"`.
1887
- * Falls back to `"unknown"` if the underlying vfile message has no rule ID.
1896
+ * Corresponds to one of the five built-in rules: `"heading-hierarchy"`,
1897
+ * `"required-sections"`, `"content-structure"`, `"dependency-table-format"`,
1898
+ * or `"uncategorized-content"`. Falls back to `"unknown"` if the underlying
1899
+ * vfile message has no rule ID.
1888
1900
  */
1889
1901
  rule: string;
1890
1902
  /**
@@ -1917,9 +1929,9 @@ interface LintMessage {
1917
1929
  /**
1918
1930
  * Static class for linting changeset markdown files.
1919
1931
  *
1920
- * Runs the four remark-lint rules (heading-hierarchy, required-sections,
1921
- * content-structure, uncategorized-content) against changeset markdown
1922
- * and returns structured {@link LintMessage} diagnostics.
1932
+ * Runs the five remark-lint rules (heading-hierarchy, required-sections,
1933
+ * content-structure, dependency-table-format, uncategorized-content) against
1934
+ * changeset markdown and returns structured {@link LintMessage} diagnostics.
1923
1935
  *
1924
1936
  * @remarks
1925
1937
  * This class implements the pre-validation layer of the three-layer
@@ -2004,7 +2016,7 @@ declare class ChangesetLinter {
2004
2016
  *
2005
2017
  * @remarks
2006
2018
  * Reads the file synchronously, strips YAML frontmatter, and runs all
2007
- * four lint rules. The file path is preserved in each returned
2019
+ * five lint rules. The file path is preserved in each returned
2008
2020
  * {@link LintMessage} for error reporting.
2009
2021
  *
2010
2022
  * @param filePath - Absolute or relative path to the changeset `.md` file
@@ -2015,7 +2027,7 @@ declare class ChangesetLinter {
2015
2027
  * Validate a markdown string directly.
2016
2028
  *
2017
2029
  * @remarks
2018
- * Strips YAML frontmatter (if present) and runs all four lint rules
2030
+ * Strips YAML frontmatter (if present) and runs all five lint rules
2019
2031
  * against the remaining content. This method is useful for validating
2020
2032
  * changeset content that is already in memory, such as in test suites
2021
2033
  * or editor integrations.
@@ -2494,6 +2506,53 @@ declare class GitError extends GitErrorBase<{
2494
2506
  }> {
2495
2507
  get message(): string;
2496
2508
  }
2509
+ /**
2510
+ * Base class for {@link ChangesetIOError}.
2511
+ *
2512
+ * @privateRemarks
2513
+ * Effect's `Data.TaggedError` creates an anonymous base class that
2514
+ * api-extractor cannot follow without an explicit export.
2515
+ *
2516
+ * @internal
2517
+ */
2518
+ declare const ChangesetIOErrorBase: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P] }>) => import("effect/Cause").YieldableError & {
2519
+ readonly _tag: "ChangesetIOError";
2520
+ } & Readonly<A>;
2521
+ /**
2522
+ * Changeset file I/O failure.
2523
+ *
2524
+ * @remarks
2525
+ * Raised by {@link DepsRegen} when reading, writing, listing, or deleting
2526
+ * `.changeset/*.md` files fails. Deletion failures during
2527
+ * {@link DepsRegenShape.execute} are tolerated (stale changesets are
2528
+ * skip-and-continue, so an interrupted run stays safely re-runnable);
2529
+ * read, list, and write failures are loud.
2530
+ *
2531
+ * @example
2532
+ * ```typescript
2533
+ * import { Effect } from "effect";
2534
+ * import { ChangesetIOError } from "@savvy-web/changesets";
2535
+ *
2536
+ * declare const program: Effect.Effect<void, ChangesetIOError>;
2537
+ *
2538
+ * const handled = program.pipe(
2539
+ * Effect.catchTag("ChangesetIOError", (err) =>
2540
+ * Effect.logError(`changeset ${err.operation} failed at ${err.path}: ${err.reason}`)
2541
+ * ),
2542
+ * );
2543
+ * ```
2544
+ *
2545
+ * @see {@link DepsRegen} which produces these errors during plan/execute
2546
+ *
2547
+ * @public
2548
+ */
2549
+ declare class ChangesetIOError extends ChangesetIOErrorBase<{
2550
+ /** Absolute path of the file or directory the operation targeted. */readonly path: string; /** The failed operation. */
2551
+ readonly operation: "read" | "write" | "delete" | "list"; /** Human-readable failure reason. */
2552
+ readonly reason: string;
2553
+ }> {
2554
+ get message(): string;
2555
+ }
2497
2556
  /**
2498
2557
  * Base class for {@link ReleasePlanError}.
2499
2558
  *
@@ -3480,6 +3539,246 @@ declare const ChangelogServiceBase: Context.TagClass<ChangelogService, "Changelo
3480
3539
  */
3481
3540
  declare class ChangelogService extends ChangelogServiceBase {}
3482
3541
  //#endregion
3542
+ //#region src/services/ChangesetConfig.d.ts
3543
+ /**
3544
+ * Changeset operating mode for a workspace root.
3545
+ * @public
3546
+ */
3547
+ type ChangesetMode = "silk" | "vanilla" | "none";
3548
+ declare const ChangesetConfig_base: Context.TagClass<ChangesetConfig, "@savvy-web/silk-effects/ChangesetConfig", {
3549
+ readonly mode: (root: string) => Effect.Effect<ChangesetMode>;
3550
+ readonly versionPrivate: (root: string) => Effect.Effect<boolean>;
3551
+ readonly ignorePatterns: (root: string) => Effect.Effect<ReadonlyArray<string>>;
3552
+ readonly isIgnored: (name: string, root: string) => Effect.Effect<boolean>;
3553
+ readonly fixed: (root: string) => Effect.Effect<ReadonlyArray<ReadonlyArray<string>>>;
3554
+ }>;
3555
+ /**
3556
+ * Accessor service over a workspace root's `.changeset/config.json`.
3557
+ *
3558
+ * @remarks
3559
+ * Reads through {@link ChangesetConfigReader} (FileSystem-based) with a per-root cache.
3560
+ * Every accessor is total (error channel `never`): a missing or unreadable config collapses
3561
+ * to `mode: "none"` and empty/false defaults.
3562
+ *
3563
+ * @since 0.4.0
3564
+ * @public
3565
+ */
3566
+ declare class ChangesetConfig extends ChangesetConfig_base {
3567
+ /**
3568
+ * The one ignore matcher: exact name match, or `@scope/*` wildcard.
3569
+ *
3570
+ * `"@scope/*"` matches `"@scope/anything"` (prefix kept includes the trailing slash),
3571
+ * but not the bare scope `"@scope"`.
3572
+ */
3573
+ static matches(name: string, pattern: string): boolean;
3574
+ }
3575
+ /**
3576
+ * Live {@link ChangesetConfig} reading via {@link ChangesetConfigReader}, cached per root.
3577
+ *
3578
+ * @remarks
3579
+ * Requires `ChangesetConfigReader` (which requires `FileSystem`). Provide
3580
+ * `ChangesetConfigReaderLive` + a platform layer (`NodeContext.layer`).
3581
+ *
3582
+ * @since 0.4.0
3583
+ * @public
3584
+ */
3585
+ declare const ChangesetConfigLive: Layer.Layer<ChangesetConfig, never, ChangesetConfigReader>;
3586
+ //#endregion
3587
+ //#region src/changesets/utils/dep-diff.d.ts
3588
+ /**
3589
+ * A workspace package's worth of dependency-table rows.
3590
+ *
3591
+ * @public
3592
+ */
3593
+ interface WorkspaceDependencyDiff {
3594
+ /** The workspace package whose `package.json` changed. */
3595
+ readonly package: string;
3596
+ /** Repo-relative path of the package directory (taken from the `after` snapshot). */
3597
+ readonly relativePath: string;
3598
+ /** One row per dependency change, sorted by the existing `sortDependencyRows` convention. */
3599
+ readonly rows: ReadonlyArray<DependencyTableRow>;
3600
+ }
3601
+ /**
3602
+ * Diff two workspace snapshots and return per-package dependency-table rows,
3603
+ * comparing already-resolved specifier values per side.
3604
+ *
3605
+ * @param before - Snapshot at the older ref (typically the merge base). A
3606
+ * workspace package absent here reports every declared dep as `"added"`.
3607
+ * @param after - Snapshot at the newer ref (typically the working tree).
3608
+ * @returns One {@link WorkspaceDependencyDiff} entry per workspace package
3609
+ * that has at least one row. Packages with no resolved-value changes are
3610
+ * omitted.
3611
+ *
3612
+ * @public
3613
+ */
3614
+ declare function computeWorkspaceDependencyDiffs(before: WorkspaceStateSnapshot, after: WorkspaceStateSnapshot): ReadonlyArray<WorkspaceDependencyDiff>;
3615
+ //#endregion
3616
+ //#region src/changesets/services/deps-regen.d.ts
3617
+ /**
3618
+ * Strict detection of "pure dependency changesets" per the documented
3619
+ * rules: single-package frontmatter, single `## Dependencies` heading,
3620
+ * no other body content beyond that section.
3621
+ *
3622
+ * @param content - Raw `.changeset/*.md` file contents.
3623
+ * @returns `{ isPure, package }` — `isPure` is `true` only for a
3624
+ * single-package, Dependencies-only changeset; `package` is the sole
3625
+ * frontmatter package name (or `null` when not pure).
3626
+ *
3627
+ * @public
3628
+ */
3629
+ declare function isPureDependencyChangeset(content: string): {
3630
+ isPure: boolean;
3631
+ package: string | null;
3632
+ };
3633
+ /**
3634
+ * A complete, side-effect-free regen plan: which stale pure-dependency
3635
+ * changesets to delete, which fresh changesets to write (carrying the
3636
+ * already-resolved diff), and which mixed changesets were left untouched.
3637
+ *
3638
+ * @public
3639
+ */
3640
+ interface RegenPlan {
3641
+ readonly toDelete: ReadonlyArray<{
3642
+ readonly file: string;
3643
+ readonly package: string;
3644
+ }>;
3645
+ readonly toWrite: ReadonlyArray<{
3646
+ readonly file: string;
3647
+ readonly package: string;
3648
+ readonly diff: WorkspaceDependencyDiff;
3649
+ }>;
3650
+ readonly skippedMixed: ReadonlyArray<string>;
3651
+ }
3652
+ /**
3653
+ * The result of applying a {@link RegenPlan}: the files actually deleted
3654
+ * and written, plus the mixed changesets that were skipped.
3655
+ *
3656
+ * @public
3657
+ */
3658
+ interface RegenResult {
3659
+ readonly deleted: ReadonlyArray<string>;
3660
+ readonly written: ReadonlyArray<string>;
3661
+ readonly skippedMixed: ReadonlyArray<string>;
3662
+ }
3663
+ /**
3664
+ * Options for {@link DepsRegenShape.plan}.
3665
+ *
3666
+ * @public
3667
+ */
3668
+ interface DepsRegenOptions {
3669
+ /** Project root (containing `.changeset/`). */
3670
+ readonly cwd: string;
3671
+ /** Override the base branch used to compute the merge-base when `from` is omitted. */
3672
+ readonly base?: string;
3673
+ /** Restrict regeneration to a single workspace package. */
3674
+ readonly package?: string;
3675
+ /**
3676
+ * When `true`, retain `devDependency` rows (the `deps detect` path);
3677
+ * when falsy (the `deps regen` default), drop them unconditionally.
3678
+ * Protocol resolution runs regardless.
3679
+ */
3680
+ readonly includeDevDeps?: boolean;
3681
+ /**
3682
+ * Older ref to diff from. Defaults to `git merge-base <base branch> HEAD`.
3683
+ */
3684
+ readonly from?: string;
3685
+ /**
3686
+ * Newer ref to diff to. Defaults to the working tree (staged + unstaged
3687
+ * + untracked) via `PointInTimeWorkspace.worktree`.
3688
+ */
3689
+ readonly to?: string;
3690
+ }
3691
+ /**
3692
+ * Effect service interface for the deps regen/detect orchestration.
3693
+ *
3694
+ * @public
3695
+ */
3696
+ interface DepsRegenShape {
3697
+ /**
3698
+ * Compute a complete {@link RegenPlan}. Read-only against the filesystem:
3699
+ * only inspects the existing `.changeset/*.md` files to detect
3700
+ * stale/mixed changesets.
3701
+ *
3702
+ * @param options - See {@link DepsRegenOptions}.
3703
+ * @returns An Effect yielding the plan, or failing with {@link GitError},
3704
+ * `WorkspaceDiscoveryError`, {@link ChangesetIOError} (an unreadable
3705
+ * `.changeset` directory or a genuinely unreadable changeset file list),
3706
+ * or `PointInTimeReadError` (a snapshot read failed for either ref).
3707
+ */
3708
+ readonly plan: (options: DepsRegenOptions) => Effect.Effect<RegenPlan, GitError | WorkspaceDiscoveryError | ChangesetIOError | PointInTimeReadError, never>;
3709
+ /**
3710
+ * Apply a {@link RegenPlan}: write fresh changesets first, then delete
3711
+ * stale ones. Writes fail loudly with {@link ChangesetIOError}; deletion
3712
+ * failures are tolerated (skip-and-continue) so an interrupted run stays
3713
+ * safely re-runnable.
3714
+ *
3715
+ * @param plan - The plan produced by {@link DepsRegenShape.plan}.
3716
+ * @returns An Effect yielding a {@link RegenResult}.
3717
+ */
3718
+ readonly execute: (plan: RegenPlan) => Effect.Effect<RegenResult, ChangesetIOError, never>;
3719
+ }
3720
+ /**
3721
+ * @internal
3722
+ */
3723
+ declare const DepsRegenBase: Context.TagClass<DepsRegen, "Changesets/DepsRegen", DepsRegenShape>;
3724
+ /**
3725
+ * Effect service tag for {@link DepsRegenShape}.
3726
+ *
3727
+ * @example
3728
+ * ```typescript
3729
+ * import { Effect } from "effect";
3730
+ * import { Changesets } from "@savvy-web/silk-effects";
3731
+ *
3732
+ * const program = Effect.gen(function* () {
3733
+ * const svc = yield* Changesets.DepsRegen;
3734
+ * const plan = yield* svc.plan({ cwd: process.cwd() });
3735
+ * return yield* svc.execute(plan);
3736
+ * });
3737
+ * ```
3738
+ *
3739
+ * @public
3740
+ */
3741
+ declare class DepsRegen extends DepsRegenBase {}
3742
+ /**
3743
+ * Live layer for {@link DepsRegen}.
3744
+ *
3745
+ * Requires `PointInTimeWorkspace`, `WorkspaceDiscovery`,
3746
+ * `PublishabilityDetector` (all from `workspaces-effect`),
3747
+ * {@link ConfigInspector}, {@link ChangesetConfig}, and
3748
+ * `FileSystem.FileSystem` (resolved once at construction and closed over by
3749
+ * the shape, keeping `plan`/`execute` themselves requirement-free).
3750
+ *
3751
+ * @public
3752
+ */
3753
+ declare const DepsRegenLive: Layer.Layer<DepsRegen, never, PointInTimeWorkspace | ConfigInspector | WorkspaceDiscovery | PublishabilityDetector | ChangesetConfig | FileSystem.FileSystem>;
3754
+ /**
3755
+ * Batteries-included {@link DepsRegen} layer: silk's opinionated default
3756
+ * composition of the full dependency graph. Only the platform services
3757
+ * remain — note that {@link PointInTimeWorkspace} reads git history, so
3758
+ * this layer genuinely requires `CommandExecutor` in addition to
3759
+ * `FileSystem`/`Path`: provide a git-capable platform layer
3760
+ * (`NodeContext.layer`), not a bare filesystem-only layer.
3761
+ *
3762
+ * Gating uses silk's adaptive publishability detector
3763
+ * ({@link PublishabilityDetectorAdaptiveLive}), so the default semantics
3764
+ * are "versionable minus ignored" — identical to the savvy CLI and MCP
3765
+ * runtimes. Consumers who need to swap any dependency (test detectors,
3766
+ * alternate config sources) should keep composing {@link DepsRegenLive}
3767
+ * directly; this layer is purely additive.
3768
+ *
3769
+ * @example
3770
+ * ```typescript
3771
+ * import { NodeContext } from "@effect/platform-node";
3772
+ * import { Layer } from "effect";
3773
+ * import { Changesets } from "@savvy-web/silk-effects";
3774
+ *
3775
+ * const depsRegen = Changesets.DepsRegenDefault.pipe(Layer.provide(NodeContext.layer));
3776
+ * ```
3777
+ *
3778
+ * @public
3779
+ */
3780
+ declare const DepsRegenDefault: Layer.Layer<DepsRegen, never, FileSystem.FileSystem | Path.Path | CommandExecutor.CommandExecutor>;
3781
+ //#endregion
3483
3782
  //#region src/changesets/schemas/release-plan.d.ts
3484
3783
  /** A semantic-version bump level (the `"none"` plan type is filtered out upstream). @public */
3485
3784
  declare const BumpTypeSchema: Schema.Literal<["major", "minor", "patch"]>;
@@ -3580,8 +3879,8 @@ interface ReleasePlannerShape {
3580
3879
  declare const ReleasePlannerBase: Context.TagClass<ReleasePlanner, "ReleasePlanner", ReleasePlannerShape>;
3581
3880
  /** Effect service tag for the release planner. @public */
3582
3881
  declare class ReleasePlanner extends ReleasePlannerBase {}
3583
- /** Production layer. Requires {@link ConfigInspector} (used by `apply`). @public */
3584
- declare const ReleasePlannerLive: Layer.Layer<ReleasePlanner, never, ConfigInspector>;
3882
+ /** Production layer. Requires {@link ConfigInspector} (used by `apply`) and `FileSystem`. @public */
3883
+ declare const ReleasePlannerLive: Layer.Layer<ReleasePlanner, never, ConfigInspector | FileSystem.FileSystem>;
3585
3884
  /**
3586
3885
  * Test factory — supply fixed results for any subset of methods. Unsupplied
3587
3886
  * methods fail with a `ReleasePlanError`.
@@ -3594,61 +3893,6 @@ declare function makeReleasePlannerTest(fixed: {
3594
3893
  readonly apply?: AppliedRelease;
3595
3894
  }): Layer.Layer<ReleasePlanner>;
3596
3895
  //#endregion
3597
- //#region src/changesets/services/workspace-snapshot.d.ts
3598
- /**
3599
- * One workspace package as it existed at a specific git ref.
3600
- *
3601
- * @public
3602
- */
3603
- interface WorkspaceSnapshot {
3604
- /** Package name from `package.json#name`. */
3605
- readonly name: string;
3606
- /** Repo-relative path of the package directory at this ref. */
3607
- readonly relativePath: string;
3608
- /** Package version from `package.json#version`. */
3609
- readonly version: string;
3610
- /** Declared `dependencies` (raw strings, including `workspace:` / `catalog:` protocols). */
3611
- readonly dependencies: Readonly<Record<string, string>>;
3612
- /** Declared `devDependencies`. */
3613
- readonly devDependencies: Readonly<Record<string, string>>;
3614
- /** Declared `peerDependencies`. */
3615
- readonly peerDependencies: Readonly<Record<string, string>>;
3616
- /** Declared `optionalDependencies`. */
3617
- readonly optionalDependencies: Readonly<Record<string, string>>;
3618
- }
3619
- /**
3620
- * Effect service interface for reading workspace snapshots.
3621
- *
3622
- * @public
3623
- */
3624
- interface WorkspaceSnapshotReaderShape {
3625
- /**
3626
- * Read every workspace package's snapshot at the given git ref.
3627
- *
3628
- * @param cwd - Project root (must be inside a git repo)
3629
- * @param ref - Any valid git revision spec — branch, tag, SHA, `HEAD~1`, etc.
3630
- * @returns Effect resolving to one {@link WorkspaceSnapshot} per workspace
3631
- * package present at that ref, or failing with {@link GitError}
3632
- */
3633
- readonly snapshotAt: (cwd: string, ref: string) => Effect.Effect<ReadonlyArray<WorkspaceSnapshot>, GitError>;
3634
- }
3635
- /**
3636
- * @internal
3637
- */
3638
- declare const WorkspaceSnapshotReaderBase: Context.TagClass<WorkspaceSnapshotReader, "WorkspaceSnapshotReader", WorkspaceSnapshotReaderShape>;
3639
- /**
3640
- * Effect service tag for {@link WorkspaceSnapshotReaderShape}.
3641
- *
3642
- * @public
3643
- */
3644
- declare class WorkspaceSnapshotReader extends WorkspaceSnapshotReaderBase {}
3645
- /**
3646
- * Production layer for {@link WorkspaceSnapshotReader}.
3647
- *
3648
- * @public
3649
- */
3650
- declare const WorkspaceSnapshotReaderLive: Layer.Layer<WorkspaceSnapshotReader>;
3651
- //#endregion
3652
3896
  //#region src/changesets/schemas/changeset.d.ts
3653
3897
  /**
3654
3898
  * Schema for a changeset summary (1--1000 characters).
@@ -4290,34 +4534,6 @@ declare const LegacyVersionFilesSchema: Schema.Array$<Schema.Struct<{
4290
4534
  package: Schema.optional<Schema.filter<typeof Schema.String>>;
4291
4535
  }>>;
4292
4536
  //#endregion
4293
- //#region src/changesets/utils/dep-diff.d.ts
4294
- /**
4295
- * A workspace package's worth of dependency-table rows.
4296
- *
4297
- * @public
4298
- */
4299
- interface WorkspaceDependencyDiff {
4300
- /** The workspace package whose `package.json` changed. */
4301
- readonly package: string;
4302
- /** Repo-relative path of the package directory (taken from the `after` snapshot when available). */
4303
- readonly relativePath: string;
4304
- /** One row per dependency change, sorted by the existing `sortDependencyRows` convention. */
4305
- readonly rows: ReadonlyArray<DependencyTableRow>;
4306
- }
4307
- /**
4308
- * Diff two workspace snapshots and return per-package dependency-table rows.
4309
- *
4310
- * @param before - Snapshot at the older ref (typically the merge base). Pass
4311
- * `null` for workspace packages that did not exist at the older ref — every
4312
- * declared dep is then reported as `"added"`.
4313
- * @param after - Snapshot at the newer ref (typically the working tree).
4314
- * @returns One {@link WorkspaceDependencyDiff} entry per workspace package
4315
- * that has at least one row. Packages with no changes are omitted.
4316
- *
4317
- * @public
4318
- */
4319
- declare function computeWorkspaceDependencyDiffs(beforeSnapshots: ReadonlyArray<WorkspaceSnapshot>, afterSnapshots: ReadonlyArray<WorkspaceSnapshot>): ReadonlyArray<WorkspaceDependencyDiff>;
4320
- //#endregion
4321
4537
  //#region src/changesets/utils/dependency-table.d.ts
4322
4538
  /**
4323
4539
  * Serialize dependency table rows to a markdown table string.
@@ -4346,6 +4562,15 @@ declare function computeWorkspaceDependencyDiffs(beforeSnapshots: ReadonlyArray<
4346
4562
  */
4347
4563
  declare function serializeDependencyTableToMarkdown(rows: DependencyTableRow[]): string;
4348
4564
  //#endregion
4565
+ //#region src/changesets/utils/git.d.ts
4566
+ /**
4567
+ * Run `git merge-base <base> HEAD`, returning the SHA. Errors propagate
4568
+ * as {@link GitError}.
4569
+ *
4570
+ * @internal
4571
+ */
4572
+ declare function gitMergeBase(cwd: string, base: string): Effect.Effect<string, GitError>;
4573
+ //#endregion
4349
4574
  //#region src/changesets/utils/publishability.d.ts
4350
4575
  /**
4351
4576
  * Compute the set of currently-publishable workspace package names.
@@ -4354,12 +4579,24 @@ declare function serializeDependencyTableToMarkdown(rows: DependencyTableRow[]):
4354
4579
  * Uses the currently-active {@link SilkPublishability} — wire the
4355
4580
  * {@link SilkPublishabilityDetectorLive} layer to get silk semantics.
4356
4581
  *
4582
+ * `root` is passed through verbatim to `detector.detect(pkg, root)` for every
4583
+ * package — it must be the project root (the directory containing
4584
+ * `.changeset/`), NOT the individual package's directory. The vanilla
4585
+ * `PublishabilityDetectorLive` and plain `SilkPublishabilityDetectorLive`
4586
+ * both ignore this argument, but the ignore/mode-aware
4587
+ * `PublishabilityDetectorAdaptiveLive` reads `.changeset/config.json`
4588
+ * relative to it, so passing a package subdirectory silently makes every
4589
+ * package resolve to "not publishable". Mirrors
4590
+ * {@link SilkPublishability.listPublishable}, which takes the same
4591
+ * single-root parameter for the same reason.
4592
+ *
4357
4593
  * @param packages - The workspace packages to evaluate
4594
+ * @param root - Absolute path to the project root containing `.changeset/`
4358
4595
  * @returns An Effect yielding a `Set` of publishable package names
4359
4596
  *
4360
4597
  * @public
4361
4598
  */
4362
- declare function listPublishablePackageNames(packages: ReadonlyArray<WorkspacePackage>): Effect.Effect<ReadonlySet<string>, never, PublishabilityDetector>;
4599
+ declare function listPublishablePackageNames(packages: ReadonlyArray<WorkspacePackage>, root: string): Effect.Effect<ReadonlySet<string>, never, PublishabilityDetector>;
4363
4600
  //#endregion
4364
4601
  //#region src/changesets/utils/version-files.d.ts
4365
4602
  /**
@@ -4566,28 +4803,6 @@ declare class VersionFiles {
4566
4803
  static processResolvedVersionFiles(scopes: ReadonlyArray<ResolvedPackageScope>, dryRun?: boolean): VersionFileUpdate[];
4567
4804
  }
4568
4805
  //#endregion
4569
- //#region src/changesets/utils/worktree-snapshot.d.ts
4570
- /**
4571
- * Run `git merge-base <base> HEAD`, returning the SHA. Errors propagate
4572
- * as {@link GitError}.
4573
- *
4574
- * @internal
4575
- */
4576
- declare function gitMergeBase(cwd: string, base: string): Effect.Effect<string, GitError>;
4577
- /**
4578
- * Read every workspace package's `package.json` from the live working
4579
- * tree, returning {@link WorkspaceSnapshot} entries matching the shape
4580
- * `WorkspaceSnapshotReader.snapshotAt` produces for git refs.
4581
- *
4582
- * @remarks
4583
- * Falls back to root-only when `pnpm-workspace.yaml` is missing or
4584
- * unparseable. Uses `node:fs.readdirSync` for directory expansion
4585
- * (portable across platforms — `execFileSync("ls")` is not).
4586
- *
4587
- * @internal
4588
- */
4589
- declare function snapshotFromWorktree(cwd: string): ReadonlyArray<WorkspaceSnapshot>;
4590
- //#endregion
4591
4806
  //#region ../../node_modules/.pnpm/micromark-util-types@2.0.2/node_modules/micromark-util-types/index.d.ts
4592
4807
  /**
4593
4808
  * Enum of allowed token types.
@@ -5262,7 +5477,7 @@ declare const RequiredSectionsRule: import("unified-lint-rule").Plugin<Root, unk
5262
5477
  //#region src/changesets/remark/rules/uncategorized-content.d.ts
5263
5478
  declare const UncategorizedContentRule: import("unified-lint-rule").Plugin<Root, unknown>;
5264
5479
  declare namespace index_d_exports {
5265
- export { AggregateDependencyTablesPlugin, AppliedRelease, AppliedReleaseEntrySchema, AppliedReleaseSchema, BranchAnalysis, BranchAnalysisSchema, BranchAnalyzer, BranchAnalyzerBase, BranchAnalyzerLive, BranchAnalyzerShape, BranchFileEntry, BranchFileEntrySchema, BumpType, BumpTypeSchema, Categories, Changelog, ChangelogService, ChangelogServiceBase, ChangelogServiceShape, ChangelogTransformer, Changeset, ChangesetLinter, ChangesetOptions, ChangesetOptionsSchema, ChangesetPreview, ChangesetPreviewSchema, ChangesetSchema, ChangesetSummarySchema, ChangesetValidationError, ChangesetValidationErrorBase, Classification, ClassificationReason, ClassificationReasonSchema, ClassificationSchema, CommitHashSchema, ConfigInspector, ConfigInspectorBase, ConfigInspectorLive, ConfigInspectorShape, ConfigurationError, ConfigurationErrorBase, ContentStructureRule, ContributorFootnotesPlugin, DeduplicateItemsPlugin, DependencyAction, DependencyActionSchema, DependencyTable, DependencyTableFormatRule, DependencyTableRow, DependencyTableRowSchema, DependencyTableSchema, DependencyTableType, DependencyTableTypeSchema, DependencyType, DependencyTypeSchema, DependencyUpdate, DependencyUpdateSchema, FileStatus, FileStatusSchema, GitError, GitErrorBase, GitHubApiError, GitHubApiErrorBase, GitHubCommitInfo, GitHubInfo, GitHubInfoSchema, GitHubLive, GitHubService, GitHubServiceBase, GitHubServiceShape, GlobSchema, HeadingHierarchyRule, InspectedConfig, InspectedConfigSchema, IssueLinkRefsPlugin, IssueNumberSchema, JsonPathSchema, LegacyVersionFileConfig, LegacyVersionFileConfigSchema, LegacyVersionFilesSchema, LintMessage, MarkdownLive, MarkdownParseError, MarkdownParseErrorBase, MarkdownService, MarkdownServiceBase, MarkdownServiceShape, ContentStructureRule$1 as MarkdownlintContentStructureRule, DependencyTableFormatRule$1 as MarkdownlintDependencyTableFormatRule, HeadingHierarchyRule$1 as MarkdownlintHeadingHierarchyRule, RequiredSectionsRule$1 as MarkdownlintRequiredSectionsRule, UncategorizedContentRule$1 as MarkdownlintUncategorizedContentRule, MergeSectionsPlugin, NonEmptyString, NormalizeFormatPlugin, PackageScope, PackageScopeSchema, PackagesRecordSchema, PendingChangeset, PendingChangesetSchema, PositiveInteger, PreviewRelease, PreviewReleaseSchema, ReleasePlanError, ReleasePlanErrorBase, ReleasePlanner, ReleasePlannerBase, ReleasePlannerLive, ReleasePlannerShape, ReorderSectionsPlugin, RepoSchema, RequiredSectionsRule, ResolvedPackageScope, ResolvedPackageScopeSchema, ResolvedVersionFile, ResolvedVersionFileSchema, SectionCategory, SectionCategorySchema, SilkChangesetPreset, SilkChangesetTransformPreset, SilkChangesetsRules, UncategorizedContentRule, UrlOrMarkdownLinkSchema, UsernameSchema, VersionFileConfig, VersionFileConfigSchema, VersionFileError, VersionFileErrorBase, VersionFileUpdate, VersionFileUpdateRecordSchema, VersionFiles, VersionFilesSchema, VersionOrEmptySchema, VersionType, VersionTypeSchema, WorkspaceDependencyDiff, WorkspaceSnapshot, WorkspaceSnapshotReader, WorkspaceSnapshotReaderBase, WorkspaceSnapshotReaderLive, WorkspaceSnapshotReaderShape, WorkspaceVersion, changelogFunctions, computeWorkspaceDependencyDiffs, gitMergeBase, listPublishablePackageNames, makeBranchAnalyzerTest, makeConfigInspectorTest, makeGitHubTest, makeReleasePlannerTest, serializeDependencyTableToMarkdown, snapshotFromWorktree };
5480
+ export { AggregateDependencyTablesPlugin, AppliedRelease, AppliedReleaseEntrySchema, AppliedReleaseSchema, BranchAnalysis, BranchAnalysisSchema, BranchAnalyzer, BranchAnalyzerBase, BranchAnalyzerLive, BranchAnalyzerShape, BranchFileEntry, BranchFileEntrySchema, BumpType, BumpTypeSchema, Categories, Changelog, ChangelogService, ChangelogServiceBase, ChangelogServiceShape, ChangelogTransformer, Changeset, ChangesetIOError, ChangesetIOErrorBase, ChangesetLinter, ChangesetOptions, ChangesetOptionsSchema, ChangesetPreview, ChangesetPreviewSchema, ChangesetSchema, ChangesetSummarySchema, ChangesetValidationError, ChangesetValidationErrorBase, Classification, ClassificationReason, ClassificationReasonSchema, ClassificationSchema, CommitHashSchema, ConfigInspector, ConfigInspectorBase, ConfigInspectorLive, ConfigInspectorShape, ConfigurationError, ConfigurationErrorBase, ContentStructureRule, ContributorFootnotesPlugin, DeduplicateItemsPlugin, DependencyAction, DependencyActionSchema, DependencyTable, DependencyTableFormatRule, DependencyTableRow, DependencyTableRowSchema, DependencyTableSchema, DependencyTableType, DependencyTableTypeSchema, DependencyType, DependencyTypeSchema, DependencyUpdate, DependencyUpdateSchema, DepsRegen, DepsRegenBase, DepsRegenDefault, DepsRegenLive, DepsRegenOptions, DepsRegenShape, FileStatus, FileStatusSchema, GitError, GitErrorBase, GitHubApiError, GitHubApiErrorBase, GitHubCommitInfo, GitHubInfo, GitHubInfoSchema, GitHubLive, GitHubService, GitHubServiceBase, GitHubServiceShape, GlobSchema, HeadingHierarchyRule, InspectedConfig, InspectedConfigSchema, IssueLinkRefsPlugin, IssueNumberSchema, JsonPathSchema, LegacyVersionFileConfig, LegacyVersionFileConfigSchema, LegacyVersionFilesSchema, LintMessage, MarkdownLive, MarkdownParseError, MarkdownParseErrorBase, MarkdownService, MarkdownServiceBase, MarkdownServiceShape, ContentStructureRule$1 as MarkdownlintContentStructureRule, DependencyTableFormatRule$1 as MarkdownlintDependencyTableFormatRule, HeadingHierarchyRule$1 as MarkdownlintHeadingHierarchyRule, RequiredSectionsRule$1 as MarkdownlintRequiredSectionsRule, UncategorizedContentRule$1 as MarkdownlintUncategorizedContentRule, MergeSectionsPlugin, NonEmptyString, NormalizeFormatPlugin, PackageScope, PackageScopeSchema, PackagesRecordSchema, PendingChangeset, PendingChangesetSchema, PositiveInteger, PreviewRelease, PreviewReleaseSchema, RegenPlan, RegenResult, ReleasePlanError, ReleasePlanErrorBase, ReleasePlanner, ReleasePlannerBase, ReleasePlannerLive, ReleasePlannerShape, ReorderSectionsPlugin, RepoSchema, RequiredSectionsRule, ResolvedPackageScope, ResolvedPackageScopeSchema, ResolvedVersionFile, ResolvedVersionFileSchema, SectionCategory, SectionCategorySchema, SilkChangesetPreset, SilkChangesetTransformPreset, SilkChangesetsRules, UncategorizedContentRule, UrlOrMarkdownLinkSchema, UsernameSchema, VERSION_RE, VersionFileConfig, VersionFileConfigSchema, VersionFileError, VersionFileErrorBase, VersionFileUpdate, VersionFileUpdateRecordSchema, VersionFiles, VersionFilesSchema, VersionOrEmptySchema, VersionType, VersionTypeSchema, WorkspaceDependencyDiff, WorkspaceVersion, changelogFunctions, computeWorkspaceDependencyDiffs, gitMergeBase, isPureDependencyChangeset, listPublishablePackageNames, makeBranchAnalyzerTest, makeConfigInspectorTest, makeGitHubTest, makeReleasePlannerTest, serializeDependencyTableToMarkdown };
5266
5481
  }
5267
5482
  //#endregion
5268
5483
  //#region src/commitlint/config/schema.d.ts
@@ -9157,51 +9372,6 @@ declare class BiomeSchemaSync extends BiomeSchemaSync_base {}
9157
9372
  */
9158
9373
  declare const BiomeSchemaSyncLive: Layer.Layer<BiomeSchemaSync, never, FileSystem.FileSystem>;
9159
9374
  //#endregion
9160
- //#region src/services/ChangesetConfig.d.ts
9161
- /**
9162
- * Changeset operating mode for a workspace root.
9163
- * @public
9164
- */
9165
- type ChangesetMode = "silk" | "vanilla" | "none";
9166
- declare const ChangesetConfig_base: Context.TagClass<ChangesetConfig, "@savvy-web/silk-effects/ChangesetConfig", {
9167
- readonly mode: (root: string) => Effect.Effect<ChangesetMode>;
9168
- readonly versionPrivate: (root: string) => Effect.Effect<boolean>;
9169
- readonly ignorePatterns: (root: string) => Effect.Effect<ReadonlyArray<string>>;
9170
- readonly isIgnored: (name: string, root: string) => Effect.Effect<boolean>;
9171
- readonly fixed: (root: string) => Effect.Effect<ReadonlyArray<ReadonlyArray<string>>>;
9172
- }>;
9173
- /**
9174
- * Accessor service over a workspace root's `.changeset/config.json`.
9175
- *
9176
- * @remarks
9177
- * Reads through {@link ChangesetConfigReader} (FileSystem-based) with a per-root cache.
9178
- * Every accessor is total (error channel `never`): a missing or unreadable config collapses
9179
- * to `mode: "none"` and empty/false defaults.
9180
- *
9181
- * @since 0.4.0
9182
- * @public
9183
- */
9184
- declare class ChangesetConfig extends ChangesetConfig_base {
9185
- /**
9186
- * The one ignore matcher: exact name match, or `@scope/*` wildcard.
9187
- *
9188
- * `"@scope/*"` matches `"@scope/anything"` (prefix kept includes the trailing slash),
9189
- * but not the bare scope `"@scope"`.
9190
- */
9191
- static matches(name: string, pattern: string): boolean;
9192
- }
9193
- /**
9194
- * Live {@link ChangesetConfig} reading via {@link ChangesetConfigReader}, cached per root.
9195
- *
9196
- * @remarks
9197
- * Requires `ChangesetConfigReader` (which requires `FileSystem`). Provide
9198
- * `ChangesetConfigReaderLive` + a platform layer (`NodeContext.layer`).
9199
- *
9200
- * @since 0.4.0
9201
- * @public
9202
- */
9203
- declare const ChangesetConfigLive: Layer.Layer<ChangesetConfig, never, ChangesetConfigReader>;
9204
- //#endregion
9205
9375
  //#region src/services/ConfigDiscovery.d.ts
9206
9376
  declare const ConfigDiscovery_base: Context.TagClass<ConfigDiscovery, "@savvy-web/silk-effects/ConfigDiscovery", {
9207
9377
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@savvy-web/silk-effects",
3
- "version": "1.5.2",
3
+ "version": "2.0.0",
4
4
  "private": false,
5
5
  "description": "Shared Effect library for Silk Suite conventions",
6
6
  "homepage": "https://github.com/savvy-web/systems/tree/main/packages/silk-effects",
@@ -33,23 +33,23 @@
33
33
  "@changesets/get-github-info": "^0.8.0",
34
34
  "@changesets/get-release-plan": "^4.0.16",
35
35
  "@manypkg/get-packages": "^1.1.3",
36
- "jsonc-effect": "^0.2.1",
36
+ "jsonc-effect": "^0.3.0",
37
37
  "mdast-util-heading-range": "^4.0.0",
38
38
  "mdast-util-to-string": "^4.0.0",
39
39
  "prettier": "^3.8.4",
40
40
  "remark-gfm": "^4.0.1",
41
41
  "remark-parse": "^11.0.0",
42
42
  "remark-stringify": "^11.0.0",
43
- "semver-effect": "^0.2.1",
43
+ "semver-effect": "^0.3.0",
44
44
  "shell-quote": "^1.9.0",
45
45
  "sort-package-json": "^4.0.0",
46
46
  "tinyglobby": "^0.2.17",
47
47
  "unified": "^11.0.5",
48
48
  "unified-lint-rule": "^3.0.1",
49
49
  "unist-util-visit": "^5.1.0",
50
- "workspaces-effect": "^1.2.0",
50
+ "workspaces-effect": "^2.0.0",
51
51
  "yaml": "^2.9.0",
52
- "yaml-effect": "^0.6.0",
52
+ "yaml-effect": "^0.7.0",
53
53
  "yaml-lint": "^1.7.0"
54
54
  },
55
55
  "peerDependencies": {