Commit Graph

25 Commits

Author SHA1 Message Date
uberwald 9e80c2c028 Add re-order, spotlight/focus, and auto-position-snapshots features
- HTML5 drag-and-drop reordering of strip participants (per-GM flag)
- Shift+click toggles spotlight focus on a participant (gold ring indicator)
- Escape exits focus mode
- Auto-save strip position on drag end + every 30s with viewport validation
- Reset strip position button in Director's Board
- French locale strings for reset button
2026-05-27 11:44:24 +02:00
uberwald 7a0d935239 Story 5.2: Video Widget Width Customization
Implements configurable video widget widths for small and large dock layouts:
- Add widgetWidthSm and widgetWidthMd world settings (defaults: 83px, 150px)
- Add width dropdown selectors in Director's Board UI
- Apply width settings to participant avatars via CSS custom properties
- Update strip width/height calculations to use custom widths
- Add localization strings for widget width settings
- Add CSS styling for widget width dropdown controls
- Fix Handlebars template syntax for select element selected values

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-05-25 12:57:24 +02:00
uberwald 748c7d7f85 Story 3.3 done 2026-05-25 10:32:49 +02:00
uberwald 25dd427a59 Update tests for Story 5-1 Full AV Replacement
- Mark Story 5-1 as done in sprint-status.yaml
- Update FoundryAdapter.test.js:
  - Updated probeCapability tests to expect 'stream-access' (was 'css-fallback')
  - Added tests for all 11 new buildWebRTCSurface methods
  - Added input validation tests for userId-taking methods
- Update ScryingPoolStrip.test.js:
  - Added tests for hasStreamAccess flag in buildParticipantList
  - Added tests for hasStreamAccess in getData()
  - Added tests for _attachVideoStream() method
  - Added tests for _cleanupVideoStreams() method

All 892 unit tests passing + 7 integration tests passing

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-05-24 12:36:52 +02:00
uberwald f8cbb75773 Apply code review patches: null guards, validation, cleanup for WebRTC full AV replacement
- module.js: null guards, try-catch, migration logic
- FoundryAdapter.js: input validation, JSDoc fix
- ScryingPoolStrip.js: null guards, cleanup, race condition fix
- _roster-strip.less: CSS typo fix
- All 19 code review findings resolved
- All tests passing, 0 lint errors
- Story 5-1 documentation added (5-1-full-av-replacement.md)
- Sprint status updated for Epic 5

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-05-24 09:50:07 +02:00
uberwald 6d7a0b5fd7 Now manage to replace the Foundry native AV dock
CI / ci (push) Failing after 16s
2026-05-24 09:39:53 +02:00
uberwald a7370f2e22 Epic 4: Complete retrospective and update sprint status
- Added comprehensive Epic 4 retrospective document
- Marked epic-4-retrospective as done in sprint-status.yaml
- Story 4.2 (Custom Portrait Fallback) already completed in previous commit

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-05-24 00:41:48 +02:00
uberwald 56eeb7cc83 Story 4.2 completed 2026-05-24 00:37:21 +02:00
uberwald de1b33c453 Story 4.1 completed 2026-05-23 23:00:07 +02:00
uberwald fd0a7868f3 Story 4.1: Tasks 3-6 Complete - Director's Board Integration & Settings Menu
- Task 3: Extended FoundryAdapter with user flag access methods
  - Added getFlag(userId, scope, key) method
  - Added setFlag(userId, scope, key, value) method
  - Added getFlagModule(userId, key) convenience method
  - Added setFlagModule(userId, key, value) convenience method

- Task 4: Integrated Privacy Settings with Director's Board
  - Updated participant-card.hbs to show Reaction Cam badge
  - Modified boardUtils.js to pass playerPrivacyManager through context
  - Updated DirectorsBoard to accept and pass playerPrivacyManager
  - Added CSS styles for Reaction Cam badge (SP accent color)

- Task 5: Registered PlayerPrivacyPanel in module settings
  - Added settings menu registration in module.js Hooks.once('ready')
  - Available to all users (restricted: false)
  - Uses localized labels and hints

- Task 6: Added all localization strings
  - Added SCRYING_POOL.PrivacyPanel.* strings for panel UI
  - Added SCRYING_POOL.Settings.* strings for settings menu

- Updated story file with task completion status

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-05-23 21:29:58 +02:00
uberwald 61f362004e Story 4.1: Task 1 Complete - PlayerPrivacyManager Core Logic
- Created src/contracts/privacy-settings.js with:
  - PrivacySettings typedef
  - PRIVACY_SETTINGS_DEFAULT (both flags false)
  - PRIVACY_SETTING_KEYS and FEATURE_NAME_MAP constants
  - createPrivacySettings() factory
  - isValidPrivacySettings() validator
  - validateSettingKey(), validateSettingValue(), validateFeatureName() helpers
- Created src/core/PlayerPrivacyManager.js with:
  - Constructor with FoundryAdapter DI validation
  - getSettings(userId) - retrieves settings from user flags
  - setSetting(userId, key, value) - async, validates, persists via user.setFlag
  - isOptedIn(userId, feature) - convenience method for feature checks
  - getAllSettings() - aggregates all users' settings (GM view)
  - onChange(callback) - subscription pattern for change events
  - teardown() - cleanup
