Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 21 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,27 @@ All notable changes to this project will be documented in this file.

## [Unreleased]

## [2.0.0] - Unreleased

### Added

- **Song Requests** — viewers can request songs in Twitch chat via `!sr <song>`; plays through Music.app via AppleScript with no focus-steal on the streamer's screen.
- **`!queue` / `!myqueue`** — show the full request queue or a viewer's own requests in chat.
- **`!skip` / `!next`** — mod/broadcaster-only command to skip the current request.
- **`!clearqueue`** — mod/broadcaster-only command to wipe the queue (with in-app confirmation dialog).
- **`!hold` / `!resume` / `!unhold`** — mod/broadcaster-only hold mode; new requests buffer without auto-playing so the streamer can curate before releasing the queue.
- **Hold controls** — Hold/Resume button in the Song Request Queue settings view and a toggle item in the menu bar dropdown.
- **Music.app closed buffering** — requests are saved when Music.app is closed and flushed automatically when it reopens (hold mode is respected).
- **Fallback playlist** — configure an Apple Music playlist to play when the request queue empties.
- **Song Request Queue UI** — full queue view with now-playing card, position badges, per-requester labels, and Skip / Hold / Clear controls.
- **Apple Music onboarding step** — new step in the first-launch wizard to authorize MusicKit for song search.
- **Per-user and global request limits**, subscriber-only mode, per-command enable/disable toggles, and custom alias configuration.

### Changed

- **Music playback via AppleScript + focus preservation** — Music.app never steals focus from OBS or other streaming tools; the previously active app is restored 150 ms after each command.
- **MusicKit used exclusively for search/resolve**, not playback — no in-app audio session.

## [1.2.0] - 2026-04-04

### Added
Expand Down
21 changes: 21 additions & 0 deletions apps/docs/content/docs/changelog.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,27 @@ description: Release history for WolfWave
All notable changes to WolfWave are documented here.


## v2.0.0 — Unreleased

### Added
- **Song Requests** — viewers request songs via `!sr <song>` in Twitch chat; plays through Music.app with no focus-steal on the streamer's screen
- **`!queue` / `!myqueue`** — show the full queue or a viewer's own requests in chat
- **`!skip` / `!next`** — mod-only skip current request
- **`!clearqueue`** — mod-only wipe the queue (with confirmation)
- **`!hold` / `!resume`** — mod-only hold mode; requests buffer without auto-playing so the streamer can curate before releasing
- **Hold controls** — Hold/Resume button in Queue settings view and menu bar toggle
- **Music.app closed buffering** — requests save when Music.app is closed, flush on relaunch
- **Fallback playlist** — plays a configured Apple Music playlist when the queue empties
- **Song Request Queue UI** — now-playing card, position badges, per-requester labels, and action controls
- **Apple Music onboarding step** — MusicKit authorization during first-launch wizard
- **Per-user limits, subscriber-only mode, command aliases**, and enable/disable toggles per command

### Changed
- Music playback via AppleScript + focus preservation — Music.app never steals focus from OBS or streaming tools
- MusicKit used exclusively for search/resolve, not playback

---

## v1.2.0 — April 4, 2026

### Added
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ final class OnboardingViewModelEdgeCaseTests: XCTestCase {
for _ in 0..<10 {
viewModel.goToNextStep()
}
XCTAssertEqual(viewModel.currentStep, .obsWidget)
XCTAssertEqual(viewModel.currentStep, .appleMusicAccess)
XCTAssertTrue(viewModel.isLastStep)
}

Expand Down
10 changes: 6 additions & 4 deletions apps/native/WolfWaveTests/OnboardingViewModelTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,8 @@ final class OnboardingViewModelTests: XCTestCase {
XCTAssertEqual(viewModel.currentStep, .welcome)
}

func testTotalStepsEquals4() {
XCTAssertEqual(viewModel.totalSteps, 4)
func testTotalStepsEquals5() {
XCTAssertEqual(viewModel.totalSteps, 5)
}

func testIsFirstStepAtWelcome() {
Expand Down Expand Up @@ -67,7 +67,8 @@ final class OnboardingViewModelTests: XCTestCase {
viewModel.goToNextStep()
viewModel.goToNextStep()
viewModel.goToNextStep()
XCTAssertEqual(viewModel.currentStep, .obsWidget)
viewModel.goToNextStep()
XCTAssertEqual(viewModel.currentStep, .appleMusicAccess)
}

// MARK: - Backward Navigation
Expand Down Expand Up @@ -103,7 +104,8 @@ final class OnboardingViewModelTests: XCTestCase {
XCTAssertFalse(viewModel.isLastStep)
}

func testIsLastStepAtOBSWidget() {
func testIsLastStepAtAppleMusicAccess() {
viewModel.goToNextStep()
viewModel.goToNextStep()
viewModel.goToNextStep()
viewModel.goToNextStep()
Expand Down
Loading
Loading