@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,126 @@
1
+ import { select } from '@inquirer/prompts';
2
+ import { SPECIES, EYES, RARITIES, RARITY_STARS, RARITY_WEIGHTS, HATS, STAT_NAMES, } from '../constants.js';
3
+ import { renderSprite, renderFace } from '../sprites/index.js';
4
+ import { PRESETS } from '../presets.js';
5
+ import { RARITY_CHALK } from "./format.js";
6
+ import chalk from 'chalk';
7
+ export function validateFlag(name, value, allowed) {
8
+ if (value === undefined)
9
+ return undefined;
10
+ if (value === 'any')
11
+ return undefined;
12
+ if (allowed.includes(value))
13
+ return value;
14
+ throw new Error(`Invalid --${name} "${value}". Must be one of: ${allowed.join(', ')}`);
15
+ }
16
+ export async function selectSpecies() {
17
+ return select({
18
+ message: 'Species',
19
+ choices: SPECIES.map((s) => {
20
+ const face = renderFace({ species: s, eye: '·' });
21
+ return { name: `${s.padEnd(10)} ${face}`, value: s };
22
+ }),
23
+ pageSize: 18,
24
+ });
25
+ }
26
+ export async function selectEyes(species) {
27
+ return select({
28
+ message: 'Eyes',
29
+ choices: EYES.map((e) => {
30
+ const face = renderFace({ species, eye: e });
31
+ return { name: `${e} ${face}`, value: e };
32
+ }),
33
+ });
34
+ }
35
+ export async function selectRarity() {
36
+ return select({
37
+ message: 'Rarity',
38
+ choices: RARITIES.map((r) => {
39
+ const color = RARITY_CHALK[r] || chalk.white;
40
+ const pct = RARITY_WEIGHTS[r];
41
+ return {
42
+ name: color(`${r.padEnd(12)} ${RARITY_STARS[r].padEnd(6)} (normally ${pct}%)`),
43
+ value: r,
44
+ };
45
+ }),
46
+ });
47
+ }
48
+ export async function selectHat(species, eye, rarity) {
49
+ if (rarity === 'common') {
50
+ console.log(chalk.dim(' Common rarity = no hat (this is how Claude Code works)\n'));
51
+ return 'none';
52
+ }
53
+ return select({
54
+ message: 'Hat',
55
+ choices: HATS.filter((h) => h !== 'none').map((h) => {
56
+ const preview = renderSprite({ species, eye, hat: h, rarity, shiny: false, stats: {} }, 0);
57
+ const topLine = preview[0]?.trim() || h;
58
+ return { name: `${h.padEnd(12)} ${topLine}`, value: h };
59
+ }),
60
+ });
61
+ }
62
+ export async function selectStat(label, exclude) {
63
+ const choices = STAT_NAMES.filter((s) => s !== exclude).map((s) => ({ name: s, value: s }));
64
+ return select({ message: label, choices });
65
+ }
66
+ export async function selectMode() {
67
+ return select({
68
+ message: 'How do you want to pick?',
69
+ choices: [
70
+ { name: 'Browse presets — curated themed builds', value: 'preset' },
71
+ { name: 'Customize — pick each attribute yourself', value: 'custom' },
72
+ ],
73
+ });
74
+ }
75
+ export async function selectStartAction(buddyCount) {
76
+ const choices = [
77
+ {
78
+ name: `Build your own ${chalk.dim('— customize species, rarity, eyes, hat')}`,
79
+ value: 'build',
80
+ },
81
+ {
82
+ name: `Browse presets ${chalk.dim(`— pick from ${PRESETS.length} curated builds`)}`,
83
+ value: 'presets',
84
+ },
85
+ ];
86
+ if (buddyCount > 0) {
87
+ choices.push({
88
+ name: `Saved buddies (${buddyCount}) ${chalk.dim('— switch between your saved pets')}`,
89
+ value: 'buddies',
90
+ });
91
+ }
92
+ return select({
93
+ message: 'What would you like to do?',
94
+ choices,
95
+ });
96
+ }
97
+ export async function selectPreset() {
98
+ return select({
99
+ message: 'Pick a preset',
100
+ choices: PRESETS.map((p) => {
101
+ const color = RARITY_CHALK[p.rarity] || chalk.white;
102
+ const face = renderFace({ species: p.species, eye: p.eye });
103
+ const stars = RARITY_STARS[p.rarity] || '';
104
+ // Full sprite preview shown below the highlighted choice
105
+ const bones = {
106
+ species: p.species,
107
+ eye: p.eye,
108
+ hat: p.hat,
109
+ rarity: p.rarity,
110
+ shiny: false,
111
+ stats: {},
112
+ };
113
+ const sprite = renderSprite(bones, 0)
114
+ .map((l) => ' ' + color(l))
115
+ .join('\n');
116
+ const info = ` ${color(`${p.rarity} ${p.species}`)} eyes: ${p.eye} hat: ${p.hat}`;
117
+ return {
118
+ name: color(`${p.name.padEnd(22)} ${stars.padEnd(6)} ${face} ${chalk.dim(p.description)}`),
119
+ value: p,
120
+ description: `\n${sprite}\n${info}`,
121
+ };
122
+ }),
123
+ pageSize: 12,
124
+ });
125
+ }
126
+ //# sourceMappingURL=prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/tui/prompts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAE3C,OAAO,EACL,OAAO,EACP,IAAI,EACJ,QAAQ,EACR,YAAY,EACZ,cAAc,EACd,IAAI,EACJ,UAAU,GACX,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAe,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,UAAU,YAAY,CAC1B,IAAY,EACZ,KAAyB,EACzB,OAAqB;IAErB,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC1C,IAAI,KAAK,KAAK,KAAK;QAAE,OAAO,SAAS,CAAC;IACtC,IAAK,OAA6B,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,KAAU,CAAC;IACtE,MAAM,IAAI,KAAK,CAAC,aAAa,IAAI,KAAK,KAAK,sBAAsB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACzF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,OAAO,MAAM,CAAC;QACZ,OAAO,EAAE,SAAS;QAClB,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YACzB,MAAM,IAAI,GAAG,UAAU,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;YAClD,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;QACvD,CAAC,CAAC;QACF,QAAQ,EAAE,EAAE;KACb,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,OAAgB;IAC/C,OAAO,MAAM,CAAC;QACZ,OAAO,EAAE,MAAM;QACf,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YACtB,MAAM,IAAI,GAAG,UAAU,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YAC7C,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,KAAK,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;QAC7C,CAAC,CAAC;KACH,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,OAAO,MAAM,CAAC;QACZ,OAAO,EAAE,QAAQ;QACjB,OAAO,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YAC1B,MAAM,KAAK,GAAG,YAAY,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC;YAC7C,MAAM,GAAG,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;YAC9B,OAAO;gBACL,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,cAAc,GAAG,IAAI,CAAC;gBAC9E,KAAK,EAAE,CAAC;aACT,CAAC;QACJ,CAAC,CAAC;KACH,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,OAAgB,EAAE,GAAQ,EAAE,MAAc;IACxE,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,4DAA4D,CAAC,CAAC,CAAC;QACrF,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,OAAO,MAAM,CAAC;QACZ,OAAO,EAAE,KAAK;QACd,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YAClD,MAAM,OAAO,GAAG,YAAY,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;YAC3F,MAAM,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;YACxC,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;QAC1D,CAAC,CAAC;KACH,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,KAAa,EAAE,OAAkB;IAChE,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5F,OAAO,MAAM,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,OAAO,MAAM,CAAC;QACZ,OAAO,EAAE,0BAA0B;QACnC,OAAO,EAAE;YACP,EAAE,IAAI,EAAE,wCAAwC,EAAE,KAAK,EAAE,QAAiB,EAAE;YAC5E,EAAE,IAAI,EAAE,0CAA0C,EAAE,KAAK,EAAE,QAAiB,EAAE;SAC/E;KACF,CAAC,CAAC;AACL,CAAC;AAID,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,UAAkB;IACxD,MAAM,OAAO,GAA2C;QACtD;YACE,IAAI,EAAE,yBAAyB,KAAK,CAAC,GAAG,CAAC,wCAAwC,CAAC,EAAE;YACpF,KAAK,EAAE,OAAO;SACf;QACD;YACE,IAAI,EAAE,0BAA0B,KAAK,CAAC,GAAG,CAAC,eAAe,OAAO,CAAC,MAAM,iBAAiB,CAAC,EAAE;YAC3F,KAAK,EAAE,SAAS;SACjB;KACF,CAAC;IAEF,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;QACnB,OAAO,CAAC,IAAI,CAAC;YACX,IAAI,EAAE,kBAAkB,UAAU,UAAU,KAAK,CAAC,GAAG,CAAC,kCAAkC,CAAC,EAAE;YAC3F,KAAK,EAAE,SAAS;SACjB,CAAC,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC;QACZ,OAAO,EAAE,4BAA4B;QACrC,OAAO;KACR,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,OAAO,MAAM,CAAC;QACZ,OAAO,EAAE,eAAe;QACxB,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YACzB,MAAM,KAAK,GAAG,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC;YACpD,MAAM,IAAI,GAAG,UAAU,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;YAC5D,MAAM,KAAK,GAAG,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YAC3C,yDAAyD;YACzD,MAAM,KAAK,GAAG;gBACZ,OAAO,EAAE,CAAC,CAAC,OAAO;gBAClB,GAAG,EAAE,CAAC,CAAC,GAAG;gBACV,GAAG,EAAE,CAAC,CAAC,GAAG;gBACV,MAAM,EAAE,CAAC,CAAC,MAAM;gBAChB,KAAK,EAAE,KAAK;gBACZ,KAAK,EAAE,EAAE;aACV,CAAC;YACF,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,EAAE,CAAC,CAAC;iBAClC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;iBAC7B,IAAI,CAAC,IAAI,CAAC,CAAC;YACd,MAAM,IAAI,GAAG,KAAK,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC,WAAW,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;YACrF,OAAO;gBACL,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,KAAK,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC;gBAC3F,KAAK,EAAE,CAAC;gBACR,WAAW,EAAE,KAAK,MAAM,KAAK,IAAI,EAAE;aACpC,CAAC;QACJ,CAAC,CAAC;QACF,QAAQ,EAAE,EAAE;KACb,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,3 @@
1
+ export type StartAction = 'build' | 'presets' | 'buddies';
2
+ export declare function runStartTUI(buddyCount: number): Promise<StartAction | null>;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tui/start/index.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,CAAC;AAkB1D,wBAAsB,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAuLjF"}
@@ -0,0 +1,170 @@
1
+ import { ISSUE_URL } from '../../constants.js';
2
+ import { BORDER_COLOR, DIM_COLOR, FOCUS_BORDER } from '../../tui/builder/colors.js';
3
+ // figlet-style block letters (hand-made, compact)
4
+ const LOGO = [
5
+ ' __ _ _ __ _ _ _ _ _ ',
6
+ " / _` | '_ \\| | | | | |__ _ _ __| | __| |_ _ ",
7
+ "| (_| | | | | |_| |____| '_ \\| | | |/ _` |/ _` | | | |",
8
+ ' \\__,_|_| |_|\\__, |____|_.__/|_|_|_|\\__,_|\\__,_|\\__, |',
9
+ ' |___/ |___/ ',
10
+ ].join('\n');
11
+ export async function runStartTUI(buddyCount) {
12
+ const otui = await import('@opentui/core');
13
+ const { createCliRenderer, Box, Text } = otui;
14
+ let renderer = null;
15
+ try {
16
+ renderer = await createCliRenderer({
17
+ exitOnCtrlC: false,
18
+ screenMode: 'alternate-screen',
19
+ });
20
+ const r = renderer;
21
+ return await new Promise((resolve) => {
22
+ let resolved = false;
23
+ let selected = 0;
24
+ const entries = [
25
+ {
26
+ value: 'build',
27
+ icon: '⚡',
28
+ title: 'Build your own',
29
+ desc: 'Customize species, rarity, eyes, hat, and stats',
30
+ },
31
+ {
32
+ value: 'presets',
33
+ icon: '★',
34
+ title: 'Browse presets',
35
+ desc: 'Pick from curated themed builds with live preview',
36
+ },
37
+ ];
38
+ if (buddyCount > 0) {
39
+ entries.push({
40
+ value: 'buddies',
41
+ icon: '♥',
42
+ title: `Saved buddies (${buddyCount})`,
43
+ desc: 'Switch between your saved pets',
44
+ });
45
+ }
46
+ const handleCtrlC = (key) => {
47
+ if (key.ctrl && key.name === 'c')
48
+ finish(null);
49
+ };
50
+ function finish(result) {
51
+ if (resolved)
52
+ return;
53
+ resolved = true;
54
+ r.keyInput.removeListener('keypress', handleCtrlC);
55
+ r.keyInput.removeListener('keypress', handleKeyPress);
56
+ r.destroy();
57
+ renderer = null;
58
+ resolve(result);
59
+ }
60
+ const cardTexts = [];
61
+ function renderCards() {
62
+ for (let i = 0; i < entries.length; i++) {
63
+ const isSelected = i === selected;
64
+ const card = cardTexts[i];
65
+ if (!card)
66
+ continue;
67
+ const entry = entries[i];
68
+ const pointer = isSelected ? '▸' : ' ';
69
+ card.title.content = `${pointer} ${entry.icon} ${entry.title}`;
70
+ card.title.fg = isSelected ? '#ffffff' : '#555555';
71
+ card.desc.content = ` ${entry.desc}`;
72
+ card.desc.fg = isSelected ? '#888888' : '#333333';
73
+ }
74
+ }
75
+ const rootBox = Box({
76
+ id: 'root',
77
+ flexDirection: 'column',
78
+ width: '100%',
79
+ height: '100%',
80
+ borderStyle: 'rounded',
81
+ border: true,
82
+ borderColor: BORDER_COLOR,
83
+ padding: 0,
84
+ justifyContent: 'center',
85
+ alignItems: 'center',
86
+ },
87
+ // Large ASCII logo
88
+ Text({
89
+ content: LOGO,
90
+ fg: FOCUS_BORDER,
91
+ height: 5,
92
+ }), Text({
93
+ content: 'Hack Claude Code to get any buddy you want',
94
+ fg: DIM_COLOR,
95
+ height: 1,
96
+ }), Text({ content: '', height: 2 }),
97
+ // Menu cards — inside a fixed-width box for alignment
98
+ Box({
99
+ id: 'menu-container',
100
+ flexDirection: 'column',
101
+ width: 56,
102
+ padding: 0,
103
+ }, ...entries.flatMap((_entry, i) => {
104
+ const titleWidget = Text({
105
+ id: `card-title-${i}`,
106
+ content: '',
107
+ height: 1,
108
+ });
109
+ const descWidget = Text({
110
+ id: `card-desc-${i}`,
111
+ content: '',
112
+ height: 1,
113
+ });
114
+ const widgets = [titleWidget, descWidget];
115
+ if (i < entries.length - 1) {
116
+ widgets.push(Text({ content: '', height: 1 }));
117
+ }
118
+ return widgets;
119
+ })), Text({ content: '', height: 2 }),
120
+ // Help bar
121
+ Text({
122
+ content: '↑↓ navigate Enter select Esc quit',
123
+ fg: DIM_COLOR,
124
+ height: 1,
125
+ }));
126
+ r.root.add(rootBox);
127
+ for (let i = 0; i < entries.length; i++) {
128
+ const title = r.root.findDescendantById(`card-title-${i}`);
129
+ const desc = r.root.findDescendantById(`card-desc-${i}`);
130
+ if (title && desc) {
131
+ cardTexts.push({ title, desc });
132
+ }
133
+ }
134
+ renderCards();
135
+ function handleKeyPress(key) {
136
+ if (key.name === 'up') {
137
+ selected = (selected - 1 + entries.length) % entries.length;
138
+ renderCards();
139
+ }
140
+ else if (key.name === 'down') {
141
+ selected = (selected + 1) % entries.length;
142
+ renderCards();
143
+ }
144
+ else if (key.name === 'return') {
145
+ finish(entries[selected].value);
146
+ }
147
+ else if (key.name === 'escape') {
148
+ finish(null);
149
+ }
150
+ }
151
+ r.keyInput.on('keypress', handleCtrlC);
152
+ r.keyInput.on('keypress', handleKeyPress);
153
+ r.auto();
154
+ });
155
+ }
156
+ catch (err) {
157
+ if (renderer) {
158
+ try {
159
+ renderer.destroy();
160
+ }
161
+ catch {
162
+ /* ignore */
163
+ }
164
+ }
165
+ console.error(` Start screen error: ${err.message}`);
166
+ console.error(` If this persists, please report at: ${ISSUE_URL}`);
167
+ return null;
168
+ }
169
+ }
170
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tui/start/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,113 @@
1
+ export type Species = 'duck' | 'goose' | 'blob' | 'cat' | 'dragon' | 'octopus' | 'owl' | 'penguin' | 'turtle' | 'snail' | 'ghost' | 'axolotl' | 'capybara' | 'cactus' | 'robot' | 'rabbit' | 'mushroom' | 'chonk';
2
+ export type Rarity = 'common' | 'uncommon' | 'rare' | 'epic' | 'legendary';
3
+ export type Eye = '·' | '✦' | '×' | '◉' | '@' | '°';
4
+ export type Hat = 'none' | 'crown' | 'tophat' | 'propeller' | 'halo' | 'wizard' | 'beanie' | 'tinyduck';
5
+ export type StatName = 'DEBUGGING' | 'PATIENCE' | 'CHAOS' | 'WISDOM' | 'SNARK';
6
+ export interface Bones {
7
+ species: Species;
8
+ rarity: Rarity;
9
+ eye: Eye;
10
+ hat: Hat;
11
+ shiny: boolean;
12
+ stats: Partial<Record<StatName, number>>;
13
+ }
14
+ export interface RollResult {
15
+ bones: Bones;
16
+ inspirationSeed: number;
17
+ }
18
+ export interface DesiredTraits {
19
+ species: Species;
20
+ rarity: Rarity;
21
+ eye: Eye;
22
+ hat: Hat;
23
+ shiny: boolean;
24
+ peak: StatName | null;
25
+ dump: StatName | null;
26
+ }
27
+ export interface FinderResult {
28
+ salt: string;
29
+ attempts: number;
30
+ elapsed: number;
31
+ bones: Bones;
32
+ totalAttempts?: number;
33
+ workers?: number;
34
+ }
35
+ export interface FinderProgress {
36
+ attempts: number;
37
+ elapsed: number;
38
+ rate: number;
39
+ expected: number;
40
+ pct: number;
41
+ eta: number;
42
+ workers: number;
43
+ }
44
+ export interface SaltState {
45
+ salt: string | null;
46
+ patched: boolean;
47
+ offsets: number[];
48
+ }
49
+ export interface PatchResult {
50
+ replacements: number;
51
+ verified: boolean;
52
+ backupPath: string;
53
+ codesigned: boolean;
54
+ codesignError: string | null;
55
+ }
56
+ export interface PreflightResult {
57
+ ok: boolean;
58
+ binaryPath: string | null;
59
+ userId: string;
60
+ saltCount: number;
61
+ bunVersion: string | null;
62
+ }
63
+ export interface PetConfig {
64
+ salt: string;
65
+ previousSalt?: string;
66
+ species?: Species;
67
+ rarity?: Rarity;
68
+ eye?: Eye;
69
+ hat?: Hat;
70
+ appliedTo?: string;
71
+ appliedAt?: string;
72
+ restored?: boolean;
73
+ }
74
+ export interface CliFlags {
75
+ species?: string;
76
+ rarity?: string;
77
+ eye?: string;
78
+ hat?: string;
79
+ name?: string;
80
+ personality?: string;
81
+ preset?: string;
82
+ shiny?: boolean;
83
+ peak?: string;
84
+ dump?: string;
85
+ silent?: boolean;
86
+ noHook?: boolean;
87
+ yes?: boolean;
88
+ all?: boolean;
89
+ }
90
+ export type RngFunction = () => number;
91
+ export interface ProfileData {
92
+ salt: string;
93
+ species: Species;
94
+ rarity: Rarity;
95
+ eye: Eye;
96
+ hat: Hat;
97
+ shiny: boolean;
98
+ stats: Partial<Record<StatName, number>>;
99
+ name: string | null;
100
+ personality: string | null;
101
+ createdAt: string;
102
+ }
103
+ export interface PetConfigV2 {
104
+ version: 2;
105
+ activeProfile: string | null;
106
+ salt: string;
107
+ previousSalt?: string;
108
+ profiles: Record<string, ProfileData>;
109
+ appliedTo?: string;
110
+ appliedAt?: string;
111
+ restored?: boolean;
112
+ }
113
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,82 @@
1
+ {
2
+ "name": "@lyellr88/buddy-mcp",
3
+ "version": "1.1.0",
4
+ "description": "Gacha companion system for Claude Code — collect, evolve, and patch your buddy via MCP",
5
+ "type": "module",
6
+ "bin": {
7
+ "buddy-mcp": "./dist/mcp/index.js",
8
+ "buddy-mcp-build": "./dist/tui/launcher.js"
9
+ },
10
+ "files": [
11
+ "dist/",
12
+ "assets/",
13
+ "README.md",
14
+ "LICENSE"
15
+ ],
16
+ "engines": {
17
+ "node": ">=20"
18
+ },
19
+ "scripts": {
20
+ "build": "tsc && tsc-alias",
21
+ "clean": "node -e \"require('fs').rmSync('dist', {recursive:true,force:true})\"",
22
+ "prebuild": "npm run clean",
23
+ "test": "vitest run",
24
+ "test:watch": "vitest",
25
+ "test:coverage": "vitest run --coverage",
26
+ "lint": "eslint src/ tests/",
27
+ "lint:fix": "eslint src/ tests/ --fix",
28
+ "format": "prettier --write 'src/**/*.ts' 'tests/**/*.ts'",
29
+ "format:check": "prettier --check 'src/**/*.ts' 'tests/**/*.ts'",
30
+ "typecheck": "tsc --noEmit",
31
+ "serve": "node dist/mcp/index.js",
32
+ "apply": "node dist/mcp/index.js apply",
33
+ "builder": "node dist/tui/launcher.js",
34
+ "prepublishOnly": "npm run build",
35
+ "prepare": "husky"
36
+ },
37
+ "repository": {
38
+ "type": "git",
39
+ "url": "https://github.com/lyell/buddy-mcp"
40
+ },
41
+ "keywords": [
42
+ "claude",
43
+ "claude-code",
44
+ "buddy",
45
+ "companion",
46
+ "pet",
47
+ "gacha",
48
+ "mcp",
49
+ "model-context-protocol"
50
+ ],
51
+ "author": "",
52
+ "license": "WTFPL",
53
+ "dependencies": {
54
+ "@inquirer/prompts": "^3",
55
+ "@modelcontextprotocol/sdk": "^1.29.0",
56
+ "chalk": "^5.3.0",
57
+ "zod": "^4.3.6"
58
+ },
59
+ "optionalDependencies": {
60
+ "@opentui/core": "*"
61
+ },
62
+ "lint-staged": {
63
+ "*.ts": [
64
+ "eslint --fix",
65
+ "prettier --write"
66
+ ]
67
+ },
68
+ "devDependencies": {
69
+ "@eslint/js": "^9",
70
+ "@types/node": "^20",
71
+ "@vitest/coverage-v8": "^3",
72
+ "eslint": "^9",
73
+ "eslint-config-prettier": "^10",
74
+ "husky": "^9.1.7",
75
+ "lint-staged": "^16.4.0",
76
+ "prettier": "^3",
77
+ "tsc-alias": "^1.8.16",
78
+ "typescript": "^5.7",
79
+ "typescript-eslint": "^8",
80
+ "vitest": "^3"
81
+ }
82
+ }