Repository navigation
v0.15.12
🚀 Key Highlights
- Major updates focus on encounter/combat flow, AI/DM tooling, and campaign management.
- The release adds more real-time, player-facing combat UX: turn changes, HP feedback, initiative updates, monster visibility, and action targeting.
- Several new capabilities improve content authoring and campaign governance, including campaign-scoped rules search, markdown editing, export/history, and shared-instance controls.
✨ New Features & Improvements
- Encounters/combat: initiative strip with per-combatant colors, live HP feedback, token state badges, duplicate combatants, AoE templates, turn-change beats, turn timers, and quick-roll buttons for attacks/damage.
- Player/GM UX: ended encounter summaries, lifecycle guidance, battle-map extraction, combat panels/rows refactors, persistent/attributable map pings, and colorblind-safe combat indicators.
- Characters/equipment: Advantage/Disadvantage/Crit context menu, equip/unequip actions, D&D Beyond import improvements for attacks/spells/slots, movement speed support, and richer spellbook wiring.
- Rules/campaigns: campaign-scoped rules search, quick-lookup panel, DM rules authoring improvements, campaign library UI updates, and shared-instance governance for campaign creation/storage.
- AI/DM workflows: improved stream handling, clearer AI driver comprehension, grounded prompts, consent provenance, and better support for homebrew rule systems.
- Other product surfaces: Markdown editor for prose fields, player display scene control, expanded notifications, campaign history export, and proposal editor improvements.
🐛 Bug Fixes & Maintenance
- Fixed multiple combat loop and turn-action issues, including player turn actions, end-turn idempotency, replay correctness, and resource tracker wiring.
- Resolved UI/behavior bugs across web and encounter screens, such as preserving dice context, handling detailed 400 errors, fixing PWA update buttons, scroll behavior, and route focus.
- Corrected data integrity/import issues, including D&D Beyond speed and damage type imports, statblock clobbering, and restored form draft normalization.
- Addressed AI/MCP/test reliability issues, including iteration caps, stream connections, structured conditions, retry handling, and flaky e2e/test assertions.
- Included accessibility, localization, and maintenance updates such as live-combat localization, improved accessibility focus handling, performance cleanup, refactors, and test hardening.
Full Changelog
What's Changed
- fix(ai-dm): human control, pause body validation, undo lever, and CAS handling (#1501) by @AwsomeFox in #1870
- fix(ai): resolve AI test integrity issues, iteration cap, and harness echo-pass (#1500) by @AwsomeFox in #1873
- fix(encounters): render ended summary and lifecycle orientation (#1470) by @AwsomeFox in #1876
- fix(encounters): prevent native image drag and improve fog discoverability (#1309) by @AwsomeFox in #1874
- feat(web): surface check requests campaign-wide outside encounters by @AwsomeFox in #1871
- feat(web): render ended encounter summary tallies and lifecycle guidance by @AwsomeFox in #1872
- fix(rules): DM rules content authoring, license gate & campaign library UI (#1504) by @AwsomeFox in #1878
- feat(encounters): initiative strip with per-combatant colour identity (#1512) by @AwsomeFox in #1875
- feat(characters): add Advantage/Disadvantage/Crit roll context menu by @AwsomeFox in #1867
- feat: make map pings attributable, perceivable, and persistent by @AwsomeFox in #1882
- fix(co-dm): ground prompts in campaign ruleset (#766) by @AwsomeFox in #1881
- fix(mcp): document structured conditions in update_combatant (#1447) by @AwsomeFox in #1883
- feat: Add MarkdownEditor for prose fields by @AwsomeFox in #1880
- feat: Player Display SSE scene control (fixes #1458) by @AwsomeFox in #1887
- feat(notifications): expand live play and campaign event coverage (#1322) by @AwsomeFox in #1886
- feat(encounters): encounter aftermath mutations for XP, loot, quest, storyline, and timeline (#1448) by @AwsomeFox in #1895
- feat(encounters): add inline quick-roll buttons for attack and damage rolls by @AwsomeFox in #1861
- feat: export complete player-authored campaign history by @AwsomeFox in #1885
- feat(ai-dm): unify stream connections to fix issue 880 by @AwsomeFox in #1888
- fix(encounters): enable player turn actions (#1457) by @AwsomeFox in #1890
- fix(web): preserve detailed 400 error messages and fix PWA update banner buttons by @AwsomeFox in #1892
- test(encounters): turn loop and error path tests (#1465) by @AwsomeFox in #1893
- feat(sessions): DM-private session prep notes (#883) by @AwsomeFox in #1894
- fix(test): correct encounter turn-loop expectations to match server contract by @AwsomeFox in #1948
- fix(e2e): stabilize map-ping-tap coordinate assertions by @AwsomeFox in #1955
- feat(equipment): equip/unequip UI and equipped-item actions in /turn and encounter card (Fixes #1901) by @AwsomeFox in #1951
- fix(a11y): re-attempt route focus when a late h1 arrives by @AwsomeFox in #1957
- fix(encounters): wire ResourceTrackerPanel rest/pips to the real engine by @AwsomeFox in #1947
- feat(characters): carry attacks, spells, and spell slots through D&D Beyond import by @AwsomeFox in #1950
- fix(encounters): wire the in-combat Spellbook to real spells and slots by @AwsomeFox in #1952
- feat(encounters): server-authoritative per-combatant initiative rolls + bulk dice-log evidence (Fixes #1904) by @AwsomeFox in #1953
- fix(cast): observe X-Card safety holds on cast-token Player Display by @AwsomeFox in #1949
- fix(i18n): localize live-combat surface (#1464) by @AwsomeFox in #1889
- chore(git): ignore Claude Code backlog worker worktrees by @AwsomeFox in #1961
- fix(characters): carry DDB feature damage types instead of resolving untyped by @AwsomeFox in #1959
- refactor(web): extract encounter battle map by @AwsomeFox in #1966
- feat(rules): campaign-scoped rules search and entries (#1898) by @AwsomeFox in #1945
- refactor(web): extract encounter combatant row by @AwsomeFox in #1968
- feat(encounters): add token state badges by @AwsomeFox in #1964
- refactor(web): extract encounter combat panels by @AwsomeFox in #1969
- fix(mcp): replay end-turn retries by @AwsomeFox in #1970
- refactor(web): extract DM lifecycle header by @AwsomeFox in #1972
- feat(web): add encounter turn-change beats by @AwsomeFox in #1963
- fix(web): preserve dice tray roll context by @AwsomeFox in #1973
- feat(encounters): add live HP feedback by @AwsomeFox in #1965
- feat(encounters): in-tracker rules quick-lookup panel (#1929) by @AwsomeFox in #1976
- feat(campaign-library): preserve roster on encounter templates by @AwsomeFox in #1978
- feat(web): preserve and infer resolvable specs in sheet action editor by @AwsomeFox in #1977
- feat(characters): add movement speed to Character/Combatant, stop hardcoding 30 ft by @AwsomeFox in #1980
- feat(encounters): duplicate combatants by @AwsomeFox in #1975
- Stop presenting 5e math as system-correct: resolver + generator honesty by @AwsomeFox in #1981
- feat(encounters): shared gating-reason affordance for disabled combat controls by @AwsomeFox in #1988
- Define campaign danger level scope and add contextual help by @AwsomeFox in #1989
- Document and close the encounter-event AI-consent boundary by @AwsomeFox in #1991
- test(encounter): add turn loop, error paths, mobile, rulesets, and death save E2E specs (#1465) by @AwsomeFox in #1879
- Expose adjustCombatantResource over REST and MCP; fix whole-statblock clobber by @AwsomeFox in #1983
- feat(web): surface action targets on encounter board by @AwsomeFox in #1979
- feat(encounters): support player-declared AoE templates by @AwsomeFox in #1984
- fix(encounters): player end_turn idempotency replay post-advance by @AwsomeFox in #1995
- AI Driver comprehension profile: chunked narration, supported choices, freeform preserved by @AwsomeFox in #2001
- fix(web): wire onSetHpMax in PlayerVitalsHeader and remove fabricated speed/spell stats (#1938) by @AwsomeFox in #2006
- perf(encounters): consolidate ruleSystem reads in previewEncounter (#1987) by @AwsomeFox in #2008
- Fix the intermittent tablet-viewport failure in combat-tracker.spec.ts by @AwsomeFox in #2004
- fix(importer): populate Character.speed from D&D Beyond imports (#1985) by @AwsomeFox in #2009
- fix(ai-driver): search homebrew rules when campaign has no ruleSystem configured (#1967) by @AwsomeFox in #2010
- fix(encounters): widen UsableAction.source length cap to preserve full equipped item names (#1960) by @AwsomeFox in #2011
- Widen the OSR mechanics-profile factory for homebrew rule systems by @AwsomeFox in #2000
- feat(proposals): schema-driven guided editor for proposal payloads by @AwsomeFox in #1999
- Proposal editor: clear the mode-switch error once its cause is fixed by @AwsomeFox in #2017
- Assert the data-repair bundle's shape instead of a substring of its JSON by @AwsomeFox in #2019
- Give the coverage job headroom above its passing suite's runtime by @AwsomeFox in #2022
- Fix flaky fog-safe map e2e test: narrow the map-bytes response predicate by @AwsomeFox in #2023
- feat(campaigns): shared-instance governance for campaign creation and storage by @AwsomeFox in #2002
- fix(encounters): include campaign homebrew monsters in the generator by @AwsomeFox in #2024
- Colorblind-safe combat indicators: color-vision-assist mode by @AwsomeFox in #2020
- Live distance readout while dragging a token, wired to speed and movementUsedFt by @AwsomeFox in #2026
- feat(dice): emit dice.rolled SSE event and spectator roll animation (#1899) by @AwsomeFox in #1982
- fix(mcp): allow restore_campaign to target trashed campaigns (#2029) by @AwsomeFox in #2031
- Enforce the active-campaign ceiling on reactivation, not just create by @AwsomeFox in #2028
- Reveal a monster's statblock to players, with a one-tap kill prompt by @AwsomeFox in #2030
- Make death saves a table-holds-breath moment (#1919) by @AwsomeFox in #2039
- Multi-writer conflict e2e coverage: HP, turn advance, SSE outage by @AwsomeFox in #2038
- Turn timer: server-stamped turn start with elapsed chip (issue #1935) by @AwsomeFox in #2037
- fix(web): scroll initiative strip on turn changes by @AwsomeFox in #1974
- feat(i18n): add JSX text ratchet and baseline check for encounter surfaces (#1940) by @AwsomeFox in #2007
- fix(web): shape-normalize restored form drafts against baseline (#1986) by @AwsomeFox in #2013
- updateCombatant transaction-local guards and replay correctness (relands #1997) by @AwsomeFox in #2043
- fix(ai-dm): record external-AI consent provenance on co-DM drafts by @AwsomeFox in #2041
- feat(encounters): per-encounter monster HP display modes for players by @AwsomeFox in #2040
- Wire MapPing color and label: per-user ping identity, long-press intents, ping_map MCP tool by @AwsomeFox in #2046
- Add a jsdom + Testing Library component-render tier for apps/web by @AwsomeFox in #2033
- feat(encounters): reveal initiative numbers cleanly on fight start (#1934) by @AwsomeFox in #2035
- feat(encounters): quick whisper to a player from the encounter screen (#1936) by @AwsomeFox in #2012
- Group checks: multi-target composer, groupId, and DM results board by @AwsomeFox in #2036
- First-fight demo: one-click seeded sample encounter on a fresh install by @AwsomeFox in #2045
- fix(web): pass customMechanicsProfile alongside ruleSystem for homebrew adapters (#2003) by @AwsomeFox in #2014
- Save-on-blur + CAS token for the whole-statblock combatant PATCH by @AwsomeFox in #2027
- feat(encounters): group action rolls for identical monsters (#1922) by @AwsomeFox in #2067
- fix(i18n): translate adapter-declared resource and condition names (#2053) by @AwsomeFox in #2065
- i18n: ratchet check:i18n against untranslated ar catalog values (#2059) by @AwsomeFox in #2064
- fix(mcp): stop advertising a default page size on endpoints that have none by @AwsomeFox in #2063
- docs(design): record the decision on the overloaded "notes" concept by @AwsomeFox in #2061
- feat(encounters): scoped player override so own-combatant writes survive an SSE outage by @AwsomeFox in #2056
- feat(encounters): inline rules hints on standard actions and conditions by @AwsomeFox in #2057
- feat(encounters): DM award and player spend for inspiration / hero points by @AwsomeFox in #2052
- fix(i18n): reject empty or whitespace-only catalog values by @AwsomeFox in #2077
- fix(i18n): close two ways the translation ratchet silently loosens by @AwsomeFox in #2076
- fix(encounters): remove the case-only filename collision behind the GroupActionRunner import by @AwsomeFox in #2075
Full Changelog: v0.15.11...v0.15.12
Container image
docker pull ghcr.io/awsomefox/campfire:0.15.12