@savvy-web/silk 2.1.2 → 2.1.3

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.
@@ -38738,15 +38738,16 @@ function makeShape$2(inspector) {
38738
38738
  path,
38739
38739
  status: "added"
38740
38740
  }));
38741
+ const isOwnChangeset = (path) => path.startsWith(".changeset/") && path.endsWith(".md");
38741
38742
  const seen = /* @__PURE__ */ new Set();
38742
38743
  const rawEntries = [];
38743
38744
  for (const e of diffEntries) {
38744
- if (seen.has(e.path)) continue;
38745
+ if (seen.has(e.path) || isOwnChangeset(e.path)) continue;
38745
38746
  seen.add(e.path);
38746
38747
  rawEntries.push(e);
38747
38748
  }
38748
38749
  for (const e of untrackedEntries) {
38749
- if (seen.has(e.path)) continue;
38750
+ if (seen.has(e.path) || isOwnChangeset(e.path)) continue;
38750
38751
  seen.add(e.path);
38751
38752
  rawEntries.push(e);
38752
38753
  }
@@ -38879,6 +38880,32 @@ const DEP_TYPE_MAP = [
38879
38880
  */
38880
38881
  const resolveOrRaw = (snapshot, dep, spec) => effect.Option.getOrElse(snapshot.resolve(dep, spec), () => spec);
38881
38882
  /**
38883
+ * Drop no-net-change field moves: the same dependency removed from one field
38884
+ * and added to another with an equal resolved version (e.g. a dep promoted
38885
+ * from `devDependencies` to `dependencies`). A field reclassification is a
38886
+ * contract change worth release-note prose, not a version movement, so it
38887
+ * must not surface as an unrelated removed row plus an added row. Moves that
38888
+ * also change the resolved version keep both rows (the movement is real).
38889
+ */
38890
+ const collapseFieldMoves = (rows) => {
38891
+ const dropped = /* @__PURE__ */ new Set();
38892
+ const byName = /* @__PURE__ */ new Map();
38893
+ for (const row of rows) {
38894
+ const group = byName.get(row.dependency);
38895
+ if (group) group.push(row);
38896
+ else byName.set(row.dependency, [row]);
38897
+ }
38898
+ for (const group of byName.values()) for (const removed of group) {
38899
+ if (removed.action !== "removed" || dropped.has(removed)) continue;
38900
+ const added = group.find((r) => r.action === "added" && !dropped.has(r) && r.type !== removed.type && r.to === removed.from);
38901
+ if (added) {
38902
+ dropped.add(removed);
38903
+ dropped.add(added);
38904
+ }
38905
+ }
38906
+ return rows.filter((r) => !dropped.has(r));
38907
+ };
38908
+ /**
38882
38909
  * Diff two workspace snapshots and return per-package dependency-table rows,
38883
38910
  * comparing already-resolved specifier values per side.
38884
38911
  *
@@ -38934,10 +38961,11 @@ function computeWorkspaceDependencyDiffs(before, after) {
38934
38961
  });
38935
38962
  }
38936
38963
  }
38937
- if (rows.length > 0) result.push({
38964
+ const collapsed = collapseFieldMoves(rows);
38965
+ if (collapsed.length > 0) result.push({
38938
38966
  package: afterPkg.name,
38939
38967
  relativePath: afterPkg.relativePath,
38940
- rows: sortDependencyRows(rows)
38968
+ rows: sortDependencyRows(collapsed)
38941
38969
  });
38942
38970
  }
38943
38971
  return result;
@@ -39277,7 +39305,8 @@ function makeShape$1(pit, inspector, discovery, detector, config, fs) {
39277
39305
  fromRef = yield* gitMergeBase(resolvedCwd, baseBranch);
39278
39306
  }
39279
39307
  const rawDiffs = computeWorkspaceDependencyDiffs(yield* pit.at(fromRef, { cwd: resolvedCwd }), options.to ? yield* pit.at(options.to, { cwd: resolvedCwd }) : yield* pit.worktree({ cwd: resolvedCwd }));
39280
- const targetPkg = options.package;
39308
+ const explicitTargets = /* @__PURE__ */ new Set([...options.packages ?? [], ...options.package ? [options.package] : []]);
39309
+ const excluded = new Set(options.exclude ?? []);
39281
39310
  const livePackages = yield* discovery.listPackages(resolvedCwd);
39282
39311
  const publishable = yield* listPublishablePackageNames(livePackages, resolvedCwd).pipe(effect.Effect.provide(provideDetector));
39283
39312
  const versionPrivate = yield* config.versionPrivate(resolvedCwd);
@@ -39286,9 +39315,15 @@ function makeShape$1(pit, inspector, discovery, detector, config, fs) {
39286
39315
  if (yield* config.isIgnored(pkg.name, resolvedCwd)) continue;
39287
39316
  if (publishable.has(pkg.name) || versionPrivate) inScope.add(pkg.name);
39288
39317
  }
39289
- const targetIgnored = targetPkg ? yield* config.isIgnored(targetPkg, resolvedCwd) : false;
39318
+ const activeTargets = /* @__PURE__ */ new Set();
39319
+ for (const name of explicitTargets) {
39320
+ if (excluded.has(name)) continue;
39321
+ if (yield* config.isIgnored(name, resolvedCwd)) continue;
39322
+ activeTargets.add(name);
39323
+ }
39324
+ const inScopeFor = (name) => explicitTargets.size > 0 ? activeTargets.has(name) : inScope.has(name) && !excluded.has(name);
39290
39325
  const keepDevDeps = options.includeDevDeps === true;
39291
- const scoped = targetPkg ? targetIgnored ? [] : rawDiffs.filter((d) => d.package === targetPkg) : rawDiffs.filter((d) => inScope.has(d.package));
39326
+ const scoped = rawDiffs.filter((d) => inScopeFor(d.package));
39292
39327
  const resolved = [];
39293
39328
  for (const diff of scoped) {
39294
39329
  const rows = keepDevDeps ? [...diff.rows] : diff.rows.filter((r) => r.type !== "devDependency");
@@ -39299,7 +39334,7 @@ function makeShape$1(pit, inspector, discovery, detector, config, fs) {
39299
39334
  }
39300
39335
  const existingPure = yield* findPureDependencyChangesets(fs, changesetDir);
39301
39336
  const skippedMixed = yield* findMixedDependencyChangesets(fs, changesetDir);
39302
- const toDelete = targetPkg ? targetIgnored ? [] : existingPure.filter((p) => p.package === targetPkg) : existingPure.filter((p) => inScope.has(p.package));
39337
+ const toDelete = existingPure.filter((p) => inScopeFor(p.package));
39303
39338
  const chosenFilenames = /* @__PURE__ */ new Set();
39304
39339
  const toWrite = [];
39305
39340
  for (const diff of resolved) {
@@ -8176,8 +8176,20 @@ interface DepsRegenOptions {
8176
8176
  readonly cwd: string;
8177
8177
  /** Override the base branch used to compute the merge-base when `from` is omitted. */
8178
8178
  readonly base?: string;
8179
- /** Restrict regeneration to a single workspace package. */
8179
+ /** Restrict regeneration to a single workspace package. Unioned with {@link DepsRegenOptions.packages}. */
8180
8180
  readonly package?: string;
8181
+ /**
8182
+ * Restrict regeneration to these workspace packages. Like `package`, an
8183
+ * explicit target bypasses the versionable gate but NOT the changeset
8184
+ * ignore list. Unioned with `package` when both are set.
8185
+ */
8186
+ readonly packages?: ReadonlyArray<string>;
8187
+ /**
8188
+ * Drop these packages from scope entirely — no changesets are written for
8189
+ * them and none of their stale pure-dependency changesets are deleted.
8190
+ * Applies to both repo-wide and explicitly-targeted runs (exclude wins).
8191
+ */
8192
+ readonly exclude?: ReadonlyArray<string>;
8181
8193
  /**
8182
8194
  * When `true`, retain `devDependency` rows (the `deps detect` path);
8183
8195
  * when falsy (the `deps regen` default), drop them unconditionally.
@@ -8176,8 +8176,20 @@ interface DepsRegenOptions {
8176
8176
  readonly cwd: string;
8177
8177
  /** Override the base branch used to compute the merge-base when `from` is omitted. */
8178
8178
  readonly base?: string;
8179
- /** Restrict regeneration to a single workspace package. */
8179
+ /** Restrict regeneration to a single workspace package. Unioned with {@link DepsRegenOptions.packages}. */
8180
8180
  readonly package?: string;
8181
+ /**
8182
+ * Restrict regeneration to these workspace packages. Like `package`, an
8183
+ * explicit target bypasses the versionable gate but NOT the changeset
8184
+ * ignore list. Unioned with `package` when both are set.
8185
+ */
8186
+ readonly packages?: ReadonlyArray<string>;
8187
+ /**
8188
+ * Drop these packages from scope entirely — no changesets are written for
8189
+ * them and none of their stale pure-dependency changesets are deleted.
8190
+ * Applies to both repo-wide and explicitly-targeted runs (exclude wins).
8191
+ */
8192
+ readonly exclude?: ReadonlyArray<string>;
8181
8193
  /**
8182
8194
  * When `true`, retain `devDependency` rows (the `deps detect` path);
8183
8195
  * when falsy (the `deps regen` default), drop them unconditionally.
@@ -39182,15 +39182,16 @@ function makeShape$2(inspector) {
39182
39182
  path,
39183
39183
  status: "added"
39184
39184
  }));
39185
+ const isOwnChangeset = (path) => path.startsWith(".changeset/") && path.endsWith(".md");
39185
39186
  const seen = /* @__PURE__ */ new Set();
39186
39187
  const rawEntries = [];
39187
39188
  for (const e of diffEntries) {
39188
- if (seen.has(e.path)) continue;
39189
+ if (seen.has(e.path) || isOwnChangeset(e.path)) continue;
39189
39190
  seen.add(e.path);
39190
39191
  rawEntries.push(e);
39191
39192
  }
39192
39193
  for (const e of untrackedEntries) {
39193
- if (seen.has(e.path)) continue;
39194
+ if (seen.has(e.path) || isOwnChangeset(e.path)) continue;
39194
39195
  seen.add(e.path);
39195
39196
  rawEntries.push(e);
39196
39197
  }
@@ -39325,6 +39326,32 @@ const DEP_TYPE_MAP = [
39325
39326
  */
39326
39327
  const resolveOrRaw = (snapshot, dep, spec) => Option.getOrElse(snapshot.resolve(dep, spec), () => spec);
39327
39328
  /**
39329
+ * Drop no-net-change field moves: the same dependency removed from one field
39330
+ * and added to another with an equal resolved version (e.g. a dep promoted
39331
+ * from `devDependencies` to `dependencies`). A field reclassification is a
39332
+ * contract change worth release-note prose, not a version movement, so it
39333
+ * must not surface as an unrelated removed row plus an added row. Moves that
39334
+ * also change the resolved version keep both rows (the movement is real).
39335
+ */
39336
+ const collapseFieldMoves = (rows) => {
39337
+ const dropped = /* @__PURE__ */ new Set();
39338
+ const byName = /* @__PURE__ */ new Map();
39339
+ for (const row of rows) {
39340
+ const group = byName.get(row.dependency);
39341
+ if (group) group.push(row);
39342
+ else byName.set(row.dependency, [row]);
39343
+ }
39344
+ for (const group of byName.values()) for (const removed of group) {
39345
+ if (removed.action !== "removed" || dropped.has(removed)) continue;
39346
+ const added = group.find((r) => r.action === "added" && !dropped.has(r) && r.type !== removed.type && r.to === removed.from);
39347
+ if (added) {
39348
+ dropped.add(removed);
39349
+ dropped.add(added);
39350
+ }
39351
+ }
39352
+ return rows.filter((r) => !dropped.has(r));
39353
+ };
39354
+ /**
39328
39355
  * Diff two workspace snapshots and return per-package dependency-table rows,
39329
39356
  * comparing already-resolved specifier values per side.
39330
39357
  *
@@ -39380,10 +39407,11 @@ function computeWorkspaceDependencyDiffs(before, after) {
39380
39407
  });
39381
39408
  }
39382
39409
  }
39383
- if (rows.length > 0) result.push({
39410
+ const collapsed = collapseFieldMoves(rows);
39411
+ if (collapsed.length > 0) result.push({
39384
39412
  package: afterPkg.name,
39385
39413
  relativePath: afterPkg.relativePath,
39386
- rows: sortDependencyRows(rows)
39414
+ rows: sortDependencyRows(collapsed)
39387
39415
  });
39388
39416
  }
39389
39417
  return result;
@@ -39726,7 +39754,8 @@ function makeShape$1(pit, inspector, discovery, detector, config, fs) {
39726
39754
  fromRef = yield* gitMergeBase(resolvedCwd, baseBranch);
39727
39755
  }
39728
39756
  const rawDiffs = computeWorkspaceDependencyDiffs(yield* pit.at(fromRef, { cwd: resolvedCwd }), options.to ? yield* pit.at(options.to, { cwd: resolvedCwd }) : yield* pit.worktree({ cwd: resolvedCwd }));
39729
- const targetPkg = options.package;
39757
+ const explicitTargets = /* @__PURE__ */ new Set([...options.packages ?? [], ...options.package ? [options.package] : []]);
39758
+ const excluded = new Set(options.exclude ?? []);
39730
39759
  const livePackages = yield* discovery.listPackages(resolvedCwd);
39731
39760
  const publishable = yield* listPublishablePackageNames(livePackages, resolvedCwd).pipe(Effect.provide(provideDetector));
39732
39761
  const versionPrivate = yield* config.versionPrivate(resolvedCwd);
@@ -39735,9 +39764,15 @@ function makeShape$1(pit, inspector, discovery, detector, config, fs) {
39735
39764
  if (yield* config.isIgnored(pkg.name, resolvedCwd)) continue;
39736
39765
  if (publishable.has(pkg.name) || versionPrivate) inScope.add(pkg.name);
39737
39766
  }
39738
- const targetIgnored = targetPkg ? yield* config.isIgnored(targetPkg, resolvedCwd) : false;
39767
+ const activeTargets = /* @__PURE__ */ new Set();
39768
+ for (const name of explicitTargets) {
39769
+ if (excluded.has(name)) continue;
39770
+ if (yield* config.isIgnored(name, resolvedCwd)) continue;
39771
+ activeTargets.add(name);
39772
+ }
39773
+ const inScopeFor = (name) => explicitTargets.size > 0 ? activeTargets.has(name) : inScope.has(name) && !excluded.has(name);
39739
39774
  const keepDevDeps = options.includeDevDeps === true;
39740
- const scoped = targetPkg ? targetIgnored ? [] : rawDiffs.filter((d) => d.package === targetPkg) : rawDiffs.filter((d) => inScope.has(d.package));
39775
+ const scoped = rawDiffs.filter((d) => inScopeFor(d.package));
39741
39776
  const resolved = [];
39742
39777
  for (const diff of scoped) {
39743
39778
  const rows = keepDevDeps ? [...diff.rows] : diff.rows.filter((r) => r.type !== "devDependency");
@@ -39748,7 +39783,7 @@ function makeShape$1(pit, inspector, discovery, detector, config, fs) {
39748
39783
  }
39749
39784
  const existingPure = yield* findPureDependencyChangesets(fs, changesetDir);
39750
39785
  const skippedMixed = yield* findMixedDependencyChangesets(fs, changesetDir);
39751
- const toDelete = targetPkg ? targetIgnored ? [] : existingPure.filter((p) => p.package === targetPkg) : existingPure.filter((p) => inScope.has(p.package));
39786
+ const toDelete = existingPure.filter((p) => inScopeFor(p.package));
39752
39787
  const chosenFilenames = /* @__PURE__ */ new Set();
39753
39788
  const toWrite = [];
39754
39789
  for (const diff of resolved) {
@@ -38742,15 +38742,16 @@ function makeShape$2(inspector) {
38742
38742
  path,
38743
38743
  status: "added"
38744
38744
  }));
38745
+ const isOwnChangeset = (path) => path.startsWith(".changeset/") && path.endsWith(".md");
38745
38746
  const seen = /* @__PURE__ */ new Set();
38746
38747
  const rawEntries = [];
38747
38748
  for (const e of diffEntries) {
38748
- if (seen.has(e.path)) continue;
38749
+ if (seen.has(e.path) || isOwnChangeset(e.path)) continue;
38749
38750
  seen.add(e.path);
38750
38751
  rawEntries.push(e);
38751
38752
  }
38752
38753
  for (const e of untrackedEntries) {
38753
- if (seen.has(e.path)) continue;
38754
+ if (seen.has(e.path) || isOwnChangeset(e.path)) continue;
38754
38755
  seen.add(e.path);
38755
38756
  rawEntries.push(e);
38756
38757
  }
@@ -38883,6 +38884,32 @@ const DEP_TYPE_MAP = [
38883
38884
  */
38884
38885
  const resolveOrRaw = (snapshot, dep, spec) => effect.Option.getOrElse(snapshot.resolve(dep, spec), () => spec);
38885
38886
  /**
38887
+ * Drop no-net-change field moves: the same dependency removed from one field
38888
+ * and added to another with an equal resolved version (e.g. a dep promoted
38889
+ * from `devDependencies` to `dependencies`). A field reclassification is a
38890
+ * contract change worth release-note prose, not a version movement, so it
38891
+ * must not surface as an unrelated removed row plus an added row. Moves that
38892
+ * also change the resolved version keep both rows (the movement is real).
38893
+ */
38894
+ const collapseFieldMoves = (rows) => {
38895
+ const dropped = /* @__PURE__ */ new Set();
38896
+ const byName = /* @__PURE__ */ new Map();
38897
+ for (const row of rows) {
38898
+ const group = byName.get(row.dependency);
38899
+ if (group) group.push(row);
38900
+ else byName.set(row.dependency, [row]);
38901
+ }
38902
+ for (const group of byName.values()) for (const removed of group) {
38903
+ if (removed.action !== "removed" || dropped.has(removed)) continue;
38904
+ const added = group.find((r) => r.action === "added" && !dropped.has(r) && r.type !== removed.type && r.to === removed.from);
38905
+ if (added) {
38906
+ dropped.add(removed);
38907
+ dropped.add(added);
38908
+ }
38909
+ }
38910
+ return rows.filter((r) => !dropped.has(r));
38911
+ };
38912
+ /**
38886
38913
  * Diff two workspace snapshots and return per-package dependency-table rows,
38887
38914
  * comparing already-resolved specifier values per side.
38888
38915
  *
@@ -38938,10 +38965,11 @@ function computeWorkspaceDependencyDiffs(before, after) {
38938
38965
  });
38939
38966
  }
38940
38967
  }
38941
- if (rows.length > 0) result.push({
38968
+ const collapsed = collapseFieldMoves(rows);
38969
+ if (collapsed.length > 0) result.push({
38942
38970
  package: afterPkg.name,
38943
38971
  relativePath: afterPkg.relativePath,
38944
- rows: sortDependencyRows(rows)
38972
+ rows: sortDependencyRows(collapsed)
38945
38973
  });
38946
38974
  }
38947
38975
  return result;
@@ -39281,7 +39309,8 @@ function makeShape$1(pit, inspector, discovery, detector, config, fs) {
39281
39309
  fromRef = yield* gitMergeBase(resolvedCwd, baseBranch);
39282
39310
  }
39283
39311
  const rawDiffs = computeWorkspaceDependencyDiffs(yield* pit.at(fromRef, { cwd: resolvedCwd }), options.to ? yield* pit.at(options.to, { cwd: resolvedCwd }) : yield* pit.worktree({ cwd: resolvedCwd }));
39284
- const targetPkg = options.package;
39312
+ const explicitTargets = /* @__PURE__ */ new Set([...options.packages ?? [], ...options.package ? [options.package] : []]);
39313
+ const excluded = new Set(options.exclude ?? []);
39285
39314
  const livePackages = yield* discovery.listPackages(resolvedCwd);
39286
39315
  const publishable = yield* listPublishablePackageNames(livePackages, resolvedCwd).pipe(effect.Effect.provide(provideDetector));
39287
39316
  const versionPrivate = yield* config.versionPrivate(resolvedCwd);
@@ -39290,9 +39319,15 @@ function makeShape$1(pit, inspector, discovery, detector, config, fs) {
39290
39319
  if (yield* config.isIgnored(pkg.name, resolvedCwd)) continue;
39291
39320
  if (publishable.has(pkg.name) || versionPrivate) inScope.add(pkg.name);
39292
39321
  }
39293
- const targetIgnored = targetPkg ? yield* config.isIgnored(targetPkg, resolvedCwd) : false;
39322
+ const activeTargets = /* @__PURE__ */ new Set();
39323
+ for (const name of explicitTargets) {
39324
+ if (excluded.has(name)) continue;
39325
+ if (yield* config.isIgnored(name, resolvedCwd)) continue;
39326
+ activeTargets.add(name);
39327
+ }
39328
+ const inScopeFor = (name) => explicitTargets.size > 0 ? activeTargets.has(name) : inScope.has(name) && !excluded.has(name);
39294
39329
  const keepDevDeps = options.includeDevDeps === true;
39295
- const scoped = targetPkg ? targetIgnored ? [] : rawDiffs.filter((d) => d.package === targetPkg) : rawDiffs.filter((d) => inScope.has(d.package));
39330
+ const scoped = rawDiffs.filter((d) => inScopeFor(d.package));
39296
39331
  const resolved = [];
39297
39332
  for (const diff of scoped) {
39298
39333
  const rows = keepDevDeps ? [...diff.rows] : diff.rows.filter((r) => r.type !== "devDependency");
@@ -39303,7 +39338,7 @@ function makeShape$1(pit, inspector, discovery, detector, config, fs) {
39303
39338
  }
39304
39339
  const existingPure = yield* findPureDependencyChangesets(fs, changesetDir);
39305
39340
  const skippedMixed = yield* findMixedDependencyChangesets(fs, changesetDir);
39306
- const toDelete = targetPkg ? targetIgnored ? [] : existingPure.filter((p) => p.package === targetPkg) : existingPure.filter((p) => inScope.has(p.package));
39341
+ const toDelete = existingPure.filter((p) => inScopeFor(p.package));
39307
39342
  const chosenFilenames = /* @__PURE__ */ new Set();
39308
39343
  const toWrite = [];
39309
39344
  for (const diff of resolved) {
@@ -8176,8 +8176,20 @@ interface DepsRegenOptions {
8176
8176
  readonly cwd: string;
8177
8177
  /** Override the base branch used to compute the merge-base when `from` is omitted. */
8178
8178
  readonly base?: string;
8179
- /** Restrict regeneration to a single workspace package. */
8179
+ /** Restrict regeneration to a single workspace package. Unioned with {@link DepsRegenOptions.packages}. */
8180
8180
  readonly package?: string;
8181
+ /**
8182
+ * Restrict regeneration to these workspace packages. Like `package`, an
8183
+ * explicit target bypasses the versionable gate but NOT the changeset
8184
+ * ignore list. Unioned with `package` when both are set.
8185
+ */
8186
+ readonly packages?: ReadonlyArray<string>;
8187
+ /**
8188
+ * Drop these packages from scope entirely — no changesets are written for
8189
+ * them and none of their stale pure-dependency changesets are deleted.
8190
+ * Applies to both repo-wide and explicitly-targeted runs (exclude wins).
8191
+ */
8192
+ readonly exclude?: ReadonlyArray<string>;
8181
8193
  /**
8182
8194
  * When `true`, retain `devDependency` rows (the `deps detect` path);
8183
8195
  * when falsy (the `deps regen` default), drop them unconditionally.
@@ -8176,8 +8176,20 @@ interface DepsRegenOptions {
8176
8176
  readonly cwd: string;
8177
8177
  /** Override the base branch used to compute the merge-base when `from` is omitted. */
8178
8178
  readonly base?: string;
8179
- /** Restrict regeneration to a single workspace package. */
8179
+ /** Restrict regeneration to a single workspace package. Unioned with {@link DepsRegenOptions.packages}. */
8180
8180
  readonly package?: string;
8181
+ /**
8182
+ * Restrict regeneration to these workspace packages. Like `package`, an
8183
+ * explicit target bypasses the versionable gate but NOT the changeset
8184
+ * ignore list. Unioned with `package` when both are set.
8185
+ */
8186
+ readonly packages?: ReadonlyArray<string>;
8187
+ /**
8188
+ * Drop these packages from scope entirely — no changesets are written for
8189
+ * them and none of their stale pure-dependency changesets are deleted.
8190
+ * Applies to both repo-wide and explicitly-targeted runs (exclude wins).
8191
+ */
8192
+ readonly exclude?: ReadonlyArray<string>;
8181
8193
  /**
8182
8194
  * When `true`, retain `devDependency` rows (the `deps detect` path);
8183
8195
  * when falsy (the `deps regen` default), drop them unconditionally.
@@ -39182,15 +39182,16 @@ function makeShape$2(inspector) {
39182
39182
  path,
39183
39183
  status: "added"
39184
39184
  }));
39185
+ const isOwnChangeset = (path) => path.startsWith(".changeset/") && path.endsWith(".md");
39185
39186
  const seen = /* @__PURE__ */ new Set();
39186
39187
  const rawEntries = [];
39187
39188
  for (const e of diffEntries) {
39188
- if (seen.has(e.path)) continue;
39189
+ if (seen.has(e.path) || isOwnChangeset(e.path)) continue;
39189
39190
  seen.add(e.path);
39190
39191
  rawEntries.push(e);
39191
39192
  }
39192
39193
  for (const e of untrackedEntries) {
39193
- if (seen.has(e.path)) continue;
39194
+ if (seen.has(e.path) || isOwnChangeset(e.path)) continue;
39194
39195
  seen.add(e.path);
39195
39196
  rawEntries.push(e);
39196
39197
  }
@@ -39325,6 +39326,32 @@ const DEP_TYPE_MAP = [
39325
39326
  */
39326
39327
  const resolveOrRaw = (snapshot, dep, spec) => Option.getOrElse(snapshot.resolve(dep, spec), () => spec);
39327
39328
  /**
39329
+ * Drop no-net-change field moves: the same dependency removed from one field
39330
+ * and added to another with an equal resolved version (e.g. a dep promoted
39331
+ * from `devDependencies` to `dependencies`). A field reclassification is a
39332
+ * contract change worth release-note prose, not a version movement, so it
39333
+ * must not surface as an unrelated removed row plus an added row. Moves that
39334
+ * also change the resolved version keep both rows (the movement is real).
39335
+ */
39336
+ const collapseFieldMoves = (rows) => {
39337
+ const dropped = /* @__PURE__ */ new Set();
39338
+ const byName = /* @__PURE__ */ new Map();
39339
+ for (const row of rows) {
39340
+ const group = byName.get(row.dependency);
39341
+ if (group) group.push(row);
39342
+ else byName.set(row.dependency, [row]);
39343
+ }
39344
+ for (const group of byName.values()) for (const removed of group) {
39345
+ if (removed.action !== "removed" || dropped.has(removed)) continue;
39346
+ const added = group.find((r) => r.action === "added" && !dropped.has(r) && r.type !== removed.type && r.to === removed.from);
39347
+ if (added) {
39348
+ dropped.add(removed);
39349
+ dropped.add(added);
39350
+ }
39351
+ }
39352
+ return rows.filter((r) => !dropped.has(r));
39353
+ };
39354
+ /**
39328
39355
  * Diff two workspace snapshots and return per-package dependency-table rows,
39329
39356
  * comparing already-resolved specifier values per side.
39330
39357
  *
@@ -39380,10 +39407,11 @@ function computeWorkspaceDependencyDiffs(before, after) {
39380
39407
  });
39381
39408
  }
39382
39409
  }
39383
- if (rows.length > 0) result.push({
39410
+ const collapsed = collapseFieldMoves(rows);
39411
+ if (collapsed.length > 0) result.push({
39384
39412
  package: afterPkg.name,
39385
39413
  relativePath: afterPkg.relativePath,
39386
- rows: sortDependencyRows(rows)
39414
+ rows: sortDependencyRows(collapsed)
39387
39415
  });
39388
39416
  }
39389
39417
  return result;
@@ -39726,7 +39754,8 @@ function makeShape$1(pit, inspector, discovery, detector, config, fs) {
39726
39754
  fromRef = yield* gitMergeBase(resolvedCwd, baseBranch);
39727
39755
  }
39728
39756
  const rawDiffs = computeWorkspaceDependencyDiffs(yield* pit.at(fromRef, { cwd: resolvedCwd }), options.to ? yield* pit.at(options.to, { cwd: resolvedCwd }) : yield* pit.worktree({ cwd: resolvedCwd }));
39729
- const targetPkg = options.package;
39757
+ const explicitTargets = /* @__PURE__ */ new Set([...options.packages ?? [], ...options.package ? [options.package] : []]);
39758
+ const excluded = new Set(options.exclude ?? []);
39730
39759
  const livePackages = yield* discovery.listPackages(resolvedCwd);
39731
39760
  const publishable = yield* listPublishablePackageNames(livePackages, resolvedCwd).pipe(Effect.provide(provideDetector));
39732
39761
  const versionPrivate = yield* config.versionPrivate(resolvedCwd);
@@ -39735,9 +39764,15 @@ function makeShape$1(pit, inspector, discovery, detector, config, fs) {
39735
39764
  if (yield* config.isIgnored(pkg.name, resolvedCwd)) continue;
39736
39765
  if (publishable.has(pkg.name) || versionPrivate) inScope.add(pkg.name);
39737
39766
  }
39738
- const targetIgnored = targetPkg ? yield* config.isIgnored(targetPkg, resolvedCwd) : false;
39767
+ const activeTargets = /* @__PURE__ */ new Set();
39768
+ for (const name of explicitTargets) {
39769
+ if (excluded.has(name)) continue;
39770
+ if (yield* config.isIgnored(name, resolvedCwd)) continue;
39771
+ activeTargets.add(name);
39772
+ }
39773
+ const inScopeFor = (name) => explicitTargets.size > 0 ? activeTargets.has(name) : inScope.has(name) && !excluded.has(name);
39739
39774
  const keepDevDeps = options.includeDevDeps === true;
39740
- const scoped = targetPkg ? targetIgnored ? [] : rawDiffs.filter((d) => d.package === targetPkg) : rawDiffs.filter((d) => inScope.has(d.package));
39775
+ const scoped = rawDiffs.filter((d) => inScopeFor(d.package));
39741
39776
  const resolved = [];
39742
39777
  for (const diff of scoped) {
39743
39778
  const rows = keepDevDeps ? [...diff.rows] : diff.rows.filter((r) => r.type !== "devDependency");
@@ -39748,7 +39783,7 @@ function makeShape$1(pit, inspector, discovery, detector, config, fs) {
39748
39783
  }
39749
39784
  const existingPure = yield* findPureDependencyChangesets(fs, changesetDir);
39750
39785
  const skippedMixed = yield* findMixedDependencyChangesets(fs, changesetDir);
39751
- const toDelete = targetPkg ? targetIgnored ? [] : existingPure.filter((p) => p.package === targetPkg) : existingPure.filter((p) => inScope.has(p.package));
39786
+ const toDelete = existingPure.filter((p) => inScopeFor(p.package));
39752
39787
  const chosenFilenames = /* @__PURE__ */ new Set();
39753
39788
  const toWrite = [];
39754
39789
  for (const diff of resolved) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@savvy-web/silk",
3
- "version": "2.1.2",
3
+ "version": "2.1.3",
4
4
  "private": false,
5
5
  "description": "The single Silk Suite dev-tooling package — changeset, commitlint, lint, and biome conventions",
6
6
  "homepage": "https://github.com/savvy-web/systems/tree/main/packages/silk",
@@ -66,7 +66,10 @@
66
66
  },
67
67
  "dependencies": {
68
68
  "@effect/platform": "^0.96.2",
69
- "@savvy-web/silk-effects": "3.0.3",
69
+ "@savvy-web/changelog": "0.1.1",
70
+ "@savvy-web/cli": "1.5.3",
71
+ "@savvy-web/mcp": "1.7.0",
72
+ "@savvy-web/silk-effects": "3.1.0",
70
73
  "effect": "^3.21.4",
71
74
  "semver": "^7.8.5"
72
75
  },
@@ -75,9 +78,6 @@
75
78
  "@changesets/cli": "^3.0.0-next.8",
76
79
  "@commitlint/cli": "^21.2.0",
77
80
  "@commitlint/config-conventional": "^21.2.0",
78
- "@savvy-web/changelog": "0.1.0",
79
- "@savvy-web/cli": "1.5.2",
80
- "@savvy-web/mcp": "1.6.7",
81
81
  "@types/node": "^26.1.0",
82
82
  "@typescript/native-preview": "^7.0.0-dev.20260612.1",
83
83
  "commitizen": "^4.3.2",