@lyellr88/buddy-mcp 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (258) hide show
  1. package/README.md +219 -0
  2. package/dist/config/claude-config.d.ts +7 -0
  3. package/dist/config/claude-config.d.ts.map +1 -0
  4. package/dist/config/claude-config.js +107 -0
  5. package/dist/config/claude-config.js.map +1 -0
  6. package/dist/config/hooks.d.ts +22 -0
  7. package/dist/config/hooks.d.ts.map +1 -0
  8. package/dist/config/hooks.js +58 -0
  9. package/dist/config/hooks.js.map +1 -0
  10. package/dist/config/index.d.ts +4 -0
  11. package/dist/config/index.d.ts.map +1 -0
  12. package/dist/config/index.js +6 -0
  13. package/dist/config/index.js.map +1 -0
  14. package/dist/config/pet-config.d.ts +12 -0
  15. package/dist/config/pet-config.d.ts.map +1 -0
  16. package/dist/config/pet-config.js +150 -0
  17. package/dist/config/pet-config.js.map +1 -0
  18. package/dist/constants.d.ts +24 -0
  19. package/dist/constants.d.ts.map +1 -0
  20. package/dist/constants.js +94 -0
  21. package/dist/constants.js.map +1 -0
  22. package/dist/finder/estimator.d.ts +3 -0
  23. package/dist/finder/estimator.d.ts.map +1 -0
  24. package/dist/finder/estimator.js +27 -0
  25. package/dist/finder/estimator.js.map +1 -0
  26. package/dist/finder/index.d.ts +3 -0
  27. package/dist/finder/index.d.ts.map +1 -0
  28. package/dist/finder/index.js +3 -0
  29. package/dist/finder/index.js.map +1 -0
  30. package/dist/finder/orchestrator.d.ts +8 -0
  31. package/dist/finder/orchestrator.d.ts.map +1 -0
  32. package/dist/finder/orchestrator.js +163 -0
  33. package/dist/finder/orchestrator.js.map +1 -0
  34. package/dist/finder/worker.d.ts +3 -0
  35. package/dist/finder/worker.d.ts.map +1 -0
  36. package/dist/finder/worker.js +130 -0
  37. package/dist/finder/worker.js.map +1 -0
  38. package/dist/generation/hash.d.ts +5 -0
  39. package/dist/generation/hash.d.ts.map +1 -0
  40. package/dist/generation/hash.js +37 -0
  41. package/dist/generation/hash.js.map +1 -0
  42. package/dist/generation/index.d.ts +4 -0
  43. package/dist/generation/index.d.ts.map +1 -0
  44. package/dist/generation/index.js +4 -0
  45. package/dist/generation/index.js.map +1 -0
  46. package/dist/generation/rng.d.ts +4 -0
  47. package/dist/generation/rng.d.ts.map +1 -0
  48. package/dist/generation/rng.js +14 -0
  49. package/dist/generation/rng.js.map +1 -0
  50. package/dist/generation/roll.d.ts +7 -0
  51. package/dist/generation/roll.d.ts.map +1 -0
  52. package/dist/generation/roll.js +51 -0
  53. package/dist/generation/roll.js.map +1 -0
  54. package/dist/mcp/index.d.ts +5 -0
  55. package/dist/mcp/index.d.ts.map +1 -0
  56. package/dist/mcp/index.js +273 -0
  57. package/dist/mcp/index.js.map +1 -0
  58. package/dist/mcp/persistence.d.ts +6 -0
  59. package/dist/mcp/persistence.d.ts.map +1 -0
  60. package/dist/mcp/persistence.js +129 -0
  61. package/dist/mcp/persistence.js.map +1 -0
  62. package/dist/mcp/state.d.ts +74 -0
  63. package/dist/mcp/state.d.ts.map +1 -0
  64. package/dist/mcp/state.js +20 -0
  65. package/dist/mcp/state.js.map +1 -0
  66. package/dist/mcp/tools/auto.d.ts +4 -0
  67. package/dist/mcp/tools/auto.d.ts.map +1 -0
  68. package/dist/mcp/tools/auto.js +15 -0
  69. package/dist/mcp/tools/auto.js.map +1 -0
  70. package/dist/mcp/tools/core.d.ts +2 -0
  71. package/dist/mcp/tools/core.d.ts.map +1 -0
  72. package/dist/mcp/tools/core.js +350 -0
  73. package/dist/mcp/tools/core.js.map +1 -0
  74. package/dist/mcp/tools/export.d.ts +2 -0
  75. package/dist/mcp/tools/export.d.ts.map +1 -0
  76. package/dist/mcp/tools/export.js +161 -0
  77. package/dist/mcp/tools/export.js.map +1 -0
  78. package/dist/mcp/tools/interact.d.ts +2 -0
  79. package/dist/mcp/tools/interact.d.ts.map +1 -0
  80. package/dist/mcp/tools/interact.js +56 -0
  81. package/dist/mcp/tools/interact.js.map +1 -0
  82. package/dist/mcp/tools/stats.d.ts +4 -0
  83. package/dist/mcp/tools/stats.d.ts.map +1 -0
  84. package/dist/mcp/tools/stats.js +87 -0
  85. package/dist/mcp/tools/stats.js.map +1 -0
  86. package/dist/mcp/watcher.d.ts +3 -0
  87. package/dist/mcp/watcher.d.ts.map +1 -0
  88. package/dist/mcp/watcher.js +117 -0
  89. package/dist/mcp/watcher.js.map +1 -0
  90. package/dist/patcher/binary-finder.d.ts +3 -0
  91. package/dist/patcher/binary-finder.d.ts.map +1 -0
  92. package/dist/patcher/binary-finder.js +169 -0
  93. package/dist/patcher/binary-finder.js.map +1 -0
  94. package/dist/patcher/index.d.ts +5 -0
  95. package/dist/patcher/index.d.ts.map +1 -0
  96. package/dist/patcher/index.js +5 -0
  97. package/dist/patcher/index.js.map +1 -0
  98. package/dist/patcher/patch.d.ts +5 -0
  99. package/dist/patcher/patch.d.ts.map +1 -0
  100. package/dist/patcher/patch.js +148 -0
  101. package/dist/patcher/patch.js.map +1 -0
  102. package/dist/patcher/preflight.d.ts +5 -0
  103. package/dist/patcher/preflight.d.ts.map +1 -0
  104. package/dist/patcher/preflight.js +145 -0
  105. package/dist/patcher/preflight.js.map +1 -0
  106. package/dist/patcher/salt-ops.d.ts +18 -0
  107. package/dist/patcher/salt-ops.d.ts.map +1 -0
  108. package/dist/patcher/salt-ops.js +93 -0
  109. package/dist/patcher/salt-ops.js.map +1 -0
  110. package/dist/personalities.d.ts +10 -0
  111. package/dist/personalities.d.ts.map +1 -0
  112. package/dist/personalities.js +295 -0
  113. package/dist/personalities.js.map +1 -0
  114. package/dist/presets.d.ts +11 -0
  115. package/dist/presets.d.ts.map +1 -0
  116. package/dist/presets.js +207 -0
  117. package/dist/presets.js.map +1 -0
  118. package/dist/sprites/data.d.ts +4 -0
  119. package/dist/sprites/data.d.ts.map +1 -0
  120. package/dist/sprites/data.js +103 -0
  121. package/dist/sprites/data.js.map +1 -0
  122. package/dist/sprites/index.d.ts +3 -0
  123. package/dist/sprites/index.d.ts.map +1 -0
  124. package/dist/sprites/index.js +3 -0
  125. package/dist/sprites/index.js.map +1 -0
  126. package/dist/sprites/render.d.ts +15 -0
  127. package/dist/sprites/render.d.ts.map +1 -0
  128. package/dist/sprites/render.js +77 -0
  129. package/dist/sprites/render.js.map +1 -0
  130. package/dist/tui/animator.d.ts +13 -0
  131. package/dist/tui/animator.d.ts.map +1 -0
  132. package/dist/tui/animator.js +39 -0
  133. package/dist/tui/animator.js.map +1 -0
  134. package/dist/tui/apply/index.d.ts +9 -0
  135. package/dist/tui/apply/index.d.ts.map +1 -0
  136. package/dist/tui/apply/index.js +553 -0
  137. package/dist/tui/apply/index.js.map +1 -0
  138. package/dist/tui/builder/colors.d.ts +15 -0
  139. package/dist/tui/builder/colors.d.ts.map +1 -0
  140. package/dist/tui/builder/colors.js +20 -0
  141. package/dist/tui/builder/colors.js.map +1 -0
  142. package/dist/tui/builder/index.d.ts +6 -0
  143. package/dist/tui/builder/index.d.ts.map +1 -0
  144. package/dist/tui/builder/index.js +172 -0
  145. package/dist/tui/builder/index.js.map +1 -0
  146. package/dist/tui/builder/keyboard.d.ts +17 -0
  147. package/dist/tui/builder/keyboard.d.ts.map +1 -0
  148. package/dist/tui/builder/keyboard.js +76 -0
  149. package/dist/tui/builder/keyboard.js.map +1 -0
  150. package/dist/tui/builder/preview-panel.d.ts +9 -0
  151. package/dist/tui/builder/preview-panel.d.ts.map +1 -0
  152. package/dist/tui/builder/preview-panel.js +103 -0
  153. package/dist/tui/builder/preview-panel.js.map +1 -0
  154. package/dist/tui/builder/selection-panel.d.ts +11 -0
  155. package/dist/tui/builder/selection-panel.d.ts.map +1 -0
  156. package/dist/tui/builder/selection-panel.js +446 -0
  157. package/dist/tui/builder/selection-panel.js.map +1 -0
  158. package/dist/tui/builder/stat-bars.d.ts +4 -0
  159. package/dist/tui/builder/stat-bars.d.ts.map +1 -0
  160. package/dist/tui/builder/stat-bars.js +46 -0
  161. package/dist/tui/builder/stat-bars.js.map +1 -0
  162. package/dist/tui/builder/state.d.ts +22 -0
  163. package/dist/tui/builder/state.d.ts.map +1 -0
  164. package/dist/tui/builder/state.js +92 -0
  165. package/dist/tui/builder/state.js.map +1 -0
  166. package/dist/tui/cli.d.ts +3 -0
  167. package/dist/tui/cli.d.ts.map +1 -0
  168. package/dist/tui/cli.js +26 -0
  169. package/dist/tui/cli.js.map +1 -0
  170. package/dist/tui/commands/buddies.d.ts +2 -0
  171. package/dist/tui/commands/buddies.d.ts.map +1 -0
  172. package/dist/tui/commands/buddies.js +172 -0
  173. package/dist/tui/commands/buddies.js.map +1 -0
  174. package/dist/tui/commands/current.d.ts +2 -0
  175. package/dist/tui/commands/current.d.ts.map +1 -0
  176. package/dist/tui/commands/current.js +35 -0
  177. package/dist/tui/commands/current.js.map +1 -0
  178. package/dist/tui/commands/interactive.d.ts +6 -0
  179. package/dist/tui/commands/interactive.d.ts.map +1 -0
  180. package/dist/tui/commands/interactive.js +385 -0
  181. package/dist/tui/commands/interactive.js.map +1 -0
  182. package/dist/tui/commands/preview.d.ts +3 -0
  183. package/dist/tui/commands/preview.d.ts.map +1 -0
  184. package/dist/tui/commands/preview.js +94 -0
  185. package/dist/tui/commands/preview.js.map +1 -0
  186. package/dist/tui/commands/rehatch.d.ts +2 -0
  187. package/dist/tui/commands/rehatch.d.ts.map +1 -0
  188. package/dist/tui/commands/rehatch.js +30 -0
  189. package/dist/tui/commands/rehatch.js.map +1 -0
  190. package/dist/tui/commands/restore.d.ts +2 -0
  191. package/dist/tui/commands/restore.d.ts.map +1 -0
  192. package/dist/tui/commands/restore.js +52 -0
  193. package/dist/tui/commands/restore.js.map +1 -0
  194. package/dist/tui/commands/share.d.ts +2 -0
  195. package/dist/tui/commands/share.d.ts.map +1 -0
  196. package/dist/tui/commands/share.js +105 -0
  197. package/dist/tui/commands/share.js.map +1 -0
  198. package/dist/tui/commands/start-screen.d.ts +3 -0
  199. package/dist/tui/commands/start-screen.d.ts.map +1 -0
  200. package/dist/tui/commands/start-screen.js +93 -0
  201. package/dist/tui/commands/start-screen.js.map +1 -0
  202. package/dist/tui/display.d.ts +5 -0
  203. package/dist/tui/display.d.ts.map +1 -0
  204. package/dist/tui/display.js +33 -0
  205. package/dist/tui/display.js.map +1 -0
  206. package/dist/tui/format.d.ts +5 -0
  207. package/dist/tui/format.d.ts.map +1 -0
  208. package/dist/tui/format.js +21 -0
  209. package/dist/tui/format.js.map +1 -0
  210. package/dist/tui/gallery/index.d.ts +12 -0
  211. package/dist/tui/gallery/index.d.ts.map +1 -0
  212. package/dist/tui/gallery/index.js +153 -0
  213. package/dist/tui/gallery/index.js.map +1 -0
  214. package/dist/tui/gallery/keyboard.d.ts +15 -0
  215. package/dist/tui/gallery/keyboard.d.ts.map +1 -0
  216. package/dist/tui/gallery/keyboard.js +41 -0
  217. package/dist/tui/gallery/keyboard.js.map +1 -0
  218. package/dist/tui/gallery/profile-list-panel.d.ts +10 -0
  219. package/dist/tui/gallery/profile-list-panel.d.ts.map +1 -0
  220. package/dist/tui/gallery/profile-list-panel.js +66 -0
  221. package/dist/tui/gallery/profile-list-panel.js.map +1 -0
  222. package/dist/tui/gallery/profile-preview-panel.d.ts +9 -0
  223. package/dist/tui/gallery/profile-preview-panel.d.ts.map +1 -0
  224. package/dist/tui/gallery/profile-preview-panel.js +121 -0
  225. package/dist/tui/gallery/profile-preview-panel.js.map +1 -0
  226. package/dist/tui/gallery/state.d.ts +13 -0
  227. package/dist/tui/gallery/state.d.ts.map +1 -0
  228. package/dist/tui/gallery/state.js +33 -0
  229. package/dist/tui/gallery/state.js.map +1 -0
  230. package/dist/tui/index.d.ts +9 -0
  231. package/dist/tui/index.d.ts.map +1 -0
  232. package/dist/tui/index.js +9 -0
  233. package/dist/tui/index.js.map +1 -0
  234. package/dist/tui/launcher.d.ts +3 -0
  235. package/dist/tui/launcher.d.ts.map +1 -0
  236. package/dist/tui/launcher.js +24 -0
  237. package/dist/tui/launcher.js.map +1 -0
  238. package/dist/tui/presets/index.d.ts +3 -0
  239. package/dist/tui/presets/index.d.ts.map +1 -0
  240. package/dist/tui/presets/index.js +202 -0
  241. package/dist/tui/presets/index.js.map +1 -0
  242. package/dist/tui/presets/preset-list-panel.d.ts +9 -0
  243. package/dist/tui/presets/preset-list-panel.d.ts.map +1 -0
  244. package/dist/tui/presets/preset-list-panel.js +52 -0
  245. package/dist/tui/presets/preset-list-panel.js.map +1 -0
  246. package/dist/tui/prompts.d.ts +13 -0
  247. package/dist/tui/prompts.d.ts.map +1 -0
  248. package/dist/tui/prompts.js +126 -0
  249. package/dist/tui/prompts.js.map +1 -0
  250. package/dist/tui/start/index.d.ts +3 -0
  251. package/dist/tui/start/index.d.ts.map +1 -0
  252. package/dist/tui/start/index.js +170 -0
  253. package/dist/tui/start/index.js.map +1 -0
  254. package/dist/types.d.ts +113 -0
  255. package/dist/types.d.ts.map +1 -0
  256. package/dist/types.js +2 -0
  257. package/dist/types.js.map +1 -0
  258. package/package.json +82 -0
