Esposter TypeScript conventions — banned patterns (Omit over Except, forEach, parameter properties, the void operator), as unknown as treated like any (model the type instead; the rare mock and library-seam exceptions), declare over ! on class fields, arrow functions and overloads, neverthrow promise style, InvalidOperationError, guard clauses, exhaustive switch guards, enum naming/refs/values arrays, discriminant-keyed maps for polymorphic dispatch, and the string "" sentinel with the null-vs-undefined rules. Apply when writing any TypeScript in this project.
Esposter vue-phaserjs integration patterns — component inventory, markRaw for Phaser objects in Pinia stores, configuration Pick pattern, all-configuration-keys-present-at-setup. Apply when writing Phaser game objects, stores, or vue-phaserjs components.
Esposter git workflow conventions — commit message format, safety rules, and branch hygiene. Apply when running git operations or advising on source control workflows.
Esposter pnpm script reference — packages/app scripts (lint, typecheck, test, format, dev, build) and the root scripts (test, coverage, depcruise:graph, outdated:dependencies). Apply whenever running or recommending package scripts.
Esposter Vitest testing conventions — describe with function refs, canonical test values, takeOne for unsafe index access, destructuring from stores/composables, mock session patterns (getMockSession/mockSessionOnce/replayMockSession), mock cleanup by creation style, toThrowErrorMatchingInlineSnapshot as the only error assertion, the node-default test environment (nuxt only via per-file directive; stub window for client/server paths), bundle-size snapshot tests, and type-level conventions for .test-d.ts files. Apply when writing .test.ts or .test-d.ts files.
Esposter responsive/mobile UI conventions — command bars collapse into a single overflow dropdown of icon+text list items on narrow viewports, which controls never collapse, and when flex-wrap is the allowed exception. Apply when adding or editing any toolbar, action row, or button group that must work on mobile.
Esposter Vue 3 component architecture — the shared Styled/App shell primitives, same level of abstraction, the wrapper + pure-child pattern for async data, generic SFCs, per-variant type correctness, is-prefixed boolean props typed as the non-default literal, present-tense emit names, component folder naming and Nuxt auto-import name collapse, defineSlots and conditional slot forwarding, slot extraction, array + v-for over hardcoded list items, shared list-item shells with action slots, permission-filtered action items, one affordance per action, singleton dialogs over per-item dialogs, page decomposition, and maximal component granularity. Apply when designing, decomposing, naming, or refactoring Vue components.
Esposter Vuetify 4 conventions — StyledButton for primary actions, :to for plain navigation with @click navigateTo for logic-then-navigate, v-prefixed auto-imported composables (useVDisplay/useVTheme), global defaults never repeated, v-btn tooltips, mergeProps for nested activators, typed SelectItemCategoryDefinition for selects/lists/menus (clearable banned), enum-value-as-display-title, dialog form validity (StyledFormDialog vs StyledEditFormDialog), StyledList, useVRules form validation, StyledAvatar, CSS custom properties over SASS variables, and scrollspy sub-nav. Apply when writing or reviewing Vuetify components, dialogs, selects, forms, or lists.