Skip to content

v0.15.12

Choose a tag to compare

@AwsomeFox AwsomeFox released this 07 Aug 17:52
· 93 commits to main since this release
e8c3493

🚀 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