Compare commits

..
4 Commits
4 changed files with 76 additions and 39 deletions
+10 -3
View File
@@ -42,9 +42,16 @@ When you run into a repeatable problem during testing (e.g. port assignment coll
The app shows its version number and a player-facing changelog in the ☰ menu → About. Both come from `frontend/src/lib/changelog.js` (rendered by `frontend/src/components/AboutModal.svelte`). The app shows its version number and a player-facing changelog in the ☰ menu → About. Both come from `frontend/src/lib/changelog.js` (rendered by `frontend/src/components/AboutModal.svelte`).
- Bump `VERSION` by one on **every** commit. - Ordinary commits do **not** bump `VERSION` or the Nix package versions.
- When a commit changes something players can see, add an entry to the **top** of `CHANGELOG` (`{ version, date, changes: [...] }`) describing it in player-facing terms. Group everything shipping under one version into a single entry. - Accumulate player-visible changes in one entry at the **top** of `CHANGELOG` with `version: null` and `changes: [...]`. The About dialog labels it **In testing**. Append to or consolidate this batch across commits; do not create a separate entry per commit or assign a release date yet.
- The changelog is for players: skip refactors, tests, tooling, and other internal-only changes. A commit with no user-facing change bumps `VERSION` but adds no entry. - Omit the In testing entry when there are no unreleased player-facing changes; empty batches are hidden. Do not add placeholder entries just to describe changelog maintenance.
- The changelog is for players: skip refactors, tests, tooling, and other internal-only changes. Internal-only commits need no changelog entry.
- Release labeling is a separate process, performed only when explicitly requested. At release time:
1. Consolidate the In testing batch into meaningful player-facing groups using `groups: [{ title, changes: [...] }]`, replacing its flat `changes` list. Remove duplicates and describe the final behavior.
2. Bump `VERSION` by one and give the batch that numeric `version` plus the release `date` (`YYYY-MM-DD`).
3. Bump **both** package `version` values in `flake.nix` (`pirats-frontend` and `pirats`) to the same new Nix release version. Preserve the Nix version scheme; do not equate its semantic version with the app's integer V number.
4. Commit the release metadata together. The next player-visible development change starts a fresh In testing entry.
- Preserve already numbered history unless the user explicitly requests reorganizing past releases.
## Work order ## Work order
+6
View File
@@ -8,6 +8,12 @@
## Polish ## Polish
- [x] Hide In testing when there are no unreleased changes and remove the placeholder batch.
- [x] Consolidate the September 4 changelog entries into one grouped version, v26 (following the previous v25 release).
- [x] Accumulate In testing changelog batches and reserve app/Nix version bumps for grouped releases.
- [x] Apply the refreshed light and dark themes to the full rulebook and TL;DR rules. - [x] Apply the refreshed light and dark themes to the full rulebook and TL;DR rules.
- [x] Refresh both themes with legible texture and nautical flair, and give the Event Log / My Notes the regular panel surface. - [x] Refresh both themes with legible texture and nautical flair, and give the Event Log / My Notes the regular panel surface.
+18 -4
View File
@@ -2,6 +2,12 @@
import { createEventDispatcher } from 'svelte'; import { createEventDispatcher } from 'svelte';
import { VERSION, CHANGELOG } from '../lib/changelog'; import { VERSION, CHANGELOG } from '../lib/changelog';
const visibleEntries = CHANGELOG.filter((entry) =>
entry.version !== null ||
(entry.groups ?? [{ changes: entry.changes ?? [] }])
.some((group) => group.changes.some((change) => change.trim()))
);
const dispatch = createEventDispatcher(); const dispatch = createEventDispatcher();
function close() { dispatch('close'); } function close() { dispatch('close'); }
</script> </script>
@@ -17,17 +23,20 @@
<h4 class="about-heading">What's New</h4> <h4 class="about-heading">What's New</h4>
<ul class="changelog"> <ul class="changelog">
{#each CHANGELOG as entry (entry.version)} {#each visibleEntries as entry (entry.version)}
<li class="changelog-entry"> <li class="changelog-entry">
<div class="changelog-head"> <div class="changelog-head">
<span class="changelog-ver">v{entry.version}</span> <span class="changelog-ver">{entry.version === null ? 'In testing' : `v${entry.version}`}</span>
<span class="changelog-date text-muted">{entry.date}</span> {#if entry.date}<span class="changelog-date text-muted">{entry.date}</span>{/if}
</div> </div>
{#each entry.groups ?? [{ title: null, changes: entry.changes }] as group}
{#if group.title}<h5 class="changelog-group">{group.title}</h5>{/if}
<ul class="changelog-changes"> <ul class="changelog-changes">
{#each entry.changes as change} {#each group.changes as change}
<li>{change}</li> <li>{change}</li>
{/each} {/each}
</ul> </ul>
{/each}
</li> </li>
{/each} {/each}
</ul> </ul>
@@ -72,6 +81,11 @@
.changelog-date { .changelog-date {
font-size: 0.85rem; font-size: 0.85rem;
} }
.changelog-group {
margin: 0.75rem 0 0.3rem;
font-size: 1rem;
color: var(--text);
}
.changelog-changes { .changelog-changes {
margin: 0; margin: 0;
padding-left: 1.2rem; padding-left: 1.2rem;
+38 -28
View File
@@ -2,37 +2,47 @@
// (rendered by AboutModal.svelte). // (rendered by AboutModal.svelte).
// //
// Maintenance (see AGENTS.md "Versioning & changelog"): // Maintenance (see AGENTS.md "Versioning & changelog"):
// - Bump VERSION by one on every commit. // - Accumulate player-facing development changes in one version: null entry.
// - Add a CHANGELOG entry only when a commit changes something players can // - Only an explicitly requested release bumps VERSION and both flake.nix versions.
// see. Skip refactors, tests, and tooling. Keep wording player-facing. // - At release, consolidate the batch into titled groups and add its version/date.
export const VERSION = 50; export const VERSION = 26;
// Newest first. Each entry: { version, date: 'YYYY-MM-DD', changes: [string, ...] }. // Newest first. In testing: { version: null, changes: [string, ...] }.
// Release: { version, date: 'YYYY-MM-DD', groups: [{ title, changes: [...] }] }.
// Historical flat changes arrays are also supported. Omit the testing entry when empty.
export const CHANGELOG = [ export const CHANGELOG = [
{ version: 50, date: '2026-09-04', changes: ['The full rulebook and TL;DR rules now match the refreshed light and dark themes, with chart backgrounds and textured solid panels.'] }, {
{ version: 49, date: '2026-09-04', changes: ['Freshened both themes with nautical chart lines, woven panel textures, and richer sea-and-brass colors while keeping text clear.', 'The Event Log and My Notes now use the regular solid panel surface.'] }, version: 26,
{ version: 48, date: '2026-09-04', changes: ['Keep your own notes alongside the Event Log. Notes save automatically between sessions, including when you close the panel, and stay intact when the game rewinds or you create a new Pi-Rat.'] }, date: '2026-09-04',
{ version: 47, date: '2026-09-04', changes: ['Rewrote character suggestions with scrappy pirate looks, distinctive smells, first words, and crew quirks that fit Yeld.'] }, groups: [
{ version: 46, date: '2026-09-04', changes: ['Added a printable TL;DR rules page, linked at the top of the full rulebook.'] }, { title: 'Themes & table layout', changes: [
{ version: 44, date: '2026-09-04', changes: ['Crew Objectives opens as one connected panel, with the toggle and checklist sharing a border and background.'] }, 'Refreshed both themes across the game, full rulebook, and TL;DR rules with nautical chart backgrounds, woven solid panels, and richer sea-and-brass colors.',
{ version: 43, date: '2026-09-04', changes: ['The crew roster keeps players in the same order when roles or ranks change, including when someone becomes the Deep.'] }, 'The Event Log and My Notes use the regular panel surface. Log controls stay the same size when opened or closed, and Dev Mode changes no longer clutter the log.',
{ version: 42, date: '2026-09-04', changes: ['Gats require a description, including older Gats that were left blank. Read descriptions on character sheets or hover over Gat icons in the crew roster.', 'Gat descriptions and prompts follow Gat Taxes correctly and clear when you create a new recruit.'] }, 'Shorter labels, aligned Difficulty and Successes boxes, and a connected Crew Objectives panel make the table easier to scan. Removed the deck count.',
{ version: 41, date: '2026-09-04', changes: ['Dismiss a completed duel once you have read the result. Other players can still read it, and dismissed results stay hidden after a reload.'] }, 'Played cards show a check or cross in the corner so results stay clear in stacked cards.',
{ version: 40, date: '2026-09-04', changes: ['Played cards show a check or cross in the upper corner instead of a green or red outline, so results remain clear in stacked cards.'] }, ] },
{ version: 39, date: '2026-09-04', changes: ['Completed duels stay visible for the rest of the scene, showing the winner, both cards, and how the defense resolved.'] }, { title: 'Notes, characters & rules', changes: [
{ version: 38, date: '2026-09-04', changes: ['The crew roster shows who is online, with hat and gun icons for the Captain and Pi-Rats who have a Gat.'] }, 'Keep private notes alongside the Event Log. Notes save automatically between sessions and stay intact when the game rewinds or you create a new Pi-Rat.',
{ version: 37, date: '2026-09-04', changes: ['Color-match replacement cards arrive after the Deep resolves a Challenge. Each applied Obstacle accepts one card per Challenge, and each assistant can contribute one card.'] }, 'Rewrote character suggestions with scrappy pirate looks, distinctive smells, first words, and crew quirks that fit Yeld.',
{ version: 36, date: '2026-09-04', changes: ['Duel instructions clarify that only the defender draws a replacement for matching the Obstacles color, even when the defense fails.'] }, 'Added a printable TL;DR rules page, linked from the full rulebook.',
{ version: 35, date: '2026-09-04', changes: ['Personal objectives now require a group vote. Propose the next objective from a character sheet, then vote Yes or No at the table. A majority approves; the Captain breaks tied votes.'] }, 'Gats require descriptions, including older Gats. Read them on character sheets or hover over Gat icons in the roster. Descriptions follow Gat Taxes and clear for new recruits.',
{ version: 34, date: '2026-09-04', changes: ['Assistance is available only when a Challenge has multiple active Obstacles. Gat and Name Tax takeovers still work against a single Obstacle.'] }, ] },
{ version: 33, date: '2026-09-04', changes: ['Hand sizes compare ranks across the crew, including Pi-Rats whose players are the Deep.', 'Discarded cards return to the deck at scene setup. Only the previous Deep can refresh their hand during upkeep, once per scene.'] }, { title: 'Crew & voting', changes: [
{ version: 32, date: '2026-09-04', changes: ['Obstacles are automatically discarded with their columns once they reach one success per player. Unfinished obstacles carry over between scenes.'] }, 'The roster keeps a consistent player order and shows who is online, who is Captain, and who has a Gat.',
{ version: 31, date: '2026-09-04', changes: ['Change your rank-up vote until everyone has voted. The final vote now reveals the result and advances automatically, without a Ready button.', 'The vote result stays visible through upkeep and next-scene setup.'] }, 'Personal objectives use a group vote from the character sheet. A majority approves; the Captain breaks tied votes.',
{ version: 30, date: '2026-09-04', changes: ['The crew roster shows voting progress with icons.', 'Your submitted vote now shows the crewmate you nominated.'] }, 'Change your rank-up vote until everyone has voted. Roster icons show voting progress and your chosen crewmate. The result advances play automatically and stays visible through upkeep and next-scene setup.',
{ version: 29, date: '2026-09-04', changes: ['Removed the remaining deck count from the table.'] }, ] },
{ version: 28, date: '2026-09-04', changes: ['The Event Log toggle keeps the same size when opened or closed.', 'Dev Mode changes no longer clutter the Event Log.'] }, { title: 'Challenges, cards & upkeep', changes: [
{ version: 27, date: '2026-09-04', changes: ['Shorter labels make the table easier to scan.', 'Difficulty and Successes now line up side by side, including on small screens.'] }, 'Completed duels stay visible with the winner, both cards, and the defense result. Dismiss each result for yourself; your choice survives a reload.',
'Color-match replacement cards arrive after the Deep resolves a Challenge. Each Obstacle accepts one card per Challenge, and each assistant can contribute one card.',
'Assistance requires multiple Obstacles. Gat and Name Tax takeovers still work against a single Obstacle.',
'Duel instructions clarify that only the defender draws a replacement for matching the Obstacles color, including on failure.',
'Hand sizes compare ranks across the whole crew, including players acting as the Deep. Discards return to the deck at scene setup; only the previous Deep can refresh their hand during upkeep, once per scene.',
'Obstacles and their card columns are discarded after one success per player. Unfinished Obstacles carry over between scenes.',
] },
],
},
{ {
version: 25, version: 25,
date: '2026-07-10', date: '2026-07-10',