- Created tests/unit/contracts/privacy-settings.test.js - 44 tests
- Created tests/unit/core/PlayerPrivacyManager.test.js - 35 tests
- All tests passing, lint clean
- Updated sprint-status.yaml: 4-1 from ready-for-dev to in-progress
- Updated story file: Task 1 subtasks 1.1-1.8 marked complete

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-05-23 21:11:55 +02:00
uberwald e81c05a3db Create Story 4.1: Player Privacy Panel & Automation Opt-ins
- Created comprehensive story file with 8 acceptance criteria from FR-23, FR-24, FR-25
- Documented PlayerPrivacyManager core logic with DI pattern
- Designed PlayerPrivacyPanel UI component extending ApplicationV2
- Added FoundryAdapter user flag access methods specification
- Integrated Reaction Cam badge into Director's Board design
- Defined all localization strings
- Mapped file structure (new and modified files)
- Specified testing requirements (12-15 new tests)
- Updated sprint-status.yaml: 4-1 from backlog to ready-for-dev, epic-4 to in-progress
- Resolved OQ-GDPR: using user flags for v1.0

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-05-23 21:02:43 +02:00
uberwald 972e456759 Epic 3 finished 2026-05-23 19:31:35 +02:00
uberwald f126793daf Update Epic 3 status to done - all stories complete
- Updated epic-3 status from in-progress to done
- All stories in Epic 3 are now done:
  - 3-1-save-and-load-scene-presets: done
  - 3-2-scene-auto-apply-and-confirmationbar: done
  - 3-3-preset-import-and-export: done

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-05-23 19:06:57 +02:00
uberwald 6a55d4f1e1 Fix sprint tracking: Story 3.1 was already implemented
- Updated sprint-status.yaml: 3-1-save-and-load-scene-presets → done
- Updated Story 3.1 file header: Status → done
- Updated last_updated timestamp

Note: Story 3.1 (Save & Load Scene Presets) was implemented as part of
commit a1e8886 (Story 3.2 done) which created ScenePresetManager,
PresetSaveDialog, PresetLoadDialog, and related tests.

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-05-23 19:06:31 +02:00
uberwald 45fbb9da00 Update Story 3.3 status to done after code review fixes
- Updated sprint-status.yaml: 3-3-preset-import-and-export → done
- Updated story file header: Status → done
- Updated last_updated timestamp

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-05-23 18:59:59 +02:00
uberwald a1e8886fce Story 3.2 done 2026-05-23 18:23:48 +02:00
uberwald d175f92806 Complete Story 3.3: Preset Import & Export
Implements FR-19: Preset import/export as JSON

New Files:
- src/core/PresetImportExportManager.js - Core logic for export/import with merge/replace
- src/ui/gm/PresetExportDialog.js - Export dialog with file download
- src/ui/gm/PresetImportDialog.js - Import dialog with file picker, preview, merge/replace
- templates/preset-export.hbs - Export dialog template
- templates/preset-import.hbs - Import dialog template
- styles/components/_preset-import-export.less - Dialog styles
- tests/unit/core/PresetImportExportManager.test.js - 38 unit tests
- _bmad-output/implementation-artifacts/3-3-preset-import-and-export.md - Story file

Modified Files:
- src/ui/gm/DirectorsBoard.js - Added export/import button handlers
- templates/directors-board.hbs - Added Export/Import buttons to footer
- styles/scrying-pool.less - Added stylesheet import
- lang/en.json - Added localization strings for new UI
- _bmad-output/implementation-artifacts/sprint-status.yaml - Story status: review

Features:
- Export all presets from current scene as JSON file
- Import presets with merge (add new, skip duplicates) or replace (overwrite all) modes
- Preview of presets before import with validation status
- Confirmation dialog for replace mode to prevent data loss
- Comprehensive error handling and validation
- All ACs satisfied (AC-9 deferred for README docs)

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-05-23 16:28:53 +02:00
uberwald e31badf865 Create Story 3.3: Preset Import & Export
- Add comprehensive story file for preset import/export functionality
- Update sprint status: 3-3-preset-import-and-export → ready-for-dev
- Story covers FR-19: Preset import/export as JSON
- Includes 9 acceptance criteria, tasks, and developer context

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-05-23 15:57:44 +02:00
uberwald dc63148b80 Create Story 3.2: Scene Auto-Apply & ConfirmationBar
- Created comprehensive story file for Scene Auto-Apply & ConfirmationBar
- Added detailed acceptance criteria covering FR-17 and FR-18
- Included exhaustive developer context with previous story intelligence
- Specified architecture compliance, file structure, and testing requirements
- Updated sprint-status.yaml to mark 3-2 as ready-for-dev

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-05-23 15:10:55 +02:00
uberwald 25b98ce64a Mark Story 2.3 code review as done
- Update deferred-work.md: mark ParticipantCard.js issue as resolved
- Update sprint-status.yaml: add code review completion date

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-05-23 11:43:05 +02:00
uberwald cc5b04d902 Update sprint status: Story 2.3 code review completed and merged
Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-05-23 11:37:16 +02:00
uberwald d001659e27 Update sprint status: Story 1.3 → done
Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-05-22 13:24:06 +02:00
uberwald 5ba7717ecd Fix Story 1.3: StateStore spec compliance and minor cleanup
Critical Fix:
- StateStore now uses global Hooks.callAll directly (per spec)
- Removed hooks parameter from StateStore constructor
- Updated module.js to pass only adapter.settings
- Updated tests to stub globalThis.Hooks

Minor Cleanup:
- Fixed misleading warning in SocketHandler.registerPendingOp
- Added clarifying comment for setMatrix _revision behavior

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-05-22 11:38:45 +02:00
uberwald 110b295a7b CLose story 1.2 2026-05-21 23:08:34 +02:00