claude-doom-statusbar 0.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 (645) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +116 -0
  3. package/assets/images/hud.png +0 -0
  4. package/assets/images/mugshot/STFST01-blockart-08.png +0 -0
  5. package/assets/images/mugshot/STFST01-orig-08.png +0 -0
  6. package/assets/images/mugshot/alpha/STFDEAD0.png +0 -0
  7. package/assets/images/mugshot/alpha/STFEVL0.png +0 -0
  8. package/assets/images/mugshot/alpha/STFEVL1.png +0 -0
  9. package/assets/images/mugshot/alpha/STFEVL2.png +0 -0
  10. package/assets/images/mugshot/alpha/STFEVL3.png +0 -0
  11. package/assets/images/mugshot/alpha/STFEVL4.png +0 -0
  12. package/assets/images/mugshot/alpha/STFGOD0.png +0 -0
  13. package/assets/images/mugshot/alpha/STFKILL0.png +0 -0
  14. package/assets/images/mugshot/alpha/STFKILL1.png +0 -0
  15. package/assets/images/mugshot/alpha/STFKILL2.png +0 -0
  16. package/assets/images/mugshot/alpha/STFKILL3.png +0 -0
  17. package/assets/images/mugshot/alpha/STFKILL4.png +0 -0
  18. package/assets/images/mugshot/alpha/STFOUCH0.png +0 -0
  19. package/assets/images/mugshot/alpha/STFOUCH1.png +0 -0
  20. package/assets/images/mugshot/alpha/STFOUCH2.png +0 -0
  21. package/assets/images/mugshot/alpha/STFOUCH3.png +0 -0
  22. package/assets/images/mugshot/alpha/STFOUCH4.png +0 -0
  23. package/assets/images/mugshot/alpha/STFST00.png +0 -0
  24. package/assets/images/mugshot/alpha/STFST01.png +0 -0
  25. package/assets/images/mugshot/alpha/STFST02.png +0 -0
  26. package/assets/images/mugshot/alpha/STFST10.png +0 -0
  27. package/assets/images/mugshot/alpha/STFST11.png +0 -0
  28. package/assets/images/mugshot/alpha/STFST12.png +0 -0
  29. package/assets/images/mugshot/alpha/STFST20.png +0 -0
  30. package/assets/images/mugshot/alpha/STFST21.png +0 -0
  31. package/assets/images/mugshot/alpha/STFST22.png +0 -0
  32. package/assets/images/mugshot/alpha/STFST30.png +0 -0
  33. package/assets/images/mugshot/alpha/STFST31.png +0 -0
  34. package/assets/images/mugshot/alpha/STFST32.png +0 -0
  35. package/assets/images/mugshot/alpha/STFST40.png +0 -0
  36. package/assets/images/mugshot/alpha/STFST41.png +0 -0
  37. package/assets/images/mugshot/alpha/STFST42.png +0 -0
  38. package/assets/images/mugshot/alpha/STFTL00.png +0 -0
  39. package/assets/images/mugshot/alpha/STFTL10.png +0 -0
  40. package/assets/images/mugshot/alpha/STFTL20.png +0 -0
  41. package/assets/images/mugshot/alpha/STFTL30.png +0 -0
  42. package/assets/images/mugshot/alpha/STFTL40.png +0 -0
  43. package/assets/images/mugshot/alpha/STFTR00.png +0 -0
  44. package/assets/images/mugshot/alpha/STFTR10.png +0 -0
  45. package/assets/images/mugshot/alpha/STFTR20.png +0 -0
  46. package/assets/images/mugshot/alpha/STFTR30.png +0 -0
  47. package/assets/images/mugshot/alpha/STFTR40.png +0 -0
  48. package/assets/images/mugshot/ans/10/STFDEAD0.ans +10 -0
  49. package/assets/images/mugshot/ans/10/STFEVL0.ans +10 -0
  50. package/assets/images/mugshot/ans/10/STFEVL1.ans +10 -0
  51. package/assets/images/mugshot/ans/10/STFEVL2.ans +10 -0
  52. package/assets/images/mugshot/ans/10/STFEVL3.ans +10 -0
  53. package/assets/images/mugshot/ans/10/STFEVL4.ans +10 -0
  54. package/assets/images/mugshot/ans/10/STFGOD0.ans +10 -0
  55. package/assets/images/mugshot/ans/10/STFKILL0.ans +10 -0
  56. package/assets/images/mugshot/ans/10/STFKILL1.ans +10 -0
  57. package/assets/images/mugshot/ans/10/STFKILL2.ans +10 -0
  58. package/assets/images/mugshot/ans/10/STFKILL3.ans +10 -0
  59. package/assets/images/mugshot/ans/10/STFKILL4.ans +10 -0
  60. package/assets/images/mugshot/ans/10/STFOUCH0.ans +10 -0
  61. package/assets/images/mugshot/ans/10/STFOUCH1.ans +10 -0
  62. package/assets/images/mugshot/ans/10/STFOUCH2.ans +10 -0
  63. package/assets/images/mugshot/ans/10/STFOUCH3.ans +10 -0
  64. package/assets/images/mugshot/ans/10/STFOUCH4.ans +10 -0
  65. package/assets/images/mugshot/ans/10/STFST00.ans +10 -0
  66. package/assets/images/mugshot/ans/10/STFST01.ans +10 -0
  67. package/assets/images/mugshot/ans/10/STFST02.ans +10 -0
  68. package/assets/images/mugshot/ans/10/STFST10.ans +10 -0
  69. package/assets/images/mugshot/ans/10/STFST11.ans +10 -0
  70. package/assets/images/mugshot/ans/10/STFST12.ans +10 -0
  71. package/assets/images/mugshot/ans/10/STFST20.ans +10 -0
  72. package/assets/images/mugshot/ans/10/STFST21.ans +10 -0
  73. package/assets/images/mugshot/ans/10/STFST22.ans +10 -0
  74. package/assets/images/mugshot/ans/10/STFST30.ans +10 -0
  75. package/assets/images/mugshot/ans/10/STFST31.ans +10 -0
  76. package/assets/images/mugshot/ans/10/STFST32.ans +10 -0
  77. package/assets/images/mugshot/ans/10/STFST40.ans +10 -0
  78. package/assets/images/mugshot/ans/10/STFST41.ans +10 -0
  79. package/assets/images/mugshot/ans/10/STFST42.ans +10 -0
  80. package/assets/images/mugshot/ans/10/STFTL00.ans +10 -0
  81. package/assets/images/mugshot/ans/10/STFTL10.ans +10 -0
  82. package/assets/images/mugshot/ans/10/STFTL20.ans +10 -0
  83. package/assets/images/mugshot/ans/10/STFTL30.ans +10 -0
  84. package/assets/images/mugshot/ans/10/STFTL40.ans +10 -0
  85. package/assets/images/mugshot/ans/10/STFTR00.ans +10 -0
  86. package/assets/images/mugshot/ans/10/STFTR10.ans +10 -0
  87. package/assets/images/mugshot/ans/10/STFTR20.ans +10 -0
  88. package/assets/images/mugshot/ans/10/STFTR30.ans +10 -0
  89. package/assets/images/mugshot/ans/10/STFTR40.ans +10 -0
  90. package/assets/images/mugshot/ans/11/STFDEAD0.ans +11 -0
  91. package/assets/images/mugshot/ans/11/STFEVL0.ans +11 -0
  92. package/assets/images/mugshot/ans/11/STFEVL1.ans +11 -0
  93. package/assets/images/mugshot/ans/11/STFEVL2.ans +11 -0
  94. package/assets/images/mugshot/ans/11/STFEVL3.ans +11 -0
  95. package/assets/images/mugshot/ans/11/STFEVL4.ans +11 -0
  96. package/assets/images/mugshot/ans/11/STFGOD0.ans +11 -0
  97. package/assets/images/mugshot/ans/11/STFKILL0.ans +11 -0
  98. package/assets/images/mugshot/ans/11/STFKILL1.ans +11 -0
  99. package/assets/images/mugshot/ans/11/STFKILL2.ans +11 -0
  100. package/assets/images/mugshot/ans/11/STFKILL3.ans +11 -0
  101. package/assets/images/mugshot/ans/11/STFKILL4.ans +11 -0
  102. package/assets/images/mugshot/ans/11/STFOUCH0.ans +11 -0
  103. package/assets/images/mugshot/ans/11/STFOUCH1.ans +11 -0
  104. package/assets/images/mugshot/ans/11/STFOUCH2.ans +11 -0
  105. package/assets/images/mugshot/ans/11/STFOUCH3.ans +11 -0
  106. package/assets/images/mugshot/ans/11/STFOUCH4.ans +11 -0
  107. package/assets/images/mugshot/ans/11/STFST00.ans +11 -0
  108. package/assets/images/mugshot/ans/11/STFST01.ans +11 -0
  109. package/assets/images/mugshot/ans/11/STFST02.ans +11 -0
  110. package/assets/images/mugshot/ans/11/STFST10.ans +11 -0
  111. package/assets/images/mugshot/ans/11/STFST11.ans +11 -0
  112. package/assets/images/mugshot/ans/11/STFST12.ans +11 -0
  113. package/assets/images/mugshot/ans/11/STFST20.ans +11 -0
  114. package/assets/images/mugshot/ans/11/STFST21.ans +11 -0
  115. package/assets/images/mugshot/ans/11/STFST22.ans +11 -0
  116. package/assets/images/mugshot/ans/11/STFST30.ans +11 -0
  117. package/assets/images/mugshot/ans/11/STFST31.ans +11 -0
  118. package/assets/images/mugshot/ans/11/STFST32.ans +11 -0
  119. package/assets/images/mugshot/ans/11/STFST40.ans +11 -0
  120. package/assets/images/mugshot/ans/11/STFST41.ans +11 -0
  121. package/assets/images/mugshot/ans/11/STFST42.ans +11 -0
  122. package/assets/images/mugshot/ans/11/STFTL00.ans +11 -0
  123. package/assets/images/mugshot/ans/11/STFTL10.ans +11 -0
  124. package/assets/images/mugshot/ans/11/STFTL20.ans +11 -0
  125. package/assets/images/mugshot/ans/11/STFTL30.ans +11 -0
  126. package/assets/images/mugshot/ans/11/STFTL40.ans +11 -0
  127. package/assets/images/mugshot/ans/11/STFTR00.ans +11 -0
  128. package/assets/images/mugshot/ans/11/STFTR10.ans +11 -0
  129. package/assets/images/mugshot/ans/11/STFTR20.ans +11 -0
  130. package/assets/images/mugshot/ans/11/STFTR30.ans +11 -0
  131. package/assets/images/mugshot/ans/11/STFTR40.ans +11 -0
  132. package/assets/images/mugshot/ans/12/STFDEAD0.ans +12 -0
  133. package/assets/images/mugshot/ans/12/STFEVL0.ans +12 -0
  134. package/assets/images/mugshot/ans/12/STFEVL1.ans +12 -0
  135. package/assets/images/mugshot/ans/12/STFEVL2.ans +12 -0
  136. package/assets/images/mugshot/ans/12/STFEVL3.ans +12 -0
  137. package/assets/images/mugshot/ans/12/STFEVL4.ans +12 -0
  138. package/assets/images/mugshot/ans/12/STFGOD0.ans +12 -0
  139. package/assets/images/mugshot/ans/12/STFKILL0.ans +12 -0
  140. package/assets/images/mugshot/ans/12/STFKILL1.ans +12 -0
  141. package/assets/images/mugshot/ans/12/STFKILL2.ans +12 -0
  142. package/assets/images/mugshot/ans/12/STFKILL3.ans +12 -0
  143. package/assets/images/mugshot/ans/12/STFKILL4.ans +12 -0
  144. package/assets/images/mugshot/ans/12/STFOUCH0.ans +12 -0
  145. package/assets/images/mugshot/ans/12/STFOUCH1.ans +12 -0
  146. package/assets/images/mugshot/ans/12/STFOUCH2.ans +12 -0
  147. package/assets/images/mugshot/ans/12/STFOUCH3.ans +12 -0
  148. package/assets/images/mugshot/ans/12/STFOUCH4.ans +12 -0
  149. package/assets/images/mugshot/ans/12/STFST00.ans +12 -0
  150. package/assets/images/mugshot/ans/12/STFST01.ans +12 -0
  151. package/assets/images/mugshot/ans/12/STFST02.ans +12 -0
  152. package/assets/images/mugshot/ans/12/STFST10.ans +12 -0
  153. package/assets/images/mugshot/ans/12/STFST11.ans +12 -0
  154. package/assets/images/mugshot/ans/12/STFST12.ans +12 -0
  155. package/assets/images/mugshot/ans/12/STFST20.ans +12 -0
  156. package/assets/images/mugshot/ans/12/STFST21.ans +12 -0
  157. package/assets/images/mugshot/ans/12/STFST22.ans +12 -0
  158. package/assets/images/mugshot/ans/12/STFST30.ans +12 -0
  159. package/assets/images/mugshot/ans/12/STFST31.ans +12 -0
  160. package/assets/images/mugshot/ans/12/STFST32.ans +12 -0
  161. package/assets/images/mugshot/ans/12/STFST40.ans +12 -0
  162. package/assets/images/mugshot/ans/12/STFST41.ans +12 -0
  163. package/assets/images/mugshot/ans/12/STFST42.ans +12 -0
  164. package/assets/images/mugshot/ans/12/STFTL00.ans +12 -0
  165. package/assets/images/mugshot/ans/12/STFTL10.ans +12 -0
  166. package/assets/images/mugshot/ans/12/STFTL20.ans +12 -0
  167. package/assets/images/mugshot/ans/12/STFTL30.ans +12 -0
  168. package/assets/images/mugshot/ans/12/STFTL40.ans +12 -0
  169. package/assets/images/mugshot/ans/12/STFTR00.ans +12 -0
  170. package/assets/images/mugshot/ans/12/STFTR10.ans +12 -0
  171. package/assets/images/mugshot/ans/12/STFTR20.ans +12 -0
  172. package/assets/images/mugshot/ans/12/STFTR30.ans +12 -0
  173. package/assets/images/mugshot/ans/12/STFTR40.ans +12 -0
  174. package/assets/images/mugshot/ans/13/STFDEAD0.ans +13 -0
  175. package/assets/images/mugshot/ans/13/STFEVL0.ans +13 -0
  176. package/assets/images/mugshot/ans/13/STFEVL1.ans +13 -0
  177. package/assets/images/mugshot/ans/13/STFEVL2.ans +13 -0
  178. package/assets/images/mugshot/ans/13/STFEVL3.ans +13 -0
  179. package/assets/images/mugshot/ans/13/STFEVL4.ans +13 -0
  180. package/assets/images/mugshot/ans/13/STFGOD0.ans +13 -0
  181. package/assets/images/mugshot/ans/13/STFKILL0.ans +13 -0
  182. package/assets/images/mugshot/ans/13/STFKILL1.ans +13 -0
  183. package/assets/images/mugshot/ans/13/STFKILL2.ans +13 -0
  184. package/assets/images/mugshot/ans/13/STFKILL3.ans +13 -0
  185. package/assets/images/mugshot/ans/13/STFKILL4.ans +13 -0
  186. package/assets/images/mugshot/ans/13/STFOUCH0.ans +13 -0
  187. package/assets/images/mugshot/ans/13/STFOUCH1.ans +13 -0
  188. package/assets/images/mugshot/ans/13/STFOUCH2.ans +13 -0
  189. package/assets/images/mugshot/ans/13/STFOUCH3.ans +13 -0
  190. package/assets/images/mugshot/ans/13/STFOUCH4.ans +13 -0
  191. package/assets/images/mugshot/ans/13/STFST00.ans +13 -0
  192. package/assets/images/mugshot/ans/13/STFST01.ans +13 -0
  193. package/assets/images/mugshot/ans/13/STFST02.ans +13 -0
  194. package/assets/images/mugshot/ans/13/STFST10.ans +13 -0
  195. package/assets/images/mugshot/ans/13/STFST11.ans +13 -0
  196. package/assets/images/mugshot/ans/13/STFST12.ans +13 -0
  197. package/assets/images/mugshot/ans/13/STFST20.ans +13 -0
  198. package/assets/images/mugshot/ans/13/STFST21.ans +13 -0
  199. package/assets/images/mugshot/ans/13/STFST22.ans +13 -0
  200. package/assets/images/mugshot/ans/13/STFST30.ans +13 -0
  201. package/assets/images/mugshot/ans/13/STFST31.ans +13 -0
  202. package/assets/images/mugshot/ans/13/STFST32.ans +13 -0
  203. package/assets/images/mugshot/ans/13/STFST40.ans +13 -0
  204. package/assets/images/mugshot/ans/13/STFST41.ans +13 -0
  205. package/assets/images/mugshot/ans/13/STFST42.ans +13 -0
  206. package/assets/images/mugshot/ans/13/STFTL00.ans +13 -0
  207. package/assets/images/mugshot/ans/13/STFTL10.ans +13 -0
  208. package/assets/images/mugshot/ans/13/STFTL20.ans +13 -0
  209. package/assets/images/mugshot/ans/13/STFTL30.ans +13 -0
  210. package/assets/images/mugshot/ans/13/STFTL40.ans +13 -0
  211. package/assets/images/mugshot/ans/13/STFTR00.ans +13 -0
  212. package/assets/images/mugshot/ans/13/STFTR10.ans +13 -0
  213. package/assets/images/mugshot/ans/13/STFTR20.ans +13 -0
  214. package/assets/images/mugshot/ans/13/STFTR30.ans +13 -0
  215. package/assets/images/mugshot/ans/13/STFTR40.ans +13 -0
  216. package/assets/images/mugshot/ans/14/STFDEAD0.ans +14 -0
  217. package/assets/images/mugshot/ans/14/STFEVL0.ans +14 -0
  218. package/assets/images/mugshot/ans/14/STFEVL1.ans +14 -0
  219. package/assets/images/mugshot/ans/14/STFEVL2.ans +14 -0
  220. package/assets/images/mugshot/ans/14/STFEVL3.ans +14 -0
  221. package/assets/images/mugshot/ans/14/STFEVL4.ans +14 -0
  222. package/assets/images/mugshot/ans/14/STFGOD0.ans +14 -0
  223. package/assets/images/mugshot/ans/14/STFKILL0.ans +14 -0
  224. package/assets/images/mugshot/ans/14/STFKILL1.ans +14 -0
  225. package/assets/images/mugshot/ans/14/STFKILL2.ans +14 -0
  226. package/assets/images/mugshot/ans/14/STFKILL3.ans +14 -0
  227. package/assets/images/mugshot/ans/14/STFKILL4.ans +14 -0
  228. package/assets/images/mugshot/ans/14/STFOUCH0.ans +14 -0
  229. package/assets/images/mugshot/ans/14/STFOUCH1.ans +14 -0
  230. package/assets/images/mugshot/ans/14/STFOUCH2.ans +14 -0
  231. package/assets/images/mugshot/ans/14/STFOUCH3.ans +14 -0
  232. package/assets/images/mugshot/ans/14/STFOUCH4.ans +14 -0
  233. package/assets/images/mugshot/ans/14/STFST00.ans +14 -0
  234. package/assets/images/mugshot/ans/14/STFST01.ans +14 -0
  235. package/assets/images/mugshot/ans/14/STFST02.ans +14 -0
  236. package/assets/images/mugshot/ans/14/STFST10.ans +14 -0
  237. package/assets/images/mugshot/ans/14/STFST11.ans +14 -0
  238. package/assets/images/mugshot/ans/14/STFST12.ans +14 -0
  239. package/assets/images/mugshot/ans/14/STFST20.ans +14 -0
  240. package/assets/images/mugshot/ans/14/STFST21.ans +14 -0
  241. package/assets/images/mugshot/ans/14/STFST22.ans +14 -0
  242. package/assets/images/mugshot/ans/14/STFST30.ans +14 -0
  243. package/assets/images/mugshot/ans/14/STFST31.ans +14 -0
  244. package/assets/images/mugshot/ans/14/STFST32.ans +14 -0
  245. package/assets/images/mugshot/ans/14/STFST40.ans +14 -0
  246. package/assets/images/mugshot/ans/14/STFST41.ans +14 -0
  247. package/assets/images/mugshot/ans/14/STFST42.ans +14 -0
  248. package/assets/images/mugshot/ans/14/STFTL00.ans +14 -0
  249. package/assets/images/mugshot/ans/14/STFTL10.ans +14 -0
  250. package/assets/images/mugshot/ans/14/STFTL20.ans +14 -0
  251. package/assets/images/mugshot/ans/14/STFTL30.ans +14 -0
  252. package/assets/images/mugshot/ans/14/STFTL40.ans +14 -0
  253. package/assets/images/mugshot/ans/14/STFTR00.ans +14 -0
  254. package/assets/images/mugshot/ans/14/STFTR10.ans +14 -0
  255. package/assets/images/mugshot/ans/14/STFTR20.ans +14 -0
  256. package/assets/images/mugshot/ans/14/STFTR30.ans +14 -0
  257. package/assets/images/mugshot/ans/14/STFTR40.ans +14 -0
  258. package/assets/images/mugshot/ans/15/STFDEAD0.ans +15 -0
  259. package/assets/images/mugshot/ans/15/STFEVL0.ans +15 -0
  260. package/assets/images/mugshot/ans/15/STFEVL1.ans +15 -0
  261. package/assets/images/mugshot/ans/15/STFEVL2.ans +15 -0
  262. package/assets/images/mugshot/ans/15/STFEVL3.ans +15 -0
  263. package/assets/images/mugshot/ans/15/STFEVL4.ans +15 -0
  264. package/assets/images/mugshot/ans/15/STFGOD0.ans +15 -0
  265. package/assets/images/mugshot/ans/15/STFKILL0.ans +15 -0
  266. package/assets/images/mugshot/ans/15/STFKILL1.ans +15 -0
  267. package/assets/images/mugshot/ans/15/STFKILL2.ans +15 -0
  268. package/assets/images/mugshot/ans/15/STFKILL3.ans +15 -0
  269. package/assets/images/mugshot/ans/15/STFKILL4.ans +15 -0
  270. package/assets/images/mugshot/ans/15/STFOUCH0.ans +15 -0
  271. package/assets/images/mugshot/ans/15/STFOUCH1.ans +15 -0
  272. package/assets/images/mugshot/ans/15/STFOUCH2.ans +15 -0
  273. package/assets/images/mugshot/ans/15/STFOUCH3.ans +15 -0
  274. package/assets/images/mugshot/ans/15/STFOUCH4.ans +15 -0
  275. package/assets/images/mugshot/ans/15/STFST00.ans +15 -0
  276. package/assets/images/mugshot/ans/15/STFST01.ans +15 -0
  277. package/assets/images/mugshot/ans/15/STFST02.ans +15 -0
  278. package/assets/images/mugshot/ans/15/STFST10.ans +15 -0
  279. package/assets/images/mugshot/ans/15/STFST11.ans +15 -0
  280. package/assets/images/mugshot/ans/15/STFST12.ans +15 -0
  281. package/assets/images/mugshot/ans/15/STFST20.ans +15 -0
  282. package/assets/images/mugshot/ans/15/STFST21.ans +15 -0
  283. package/assets/images/mugshot/ans/15/STFST22.ans +15 -0
  284. package/assets/images/mugshot/ans/15/STFST30.ans +15 -0
  285. package/assets/images/mugshot/ans/15/STFST31.ans +15 -0
  286. package/assets/images/mugshot/ans/15/STFST32.ans +15 -0
  287. package/assets/images/mugshot/ans/15/STFST40.ans +15 -0
  288. package/assets/images/mugshot/ans/15/STFST41.ans +15 -0
  289. package/assets/images/mugshot/ans/15/STFST42.ans +15 -0
  290. package/assets/images/mugshot/ans/15/STFTL00.ans +15 -0
  291. package/assets/images/mugshot/ans/15/STFTL10.ans +15 -0
  292. package/assets/images/mugshot/ans/15/STFTL20.ans +15 -0
  293. package/assets/images/mugshot/ans/15/STFTL30.ans +15 -0
  294. package/assets/images/mugshot/ans/15/STFTL40.ans +15 -0
  295. package/assets/images/mugshot/ans/15/STFTR00.ans +15 -0
  296. package/assets/images/mugshot/ans/15/STFTR10.ans +15 -0
  297. package/assets/images/mugshot/ans/15/STFTR20.ans +15 -0
  298. package/assets/images/mugshot/ans/15/STFTR30.ans +15 -0
  299. package/assets/images/mugshot/ans/15/STFTR40.ans +15 -0
  300. package/assets/images/mugshot/ans/16/STFDEAD0.ans +16 -0
  301. package/assets/images/mugshot/ans/16/STFEVL0.ans +15 -0
  302. package/assets/images/mugshot/ans/16/STFEVL1.ans +15 -0
  303. package/assets/images/mugshot/ans/16/STFEVL2.ans +15 -0
  304. package/assets/images/mugshot/ans/16/STFEVL3.ans +15 -0
  305. package/assets/images/mugshot/ans/16/STFEVL4.ans +15 -0
  306. package/assets/images/mugshot/ans/16/STFGOD0.ans +15 -0
  307. package/assets/images/mugshot/ans/16/STFKILL0.ans +15 -0
  308. package/assets/images/mugshot/ans/16/STFKILL1.ans +15 -0
  309. package/assets/images/mugshot/ans/16/STFKILL2.ans +15 -0
  310. package/assets/images/mugshot/ans/16/STFKILL3.ans +15 -0
  311. package/assets/images/mugshot/ans/16/STFKILL4.ans +15 -0
  312. package/assets/images/mugshot/ans/16/STFOUCH0.ans +16 -0
  313. package/assets/images/mugshot/ans/16/STFOUCH1.ans +16 -0
  314. package/assets/images/mugshot/ans/16/STFOUCH2.ans +16 -0
  315. package/assets/images/mugshot/ans/16/STFOUCH3.ans +16 -0
  316. package/assets/images/mugshot/ans/16/STFOUCH4.ans +16 -0
  317. package/assets/images/mugshot/ans/16/STFST00.ans +15 -0
  318. package/assets/images/mugshot/ans/16/STFST01.ans +15 -0
  319. package/assets/images/mugshot/ans/16/STFST02.ans +15 -0
  320. package/assets/images/mugshot/ans/16/STFST10.ans +15 -0
  321. package/assets/images/mugshot/ans/16/STFST11.ans +15 -0
  322. package/assets/images/mugshot/ans/16/STFST12.ans +15 -0
  323. package/assets/images/mugshot/ans/16/STFST20.ans +15 -0
  324. package/assets/images/mugshot/ans/16/STFST21.ans +15 -0
  325. package/assets/images/mugshot/ans/16/STFST22.ans +15 -0
  326. package/assets/images/mugshot/ans/16/STFST30.ans +16 -0
  327. package/assets/images/mugshot/ans/16/STFST31.ans +16 -0
  328. package/assets/images/mugshot/ans/16/STFST32.ans +16 -0
  329. package/assets/images/mugshot/ans/16/STFST40.ans +16 -0
  330. package/assets/images/mugshot/ans/16/STFST41.ans +16 -0
  331. package/assets/images/mugshot/ans/16/STFST42.ans +16 -0
  332. package/assets/images/mugshot/ans/16/STFTL00.ans +15 -0
  333. package/assets/images/mugshot/ans/16/STFTL10.ans +15 -0
  334. package/assets/images/mugshot/ans/16/STFTL20.ans +15 -0
  335. package/assets/images/mugshot/ans/16/STFTL30.ans +16 -0
  336. package/assets/images/mugshot/ans/16/STFTL40.ans +16 -0
  337. package/assets/images/mugshot/ans/16/STFTR00.ans +15 -0
  338. package/assets/images/mugshot/ans/16/STFTR10.ans +15 -0
  339. package/assets/images/mugshot/ans/16/STFTR20.ans +15 -0
  340. package/assets/images/mugshot/ans/16/STFTR30.ans +15 -0
  341. package/assets/images/mugshot/ans/16/STFTR40.ans +15 -0
  342. package/assets/images/mugshot/ans/4/STFDEAD0.ans +4 -0
  343. package/assets/images/mugshot/ans/4/STFEVL0.ans +4 -0
  344. package/assets/images/mugshot/ans/4/STFEVL1.ans +4 -0
  345. package/assets/images/mugshot/ans/4/STFEVL2.ans +4 -0
  346. package/assets/images/mugshot/ans/4/STFEVL3.ans +4 -0
  347. package/assets/images/mugshot/ans/4/STFEVL4.ans +4 -0
  348. package/assets/images/mugshot/ans/4/STFGOD0.ans +4 -0
  349. package/assets/images/mugshot/ans/4/STFKILL0.ans +4 -0
  350. package/assets/images/mugshot/ans/4/STFKILL1.ans +4 -0
  351. package/assets/images/mugshot/ans/4/STFKILL2.ans +4 -0
  352. package/assets/images/mugshot/ans/4/STFKILL3.ans +4 -0
  353. package/assets/images/mugshot/ans/4/STFKILL4.ans +4 -0
  354. package/assets/images/mugshot/ans/4/STFOUCH0.ans +4 -0
  355. package/assets/images/mugshot/ans/4/STFOUCH1.ans +4 -0
  356. package/assets/images/mugshot/ans/4/STFOUCH2.ans +4 -0
  357. package/assets/images/mugshot/ans/4/STFOUCH3.ans +4 -0
  358. package/assets/images/mugshot/ans/4/STFOUCH4.ans +4 -0
  359. package/assets/images/mugshot/ans/4/STFST00.ans +4 -0
  360. package/assets/images/mugshot/ans/4/STFST01.ans +4 -0
  361. package/assets/images/mugshot/ans/4/STFST02.ans +4 -0
  362. package/assets/images/mugshot/ans/4/STFST10.ans +4 -0
  363. package/assets/images/mugshot/ans/4/STFST11.ans +4 -0
  364. package/assets/images/mugshot/ans/4/STFST12.ans +4 -0
  365. package/assets/images/mugshot/ans/4/STFST20.ans +4 -0
  366. package/assets/images/mugshot/ans/4/STFST21.ans +4 -0
  367. package/assets/images/mugshot/ans/4/STFST22.ans +4 -0
  368. package/assets/images/mugshot/ans/4/STFST30.ans +4 -0
  369. package/assets/images/mugshot/ans/4/STFST31.ans +4 -0
  370. package/assets/images/mugshot/ans/4/STFST32.ans +4 -0
  371. package/assets/images/mugshot/ans/4/STFST40.ans +4 -0
  372. package/assets/images/mugshot/ans/4/STFST41.ans +4 -0
  373. package/assets/images/mugshot/ans/4/STFST42.ans +4 -0
  374. package/assets/images/mugshot/ans/4/STFTL00.ans +4 -0
  375. package/assets/images/mugshot/ans/4/STFTL10.ans +4 -0
  376. package/assets/images/mugshot/ans/4/STFTL20.ans +4 -0
  377. package/assets/images/mugshot/ans/4/STFTL30.ans +4 -0
  378. package/assets/images/mugshot/ans/4/STFTL40.ans +4 -0
  379. package/assets/images/mugshot/ans/4/STFTR00.ans +4 -0
  380. package/assets/images/mugshot/ans/4/STFTR10.ans +4 -0
  381. package/assets/images/mugshot/ans/4/STFTR20.ans +4 -0
  382. package/assets/images/mugshot/ans/4/STFTR30.ans +4 -0
  383. package/assets/images/mugshot/ans/4/STFTR40.ans +4 -0
  384. package/assets/images/mugshot/ans/5/STFDEAD0.ans +5 -0
  385. package/assets/images/mugshot/ans/5/STFEVL0.ans +5 -0
  386. package/assets/images/mugshot/ans/5/STFEVL1.ans +5 -0
  387. package/assets/images/mugshot/ans/5/STFEVL2.ans +5 -0
  388. package/assets/images/mugshot/ans/5/STFEVL3.ans +5 -0
  389. package/assets/images/mugshot/ans/5/STFEVL4.ans +5 -0
  390. package/assets/images/mugshot/ans/5/STFGOD0.ans +5 -0
  391. package/assets/images/mugshot/ans/5/STFKILL0.ans +5 -0
  392. package/assets/images/mugshot/ans/5/STFKILL1.ans +5 -0
  393. package/assets/images/mugshot/ans/5/STFKILL2.ans +5 -0
  394. package/assets/images/mugshot/ans/5/STFKILL3.ans +5 -0
  395. package/assets/images/mugshot/ans/5/STFKILL4.ans +5 -0
  396. package/assets/images/mugshot/ans/5/STFOUCH0.ans +5 -0
  397. package/assets/images/mugshot/ans/5/STFOUCH1.ans +5 -0
  398. package/assets/images/mugshot/ans/5/STFOUCH2.ans +5 -0
  399. package/assets/images/mugshot/ans/5/STFOUCH3.ans +5 -0
  400. package/assets/images/mugshot/ans/5/STFOUCH4.ans +5 -0
  401. package/assets/images/mugshot/ans/5/STFST00.ans +5 -0
  402. package/assets/images/mugshot/ans/5/STFST01.ans +5 -0
  403. package/assets/images/mugshot/ans/5/STFST02.ans +5 -0
  404. package/assets/images/mugshot/ans/5/STFST10.ans +5 -0
  405. package/assets/images/mugshot/ans/5/STFST11.ans +5 -0
  406. package/assets/images/mugshot/ans/5/STFST12.ans +5 -0
  407. package/assets/images/mugshot/ans/5/STFST20.ans +5 -0
  408. package/assets/images/mugshot/ans/5/STFST21.ans +5 -0
  409. package/assets/images/mugshot/ans/5/STFST22.ans +5 -0
  410. package/assets/images/mugshot/ans/5/STFST30.ans +5 -0
  411. package/assets/images/mugshot/ans/5/STFST31.ans +5 -0
  412. package/assets/images/mugshot/ans/5/STFST32.ans +5 -0
  413. package/assets/images/mugshot/ans/5/STFST40.ans +5 -0
  414. package/assets/images/mugshot/ans/5/STFST41.ans +5 -0
  415. package/assets/images/mugshot/ans/5/STFST42.ans +5 -0
  416. package/assets/images/mugshot/ans/5/STFTL00.ans +5 -0
  417. package/assets/images/mugshot/ans/5/STFTL10.ans +5 -0
  418. package/assets/images/mugshot/ans/5/STFTL20.ans +5 -0
  419. package/assets/images/mugshot/ans/5/STFTL30.ans +5 -0
  420. package/assets/images/mugshot/ans/5/STFTL40.ans +5 -0
  421. package/assets/images/mugshot/ans/5/STFTR00.ans +5 -0
  422. package/assets/images/mugshot/ans/5/STFTR10.ans +5 -0
  423. package/assets/images/mugshot/ans/5/STFTR20.ans +5 -0
  424. package/assets/images/mugshot/ans/5/STFTR30.ans +5 -0
  425. package/assets/images/mugshot/ans/5/STFTR40.ans +5 -0
  426. package/assets/images/mugshot/ans/6/STFDEAD0.ans +6 -0
  427. package/assets/images/mugshot/ans/6/STFEVL0.ans +6 -0
  428. package/assets/images/mugshot/ans/6/STFEVL1.ans +6 -0
  429. package/assets/images/mugshot/ans/6/STFEVL2.ans +6 -0
  430. package/assets/images/mugshot/ans/6/STFEVL3.ans +6 -0
  431. package/assets/images/mugshot/ans/6/STFEVL4.ans +6 -0
  432. package/assets/images/mugshot/ans/6/STFGOD0.ans +6 -0
  433. package/assets/images/mugshot/ans/6/STFKILL0.ans +6 -0
  434. package/assets/images/mugshot/ans/6/STFKILL1.ans +6 -0
  435. package/assets/images/mugshot/ans/6/STFKILL2.ans +6 -0
  436. package/assets/images/mugshot/ans/6/STFKILL3.ans +6 -0
  437. package/assets/images/mugshot/ans/6/STFKILL4.ans +6 -0
  438. package/assets/images/mugshot/ans/6/STFOUCH0.ans +6 -0
  439. package/assets/images/mugshot/ans/6/STFOUCH1.ans +6 -0
  440. package/assets/images/mugshot/ans/6/STFOUCH2.ans +6 -0
  441. package/assets/images/mugshot/ans/6/STFOUCH3.ans +6 -0
  442. package/assets/images/mugshot/ans/6/STFOUCH4.ans +6 -0
  443. package/assets/images/mugshot/ans/6/STFST00.ans +6 -0
  444. package/assets/images/mugshot/ans/6/STFST01.ans +6 -0
  445. package/assets/images/mugshot/ans/6/STFST02.ans +6 -0
  446. package/assets/images/mugshot/ans/6/STFST10.ans +6 -0
  447. package/assets/images/mugshot/ans/6/STFST11.ans +6 -0
  448. package/assets/images/mugshot/ans/6/STFST12.ans +6 -0
  449. package/assets/images/mugshot/ans/6/STFST20.ans +6 -0
  450. package/assets/images/mugshot/ans/6/STFST21.ans +6 -0
  451. package/assets/images/mugshot/ans/6/STFST22.ans +6 -0
  452. package/assets/images/mugshot/ans/6/STFST30.ans +6 -0
  453. package/assets/images/mugshot/ans/6/STFST31.ans +6 -0
  454. package/assets/images/mugshot/ans/6/STFST32.ans +6 -0
  455. package/assets/images/mugshot/ans/6/STFST40.ans +6 -0
  456. package/assets/images/mugshot/ans/6/STFST41.ans +6 -0
  457. package/assets/images/mugshot/ans/6/STFST42.ans +6 -0
  458. package/assets/images/mugshot/ans/6/STFTL00.ans +6 -0
  459. package/assets/images/mugshot/ans/6/STFTL10.ans +6 -0
  460. package/assets/images/mugshot/ans/6/STFTL20.ans +6 -0
  461. package/assets/images/mugshot/ans/6/STFTL30.ans +6 -0
  462. package/assets/images/mugshot/ans/6/STFTL40.ans +6 -0
  463. package/assets/images/mugshot/ans/6/STFTR00.ans +6 -0
  464. package/assets/images/mugshot/ans/6/STFTR10.ans +6 -0
  465. package/assets/images/mugshot/ans/6/STFTR20.ans +6 -0
  466. package/assets/images/mugshot/ans/6/STFTR30.ans +6 -0
  467. package/assets/images/mugshot/ans/6/STFTR40.ans +6 -0
  468. package/assets/images/mugshot/ans/7/STFDEAD0.ans +7 -0
  469. package/assets/images/mugshot/ans/7/STFEVL0.ans +7 -0
  470. package/assets/images/mugshot/ans/7/STFEVL1.ans +7 -0
  471. package/assets/images/mugshot/ans/7/STFEVL2.ans +7 -0
  472. package/assets/images/mugshot/ans/7/STFEVL3.ans +7 -0
  473. package/assets/images/mugshot/ans/7/STFEVL4.ans +7 -0
  474. package/assets/images/mugshot/ans/7/STFGOD0.ans +7 -0
  475. package/assets/images/mugshot/ans/7/STFKILL0.ans +7 -0
  476. package/assets/images/mugshot/ans/7/STFKILL1.ans +7 -0
  477. package/assets/images/mugshot/ans/7/STFKILL2.ans +7 -0
  478. package/assets/images/mugshot/ans/7/STFKILL3.ans +7 -0
  479. package/assets/images/mugshot/ans/7/STFKILL4.ans +7 -0
  480. package/assets/images/mugshot/ans/7/STFOUCH0.ans +7 -0
  481. package/assets/images/mugshot/ans/7/STFOUCH1.ans +7 -0
  482. package/assets/images/mugshot/ans/7/STFOUCH2.ans +7 -0
  483. package/assets/images/mugshot/ans/7/STFOUCH3.ans +7 -0
  484. package/assets/images/mugshot/ans/7/STFOUCH4.ans +7 -0
  485. package/assets/images/mugshot/ans/7/STFST00.ans +7 -0
  486. package/assets/images/mugshot/ans/7/STFST01.ans +7 -0
  487. package/assets/images/mugshot/ans/7/STFST02.ans +7 -0
  488. package/assets/images/mugshot/ans/7/STFST10.ans +7 -0
  489. package/assets/images/mugshot/ans/7/STFST11.ans +7 -0
  490. package/assets/images/mugshot/ans/7/STFST12.ans +7 -0
  491. package/assets/images/mugshot/ans/7/STFST20.ans +7 -0
  492. package/assets/images/mugshot/ans/7/STFST21.ans +7 -0
  493. package/assets/images/mugshot/ans/7/STFST22.ans +7 -0
  494. package/assets/images/mugshot/ans/7/STFST30.ans +7 -0
  495. package/assets/images/mugshot/ans/7/STFST31.ans +7 -0
  496. package/assets/images/mugshot/ans/7/STFST32.ans +7 -0
  497. package/assets/images/mugshot/ans/7/STFST40.ans +7 -0
  498. package/assets/images/mugshot/ans/7/STFST41.ans +7 -0
  499. package/assets/images/mugshot/ans/7/STFST42.ans +7 -0
  500. package/assets/images/mugshot/ans/7/STFTL00.ans +7 -0
  501. package/assets/images/mugshot/ans/7/STFTL10.ans +7 -0
  502. package/assets/images/mugshot/ans/7/STFTL20.ans +7 -0
  503. package/assets/images/mugshot/ans/7/STFTL30.ans +7 -0
  504. package/assets/images/mugshot/ans/7/STFTL40.ans +7 -0
  505. package/assets/images/mugshot/ans/7/STFTR00.ans +7 -0
  506. package/assets/images/mugshot/ans/7/STFTR10.ans +7 -0
  507. package/assets/images/mugshot/ans/7/STFTR20.ans +7 -0
  508. package/assets/images/mugshot/ans/7/STFTR30.ans +7 -0
  509. package/assets/images/mugshot/ans/7/STFTR40.ans +7 -0
  510. package/assets/images/mugshot/ans/8/STFDEAD0.ans +8 -0
  511. package/assets/images/mugshot/ans/8/STFEVL0.ans +8 -0
  512. package/assets/images/mugshot/ans/8/STFEVL1.ans +8 -0
  513. package/assets/images/mugshot/ans/8/STFEVL2.ans +8 -0
  514. package/assets/images/mugshot/ans/8/STFEVL3.ans +8 -0
  515. package/assets/images/mugshot/ans/8/STFEVL4.ans +8 -0
  516. package/assets/images/mugshot/ans/8/STFGOD0.ans +8 -0
  517. package/assets/images/mugshot/ans/8/STFKILL0.ans +8 -0
  518. package/assets/images/mugshot/ans/8/STFKILL1.ans +8 -0
  519. package/assets/images/mugshot/ans/8/STFKILL2.ans +8 -0
  520. package/assets/images/mugshot/ans/8/STFKILL3.ans +8 -0
  521. package/assets/images/mugshot/ans/8/STFKILL4.ans +8 -0
  522. package/assets/images/mugshot/ans/8/STFOUCH0.ans +8 -0
  523. package/assets/images/mugshot/ans/8/STFOUCH1.ans +8 -0
  524. package/assets/images/mugshot/ans/8/STFOUCH2.ans +8 -0
  525. package/assets/images/mugshot/ans/8/STFOUCH3.ans +8 -0
  526. package/assets/images/mugshot/ans/8/STFOUCH4.ans +8 -0
  527. package/assets/images/mugshot/ans/8/STFST00.ans +8 -0
  528. package/assets/images/mugshot/ans/8/STFST01.ans +8 -0
  529. package/assets/images/mugshot/ans/8/STFST02.ans +8 -0
  530. package/assets/images/mugshot/ans/8/STFST10.ans +8 -0
  531. package/assets/images/mugshot/ans/8/STFST11.ans +8 -0
  532. package/assets/images/mugshot/ans/8/STFST12.ans +8 -0
  533. package/assets/images/mugshot/ans/8/STFST20.ans +8 -0
  534. package/assets/images/mugshot/ans/8/STFST21.ans +8 -0
  535. package/assets/images/mugshot/ans/8/STFST22.ans +8 -0
  536. package/assets/images/mugshot/ans/8/STFST30.ans +8 -0
  537. package/assets/images/mugshot/ans/8/STFST31.ans +8 -0
  538. package/assets/images/mugshot/ans/8/STFST32.ans +8 -0
  539. package/assets/images/mugshot/ans/8/STFST40.ans +8 -0
  540. package/assets/images/mugshot/ans/8/STFST41.ans +8 -0
  541. package/assets/images/mugshot/ans/8/STFST42.ans +8 -0
  542. package/assets/images/mugshot/ans/8/STFTL00.ans +8 -0
  543. package/assets/images/mugshot/ans/8/STFTL10.ans +8 -0
  544. package/assets/images/mugshot/ans/8/STFTL20.ans +8 -0
  545. package/assets/images/mugshot/ans/8/STFTL30.ans +8 -0
  546. package/assets/images/mugshot/ans/8/STFTL40.ans +8 -0
  547. package/assets/images/mugshot/ans/8/STFTR00.ans +8 -0
  548. package/assets/images/mugshot/ans/8/STFTR10.ans +8 -0
  549. package/assets/images/mugshot/ans/8/STFTR20.ans +8 -0
  550. package/assets/images/mugshot/ans/8/STFTR30.ans +8 -0
  551. package/assets/images/mugshot/ans/8/STFTR40.ans +8 -0
  552. package/assets/images/mugshot/ans/9/STFDEAD0.ans +9 -0
  553. package/assets/images/mugshot/ans/9/STFEVL0.ans +9 -0
  554. package/assets/images/mugshot/ans/9/STFEVL1.ans +9 -0
  555. package/assets/images/mugshot/ans/9/STFEVL2.ans +9 -0
  556. package/assets/images/mugshot/ans/9/STFEVL3.ans +9 -0
  557. package/assets/images/mugshot/ans/9/STFEVL4.ans +9 -0
  558. package/assets/images/mugshot/ans/9/STFGOD0.ans +9 -0
  559. package/assets/images/mugshot/ans/9/STFKILL0.ans +9 -0
  560. package/assets/images/mugshot/ans/9/STFKILL1.ans +9 -0
  561. package/assets/images/mugshot/ans/9/STFKILL2.ans +9 -0
  562. package/assets/images/mugshot/ans/9/STFKILL3.ans +9 -0
  563. package/assets/images/mugshot/ans/9/STFKILL4.ans +9 -0
  564. package/assets/images/mugshot/ans/9/STFOUCH0.ans +9 -0
  565. package/assets/images/mugshot/ans/9/STFOUCH1.ans +9 -0
  566. package/assets/images/mugshot/ans/9/STFOUCH2.ans +9 -0
  567. package/assets/images/mugshot/ans/9/STFOUCH3.ans +9 -0
  568. package/assets/images/mugshot/ans/9/STFOUCH4.ans +9 -0
  569. package/assets/images/mugshot/ans/9/STFST00.ans +9 -0
  570. package/assets/images/mugshot/ans/9/STFST01.ans +9 -0
  571. package/assets/images/mugshot/ans/9/STFST02.ans +9 -0
  572. package/assets/images/mugshot/ans/9/STFST10.ans +9 -0
  573. package/assets/images/mugshot/ans/9/STFST11.ans +9 -0
  574. package/assets/images/mugshot/ans/9/STFST12.ans +9 -0
  575. package/assets/images/mugshot/ans/9/STFST20.ans +9 -0
  576. package/assets/images/mugshot/ans/9/STFST21.ans +9 -0
  577. package/assets/images/mugshot/ans/9/STFST22.ans +9 -0
  578. package/assets/images/mugshot/ans/9/STFST30.ans +9 -0
  579. package/assets/images/mugshot/ans/9/STFST31.ans +9 -0
  580. package/assets/images/mugshot/ans/9/STFST32.ans +9 -0
  581. package/assets/images/mugshot/ans/9/STFST40.ans +9 -0
  582. package/assets/images/mugshot/ans/9/STFST41.ans +9 -0
  583. package/assets/images/mugshot/ans/9/STFST42.ans +9 -0
  584. package/assets/images/mugshot/ans/9/STFTL00.ans +9 -0
  585. package/assets/images/mugshot/ans/9/STFTL10.ans +9 -0
  586. package/assets/images/mugshot/ans/9/STFTL20.ans +9 -0
  587. package/assets/images/mugshot/ans/9/STFTL30.ans +9 -0
  588. package/assets/images/mugshot/ans/9/STFTL40.ans +9 -0
  589. package/assets/images/mugshot/ans/9/STFTR00.ans +9 -0
  590. package/assets/images/mugshot/ans/9/STFTR10.ans +9 -0
  591. package/assets/images/mugshot/ans/9/STFTR20.ans +9 -0
  592. package/assets/images/mugshot/ans/9/STFTR30.ans +9 -0
  593. package/assets/images/mugshot/ans/9/STFTR40.ans +9 -0
  594. package/assets/images/mugshot/wad/STFDEAD0.png +0 -0
  595. package/assets/images/mugshot/wad/STFEVL0.png +0 -0
  596. package/assets/images/mugshot/wad/STFEVL1.png +0 -0
  597. package/assets/images/mugshot/wad/STFEVL2.png +0 -0
  598. package/assets/images/mugshot/wad/STFEVL3.png +0 -0
  599. package/assets/images/mugshot/wad/STFEVL4.png +0 -0
  600. package/assets/images/mugshot/wad/STFGOD0.png +0 -0
  601. package/assets/images/mugshot/wad/STFKILL0.png +0 -0
  602. package/assets/images/mugshot/wad/STFKILL1.png +0 -0
  603. package/assets/images/mugshot/wad/STFKILL2.png +0 -0
  604. package/assets/images/mugshot/wad/STFKILL3.png +0 -0
  605. package/assets/images/mugshot/wad/STFKILL4.png +0 -0
  606. package/assets/images/mugshot/wad/STFOUCH0.png +0 -0
  607. package/assets/images/mugshot/wad/STFOUCH1.png +0 -0
  608. package/assets/images/mugshot/wad/STFOUCH2.png +0 -0
  609. package/assets/images/mugshot/wad/STFOUCH3.png +0 -0
  610. package/assets/images/mugshot/wad/STFOUCH4.png +0 -0
  611. package/assets/images/mugshot/wad/STFST00.png +0 -0
  612. package/assets/images/mugshot/wad/STFST01.png +0 -0
  613. package/assets/images/mugshot/wad/STFST02.png +0 -0
  614. package/assets/images/mugshot/wad/STFST10.png +0 -0
  615. package/assets/images/mugshot/wad/STFST11.png +0 -0
  616. package/assets/images/mugshot/wad/STFST12.png +0 -0
  617. package/assets/images/mugshot/wad/STFST20.png +0 -0
  618. package/assets/images/mugshot/wad/STFST21.png +0 -0
  619. package/assets/images/mugshot/wad/STFST22.png +0 -0
  620. package/assets/images/mugshot/wad/STFST30.png +0 -0
  621. package/assets/images/mugshot/wad/STFST31.png +0 -0
  622. package/assets/images/mugshot/wad/STFST32.png +0 -0
  623. package/assets/images/mugshot/wad/STFST40.png +0 -0
  624. package/assets/images/mugshot/wad/STFST41.png +0 -0
  625. package/assets/images/mugshot/wad/STFST42.png +0 -0
  626. package/assets/images/mugshot/wad/STFTL00.png +0 -0
  627. package/assets/images/mugshot/wad/STFTL10.png +0 -0
  628. package/assets/images/mugshot/wad/STFTL20.png +0 -0
  629. package/assets/images/mugshot/wad/STFTL30.png +0 -0
  630. package/assets/images/mugshot/wad/STFTL40.png +0 -0
  631. package/assets/images/mugshot/wad/STFTR00.png +0 -0
  632. package/assets/images/mugshot/wad/STFTR10.png +0 -0
  633. package/assets/images/mugshot/wad/STFTR20.png +0 -0
  634. package/assets/images/mugshot/wad/STFTR30.png +0 -0
  635. package/assets/images/mugshot/wad/STFTR40.png +0 -0
  636. package/bin/cli.js +163 -0
  637. package/package.json +39 -0
  638. package/presets/default.toml +30 -0
  639. package/presets/full.toml +80 -0
  640. package/presets/minimal.toml +19 -0
  641. package/src/ansi.js +20 -0
  642. package/src/face.js +126 -0
  643. package/src/hook.js +136 -0
  644. package/src/render.js +463 -0
  645. package/src/statusline.js +318 -0
