Lukas
51bdb799ae
Skip lifecycle scripts in Docker build to avoid missing git
...
CI / check (push) Successful in 47s
CI / build-image (push) Successful in 29s
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-12 10:06:49 +01:00
Lukas
1baddad939
Remove pnpm cache from setup-node to fix Gitea Actions timeout
CI / check (push) Successful in 47s
CI / build-image (push) Failing after 18s
2026-03-12 09:52:16 +01:00
Lukas
e701e4dd70
Run build-image job on host to access Docker CLI
...
CI / check (push) Failing after 14m13s
CI / build-image (push) Has been cancelled
The node:22 container doesn't have Docker installed. Running
on the host label executes directly on the VPS where Docker
is available.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-12 09:18:51 +01:00
Lukas
e2b0e7d5ee
Exclude .pnpm-store from Biome and add .dockerignore
...
CI / check (push) Successful in 10m21s
CI / build-image (push) Failing after 4s
The CI runner's pnpm store lands inside the workspace, causing
Biome to lint/format hundreds of store index JSON files.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-12 00:46:38 +01:00
Lukas
635e9c0705
Add Dockerfile, nginx config, and Gitea Actions CI workflow
...
CI / check (push) Failing after 6m20s
CI / build-image (push) Has been skipped
Multi-stage Docker build produces an Nginx container serving the
static SPA. The CI workflow runs pnpm check on every push and
builds/pushes a Docker image on semver tags.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-12 00:32:12 +01:00
Lukas
582a42e62d
Change add creature placeholder to "+ Add combatants"
...
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-11 22:50:09 +01:00
Lukas
fc43f440aa
Toggle pin off when clicking pin on already-pinned creature
...
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-11 22:49:00 +01:00
Lukas
1cf30b3622
Add swipe-to-dismiss gesture for mobile stat block drawer
...
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-11 22:48:48 +01:00
Lukas
2ce0ff50b9
Always show add-condition and delete buttons on touch devices
...
Use a pointer-coarse custom variant to bypass hover-dependent
visibility on devices without a precise pointer (phones, tablets).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-11 22:37:04 +01:00
Lukas
96a7b2d00e
Remove pencil icon, use cursor-text to signal editable name
...
The hover-revealed pencil icon caused layout shift on rows with
conditions. Modern UIs (Figma, Notion, Linear) rely on double-click
without a visible edit icon. Replace with cursor-text on hover.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-11 22:32:56 +01:00
Lukas
2d8e823eff
Replace single-click rename with double-click, pencil icon, and long-press ( #6 )
...
Single-clicking a combatant name now opens the stat block panel instead of
entering edit mode. Renaming is triggered by double-click, a hover pencil
icon, or long-press on touch. Also fixes condition picker positioning when
near viewport edges.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-11 22:22:21 +01:00
Lukas
613bb70065
Consolidate 36 per-change specs into 4 feature-level specs and align workflow
...
Replace granular change-level specs (001–036) with living feature specs:
- 001-combatant-management (CRUD, persistence, clear, confirm buttons)
- 002-turn-tracking (rounds, turn order, advance/retreat, top bar)
- 003-combatant-state (HP, AC, conditions, concentration, initiative)
- 004-bestiary (search, stat blocks, source management, panel UX)
Workflow changes:
- Add /integrate-issue command (replaces /issue-to-spec) for routing
issues to existing specs or handing off to /speckit.specify
- Update /sync-issue to list specs instead of requiring feature branch
- Update /write-issue to reference /integrate-issue
- Add RPI skills (research, plan, implement) to .claude/skills/
- Create docs/agents/ for RPI artifacts (research reports, plans)
- Remove update-agent-context.sh call from /speckit.plan
- Update CLAUDE.md with proportional scope-based workflow table
- Bump constitution to 3.0.0 (specs describe features, not changes)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-11 21:33:27 +01:00
Lukas
b6e052f198
Overhaul bottom bar: batch add, custom fields, stat block viewer
...
Unify the action bar into a single search input with inline bestiary
dropdown. Clicking a dropdown entry queues it with +/- count controls
and a confirm button; Enter or confirm adds N copies to combat.
When no bestiary match exists, optional Init/AC/MaxHP fields appear
for custom creatures. The eye icon opens a separate search dropdown
to preview stat blocks without leaving the add flow.
Fix batch-add bug where only the last creature got a creatureId by
using store.save() instead of setEncounter() in addFromBestiary.
Prevent dropdown buttons from stealing input focus so Enter confirms
the queued batch.
Remove the now-redundant BestiarySearch component.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-11 15:27:06 +01:00
Lukas
460c65bf49
Implement stat block panel fold/unfold and pin-to-second-panel
...
Replace the close button and heading with fold/unfold controls that
collapse the panel to a slim right-edge tab showing the creature name
vertically, and add a pin button (xl+ viewports with creature loaded)
that opens the creature in a second left-side panel for simultaneous
reference. Fold state is respected on turn change. 19 acceptance tests.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-11 14:18:15 +01:00
Lukas
95cb2edc23
Redesign top bar with dedicated round badge and centered combatant name
...
Replace the combined "Round N — Name" string with a three-zone flex layout:
left (prev button + R{n} pill badge), center (prominent combatant name with
truncation), right (action buttons + next button). Adds 13 unit tests
covering all user stories including layout robustness and empty state.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-11 12:39:57 +01:00
Lukas
55d322a727
Fix concentration glow clipping at container edges
...
Add padding to the inner combatant list container so the box-shadow glow
from the concentration-damage animation renders fully on all sides,
preventing clipping by the scrollable parent's implicit overflow-x.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-11 11:54:22 +01:00
Lukas
0c903bc9a5
Fix ConfirmButton Enter/Space keydown bubbling to parent row handler
...
The button's onClick stopped mouse event propagation, but keyboard
Enter/Space fired a separate keydown event that bubbled to the
combatant row's onKeyDown, opening the stat block side panel instead
of arming/confirming the button.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-11 10:04:27 +01:00
Lukas
236c3bf64a
Add /issue-to-spec and /sync-issue Claude Code skills
...
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-11 10:00:47 +01:00
Lukas
0747d044f3
Implement the 032-inline-confirm-buttons feature that replaces single-click destructive actions with a reusable ConfirmButton component providing inline two-step confirmation (click to arm, click to execute), applied to the remove combatant and clear encounter buttons, with CSS scale pulse animation, 5-second auto-revert, click-outside/Escape/blur dismissal, full keyboard accessibility, and 13 unit tests via @testing-library/react
...
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-11 09:51:21 +01:00
Lukas
d101906776
Add /write-issue skill for interactive Gitea issue creation
...
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-11 01:21:22 +01:00
Lukas
69363d4f7d
Implement the 031-quality-gates-hygiene feature that strengthens automated quality gates by adding pnpm audit to the check script, v8 coverage thresholds with per-directory auto-ratchet (domain 96%, adapters 71%, persistence 87%), Biome cognitive complexity enforcement (max 15), and keyboard accessibility for the combatant row, while cleaning up all blanket biome-ignore comments, refactoring 5 overly complex functions into smaller helpers, and codifying the early-enforcement principle in the constitution and CLAUDE.md
...
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-11 00:52:29 +01:00
Lukas
47da942b73
Clean up project documentation and constitution for post-MVP maturity
...
- CLAUDE.md: replace 32-line per-feature tech changelog with consolidated
tech stack, add project structure and data/storage sections, remove stale
Recent Changes
- README.md: rewrite for current feature set, fix bestiary description
(import-based, not bundled), remove placeholder license section
- Constitution v2.2.0: remove unused Agent Boundary principle (MAJOR),
add README and CLAUDE.md sync rules to Development Workflow (MINOR)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-10 23:48:50 +01:00
Lukas
94d125d9c4
Implement the 030-bulk-import-sources feature that adds a one-click bulk import button to load all bestiary sources at once, with real-time progress feedback in the side panel and a toast notification when the panel is closed, plus completion/failure reporting with auto-dismiss on success and persistent display on partial failure, while also hardening the bestiary normalizer to handle variable stat blocks (spell summons with special AC/HP/CR) and skip malformed monster entries gracefully
...
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-10 23:29:34 +01:00
Lukas
c323adc343
Add spec, plan, and tasks for 030-bulk-import-sources feature
...
Defines the "Bulk Import All Sources" feature for the on-demand bestiary
system: one-click loading of all ~104 bestiary sources with concurrent
fetching, progress feedback, toast notifications, and completion reporting.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-10 22:46:24 +01:00
Lukas
91120d7c82
Implement the 029-on-demand-bestiary feature that replaces the bundled XMM bestiary JSON with a compact search index (~350KB) and on-demand source loading, where users explicitly provide a URL or upload a JSON file to fetch full stat block data per source, which is then normalized and cached in IndexedDB (with in-memory fallback) so creature stat blocks load instantly on subsequent visits while keeping the app bundle small and never auto-fetching copyrighted content
...
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-10 22:46:13 +01:00
Lukas
99d1ba1bcd
Implement the 028-semantic-hover-tokens feature that unifies hover colors across all interactive UI components via six CSS custom property tokens (three text, three background) defined in the Tailwind v4 theme, replacing hardcoded hover classes in 9 component files plus the shared Button primitive with semantic token references so all hover colors can be globally reconfigured from one place
...
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-10 19:50:22 +01:00
Lukas
f029c1a85b
Implement the 027-ui-polish feature that adds six combatant row improvements (inline conditions, row-click stat block, hover-only remove button, AC shield shape, expanded concentration click target, larger d20 icon) plus top bar redesign with icon-only StepBack/StepForward navigation buttons, dark-themed scrollbars, and multiple UX fixes including stat block panel stability during initiative rolls and mobile touch safety for hidden buttons
...
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-10 19:00:49 +01:00
Lukas
d5f7b6ee36
Implement the 026-roll-initiative feature that adds d20 roll buttons for bestiary combatants' initiative using a click-to-edit pattern (d20 icon when empty, plain text when set), plus a Roll All button in the top bar that batch-rolls for all unrolled bestiary combatants, with randomness confined to the adapter layer and the domain receiving pre-resolved dice values
...
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-10 16:29:09 +01:00
Lukas
5b0bac880d
Implement the 025-display-initiative feature that adds initiative modifier and passive initiative display to creature stat blocks, calculated as DEX modifier + (proficiency multiplier × proficiency bonus) from bestiary data, shown in MM 2024 format on the AC line
...
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-10 11:27:46 +01:00
Lukas
c6349928eb
Implement the 024-fix-hp-popover-overflow feature that switches the HP adjustment popover from absolute to fixed positioning with viewport-aware clamping so it stays fully visible and causes no horizontal scrollbar, even when the HP display is near the right edge of the viewport
...
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-09 16:50:39 +01:00
Lukas
24198c25f1
Implement the 023-clear-encounter feature that adds a clear encounter button with confirmation dialog to remove all combatants and reset round/turn counters, with the cleared state persisting across page refreshes
...
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-09 13:43:42 +01:00
Lukas
11c4c0237e
Implement the 022-fixed-layout-bars feature that pins turn navigation to the top and add-creature bar to the bottom of the encounter tracker with only the combatant list scrolling between them, and auto-scrolls to the active combatant on turn change
...
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-09 11:36:59 +01:00
Lukas
fa078be2f9
Implement the 021-bestiary-statblock feature that adds a searchable D&D 2024 Monster Manual creature library with inline autocomplete suggestions, full stat block display in a fixed side panel, auto-numbering of duplicate creature names, HP/AC pre-fill from bestiary data, and automatic stat block display on turn change for wide viewports
...
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-09 11:01:07 +01:00
Lukas
04a4f18f98
Implement the 020-fix-zero-hp-opacity feature that replaces container-level opacity dimming with element-level opacity on individual leaf elements so that HP popover and condition picker render at full opacity for unconscious combatants
...
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-06 15:43:27 +01:00
Lukas
0c0da9b90e
Implement the 019-combatant-row-declutter feature that replaces always-visible HP controls and AC/MaxHP inputs with compact click-to-edit and click-to-adjust patterns in the encounter tracker
...
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-06 15:07:04 +01:00
Lukas
e59fd83292
Implement the 018-combatant-concentration feature that adds a per-combatant concentration toggle with Brain icon, purple border accent, and damage pulse animation in the encounter tracker
...
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-06 14:41:59 +01:00
Lukas
febe892e15
Implement the 017-combat-conditions feature that adds D&D 5e status conditions to combatants with icon tags, color coding, and a compact toggle picker in the encounter tracker
...
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-06 11:29:39 +01:00
Lukas
78c6591973
Implement the 016-combatant-ac feature that adds an optional Armor Class field to combatants with shield icon display and inline editing in the encounter tracker
...
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-06 10:41:56 +01:00
Lukas
2793a66672
Implement the 015-add-jscpd-gate feature that adds copy-paste detection to the quality gate using jscpd with a 5% duplication threshold integrated into pnpm check
...
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-06 00:13:32 +01:00
Lukas
56bced8481
Implement the 014-inline-hp-delta feature that replaces the damage/heal mode toggle with explicit action buttons and Enter-to-damage keyboard shortcut
...
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-05 23:52:03 +01:00
Lukas
97d3918cef
Implement the 013-hp-status-indicators feature that adds visual HP status indicators to combatant rows with a pure domain function deriving bloodied/unconscious states
...
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-05 23:29:24 +01:00
Lukas
7d440677be
Implement the 012-turn-navigation feature that adds a RetreatTurn domain operation and relocates turn controls to a navigation bar at the top of the encounter tracker
...
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-05 23:11:11 +01:00
Lukas
a0d85a07e3
Implement the 011-quick-hp-input feature that adds an inline damage/heal numeric input per combatant row with mode toggle, keyboard workflow, and visual distinction
...
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-05 22:43:26 +01:00
Lukas
1c40bf7889
Implement the 010-ui-baseline feature that establishes a modern UI using Tailwind CSS v4 and shadcn/ui-style components for the encounter screen
...
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-05 18:36:39 +01:00
Lukas
8185fde0e8
Implement the 009-combatant-hp feature that adds optional max HP and current HP tracking per combatant with +/- controls, direct entry, and persistence
...
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-05 17:18:03 +01:00
Lukas
a9c280a6d6
Implement the 008-persist-encounter feature that saves encounter state to localStorage so it survives page reloads
...
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-05 16:24:00 +01:00
Lukas
c4a90c9982
Implement the 007-add-knip feature that adds Knip unused code detection to the quality gate and as a standalone command
...
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-05 12:24:27 +01:00
Lukas
0bbd6f27f9
Implement the 006-pre-commit-gate feature that enforces a pre-commit quality gate using Lefthook to run pnpm check before every commit
...
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-05 11:44:44 +01:00
Lukas
fea2bfe39d
Implement the 005-set-initiative feature that adds initiative values to combatants with automatic descending sort and active turn preservation
...
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-04 17:26:41 +01:00
Lukas
a9df826fef
Implement the 004-edit-combatant feature that adds the possibility to change a combatants name
2026-03-04 10:05:13 +01:00