diff --git a/scarf/Packages/ScarfCore/Sources/ScarfCore/Services/SkillSnapshotService.swift b/scarf/Packages/ScarfCore/Sources/ScarfCore/Services/SkillSnapshotService.swift index 0e61d0b..f6caba3 100644 --- a/scarf/Packages/ScarfCore/Sources/ScarfCore/Services/SkillSnapshotService.swift +++ b/scarf/Packages/ScarfCore/Sources/ScarfCore/Services/SkillSnapshotService.swift @@ -133,12 +133,20 @@ public struct SkillSnapshotDiff: Sendable, Equatable { } /// Compact label for the "What's New" pill, e.g. - /// "2 new, 4 updated since you last looked" or "1 new skill". + /// "2 new, 4 changed since you last looked" or "1 new skill". + /// + /// Wording note (issue #78): we used to say "X updated since you + /// last looked" but the same screen also surfaces an "Updates" + /// sub-tab driven by `hermes skills check` (skills with newer + /// **upstream** versions available). Two surfaces with the word + /// "update" meaning two different things read as a contradiction + /// to the user. "Changed" describes the local file delta without + /// colliding with upstream-update vocabulary. public var label: String { switch (newCount, updatedCount) { case (let n, 0): return n == 1 ? "1 new skill since you last looked" : "\(n) new skills since you last looked" - case (0, let u): return u == 1 ? "1 updated skill since you last looked" : "\(u) updated skills since you last looked" - default: return "\(newCount) new, \(updatedCount) updated since you last looked" + case (0, let u): return u == 1 ? "1 changed skill since you last looked" : "\(u) changed skills since you last looked" + default: return "\(newCount) new, \(updatedCount) changed since you last looked" } } } diff --git a/scarf/Scarf iOS/Skills/SkillsView.swift b/scarf/Scarf iOS/Skills/SkillsView.swift index 8fe8eef..1541bbf 100644 --- a/scarf/Scarf iOS/Skills/SkillsView.swift +++ b/scarf/Scarf iOS/Skills/SkillsView.swift @@ -48,7 +48,12 @@ struct SkillsView: View { // picker when the per-server snapshot diff has changes. // First-load with no prior snapshot silently primes (no // pill, the snapshot just records what's there). - if let diff = snapshotDiff, + // + // Issue #78: scope the pill to the Installed tab. It + // describes local file deltas; rendering it on Updates + // contradicts the upstream-version-check pane below. + if currentTab == .installed, + let diff = snapshotDiff, diff.hasChanges, !diff.previousSnapshotEmpty { whatsNewPill(diff: diff) diff --git a/scarf/scarf/Features/Skills/Views/SkillsView.swift b/scarf/scarf/Features/Skills/Views/SkillsView.swift index 4591ece..7eb67ae 100644 --- a/scarf/scarf/Features/Skills/Views/SkillsView.swift +++ b/scarf/scarf/Features/Skills/Views/SkillsView.swift @@ -71,7 +71,14 @@ struct SkillsView: View { // changes against a non-empty prior snapshot (first launch // is silent so users aren't drowned in "everything is // new!" noise). - if let diff = snapshotDiff, + // + // Issue #78: keep the pill scoped to the Installed tab. + // It describes local file deltas in the installed-skill + // tree; surfacing it above the Hub or Updates tab read as + // a contradiction with the Updates body's separate + // upstream-version check. + if currentTab == .installed, + let diff = snapshotDiff, diff.hasChanges, !diff.previousSnapshotEmpty { whatsNewPill(diff: diff)