@@ -0,0 +1,446 @@
1
+ import { Box, Select, SelectRenderableEvents } from '@opentui/core';
2
+ import { SPECIES, EYES, RARITIES, RARITY_STARS, RARITY_WEIGHTS, HATS, STAT_NAMES, } from '../../constants.js';
3
+ import { renderFace } from '../../sprites/index.js';
4
+ import { FOCUS_BORDER, UNFOCUS_BORDER, DISABLED_BORDER, DISABLED_TEXT, HIGHLIGHT_BG, HIGHLIGHT_FG, UNFOCUS_TEXT, } from "./colors.js";
5
+ import { applyRarityConstraints, applyDumpConstraint, getVisibleFields, } from "./state.js";
6
+ // --- Option generators ---
7
+ function speciesOptions() {
8
+ return SPECIES.map((s) => {
9
+ const face = renderFace({ species: s, eye: '\u00B7' });
10
+ return { name: `${s.padEnd(10)} ${face}`, description: '', value: s };
11
+ });
12
+ }
13
+ function eyeOptions(species) {
14
+ return EYES.map((e) => {
15
+ const face = renderFace({ species, eye: e });
16
+ return { name: `${e} ${face}`, description: '', value: e };
17
+ });
18
+ }
19
+ function rarityOptions() {
20
+ return RARITIES.map((r) => ({
21
+ name: `${r.padEnd(12)} ${RARITY_STARS[r].padEnd(6)} (${RARITY_WEIGHTS[r]}%)`,
22
+ description: '',
23
+ value: r,
24
+ }));
25
+ }
26
+ function hatOptions() {
27
+ return HATS.filter((h) => h !== 'none').map((h) => ({
28
+ name: h,
29
+ description: '',
30
+ value: h,
31
+ }));
32
+ }
33
+ function shinyOptions() {
34
+ return [
35
+ { name: 'No', description: '', value: false },
36
+ { name: 'Yes (~100x longer search)', description: '', value: true },
37
+ ];
38
+ }
39
+ function statsModeOptions() {
40
+ return [
41
+ { name: 'None', description: '', value: 'none' },
42
+ { name: 'Customize (~20x longer search)', description: '', value: 'customize' },
43
+ ];
44
+ }
45
+ function statOptions(exclude) {
46
+ return STAT_NAMES.filter((s) => s !== exclude).map((s) => ({
47
+ name: s,
48
+ description: '',
49
+ value: s,
50
+ }));
51
+ }
52
+ const DEFAULT_DISABLED = [
53
+ { name: '\u2014', description: '', value: '__disabled__' },
54
+ ];
55
+ function getDisabledOptions(field) {
56
+ return DISABLED_OPTIONS[field] ?? DEFAULT_DISABLED;
57
+ }
58
+ const DISABLED_OPTIONS = {
59
+ hat: [
60
+ { name: 'Common rarity pets don\u2019t wear hats.', description: '', value: '__disabled__' },
61
+ { name: 'Change Rarity above to unlock hats.', description: '', value: '__disabled__' },
62
+ ],
63
+ peak: [
64
+ { name: 'Set Stats to "Customize" to pick', description: '', value: '__disabled__' },
65
+ { name: 'your best stat.', description: '', value: '__disabled__' },
66
+ ],
67
+ dump: [
68
+ { name: 'Set Stats to "Customize" to pick', description: '', value: '__disabled__' },
69
+ { name: 'your worst stat.', description: '', value: '__disabled__' },
70
+ ],
71
+ };
72
+ // --- Field label map ---
73
+ const FIELD_LABELS = {
74
+ species: 'Species',
75
+ eye: 'Eyes',
76
+ rarity: 'Rarity',
77
+ hat: 'Hat',
78
+ shiny: 'Shiny',
79
+ statsMode: 'Stats',
80
+ peak: 'Best Stat',
81
+ dump: 'Worst Stat',
82
+ };
83
+ // --- Styles ---
84
+ const FOCUSED_SELECT = {
85
+ selectedBackgroundColor: HIGHLIGHT_BG,
86
+ selectedTextColor: HIGHLIGHT_FG,
87
+ textColor: '#CCCCCC',
88
+ showScrollIndicator: true,
89
+ wrapSelection: true,
90
+ showDescription: false,
91
+ };
92
+ const UNFOCUSED_SELECT = {
93
+ selectedBackgroundColor: '#1a1a2e',
94
+ selectedTextColor: UNFOCUS_TEXT,
95
+ textColor: UNFOCUS_TEXT,
96
+ showScrollIndicator: false,
97
+ wrapSelection: true,
98
+ showDescription: false,
99
+ };
100
+ // --- Section heights (minimum rows for the select content) ---
101
+ const SECTION_HEIGHTS = {
102
+ species: 5,
103
+ eye: 6,
104
+ rarity: 5,
105
+ hat: 5,
106
+ shiny: 2,
107
+ statsMode: 2,
108
+ peak: 3,
109
+ dump: 3,
110
+ };
111
+ // --- Build one section ---
112
+ function buildSection(field, options) {
113
+ const h = SECTION_HEIGHTS[field];
114
+ return Box({
115
+ id: `section-${field}`,
116
+ border: true,
117
+ borderStyle: 'rounded',
118
+ borderColor: UNFOCUS_BORDER,
119
+ title: ` ${FIELD_LABELS[field]} `,
120
+ titleAlignment: 'left',
121
+ flexDirection: 'column',
122
+ height: h + 2, // fixed height: content + top/bottom border
123
+ flexShrink: 0,
124
+ }, Select({
125
+ id: `select-${field}`,
126
+ options,
127
+ height: h,
128
+ ...UNFOCUSED_SELECT,
129
+ }));
130
+ }
131
+ // --- Main panel ---
132
+ export function createSelectionPanel(parent, initialState, onChange) {
133
+ const state = { ...initialState };
134
+ const selects = new Map();
135
+ const sectionBoxes = new Map();
136
+ let currentFocusedField = null;
137
+ // Track which fields are logically active (not disabled)
138
+ const fieldEnabled = new Map();
139
+ const visibleFields = getVisibleFields(state);
140
+ const allFields = [
141
+ 'species',
142
+ 'eye',
143
+ 'rarity',
144
+ 'hat',
145
+ 'shiny',
146
+ 'statsMode',
147
+ 'peak',
148
+ 'dump',
149
+ ];
150
+ // Initial options -- disabled fields get placeholder
151
+ function getInitialOptions(field) {
152
+ const active = visibleFields.includes(field);
153
+ fieldEnabled.set(field, active);
154
+ if (!active)
155
+ return getDisabledOptions(field);
156
+ switch (field) {
157
+ case 'species':
158
+ return speciesOptions();
159
+ case 'eye':
160
+ return eyeOptions(state.species);
161
+ case 'rarity':
162
+ return rarityOptions();
163
+ case 'hat':
164
+ return hatOptions();
165
+ case 'shiny':
166
+ return shinyOptions();
167
+ case 'statsMode':
168
+ return statsModeOptions();
169
+ case 'peak':
170
+ return statOptions();
171
+ case 'dump':
172
+ return statOptions(state.peak);
173
+ }
174
+ }
175
+ const container = Box({
176
+ id: 'selection-panel',
177
+ flexDirection: 'column',
178
+ flexGrow: 1,
179
+ overflow: 'hidden',
180
+ padding: 0,
181
+ paddingLeft: 1,
182
+ paddingRight: 1,
183
+ paddingTop: 1,
184
+ gap: 0,
185
+ }, Box({
186
+ id: 'selection-content',
187
+ flexDirection: 'column',
188
+ position: 'relative',
189
+ top: 0,
190
+ }, ...allFields.map((f) => buildSection(f, getInitialOptions(f)))));
191
+ parent.add(container);
192
+ // Resolve renderable references
193
+ const containerRenderable = parent.findDescendantById('selection-panel');
194
+ const contentRenderable = parent.findDescendantById('selection-content');
195
+ for (const field of allFields) {
196
+ const selectEl = containerRenderable?.findDescendantById(`select-${field}`);
197
+ const sectionEl = containerRenderable?.findDescendantById(`section-${field}`);
198
+ if (selectEl)
199
+ selects.set(field, selectEl);
200
+ if (sectionEl)
201
+ sectionBoxes.set(field, sectionEl);
202
+ }
203
+ // Set initial selection indices for enabled fields
204
+ const speciesSelect = selects.get('species');
205
+ const eyeSelect = selects.get('eye');
206
+ const raritySelect = selects.get('rarity');
207
+ const hatSelect = selects.get('hat');
208
+ const dumpSelect = selects.get('dump');
209
+ const speciesIdx = SPECIES.indexOf(state.species);
210
+ if (speciesIdx >= 0)
211
+ speciesSelect?.setSelectedIndex(speciesIdx);
212
+ const eyeIdx = EYES.indexOf(state.eye);
213
+ if (eyeIdx >= 0)
214
+ eyeSelect?.setSelectedIndex(eyeIdx);
215
+ const rarityIdx = RARITIES.indexOf(state.rarity);
216
+ if (rarityIdx >= 0)
217
+ raritySelect?.setSelectedIndex(rarityIdx);
218
+ if (state.hat !== 'none' && fieldEnabled.get('hat')) {
219
+ const hatsNoNone = HATS.filter((h) => h !== 'none');
220
+ const hatIdx = hatsNoNone.indexOf(state.hat);
221
+ if (hatIdx >= 0)
222
+ hatSelect?.setSelectedIndex(hatIdx);
223
+ }
224
+ // Apply initial disabled styling
225
+ for (const field of allFields) {
226
+ if (!fieldEnabled.get(field)) {
227
+ applyDisabledStyle(field);
228
+ }
229
+ }
230
+ // --- Styling ---
231
+ function applyFocusStyle(field) {
232
+ const box = sectionBoxes.get(field);
233
+ const sel = selects.get(field);
234
+ if (box) {
235
+ box.borderColor = FOCUS_BORDER;
236
+ box.title = ` \u25B6 ${FIELD_LABELS[field]} `;
237
+ }
238
+ if (sel) {
239
+ sel.selectedBackgroundColor = FOCUSED_SELECT.selectedBackgroundColor;
240
+ sel.selectedTextColor = FOCUSED_SELECT.selectedTextColor;
241
+ sel.textColor = FOCUSED_SELECT.textColor;
242
+ sel.showScrollIndicator = true;
243
+ }
244
+ }
245
+ function applyUnfocusStyle(field) {
246
+ const box = sectionBoxes.get(field);
247
+ const sel = selects.get(field);
248
+ if (box) {
249
+ box.borderColor = UNFOCUS_BORDER;
250
+ box.title = ` ${FIELD_LABELS[field]} `;
251
+ }
252
+ if (sel) {
253
+ sel.selectedBackgroundColor = UNFOCUSED_SELECT.selectedBackgroundColor;
254
+ sel.selectedTextColor = UNFOCUSED_SELECT.selectedTextColor;
255
+ sel.textColor = UNFOCUSED_SELECT.textColor;
256
+ sel.showScrollIndicator = false;
257
+ }
258
+ }
259
+ function applyDisabledStyle(field) {
260
+ const box = sectionBoxes.get(field);
261
+ const sel = selects.get(field);
262
+ if (box) {
263
+ box.borderColor = DISABLED_BORDER;
264
+ box.title = ` ${FIELD_LABELS[field]} `;
265
+ }
266
+ if (sel) {
267
+ sel.selectedBackgroundColor = '#111111';
268
+ sel.selectedTextColor = DISABLED_TEXT;
269
+ sel.textColor = DISABLED_TEXT;
270
+ sel.showScrollIndicator = false;
271
+ }
272
+ }
273
+ function enableField(field) {
274
+ if (fieldEnabled.get(field))
275
+ return;
276
+ fieldEnabled.set(field, true);
277
+ const sel = selects.get(field);
278
+ if (!sel)
279
+ return;
280
+ // Restore real options
281
+ switch (field) {
282
+ case 'hat':
283
+ sel.options = hatOptions();
284
+ break;
285
+ case 'peak':
286
+ sel.options = statOptions();
287
+ break;
288
+ case 'dump':
289
+ sel.options = statOptions(state.peak);
290
+ break;
291
+ }
292
+ applyUnfocusStyle(field);
293
+ }
294
+ function disableField(field) {
295
+ if (!fieldEnabled.get(field))
296
+ return;
297
+ fieldEnabled.set(field, false);
298
+ const sel = selects.get(field);
299
+ if (!sel)
300
+ return;
301
+ sel.options = getDisabledOptions(field);
302
+ applyDisabledStyle(field);
303
+ }
304
+ // Manual scroll: shift content box so the focused section is visible
305
+ let scrollOffset = 0;
306
+ function scrollToField(field) {
307
+ if (!contentRenderable)
308
+ return;
309
+ // Use terminal rows minus chrome (outer border + help bar + padding ~ 4 rows)
310
+ // Outer border (2) + help bar (1) + padding (1)
311
+ const CHROME_HEIGHT = 4;
312
+ const viewportHeight = (process.stdout.rows ?? 40) - CHROME_HEIGHT;
313
+ if (viewportHeight <= 0)
314
+ return;
315
+ // Calculate total content height and target section's Y position
316
+ let targetY = 0;
317
+ let totalHeight = 0;
318
+ for (const f of allFields) {
319
+ const h = SECTION_HEIGHTS[f] + 2;
320
+ if (f === field)
321
+ targetY = totalHeight;
322
+ totalHeight += h;
323
+ }
324
+ const sectionH = SECTION_HEIGHTS[field] + 2;
325
+ // No scrolling needed if everything fits
326
+ if (totalHeight <= viewportHeight) {
327
+ scrollOffset = 0;
328
+ contentRenderable.top = 0;
329
+ return;
330
+ }
331
+ // If section is above the viewport, scroll up
332
+ if (targetY < scrollOffset) {
333
+ scrollOffset = targetY;
334
+ }
335
+ // If section bottom is below the viewport, scroll down
336
+ else if (targetY + sectionH > scrollOffset + viewportHeight) {
337
+ scrollOffset = targetY + sectionH - viewportHeight;
338
+ }
339
+ // Clamp
340
+ const maxScroll = Math.max(0, totalHeight - viewportHeight);
341
+ scrollOffset = Math.max(0, Math.min(scrollOffset, maxScroll));
342
+ contentRenderable.top = -scrollOffset;
343
+ }
344
+ function focusField(field) {
345
+ if (currentFocusedField && currentFocusedField !== field) {
346
+ if (fieldEnabled.get(currentFocusedField)) {
347
+ applyUnfocusStyle(currentFocusedField);
348
+ }
349
+ else {
350
+ applyDisabledStyle(currentFocusedField);
351
+ }
352
+ }
353
+ currentFocusedField = field;
354
+ applyFocusStyle(field);
355
+ const sel = selects.get(field);
356
+ if (sel)
357
+ sel.focus();
358
+ scrollToField(field);
359
+ }
360
+ // --- Change handlers ---
361
+ function emitChange() {
362
+ onChange({ ...state });
363
+ }
364
+ function updateFieldStates() {
365
+ const active = getVisibleFields(state);
366
+ for (const field of allFields) {
367
+ if (active.includes(field)) {
368
+ enableField(field);
369
+ }
370
+ else {
371
+ disableField(field);
372
+ }
373
+ }
374
+ }
375
+ // Wire up SELECTION_CHANGED events
376
+ speciesSelect?.on(SelectRenderableEvents.SELECTION_CHANGED, (_index, option) => {
377
+ state.species = option.value;
378
+ if (eyeSelect) {
379
+ eyeSelect.options = eyeOptions(state.species);
380
+ const idx = EYES.indexOf(state.eye);
381
+ if (idx >= 0)
382
+ eyeSelect.setSelectedIndex(idx);
383
+ }
384
+ emitChange();
385
+ });
386
+ eyeSelect?.on(SelectRenderableEvents.SELECTION_CHANGED, (_index, option) => {
387
+ state.eye = option.value;
388
+ emitChange();
389
+ });
390
+ raritySelect?.on(SelectRenderableEvents.SELECTION_CHANGED, (_index, option) => {
391
+ state.rarity = option.value;
392
+ const constrained = applyRarityConstraints(state);
393
+ state.hat = constrained.hat;
394
+ updateFieldStates();
395
+ emitChange();
396
+ });
397
+ hatSelect?.on(SelectRenderableEvents.SELECTION_CHANGED, (_index, option) => {
398
+ if (option.value === '__disabled__')
399
+ return;
400
+ state.hat = option.value;
401
+ emitChange();
402
+ });
403
+ selects
404
+ .get('shiny')
405
+ ?.on(SelectRenderableEvents.SELECTION_CHANGED, (_index, option) => {
406
+ state.shiny = option.value;
407
+ emitChange();
408
+ });
409
+ selects
410
+ .get('statsMode')
411
+ ?.on(SelectRenderableEvents.SELECTION_CHANGED, (_index, option) => {
412
+ state.statsMode = option.value;
413
+ updateFieldStates();
414
+ emitChange();
415
+ });
416
+ selects
417
+ .get('peak')
418
+ ?.on(SelectRenderableEvents.SELECTION_CHANGED, (_index, option) => {
419
+ if (option.value === '__disabled__')
420
+ return;
421
+ state.peak = option.value;
422
+ const constrained = applyDumpConstraint(state);
423
+ state.dump = constrained.dump;
424
+ if (dumpSelect && fieldEnabled.get('dump')) {
425
+ dumpSelect.options = statOptions(state.peak);
426
+ const dumpNames = STAT_NAMES.filter((s) => s !== state.peak);
427
+ const dIdx = dumpNames.indexOf(state.dump);
428
+ if (dIdx >= 0)
429
+ dumpSelect.setSelectedIndex(dIdx);
430
+ }
431
+ emitChange();
432
+ });
433
+ dumpSelect?.on(SelectRenderableEvents.SELECTION_CHANGED, (_index, option) => {
434
+ if (option.value === '__disabled__')
435
+ return;
436
+ state.dump = option.value;
437
+ emitChange();
438
+ });
439
+ return {
440
+ container: containerRenderable ?? container,
441
+ selects,
442
+ focusField,
443
+ getState: () => ({ ...state }),
444
+ };
445
+ }
446
+ //# sourceMappingURL=selection-panel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selection-panel.js","sourceRoot":"","sources":["../../../src/tui/builder/selection-panel.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { StatName } from '../../types.js';
2
+ export declare function renderStatBarsFromStats(stats: Partial<Record<StatName, number>>): string;
3
+ export declare function renderStatBars(peak: StatName | null, dump: StatName | null): string;
4
+ //# sourceMappingURL=stat-bars.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stat-bars.d.ts","sourceRoot":"","sources":["../../../src/tui/builder/stat-bars.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAO3C,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,GAAG,MAAM,CAcxF;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,EAAE,IAAI,EAAE,QAAQ,GAAG,IAAI,GAAG,MAAM,CAqBnF"}
@@ -0,0 +1,46 @@
1
+ import { STAT_NAMES } from '../../constants.js';
2
+ const BAR_WIDTH = 14;
3
+ const FILLED = '\u2588'; // █
4
+ const EMPTY = '\u2591'; // ░
5
+ export function renderStatBarsFromStats(stats) {
6
+ const entries = STAT_NAMES.filter((s) => stats[s] !== undefined);
7
+ if (entries.length === 0)
8
+ return '';
9
+ const padWidth = Math.max(...STAT_NAMES.map((s) => s.length));
10
+ const maxVal = Math.max(...entries.map((s) => stats[s] ?? 0), 1);
11
+ const lines = [];
12
+ for (const name of entries) {
13
+ const val = stats[name] ?? 0;
14
+ const label = name.padEnd(padWidth);
15
+ const filled = Math.round(BAR_WIDTH * (val / maxVal));
16
+ const bar = FILLED.repeat(filled) + EMPTY.repeat(BAR_WIDTH - filled);
17
+ lines.push(`${label} ${bar} ${String(val).padStart(3)}`);
18
+ }
19
+ return lines.join('\n');
20
+ }
21
+ export function renderStatBars(peak, dump) {
22
+ if (!peak && !dump)
23
+ return '';
24
+ const padWidth = Math.max(...STAT_NAMES.map((s) => s.length));
25
+ const lines = [];
26
+ for (const name of STAT_NAMES) {
27
+ const label = name.padEnd(padWidth);
28
+ let filled;
29
+ let annotation = '';
30
+ if (name === peak) {
31
+ filled = BAR_WIDTH;
32
+ annotation = ' \u2190 peak';
33
+ }
34
+ else if (name === dump) {
35
+ filled = 1;
36
+ annotation = ' \u2190 dump';
37
+ }
38
+ else {
39
+ filled = Math.round(BAR_WIDTH * 0.4);
40
+ }
41
+ const bar = FILLED.repeat(filled) + EMPTY.repeat(BAR_WIDTH - filled);
42
+ lines.push(`${label} ${bar}${annotation}`);
43
+ }
44
+ return lines.join('\n');
45
+ }
46
+ //# sourceMappingURL=stat-bars.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stat-bars.js","sourceRoot":"","sources":["../../../src/tui/builder/stat-bars.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { Bones, CliFlags, DesiredTraits, Eye, Hat, Rarity, Species, StatName } from '../../types.js';
2
+ export type StatsMode = 'none' | 'customize';
3
+ export type BuilderField = 'species' | 'eye' | 'rarity' | 'hat' | 'shiny' | 'statsMode' | 'peak' | 'dump';
4
+ export interface BuilderState {
5
+ species: Species;
6
+ eye: Eye;
7
+ rarity: Rarity;
8
+ hat: Hat;
9
+ shiny: boolean;
10
+ statsMode: StatsMode;
11
+ peak: StatName;
12
+ dump: StatName;
13
+ }
14
+ export declare function createInitialState(flags?: CliFlags): BuilderState;
15
+ export declare function applyRarityConstraints(state: BuilderState): BuilderState;
16
+ export declare function applyDumpConstraint(state: BuilderState): BuilderState;
17
+ export declare function getVisibleFields(state: BuilderState): BuilderField[];
18
+ export declare function stateToDesiredTraits(state: BuilderState): DesiredTraits;
19
+ export declare function stateToBones(state: BuilderState): Bones;
20
+ export declare function firstUnfilledField(flags: CliFlags): BuilderField;
21
+ export declare function allTraitsFlagged(flags: CliFlags): boolean;
22
+ //# sourceMappingURL=state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../src/tui/builder/state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,KAAK,EACL,QAAQ,EACR,aAAa,EACb,GAAG,EACH,GAAG,EACH,MAAM,EACN,OAAO,EACP,QAAQ,EACT,MAAM,YAAY,CAAC;AAGpB,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,WAAW,CAAC;AAE7C,MAAM,MAAM,YAAY,GACpB,SAAS,GACT,KAAK,GACL,QAAQ,GACR,KAAK,GACL,OAAO,GACP,WAAW,GACX,MAAM,GACN,MAAM,CAAC;AAEX,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,GAAG,CAAC;IACT,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,GAAG,CAAC;IACT,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,SAAS,CAAC;IACrB,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,EAAE,QAAQ,CAAC;CAChB;AAED,wBAAgB,kBAAkB,CAAC,KAAK,GAAE,QAAa,GAAG,YAAY,CAuBrE;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,YAAY,GAAG,YAAY,CAQxE;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,YAAY,GAAG,YAAY,CAMrE;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,YAAY,GAAG,YAAY,EAAE,CAUpE;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,YAAY,GAAG,aAAa,CAUvE;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,YAAY,GAAG,KAAK,CASvD;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,QAAQ,GAAG,YAAY,CAOhE;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO,CAOzD"}
@@ -0,0 +1,92 @@
1
+ import { SPECIES, EYES, RARITIES, HATS, STAT_NAMES } from '../../constants.js';
2
+ export function createInitialState(flags = {}) {
3
+ const species = (SPECIES.includes(flags.species) ? flags.species : SPECIES[0]);
4
+ const eye = (EYES.includes(flags.eye) ? flags.eye : EYES[0]);
5
+ const rarity = (RARITIES.includes(flags.rarity) ? flags.rarity : RARITIES[0]);
6
+ const hatFromFlag = HATS.includes(flags.hat) ? flags.hat : undefined;
7
+ const hat = rarity === 'common' ? 'none' : (hatFromFlag ?? 'crown');
8
+ const shiny = flags.shiny ?? false;
9
+ const hasPeak = STAT_NAMES.includes(flags.peak);
10
+ const hasDump = STAT_NAMES.includes(flags.dump);
11
+ const statsMode = hasPeak || hasDump ? 'customize' : 'none';
12
+ const peak = (hasPeak ? flags.peak : STAT_NAMES[0]);
13
+ let dump = (hasDump ? flags.dump : STAT_NAMES[1]);
14
+ if (dump === peak) {
15
+ dump = STAT_NAMES.find((s) => s !== peak) ?? STAT_NAMES[1];
16
+ }
17
+ return { species, eye, rarity, hat, shiny, statsMode, peak, dump };
18
+ }
19
+ export function applyRarityConstraints(state) {
20
+ if (state.rarity === 'common' && state.hat !== 'none') {
21
+ return { ...state, hat: 'none' };
22
+ }
23
+ if (state.rarity !== 'common' && state.hat === 'none') {
24
+ return { ...state, hat: 'crown' };
25
+ }
26
+ return state;
27
+ }
28
+ export function applyDumpConstraint(state) {
29
+ if (state.dump === state.peak) {
30
+ const next = STAT_NAMES.find((s) => s !== state.peak);
31
+ if (next)
32
+ return { ...state, dump: next };
33
+ }
34
+ return state;
35
+ }
36
+ export function getVisibleFields(state) {
37
+ const fields = ['species', 'eye', 'rarity'];
38
+ if (state.rarity !== 'common') {
39
+ fields.push('hat');
40
+ }
41
+ fields.push('shiny', 'statsMode');
42
+ if (state.statsMode === 'customize') {
43
+ fields.push('peak', 'dump');
44
+ }
45
+ return fields;
46
+ }
47
+ export function stateToDesiredTraits(state) {
48
+ return {
49
+ species: state.species,
50
+ eye: state.eye,
51
+ rarity: state.rarity,
52
+ hat: state.rarity === 'common' ? 'none' : state.hat,
53
+ shiny: state.shiny,
54
+ peak: state.statsMode === 'customize' ? state.peak : null,
55
+ dump: state.statsMode === 'customize' ? state.dump : null,
56
+ };
57
+ }
58
+ export function stateToBones(state) {
59
+ return {
60
+ species: state.species,
61
+ eye: state.eye,
62
+ rarity: state.rarity,
63
+ hat: state.rarity === 'common' ? 'none' : state.hat,
64
+ shiny: state.shiny,
65
+ stats: {},
66
+ };
67
+ }
68
+ export function firstUnfilledField(flags) {
69
+ if (!flags.species || !SPECIES.includes(flags.species))
70
+ return 'species';
71
+ if (!flags.eye || !EYES.includes(flags.eye))
72
+ return 'eye';
73
+ if (!flags.rarity || !RARITIES.includes(flags.rarity))
74
+ return 'rarity';
75
+ const rarity = flags.rarity;
76
+ if (rarity !== 'common' && (!flags.hat || !HATS.includes(flags.hat)))
77
+ return 'hat';
78
+ return 'shiny';
79
+ }
80
+ export function allTraitsFlagged(flags) {
81
+ if (!flags.species || !SPECIES.includes(flags.species))
82
+ return false;
83
+ if (!flags.eye || !EYES.includes(flags.eye))
84
+ return false;
85
+ if (!flags.rarity || !RARITIES.includes(flags.rarity))
86
+ return false;
87
+ const rarity = flags.rarity;
88
+ if (rarity !== 'common' && (!flags.hat || !HATS.includes(flags.hat)))
89
+ return false;
90
+ return true;
91
+ }
92
+ //# sourceMappingURL=state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../../../src/tui/builder/state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map