package/bin/cli.js ADDED
@@ -0,0 +1,163 @@
1
+ #!/usr/bin/env node
2
+ // Wire claude-doom-statusbar into Claude Code, so you never touch settings.json by hand.
3
+ // Port of install.py.
4
+ //
5
+ // claude-doom-statusbar install # install into ~/.claude/settings.json
6
+ // claude-doom-statusbar install --preset full # pick a preset (full | default | minimal)
7
+ // claude-doom-statusbar install --project # install into ./.claude/settings.json instead
8
+ // claude-doom-statusbar uninstall # remove everything this installer added
9
+ //
10
+ // It merges into your existing settings (other hooks / statusline are preserved or
11
+ // backed up), is safe to re-run, and prints what to do next.
12
+
13
+ import { readFileSync, writeFileSync, copyFileSync, existsSync, mkdirSync } from "node:fs";
14
+ import os from "node:os";
15
+ import path from "node:path";
16
+ import { fileURLToPath } from "node:url";
17
+
18
+ const HERE = path.dirname(fileURLToPath(import.meta.url)); // bin/
19
+ const ROOT = path.dirname(HERE); // package root
20
+
21
+ // Normalise to forward slashes, like install.py's `.replace("\\", "/")`. The marker we
22
+ // DETECT below must match the command we WRITE byte-for-byte, including slash direction —
23
+ // otherwise a second install double-adds. So everything goes through this one funnel.
24
+ const slash = (p) => p.replace(/\\/g, "/");
25
+
26
+ const STATUSLINE = slash(path.join(ROOT, "src", "statusline.js"));
27
+ const HOOK = slash(path.join(ROOT, "src", "hook.js"));
28
+ const STATUSLINE_CMD = `node "${STATUSLINE}"`;
29
+ const HOOK_CMD = `node "${HOOK}"`;
30
+
31
+ // Lifecycle events the mugshot hook understands (face reactions, geiger, subagents,
32
+ // tasks, permission mode). PreToolUse has no matcher -> fires for every tool.
33
+ const HOOK_EVENTS = [
34
+ "PreToolUse", "PostToolUse", "PostToolUseFailure", "PermissionDenied",
35
+ "Stop", "SubagentStart", "SubagentStop", "TaskCreated", "TaskCompleted",
36
+ ];
37
+
38
+ // How we recognise our own entries — current JS scripts plus legacy Python ones, so a
39
+ // user who ran install.py earlier still gets cleaned up by `uninstall`.
40
+ const HOOK_MARKS = ["src/hook.js", "mugshot_hook.py"];
41
+ const SL_MARKS = ["src/statusline.js", "statusline.py"];
42
+ const hasMark = (s, marks) => marks.some((m) => slash(String(s || "")).includes(m));
43
+
44
+ function die(msg) {
45
+ process.stderr.write(msg + "\n");
46
+ process.exit(1);
47
+ }
48
+
49
+ function settingsFile(project) {
50
+ const base = project ? path.join(process.cwd(), ".claude") : path.join(os.homedir(), ".claude");
51
+ return path.join(base, "settings.json");
52
+ }
53
+
54
+ function load(p) {
55
+ let text;
56
+ try {
57
+ text = readFileSync(p, "utf-8");
58
+ } catch (e) {
59
+ if (e.code === "ENOENT") return {};
60
+ throw e;
61
+ }
62
+ try {
63
+ return JSON.parse(text);
64
+ } catch (e) {
65
+ die(`! ${p} is not valid JSON (${e.message}); fix or move it, then re-run.`);
66
+ }
67
+ }
68
+
69
+ function save(p, data) {
70
+ mkdirSync(path.dirname(p), { recursive: true });
71
+ if (existsSync(p)) copyFileSync(p, p + ".bak"); // one-level backup before writing
72
+ writeFileSync(p, JSON.stringify(data, null, 2) + "\n", "utf-8");
73
+ }
74
+
75
+ const ours = (entry) => (entry.hooks || []).some((h) => hasMark(h.command, HOOK_MARKS));
76
+
77
+ function install(cfg, preset) {
78
+ const notes = [];
79
+ const existing = cfg.statusLine;
80
+ if (existing && !hasMark(JSON.stringify(existing), SL_MARKS)) {
81
+ notes.push("replaced your existing statusLine (the old one is in settings.json.bak)");
82
+ }
83
+ cfg.statusLine = { type: "command", command: STATUSLINE_CMD, refreshInterval: 1 };
84
+
85
+ const env = (cfg.env ??= {});
86
+ const presetFile = preset.endsWith(".toml") ? preset : preset + ".toml";
87
+ env.DOOMBAR_PRESET = slash(path.join(ROOT, "presets", presetFile));
88
+ env.FORCE_HYPERLINK ??= "1"; // clickable links (Windows Terminal needs this)
89
+
90
+ const hooks = (cfg.hooks ??= {});
91
+ for (const ev of HOOK_EVENTS) {
92
+ const lst = (hooks[ev] ??= []);
93
+ if (!lst.some(ours)) {
94
+ // idempotent: don't double-add
95
+ lst.push({ hooks: [{ type: "command", command: HOOK_CMD }] });
96
+ }
97
+ }
98
+ return notes;
99
+ }
100
+
101
+ function uninstall(cfg) {
102
+ if (hasMark(cfg.statusLine?.command, SL_MARKS)) delete cfg.statusLine;
103
+
104
+ const env = cfg.env || {};
105
+ for (const k of ["DOOMBAR_PRESET", "FORCE_HYPERLINK"]) delete env[k];
106
+ if (Object.keys(env).length === 0) delete cfg.env;
107
+
108
+ const hooks = cfg.hooks || {};
109
+ for (const ev of Object.keys(hooks)) {
110
+ hooks[ev] = hooks[ev].filter((e) => !ours(e));
111
+ if (hooks[ev].length === 0) delete hooks[ev];
112
+ }
113
+ if (Object.keys(hooks).length === 0) delete cfg.hooks;
114
+ }
115
+
116
+ function parseArgs(argv) {
117
+ const out = { cmd: "install", preset: "full", project: false };
118
+ for (let i = 0; i < argv.length; i++) {
119
+ const a = argv[i];
120
+ if (a === "install" || a === "uninstall") out.cmd = a;
121
+ else if (a === "--uninstall") out.cmd = "uninstall";
122
+ else if (a === "--project") out.project = true;
123
+ else if (a === "--preset") out.preset = argv[++i];
124
+ else if (a.startsWith("--preset=")) out.preset = a.slice("--preset=".length);
125
+ else die(`! unknown argument: ${a}`);
126
+ }
127
+ if (out.cmd === "install" && !out.preset) die("! --preset needs a value (full | default | minimal)");
128
+ return out;
129
+ }
130
+
131
+ function main() {
132
+ const args = parseArgs(process.argv.slice(2));
133
+ const p = settingsFile(args.project);
134
+ const cfg = load(p);
135
+
136
+ if (args.cmd === "uninstall") {
137
+ uninstall(cfg);
138
+ save(p, cfg);
139
+ console.log(`✓ removed claude-doom-statusbar from ${p}`);
140
+ console.log(" restart Claude Code to apply.");
141
+ return;
142
+ }
143
+
144
+ if (!existsSync(fileURLToPath(new URL("../src/statusline.js", import.meta.url)))) {
145
+ die(`! can't find ${STATUSLINE} — reinstall the package.`);
146
+ }
147
+ const notes = install(cfg, args.preset);
148
+ save(p, cfg);
149
+
150
+ console.log(`✓ installed claude-doom-statusbar into ${p}`);
151
+ console.log(` statusline : ${STATUSLINE_CMD}`);
152
+ console.log(` preset : ${args.preset}`);
153
+ console.log(` hooks : ${HOOK_EVENTS.join(", ")}`);
154
+ for (const n of notes) console.log(` note : ${n}`);
155
+ console.log();
156
+ console.log("Next:");
157
+ console.log(" 1. (optional) install chafa for a sharper mugshot; without it a pre-rendered face is used.");
158
+ console.log(" 2. restart Claude Code.");
159
+ console.log(" Clickable links need FORCE_HYPERLINK=1 (set for you here; on Windows Terminal you may");
160
+ console.log(" also need to launch with it: $env:FORCE_HYPERLINK='1'; claude ).");
161
+ }
162
+
163
+ main();
package/package.json ADDED
@@ -0,0 +1,39 @@
1
+ {
2
+ "name": "claude-doom-statusbar",
3
+ "version": "0.1.0",
4
+ "description": "DOOM-inspired status bar for the Claude Code CLI — a mugshot that tracks session health, plus usage, model, project, system, and a live subagent list.",
5
+ "type": "module",
6
+ "bin": {
7
+ "claude-doom-statusbar": "bin/cli.js"
8
+ },
9
+ "files": [
10
+ "src",
11
+ "bin",
12
+ "presets",
13
+ "assets"
14
+ ],
15
+ "scripts": {
16
+ "statusline": "node src/statusline.js",
17
+ "hook": "node src/hook.js",
18
+ "test": "node test/installer.test.mjs && node test/smoke.test.mjs && node test/hook-tasks.test.mjs && node test/statusline-tasks.test.mjs && node test/render-scroll.test.mjs && node test/e2e-tasks.test.mjs"
19
+ },
20
+ "engines": {
21
+ "node": ">=18"
22
+ },
23
+ "dependencies": {
24
+ "smol-toml": "^1.6.1"
25
+ },
26
+ "keywords": [
27
+ "claude-code",
28
+ "statusline",
29
+ "doom",
30
+ "terminal",
31
+ "hud",
32
+ "tui"
33
+ ],
34
+ "repository": {
35
+ "type": "git",
36
+ "url": "git+https://github.com/99LevelsUp/claude-doom-statusbar.git"
37
+ },
38
+ "license": "MIT"
39
+ }
@@ -0,0 +1,30 @@
1
+ # default — balanced (the live-mockup look)
2
+ [bar]
3
+ border_style = "vertical"
4
+ border_color = "term-fg"
5
+ box_background = "term-bg"
6
+ headers = true
7
+
8
+ [mugshot]
9
+ background = "#000000"
10
+
11
+ [[segment]]
12
+ type = "box"
13
+ title = "USAGE"
14
+ metric = [
15
+ { id = "context.hp", render = "bar", icon = "🧠", color = "threshold" },
16
+ { id = "ratelimit.5h", render = "bar", icon = "🕔", color = "threshold" },
17
+ { id = "ratelimit.7d", render = "bar", icon = "📅", color = "threshold" },
18
+ ]
19
+
20
+ [[segment]]
21
+ type = "mugshot"
22
+
23
+ [[segment]]
24
+ type = "box"
25
+ title = "GIT"
26
+ metric = [
27
+ { id = "git.branch", render = "text", icon = "🌿" },
28
+ { group = ["git.behind", "git.ahead"], render = "number", sep = " ", icon = "⇅" },
29
+ { id = "cost.total", render = "number", icon = "💰" },
30
+ ]
@@ -0,0 +1,80 @@
1
+ # full — DOOM panel, everything on
2
+ [bar]
3
+ border_style = "vertical"
4
+ border_color = "term-bg" # seamless cuts through the panel
5
+ box_background = "#1c2036"
6
+ headers = true
7
+
8
+ [mugshot]
9
+ background = "#000000"
10
+
11
+ [[segment]]
12
+ type = "box"
13
+ title = "MODEL"
14
+ metric = [
15
+ { id = "model.name", render = "text", icon = "🤖", right = "model.effort" },
16
+ { id = "model.mode", render = "text" }, # 💭 thinking 🚀 fast
17
+ { id = "model.permission", render = "text" }, # 📋 plan / ⏩ auto (hidden on default)
18
+ { id = "model.style", render = "text", icon = "🎨" },
19
+ { id = "advisor.model", render = "text", icon = "🧙" },
20
+ ]
21
+
22
+ [[segment]]
23
+ type = "box"
24
+ title = "USAGE"
25
+ metric = [
26
+ { id = "context.hp", render = "bar", icon = "🧠", color = "threshold" },
27
+ { id = "ratelimit.5h", render = "bar", icon = "🕔", color = "threshold", show_pct = false, suffix = "usage.reset5h" },
28
+ { id = "ratelimit.7d", render = "bar", icon = "📅", color = "threshold", show_pct = false, suffix = "usage.reset7d" },
29
+ { id = "sys.ram", render = "bar", icon = "💾", color = "threshold" },
30
+ { id = "cost.total", render = "number", icon = "💰" },
31
+ ]
32
+
33
+ [[segment]]
34
+ type = "box"
35
+ title = "PROJECT"
36
+ metric = [
37
+ { id = "loc.cwd", render = "text", icon = "📁" },
38
+ { id = "git.branch", render = "text", icon = "🌿" },
39
+ { group = ["git.behind", "git.ahead"], render = "number", sep = " ", icon = "⇅ " },
40
+ { id = "git.status", render = "number", icon = "✎ " },
41
+ { id = "loc.churn", render = "text", icon = "📝" },
42
+ { id = "pr.state", render = "text", icon = "⇧ " },
43
+ ]
44
+
45
+ [[segment]]
46
+ type = "mugshot"
47
+
48
+ [[segment]]
49
+ type = "box"
50
+ title = "ACTIVITY"
51
+ metric = [
52
+ { id = "act.geiger", render = "spark", icon = "📟", spark_style = "octant", spark_max = 1 },
53
+ { id = "act.agents", render = "number", icon = "👹" },
54
+ { id = "act.tasks", render = "number", icon = "🎯" },
55
+ { id = "act.errors", render = "number", icon = "💢", color = "threshold" },
56
+ ]
57
+
58
+ [[segment]]
59
+ type = "box"
60
+ title = "AGENTS"
61
+ metric = [
62
+ { id = "act.subagents", render = "scroll", anchor = "top", icon = "👹" },
63
+ ]
64
+
65
+ [[segment]]
66
+ type = "box"
67
+ title = "TASKS"
68
+ metric = [
69
+ { id = "act.tasklist", render = "scroll", anchor = "boundary" },
70
+ ]
71
+
72
+ [[segment]]
73
+ type = "box"
74
+ title = "SYS"
75
+ metric = [
76
+ { id = "sys.cpu", render = "number", icon = "🔥" },
77
+ { id = "sys.disk", render = "bar", icon = "💿", color = "threshold" },
78
+ { id = "sys.session", render = "text", icon = "🕙" },
79
+ { id = "sys.clock", render = "text", icon = "🕓" },
80
+ ]
@@ -0,0 +1,19 @@
1
+ # minimal — blends into the terminal, smallest footprint
2
+ [bar]
3
+ border_style = "none"
4
+ box_background = "term-bg"
5
+ headers = false
6
+
7
+ [mugshot]
8
+ background = "term-bg"
9
+
10
+ [[segment]]
11
+ type = "box"
12
+ metric = [
13
+ { id = "context.hp", render = "bar", icon = "🧠", color = "threshold" },
14
+ { id = "ratelimit.5h", render = "ammo", icon = "🕔" },
15
+ { id = "cost.total", render = "number", icon = "💰" },
16
+ ]
17
+
18
+ [[segment]]
19
+ type = "mugshot"
package/src/ansi.js ADDED
@@ -0,0 +1,20 @@
1
+ // Shared low-level ANSI primitives, used by both the face loader and the render
2
+ // engine. Kept dependency-free and tiny.
3
+
4
+ export const RESET = "\x1b[0m";
5
+ export const BOLD = "\x1b[1m";
6
+ export const TERM_RGB = [0, 0, 0]; // assumed terminal background (for blends/look)
7
+
8
+ // Truecolor foreground / background SGR from an [r,g,b] array.
9
+ export const sgrFg = (c) => `\x1b[38;2;${c[0]};${c[1]};${c[2]}m`;
10
+ export const sgrBg = (c) => `\x1b[48;2;${c[0]};${c[1]};${c[2]}m`;
11
+
12
+ // Python's round() is round-half-to-even (banker's); JS Math.round is half-up.
13
+ // We must match Python exactly or bar/spark heights drift by one at .5 boundaries.
14
+ export function pyround(x) {
15
+ const fl = Math.floor(x);
16
+ const d = x - fl;
17
+ if (d < 0.5) return fl;
18
+ if (d > 0.5) return fl + 1;
19
+ return fl % 2 === 0 ? fl : fl + 1; // exactly .5 -> nearest even
20
+ }
package/src/face.js ADDED
@@ -0,0 +1,126 @@
1
+ // Mugshot face loader — port of the face logic in tools/mockup_boxes.py.
2
+ // chafa rasterises a pre-baked *transparent* sprite into block-art at the
3
+ // requested height; when chafa is absent we fall back to the pre-rendered .ans
4
+ // (heights 4..16). The ANSI is parsed into rows of [char, fg, bg] (fg/bg an
5
+ // [r,g,b] or null = transparent), then composited onto the mugshot background.
6
+
7
+ import { spawnSync } from "node:child_process";
8
+ import { readFileSync } from "node:fs";
9
+ import path from "node:path";
10
+ import { fileURLToPath } from "node:url";
11
+ import { RESET, sgrBg } from "./ansi.js";
12
+
13
+ const HERE = path.dirname(fileURLToPath(import.meta.url));
14
+ const REPO = path.dirname(HERE);
15
+ const ALPHA_DIR = path.join(REPO, "assets", "images", "mugshot", "alpha"); // pre-baked transparent
16
+ const ANS_DIR = path.join(REPO, "assets", "images", "mugshot", "ans");
17
+ const ANS_SIZES = [4, 16];
18
+ const SYMS = "block+half+quad+sextant+wedge+legacy";
19
+ const TERM_BG = "term-bg";
20
+
21
+ const _cache = new Map();
22
+
23
+ function chafaFace(name, rows) {
24
+ const sprite = path.join(ALPHA_DIR, name + ".png");
25
+ const args = ["-f", "symbols", "--polite", "on", "--colors", "full",
26
+ "--symbols", SYMS, "--size", `9999x${rows}`, sprite];
27
+ const r = spawnSync("chafa", args, { maxBuffer: 1 << 24 });
28
+ if (r.error) return null; // chafa not on PATH
29
+ return r.status === 0 && r.stdout && r.stdout.length ? r.stdout.toString("utf8") : null;
30
+ }
31
+
32
+ function ansiFace(name, rows) {
33
+ const r = Math.max(ANS_SIZES[0], Math.min(ANS_SIZES[1], rows));
34
+ try {
35
+ return readFileSync(path.join(ANS_DIR, String(r), name + ".ans"), "utf8");
36
+ } catch {
37
+ return "";
38
+ }
39
+ }
40
+
41
+ const FINAL = "ABCDEFGHJKSTfhilmnpqrsu"; // CSI final bytes we scan to
42
+
43
+ function parseAnsi(text) {
44
+ const chars = [...text]; // code points (face glyphs are astral)
45
+ let fgc = null, bgc = null, rev = false;
46
+ const out = [];
47
+ let row = [];
48
+ let i = 0;
49
+ while (i < chars.length) {
50
+ const c = chars[i];
51
+ if (c === "\r") {
52
+ i += 1;
53
+ } else if (c === "\n") {
54
+ out.push(row);
55
+ row = [];
56
+ i += 1;
57
+ } else if (c === "\x1b" && i + 1 < chars.length && chars[i + 1] === "[") {
58
+ let j = i + 2;
59
+ while (j < chars.length && !FINAL.includes(chars[j])) j += 1;
60
+ if (j < chars.length && chars[j] === "m") {
61
+ const ps = chars.slice(i + 2, j).join("").split(";");
62
+ let k = 0;
63
+ while (k < ps.length) {
64
+ const p = ps[k] === "" ? 0 : parseInt(ps[k], 10);
65
+ if (p === 0) { fgc = null; bgc = null; rev = false; }
66
+ else if (p === 7) rev = true;
67
+ else if (p === 27) rev = false;
68
+ else if (p === 39) fgc = null;
69
+ else if (p === 49) bgc = null;
70
+ else if ((p === 38 || p === 48) && k + 4 < ps.length && ps[k + 1] === "2") {
71
+ const col = [parseInt(ps[k + 2], 10), parseInt(ps[k + 3], 10), parseInt(ps[k + 4], 10)];
72
+ if (p === 38) fgc = col; else bgc = col;
73
+ k += 4;
74
+ }
75
+ k += 1;
76
+ }
77
+ }
78
+ i = j + 1;
79
+ } else {
80
+ const [efg, ebg] = rev ? [bgc, fgc] : [fgc, bgc];
81
+ row.push([c, efg, ebg]);
82
+ i += 1;
83
+ }
84
+ }
85
+ if (row.length) out.push(row);
86
+ return out;
87
+ }
88
+
89
+ export function loadFace(name, rows) {
90
+ const key = `${name}@${rows}`;
91
+ if (_cache.has(key)) return _cache.get(key);
92
+ let text = chafaFace(name, rows);
93
+ if (!text) text = ansiFace(name, rows); // no chafa -> pre-rendered ANSI
94
+ let out = parseAnsi(text);
95
+ out = out.slice(0, rows);
96
+ while (out.length < rows) out.push([]); // exactly `rows` lines (fallback clamps)
97
+ _cache.set(key, out);
98
+ return out;
99
+ }
100
+
101
+ const tc = (code, c) => `\x1b[${code};2;${c[0]};${c[1]};${c[2]}m`;
102
+
103
+ function emitCell(ch, efg, ebg, boxBg) {
104
+ if (boxBg !== TERM_BG) {
105
+ const fcol = efg !== null ? efg : boxBg;
106
+ const bcol = ebg !== null ? ebg : boxBg;
107
+ return "\x1b[27m" + tc(38, fcol) + tc(48, bcol) + ch;
108
+ }
109
+ if (efg === null && ebg === null) return "\x1b[27m\x1b[39m\x1b[49m" + ch;
110
+ if (efg === null) return "\x1b[7m" + tc(38, ebg) + "\x1b[49m" + ch;
111
+ if (ebg === null) return "\x1b[27m" + tc(38, efg) + "\x1b[49m" + ch;
112
+ return "\x1b[27m" + tc(38, efg) + tc(48, ebg) + ch;
113
+ }
114
+
115
+ const bg = (color) => (color === TERM_BG ? "\x1b[49m" : sgrBg(color));
116
+
117
+ export function faceCell(cells, w, boxBg) {
118
+ const vis = cells.length;
119
+ const total = Math.max(0, w - vis);
120
+ const left = Math.floor(total / 2);
121
+ const right = total - left;
122
+ let s = bg(boxBg) + " " + " ".repeat(left);
123
+ for (const [ch, efg, ebg] of cells) s += emitCell(ch, efg, ebg, boxBg);
124
+ s += RESET + bg(boxBg) + " ".repeat(right) + " " + RESET;
125
+ return s;
126
+ }
package/src/hook.js ADDED
@@ -0,0 +1,136 @@
1
+ #!/usr/bin/env node
2
+ // Claude Code hook: an event-bus for the DOOM HUD. Port of hooks/mugshot_hook.py.
3
+ // Each invocation reads the shared state file, folds in the lifecycle event, and
4
+ // writes it back atomically. The status line reads that state.
5
+ //
6
+ // State carries: face reaction {expr, ts}; activity spans[] [start,end] (geiger),
7
+ // squad{} (running subagents), pending[] (Agent launch labels), tasks{} (id ->
8
+ // {title,status,ts}), tasks_ts (last tasks mutation), errors, mode (permission mode). Always exits 0.
9
+ //
10
+ // State file: $MUGSHOT_STATE, else <temp>/mugshot_<session_id>.json.
11
+
12
+ import { readFileSync, writeFileSync, renameSync } from "node:fs";
13
+ import os from "node:os";
14
+ import path from "node:path";
15
+ import { fileURLToPath } from "node:url";
16
+
17
+ const GEIGER_WINDOW = 30.0; // seconds of tool-run history kept for the sparkline
18
+ const MAX_RUN = 300.0; // drop an unclosed span after this (assume the Post was lost)
19
+ const TASK_LINGER = 10.0; // seconds the TASKS box lingers after all tasks settle
20
+
21
+ const READ_TOOLS = new Set(["Read", "Grep", "Glob",
22
+ "ctx_read", "ctx_multi_read", "ctx_search", "ctx_semantic_search", "ctx_tree", "ctx_overview"]);
23
+ const WRITE_TOOLS = new Set(["Edit", "Write", "MultiEdit", "NotebookEdit", "Bash", "ctx_shell", "ctx_edit"]);
24
+
25
+ function statePath(ev) {
26
+ if (process.env.MUGSHOT_STATE) return process.env.MUGSHOT_STATE;
27
+ const sid = String(ev.session_id || "default").replace(/[^A-Za-z0-9_-]/g, "_").slice(0, 48);
28
+ return path.join(os.tmpdir(), `mugshot_${sid}.json`);
29
+ }
30
+
31
+ function base(tool) {
32
+ return tool.startsWith("mcp__") ? tool.split("__").pop() : tool;
33
+ }
34
+
35
+ // Task event subject: the exact key isn't documented, so try the likely ones.
36
+ function taskTitle(ev) {
37
+ return ev.task_title || ev.task_subject || ev.subject || ev.title ||
38
+ (ev.tool_input && ev.tool_input.subject) || "task";
39
+ }
40
+
41
+ export function expression(name, tool) {
42
+ const b = base(tool);
43
+ if (["PostToolUseFailure", "StopFailure", "PermissionDenied"].includes(name)) return "ouch";
44
+ if (["Stop", "TaskCompleted"].includes(name)) return "evl";
45
+ if (name === "PostToolUse") {
46
+ if (READ_TOOLS.has(b)) return Math.floor((Date.now() / 1000) * 2) % 2 === 0 ? "tl" : "tr";
47
+ if (WRITE_TOOLS.has(b)) return "kill";
48
+ }
49
+ return null;
50
+ }
51
+
52
+ export function foldActivity(st, name, ev, now) {
53
+ st.spans ??= [];
54
+ st.squad ??= {};
55
+ st.pending ??= [];
56
+ st.tasks ??= {}; // keyed map: id -> { title, status, ts }
57
+ st.errors ??= 0;
58
+
59
+ const tool = base(ev.tool_name || "");
60
+ if (name === "PreToolUse") {
61
+ st.spans.push([now, null]); // open a run interval
62
+ if (tool === "Agent") {
63
+ const ti = ev.tool_input || {};
64
+ st.pending.push({ type: ti.subagent_type || "", desc: ti.description || "", ts: now });
65
+ st.pending = st.pending.filter((p) => now - p.ts < 60).slice(-16);
66
+ }
67
+ } else if (["PostToolUse", "PostToolUseFailure", "PermissionDenied"].includes(name)) {
68
+ for (let i = st.spans.length - 1; i >= 0; i--) { // close the most recent open one
69
+ if (st.spans[i][1] === null) { st.spans[i][1] = now; break; }
70
+ }
71
+ }
72
+
73
+ if (["PostToolUseFailure", "StopFailure", "PermissionDenied"].includes(name)) {
74
+ st.errors += 1;
75
+ } else if (name === "SubagentStart") {
76
+ const aid = String(ev.agent_id || now);
77
+ const atype = ev.agent_type || "agent";
78
+ let desc = "";
79
+ for (let i = 0; i < st.pending.length; i++) { // FIFO match the launch by agent type
80
+ if (st.pending[i].type === atype) { desc = st.pending[i].desc; st.pending.splice(i, 1); break; }
81
+ }
82
+ st.squad[aid] = { type: atype, start: now, desc };
83
+ } else if (name === "SubagentStop") {
84
+ delete st.squad[String(ev.agent_id || "")];
85
+ } else if (name === "TaskCreated") {
86
+ const id = String(ev.task_id ?? now);
87
+ st.tasks[id] = { title: taskTitle(ev), status: "pending", ts: now };
88
+ st.tasks_ts = now;
89
+ } else if (name === "TaskCompleted") {
90
+ const id = String(ev.task_id ?? "");
91
+ if (st.tasks[id]) st.tasks[id].status = "completed";
92
+ else st.tasks[id] = { title: taskTitle(ev), status: "completed", ts: now };
93
+ st.tasks_ts = now;
94
+ } else if (name === "PostToolUse" && (ev.tool_name === "TaskUpdate") && ev.tool_input) {
95
+ const id = String(ev.tool_input.taskId ?? "");
96
+ const s = ev.tool_input.status;
97
+ if (id && st.tasks[id] && ["pending", "in_progress", "completed", "deleted"].includes(s)) {
98
+ st.tasks[id].status = s;
99
+ st.tasks_ts = now;
100
+ }
101
+ }
102
+
103
+ const win = now - GEIGER_WINDOW; // prune: closed spans out of window, orphaned open spans
104
+ st.spans = st.spans.filter((s) => (s[1] === null ? s[0] >= now - MAX_RUN : s[1] >= win));
105
+ st.squad = Object.fromEntries(Object.entries(st.squad).filter(([, v]) => now - v.start < MAX_RUN));
106
+
107
+ const taskVals = Object.values(st.tasks || {});
108
+ const anyOpen = taskVals.some((t) => t.status === "pending" || t.status === "in_progress");
109
+ if (taskVals.length && !anyOpen && now - (st.tasks_ts || 0) > TASK_LINGER) st.tasks = {};
110
+ }
111
+
112
+ function main() {
113
+ try {
114
+ let ev = {};
115
+ try { ev = JSON.parse(readFileSync(0, "utf8")); } catch { ev = {}; }
116
+ const name = ev.hook_event_name || "";
117
+ const now = Date.now() / 1000;
118
+ const p = statePath(ev);
119
+
120
+ let st = {};
121
+ try { st = JSON.parse(readFileSync(p, "utf8")); } catch { st = {}; }
122
+
123
+ foldActivity(st, name, ev, now);
124
+ const expr = expression(name, ev.tool_name || "");
125
+ if (expr) { st.expr = expr; st.ts = now; }
126
+ if (ev.permission_mode) st.mode = ev.permission_mode;
127
+
128
+ const tmp = `${p}.${process.pid}.tmp`;
129
+ try { writeFileSync(tmp, JSON.stringify(st)); renameSync(tmp, p); } catch { /* never block */ }
130
+ } catch { /* swallow everything: a hook must never block a tool */ }
131
+ process.exit(0);
132
+ }
133
+
134
+ if (process.argv[1] && fileURLToPath(import.meta.url) === path.resolve(process.argv[1])) {
135
+ main();
136
+ }