Commit Graph
100 Commits
Author SHA1 Message Date
kamilkrzywda 3ea2d1c38b chore(release): v0.14.0 — NEXT TURN button in the right pane (#52) 2026-10-06 12:51:11 +00:00
kamilkrzywda ca590c7b53 test(e2e): pin NEXT TURN full-width and no-overlap with the active-tasks strip (#52) 2026-10-06 12:51:11 +00:00
kamilkrzywda bb44530649 fix(ui): move NEXT TURN into the right pane — full width, no longer overlapped (#52) 2026-10-06 12:51:11 +00:00
kamilkrzywda 311eb5c713 Merge pull request 'feat: map spread limit — random 1-4 legs + loop-closing routes (#51, v0.13.0)' (#53) from feat/map-spread-limit into master
CI / build + unit + e2e (push) Successful in 3m15s
2026-10-06 14:40:01 +02:00
kamilkrzywda d20037762d chore: bump to v0.13.0 — #51 map spread limit + loop-closing routes
CI / build + unit + e2e (pull_request) Successful in 3m15s
2026-10-06 12:18:38 +00:00
kamilkrzywda ab22a7e68b save/e2e: #51 — wire generateRing attach into resolveJumpTask + spread-limit e2e
- resolveJumpTask: build existingEdgeKeys from all jump routes (both
  endpoints in the save's system set), pass all systems except the
  target as attachCandidates, insert closing routes for each attach.
- save.test.ts: jump test now expects 1–4 fresh systems (was pinned
  to exactly 4); A/B snapshot test stays green (both paths share the
  same resolveJumpTask code).
- e2e/helpers.ts: update stale comment ('4 fresh neighbours' →
  '1–4 new systems').
- e2e/smoke.spec.ts: new test verifying 1–4 mints, all undiscovered,
  each routed to the target, and BFS connectivity of the full graph.
2026-10-06 12:18:33 +00:00
kamilkrzywda 90de8818f8 world: #51 — ringEdges small-n fix + generateRing seeded 1–4 legs with attach
- ringEdges: n=0 → [], n=1 → [[0,1]], n=2 → [[0,1],[0,2],[1,2]];
  n≥3 wheel is byte-identical to the legacy output.
- generateRing: new params attachCandidates, existingEdgeKeys, anchorId;
  legCount is seeded-random in [EXPAND_MIN, EXPAND_MAX] (1–4);
  each leg may attach a known system (closing a loop) with prob ATTACH_PROB
  instead of minting; frontier guarantee converts the last-drawn attach
  to a mint when all legs attached.
- RingRegion gains attaches: number[] (candidate indices attached).
- Remove the EXPAND_RING constant (replaced by EXPAND_MIN/EXPAND_MAX).
2026-10-06 12:18:27 +00:00
kamilkrzywda a593cd04cd Merge pull request 'feat: trait outcome effects — FINDS HIDDEN THINGS + TALKS TO ANYONE (#43, v0.12.0)' (#50) from feat/trait-outcome-effects into master
CI / build + unit + e2e (push) Successful in 3m11s
2026-10-04 23:24:30 +02:00
kamilkrzywda 352ef31625 test(game): pin RECRUIT_CHANCE_BASE === CREW_CHANCE so the no-trait recruit path can't silently diverge (#43)
CI / build + unit + e2e (pull_request) Successful in 3m3s
2026-10-04 21:20:27 +00:00
kamilkrzywda 9af7d21d93 chore(release): v0.12.0 — trait outcome effects (#43) 2026-10-04 21:04:46 +00:00
kamilkrzywda 7d5a561882 docs: trait outcome effects implementation plan (#43) 2026-10-04 21:04:28 +00:00
kamilkrzywda 39920b3e05 feat(game): trait outcome effects — extra haul item + recruit chance (#43) 2026-10-04 21:04:24 +00:00
kamilkrzywda 92c2c26047 Merge pull request 'feat: skill progression & specialisation (#45, v0.11.0)' (#49) from feat/skill-progression into master
CI / build + unit + e2e (push) Successful in 3m2s
2026-10-04 05:52:27 +02:00
kamilkrzywda b8a998dcbb chore(release): v0.11.0 — skill progression & specialisation (#45)
CI / build + unit + e2e (pull_request) Successful in 2m52s
2026-10-04 03:49:06 +00:00
kamilkrzywda 1a36160392 feat(ui): skill levels + titles on CREW tab and team-builder (#45)
CI / build + unit + e2e (pull_request) Successful in 3m7s
2026-10-04 03:22:51 +00:00
kamilkrzywda 9d1a8e9d89 fix(game): grantXp event fires only on level transition, not while at-band (#45)
CI / build + unit + e2e (pull_request) Successful in 3m8s
2026-10-04 02:50:47 +00:00
kamilkrzywda f3751b4747 feat(game): skill XP on task completion + power bands in duration (#45)
CI / build + unit + e2e (pull_request) Successful in 2m48s
2026-10-04 02:34:56 +00:00
kamilkrzywda 5bc411cb76 fix(db): consistent starting xp in crew_skills seeder (#45) 2026-10-04 02:19:36 +00:00
kamilkrzywda 7f2121a717 feat(game): skills.ts — XP, levels, power bands, titles (#45)
CI / build + unit + e2e (pull_request) Successful in 2m53s
2026-10-04 01:33:05 +00:00
kamilkrzywda 449d4b9895 feat(db): crew_skills table + role-based starting levels — schema v8 (#45)
CI / build + unit + e2e (pull_request) Successful in 2m48s
2026-10-04 00:56:30 +00:00
kamilkrzywda 678cd48a94 Merge pull request 'fix: hydration-safe banner clock (#44, v0.10.1)' (#47) from fix/hydration-jump-dispatch into master
CI / build + unit + e2e (push) Successful in 3m32s
2026-10-04 01:52:28 +02:00
kamilkrzywda e792c8a06c fix(ui): team builder — coalesce the queued-jump block to null so an empty queue no longer disables JUMP dispatch (#44)
CI / build + unit + e2e (pull_request) Successful in 2m38s
2026-10-03 23:42:32 +00:00
kamilkrzywda 8f018a6ee9 chore(release): v0.10.1 — hydration-safe banner clock (#44)
CI / build + unit + e2e (pull_request) Failing after 33m24s
2026-10-03 18:36:40 +00:00
kamilkrzywda f1633eb518 fix(ui): hydration-safe banner clock — no build-time clock in the prerendered banner (#44, v0.10.1) 2026-10-03 18:36:19 +00:00
kamilkrzywda 1993623548 docs(agents): next.js agent rules block (added by next dev) 2026-10-03 18:36:15 +00:00
kamilkrzywda 9020a773e1 Merge pull request 'feat: crew-driven actions — queue + tick engine, NEXT TURN, team builder, task strip (#44, v0.10.0)' (#46) from feat/crew-driven-actions into master
CI / build + unit + e2e (push) Failing after 33m2s
CI / build + unit + e2e (pull_request) Failing after 32m56s
2026-10-03 03:07:42 +02:00
kamilkrzywda bf5ac8c8a8 chore(release): v0.10.0 — crew-driven actions engine (#44)
CI / build + unit + e2e (pull_request) Failing after 33m9s
2026-10-03 00:57:43 +00:00
kamilkrzywda babae7c392 docs: approved crew-driven-actions spec + implementation plan (#44) 2026-10-03 00:57:11 +00:00
kamilkrzywda a0307e4ccd fix(e2e): task-10 review fixes — Nth tick, retry-safe preambles, queue-DTO shape (#44)
CI / build + unit + e2e (pull_request) Failing after 34m10s
2026-10-03 00:35:10 +00:00
kamilkrzywda 1ddb8ad469 test(e2e): rework the suite to the queue + NEXT TURN model (#44) 2026-10-03 00:05:18 +00:00
kamilkrzywda b51bde3c25 test(e2e): rework the existing action tests to the queue + NEXT TURN model (2/3) (#44) 2026-10-02 23:45:11 +00:00
kamilkrzywda 53cf1bdacc test(e2e): rework shared helpers + state spec to the queue + NEXT TURN model (1/3) (#44) 2026-10-02 23:11:37 +00:00
kamilkrzywda f1b5645e9d feat(ui): active-tasks strip bottom-left — active first, pending dimmed (#44) 2026-10-02 21:02:37 +00:00
kamilkrzywda 1cabea7972 fix(ui): team builder lead rule mirrors the route busy check (helper-on-PENDING is not a valid lead) (#44) 2026-10-02 20:55:26 +00:00
kamilkrzywda a199b64348 feat(ui): team builder — lead + helpers with live duration preview, wired into the action panels (#44) 2026-10-02 20:34:14 +00:00
kamilkrzywda 07c1508999 feat(ui): NEXT TURN button (bottom-right) + turn counter; empty queue is a free skip (#44) 2026-10-02 20:04:38 +00:00
kamilkrzywda 1084f4e099 fix(api): guard task-queue name resolution against corrupted rows (#44) 2026-10-02 19:58:40 +00:00
kamilkrzywda 84d1aa8122 feat(api): world/system/crew snapshots expose the active + pending task queue (#44) 2026-10-02 19:42:19 +00:00
kamilkrzywda 178de6e4fb feat(api): POST /api/turn ticks the queue one turn; an empty queue is a free skip (#44) 2026-10-02 19:12:51 +00:00
kamilkrzywda 03b8b661f6 feat(api): ship + research endpoints queue tasks with lead + helpers; mission accept is instant and free (#44)
CI / build + unit + e2e (pull_request) Failing after 3m58s
2026-10-02 18:36:14 +00:00
kamilkrzywda 4e312d054f feat(api): jump + explore endpoints queue tasks with lead + helpers instead of resolving instantly (#44) 2026-10-02 15:47:31 +00:00
kamilkrzywda d7faf739a9 feat(game): tickTurn + runTurn — the turn tick: decrement, resolve, FIFO auto-start, one turn per call (#44) 2026-10-02 14:30:49 +00:00
kamilkrzywda bbcd77c41b feat(game): per-type resolvers — jump/explore/ship/research effect extraction for task resolution (#44) 2026-10-02 13:55:32 +00:00
kamilkrzywda d4491e082e feat(game): queueTask — queue-time validation, cost deduction, ACTIVE/PENDING row (#44) 2026-10-02 13:25:25 +00:00
kamilkrzywda 6c51c3cec8 feat(game): tasks table + schema v7 backfill, admin registry (#44) 2026-10-02 13:08:53 +00:00
kamilkrzywda f52a59c5fc feat(game): crew-costs balance module + computeDuration duration model (#44) 2026-10-02 12:58:57 +00:00
kamilkrzywda 2a8cb4da06 Merge pull request 'v0.9.12 — admin button + direct DB table CRUD, no auth for now (#38)' (#42) from admin-db-crud into master
CI / build + unit + e2e (push) Successful in 2m41s
2026-09-29 23:53:45 +02:00
kamilkrzywda 0d2370850f feat(admin): DB CRUD panel + /api/admin endpoints (#38)
CI / build + unit + e2e (pull_request) Successful in 3m47s
- ADMIN button in the mission-control header opens a table picker + row grid with add/edit/delete (components/admin-panel.tsx), deliberately unauthenticated by explicit request
- /api/admin/tables and /api/admin/tables/{name}/rows driven off a name→table registry built from lib/db/schema.ts (lib/db/admin.ts) — no per-table code; 404 unknown table, 400 malformed payload, 409 constraint violation
- OpenAPI spec updated for all four admin operations + Admin* schemas
- unit: lib/db/admin.test.ts (registry, CRUD round-trips, composite PKs, error mapping); e2e: read-only admin.spec.ts
2026-09-29 21:48:15 +00:00
kamilkrzywda be11aac356 Merge pull request 'v0.9.11 — fix #35 e2e spec (tab restore + strict mode), test-only' (#41) from fix-navai-e2e into master
CI / build + unit + e2e (push) Successful in 2m42s
2026-09-29 17:44:09 +02:00
kamilkrzywda fdc5624b0c fix(e2e): make the #35 NAV AI spec survive tab restore and multi-match sublabels
CI / build + unit + e2e (pull_request) Successful in 3m7s
2026-09-29 15:37:45 +00:00
kamilkrzywda ff4ced9d71 Merge pull request 'v0.9.11 — NAVIGATION AI unlocks two-hop jumps (#35)' (#40) from navigation-ai into master
CI / build + unit + e2e (push) Failing after 2m40s
2026-09-29 16:57:43 +02:00
kamilkrzywda d14ffdcf2f feat(game): NAVIGATION AI unlocks two-hop jumps in one action (#35)
CI / build + unit + e2e (pull_request) Failing after 3m11s
2026-09-29 14:53:11 +00:00
kamilkrzywda d083b5b708 Merge pull request 'v0.9.10 — world map fills entire tab area, no scrollbar (#36)' (#39) from world-map-full-area into master
CI / build + unit + e2e (push) Successful in 3m22s
2026-09-29 16:09:15 +02:00
kamilkrzywda c012b0fe56 fix(ui): keep the OPERATIONS tab bar intact when tall tabs overflow the pane (#36)
CI / build + unit + e2e (pull_request) Successful in 2m30s
2026-09-29 14:03:27 +00:00
kamilkrzywda 6483d510ef Merge pull request 'v0.9.10 — world map fills entire tab area, no scrollbar (#36)' (#37) from world-map-full-area into master
CI / build + unit + e2e (push) Failing after 13m40s
2026-09-29 15:03:00 +02:00
kamilkrzywda bc6bc7dd07 fix(ui): scale WORLD MAP to fill its tab pane without an internal scrollbar (#36)
CI / build + unit + e2e (pull_request) Failing after 13m30s
2026-09-29 12:59:16 +00:00
kamilkrzywda 3a786913df Merge pull request 'v0.9.9 — world map: force-directed graph with pan+zoom (#28)' (#34) from world-map-graph-viz into master
CI / build + unit + e2e (push) Successful in 3m10s
2026-09-29 13:27:17 +02:00
kamilkrzywda 978a1d119d feat(ui): render WORLD MAP as a force-directed d3 graph with pan + zoom (#28)
CI / build + unit + e2e (pull_request) Successful in 2m50s
2026-09-29 11:24:02 +00:00
kamilkrzywda a57c590bae Merge pull request 'v0.9.8 — pin tab bar at top while panel content scrolls (#31)' (#33) from pin-tab-bar into master
CI / build + unit + e2e (push) Successful in 2m49s
2026-09-29 12:25:01 +02:00
kamilkrzywda 1710e50b63 fix(ui): pin the OPERATIONS tab bar while panel content scrolls (#31)
CI / build + unit + e2e (pull_request) Successful in 2m47s
The TabsList is now position:sticky top:0 with a z-index above the panel
content. In wide mode it pins to the top of the OPERATIONS scroll area
(#21's center-pane scroller); in narrow mode, where the body scrolls and
there is no inner scroll container, it pins to the viewport. The existing
opaque background keeps scrolled content from showing through.
2026-09-29 10:22:14 +00:00
kamilkrzywda 1bb04d2a51 Merge pull request 'v0.9.7 — local system refreshes after jump, no page reload needed (#30)' (#32) from local-system-refresh into master
CI / build + unit + e2e (push) Successful in 3m7s
2026-09-29 12:03:41 +02:00
kamilkrzywda e27ff7015e fix(ui): refresh LOCAL SYSTEM after a jump instead of waiting for a page reload (#30)
CI / build + unit + e2e (pull_request) Successful in 2m39s
WorldMapPanel owns the world state and applied the /api/jump response
locally, so MissionControl's lifted /api/system state (LOCAL SYSTEM tab,
CARGO HOLD, SECTOR row) stayed on the previous system until a full refresh.
The panel now takes an onJumped callback that MissionControl wires to an
/api/system refetch after every successful jump.
2026-09-29 10:00:18 +00:00
kamilkrzywda e6c88b10c2 Merge pull request 'v0.9.6 — keep active tab between page refresh (#27)' (#29) from keep-active-tab into master
CI / build + unit + e2e (push) Successful in 2m46s
2026-09-29 11:43:21 +02:00
kamilkrzywda f4690bc1a2 feat(ui): keep the active operations tab across page refreshes (#27)
CI / build + unit + e2e (pull_request) Successful in 2m15s
Persist the selected tab ID to localStorage (sw-active-tab) on every change
and restore it on mount when it matches one of the seven valid tab IDs. The
Radix Tabs become controlled for this; SSR and first client render still agree
on the default, so there is no hydration mismatch.
2026-09-29 09:42:18 +00:00
kamilkrzywda 4b030716f7 Merge pull request 'v0.9.5 — fix infinite loop on name-pool exhaustion (server freeze) (#21)' (#26) from ui-layout-fix into master
CI / build + unit + e2e (push) Successful in 2m54s
2026-09-29 11:22:07 +02:00
kamilkrzywda 06f8a28e96 fix(game): numbered name fallback when pool exhausted — server no longer freezes past 128 systems
CI / build + unit + e2e (pull_request) Successful in 2m38s
Production freeze reported after the v0.9.3 (#21) deploy: every API route
hung and all panels stayed at LOADING. Root cause was not the #21 layout
(verified healthy across all 7 tabs/viewports) but makeName's unbounded
rejection loop over a finite 16x8=128 system-name pool — once a save grew
past ~128 systems, any jump into an undiscovered system spun forever on
Node's single thread (sql.js is synchronous), blocking the whole process.

makeName and makeCrewName now fall back to numbered variants ('Kepler Drift 2')
once their pools are exhausted, so they always terminate.
2026-09-29 09:18:00 +00:00
kamilkrzywda 36ff412f0b Merge pull request 'v0.9.4 — top bar shows app version instead of ◄ SHIP (#23)' (#25) from topbar-version into master
CI / build + unit + e2e (push) Successful in 3m12s
2026-09-29 10:33:19 +02:00
kamilkrzywda c35edc60d0 feat(ui): top bar shows app version instead of ◄ SHIP label (#23)
CI / build + unit + e2e (pull_request) Successful in 2m44s
2026-09-29 08:30:35 +00:00
kamilkrzywda f545792c36 Merge pull request 'v0.9.3 — layout: only middle pane scrolls, side panels stay fixed (#21)' (#24) from middle-pane-scroll into master
CI / build + unit + e2e (push) Successful in 2m29s
2026-09-29 10:24:56 +02:00
kamilkrzywda 593cca5dce release v0.9.3
CI / build + unit + e2e (pull_request) Successful in 2m49s
2026-09-29 08:21:14 +00:00
kamilkrzywda d2fb252a98 feat(ui): only the middle column scrolls — side panes stay fixed (#21)
Pin the wide layout to the viewport (height:100vh + overflow:hidden on the
root), add min-height:0 to the BODY wrapper and 3-column grid so the flex
chain actually constrains, and make the OPERATIONS panel a flex column whose
PanelContent is the scroll area (header stays pinned; the Panel root's default
overflow:hidden would otherwise clip). Columns' existing overflow-y:auto now
scrolls inside their tracks. Narrow mode keeps natural body flow.
2026-09-29 08:21:14 +00:00
kamilkrzywda bf6d8714e6 Merge pull request 'v0.9.2 — WORLD MAP: click-to-jump on galactic chart, drop jump routes list (#19)' (#22) from world-map-click-jump into master
CI / build + unit + e2e (push) Successful in 2m19s
2026-09-29 10:06:05 +02:00
kamilkrzywda 32dda04e92 release v0.9.2
CI / build + unit + e2e (pull_request) Successful in 2m57s
2026-09-29 08:00:44 +00:00
kamilkrzywda ef1d282770 feat(ui): world map — jump by clicking chart fields (#19)
Remove the bottom JUMP ROUTES button list; systems adjacent to the current
one become clickable galactic-chart nodes (same POST /api/jump flow, same
state refreshes). Current + unreachable systems are dimmed and not
clickable. NodeGraph gains optional onNodeClick + per-node disabled
(backward-compatible); two smoke tests updated to click chart fields.
2026-09-29 08:00:44 +00:00
kamilkrzywda 18ca5eae6c Merge pull request 'v0.9.1 — layout pass: CARGO HOLD to right pane, wider panes, drop placeholders' (#20) from layout-tweaks into master
CI / build + unit + e2e (push) Successful in 2m27s
2026-09-29 09:12:54 +02:00
kamilkrzywda b05ac32da6 release v0.9.1
CI / build + unit + e2e (pull_request) Successful in 2m37s
2026-09-29 06:48:20 +00:00
kamilkrzywda 85627201f8 feat(ui): layout pass — CARGO HOLD to right column, wider panes, drop placeholders
CARGO HOLD // INVENTORY moves out of the LOCAL SYSTEM tab into a persistent
right-column panel; UPCOMING ENCOUNTERS removed; SHIP DATA folded into VESSEL
METRICS (SECTOR + TURN kept with real values, filler dropped). Grid goes
260px/1fr/240px -> 320px/1fr/360px. Cargo state uses the lifted-state pattern:
MissionControl owns /api/system and LocalSystemPanel reports each scan's
response up via onChanged (ShipSystemsPanel style) — no polling.
2026-09-29 06:48:20 +00:00
kamilkrzywda fb11a8ef81 Merge pull request 'v0.9.0 — EVENT LOG: real game events in the terminal (#11)' (#18) from event-log into master
CI / build + unit + e2e (push) Successful in 2m51s
2026-09-29 05:05:30 +02:00
kamilkrzywda 37b193ffb8 test(e2e): tab-switch test — assert real log lines, not the removed placeholder
CI / build + unit + e2e (pull_request) Successful in 2m36s
CI run 361: v0.9.0 replaced the placeholder feed with EventLogPanel, but this
pre-existing assertion still expected 'SHIP LOG // PLACEHOLDER FEED'. Assert a
real T<turn> // <MESSAGE> line instead — every save has the turn-0 new_game
event, so it holds on a fresh stack and across retries.
2026-09-29 03:02:04 +00:00
kamilkrzywda 760a45fc4b release v0.9.0
CI / build + unit + e2e (pull_request) Failing after 3m12s
2026-09-29 02:48:25 +00:00
kamilkrzywda 0b435a583b test(e2e): event log entries + restart persistence
smoke: jump (shared helper) + scan, then assert both events are in
GET /api/events with the newer one first, and that the EVENT LOG terminal
renders both T<turn> // <MESSAGE> lines. Idempotent across retries — asserts
on this run's own entries by turn/message, never absolute counts. state: the
latest five log lines come back identical (ids included) after the mid-run
container restart.
2026-09-29 02:47:36 +00:00
kamilkrzywda 29e8ac6909 feat(ui): EVENT LOG tab renders the real game log
Self-fetching EventLogPanel (MissionPanel pattern — refetches on each tab
open). One terminal line per event: T<turn> // <MESSAGE>, newest first, with
the event's local time as the timestamp; new_game lines render as system
lines. Placeholder feed + now() removed from mission-control.
2026-09-29 02:45:38 +00:00
kamilkrzywda 21abf8768f feat(api): GET /api/events endpoint + OpenAPI
Latest game events, newest first; auto-initializes like the other reads.
?limit= defaults to 50 (cap 200), non-integer/out-of-range → 400. OpenAPI
spec gains the path + Event schema (14 -> 15 paths).
2026-09-29 02:45:38 +00:00
kamilkrzywda 8d678d73ce test: assert events for the remaining action types
expand had no event assertion at all; build and mission-complete asserted
type/message but not the event's turn. Issue #11 requires every action type
to be covered with correct turn/type/message.
2026-09-29 02:45:38 +00:00
kamilkrzywda 0d5858695a feat(events): event log read — getEvents + limit parsing
lib/game/events.ts: the latest N events of the save, newest first (ORDER BY
id DESC), with parseEventLimit for the optional ?limit= param (default 50,
cap 200, 400 otherwise). Unit tests cover default/accept/reject and
newest-first ordering + slicing.
2026-09-29 02:45:38 +00:00
kamilkrzywda 6c828e40a6 Merge pull request 'v0.8.0 — MISSIONS: generation, accept & complete (#10)' (#17) from missions into master
CI / build + unit + e2e (push) Successful in 2m44s
2026-09-29 04:21:13 +02:00
kamilkrzywda b5a072c9aa test(e2e): mission test — match dotted ACTIVE badge, idempotent across retries
CI / build + unit + e2e (pull_request) Successful in 2m25s
CI run 358: the ACTIVE assertion used exact text but badge.tsx renders a
'●' dot prefix for ACTIVE variants (text is '●ACTIVE'), so it could never
match. And attempt 1's accept persisted an ACTIVE mission, leaving every
ACCEPT button disabled on retry. Drop exact matching and, when a leftover
active mission exists, assert the UI state and complete that one instead of
re-accepting.
2026-09-29 02:18:14 +00:00
kamilkrzywda 85eeeecc4a release v0.8.0
CI / build + unit + e2e (pull_request) Failing after 2m53s
2026-09-29 01:56:24 +00:00
kamilkrzywda 70f95145ae test(e2e): mission accept -> complete + board survives restart
smoke: pick an AVAILABLE contract (non-DELIVER preferred), accept it through
the UI (card flips ACTIVE, button disables), complete via API — scan loop for
EXPLORE/FIND, BFS jump path for DELIVER — assert DONE and the reward landed in
the hold. state: mission board deep-equal across the mid-run container restart.
2026-09-29 01:55:49 +00:00
kamilkrzywda 684a126a5b feat(ui): MISSIONS tab renders the live mission board
Self-fetching MissionPanel (world-map pattern — refetches on each tab open,
accept responses applied directly). One card per contract: type title + state
badge, CONTRACT // #id line, objective, reward line, EXPLORE progress line.
ACCEPT enabled only when AVAILABLE and nothing else is ACTIVE. Placeholder
encounter content removed.
2026-09-29 01:55:49 +00:00
kamilkrzywda 786a5ec001 feat(api): GET /api/missions + POST /api/missions/{id}/accept
Routes call ensureSave first (mission functions assume an initialized save),
map MissionError to 404/409 and non-integer path ids to 400. OpenAPI spec in
code gains both paths + the Mission schema (12 -> 14 paths); openapi.test.ts
covers the new shapes.
2026-09-29 01:55:41 +00:00
kamilkrzywda f356ffbe93 feat(missions): mission board — schema, deterministic generation, top-up + v6 backfill
New missions table (schema + DDL). Pure model in lib/game/missions.ts:
DELIVER / EXPLORE / FIND contracts generated from missionRng(seed, turn),
board always topped up to >=3 AVAILABLE after every action. save.ts wires
SCHEMA_VERSION 5 -> 6 with a v6 backfill step and completion hooks inside
jumpToSystem/explorePlanet (one atomic persist). Unit tests cover generation
determinism, top-up idempotency, backfill, accept validation and per-type
completion incl. reward accumulation.
2026-09-29 01:55:34 +00:00
kamilkrzywda 5657e8938a Merge pull request 'v0.7.0 — SKILL TREE: technology research unlocks (#9)' (#16) from skill-tree into master
CI / build + unit + e2e (push) Successful in 2m52s
2026-09-29 02:59:32 +02:00
kamilkrzywda 80885c8ad7 test: e2e jump helper prefers undiscovered systems — fixes exhausted-territory ping-pong
CI / build + unit + e2e (pull_request) Successful in 2m30s
2026-09-29 00:56:28 +00:00
kamilkrzywda a62ed2cf95 release v0.7.0
CI / build + unit + e2e (pull_request) Failing after 2m41s
2026-09-29 00:39:04 +00:00
kamilkrzywda 672e99bd96 e2e: research unlocks the gated WEAPONS build via UI + tech state survives restart 2026-09-29 00:38:09 +00:00
kamilkrzywda 94e9fc728c ui: real SKILL TREE tab (research) + SHIP SYSTEMS buttons gated by researched techs 2026-09-29 00:35:39 +00:00
kamilkrzywda 7b0227cde9 api+openapi: GET /api/tech + POST /api/research with 400/404/409/422 mapping 2026-09-29 00:30:10 +00:00
kamilkrzywda 8818f0928d game: tech research action + ship-action gating by researched techs (build gate, raised caps) 2026-09-29 00:24:25 +00:00
kamilkrzywda 4ef924edd6 db+game: tech table + starting tech list seeded on new game and v5 backfill step 2026-09-29 00:20:02 +00:00