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.
- package/LICENSE +21 -0
- package/README.md +116 -0
- package/assets/images/hud.png +0 -0
- package/assets/images/mugshot/STFST01-blockart-08.png +0 -0
- package/assets/images/mugshot/STFST01-orig-08.png +0 -0
- package/assets/images/mugshot/alpha/STFDEAD0.png +0 -0
- package/assets/images/mugshot/alpha/STFEVL0.png +0 -0
- package/assets/images/mugshot/alpha/STFEVL1.png +0 -0
- package/assets/images/mugshot/alpha/STFEVL2.png +0 -0
- package/assets/images/mugshot/alpha/STFEVL3.png +0 -0
- package/assets/images/mugshot/alpha/STFEVL4.png +0 -0
- package/assets/images/mugshot/alpha/STFGOD0.png +0 -0
- package/assets/images/mugshot/alpha/STFKILL0.png +0 -0
- package/assets/images/mugshot/alpha/STFKILL1.png +0 -0
- package/assets/images/mugshot/alpha/STFKILL2.png +0 -0
- package/assets/images/mugshot/alpha/STFKILL3.png +0 -0
- package/assets/images/mugshot/alpha/STFKILL4.png +0 -0
- package/assets/images/mugshot/alpha/STFOUCH0.png +0 -0
- package/assets/images/mugshot/alpha/STFOUCH1.png +0 -0
- package/assets/images/mugshot/alpha/STFOUCH2.png +0 -0
- package/assets/images/mugshot/alpha/STFOUCH3.png +0 -0
- package/assets/images/mugshot/alpha/STFOUCH4.png +0 -0
- package/assets/images/mugshot/alpha/STFST00.png +0 -0
- package/assets/images/mugshot/alpha/STFST01.png +0 -0
- package/assets/images/mugshot/alpha/STFST02.png +0 -0
- package/assets/images/mugshot/alpha/STFST10.png +0 -0
- package/assets/images/mugshot/alpha/STFST11.png +0 -0
- package/assets/images/mugshot/alpha/STFST12.png +0 -0
- package/assets/images/mugshot/alpha/STFST20.png +0 -0
- package/assets/images/mugshot/alpha/STFST21.png +0 -0
- package/assets/images/mugshot/alpha/STFST22.png +0 -0
- package/assets/images/mugshot/alpha/STFST30.png +0 -0
- package/assets/images/mugshot/alpha/STFST31.png +0 -0
- package/assets/images/mugshot/alpha/STFST32.png +0 -0
- package/assets/images/mugshot/alpha/STFST40.png +0 -0
- package/assets/images/mugshot/alpha/STFST41.png +0 -0
- package/assets/images/mugshot/alpha/STFST42.png +0 -0
- package/assets/images/mugshot/alpha/STFTL00.png +0 -0
- package/assets/images/mugshot/alpha/STFTL10.png +0 -0
- package/assets/images/mugshot/alpha/STFTL20.png +0 -0
- package/assets/images/mugshot/alpha/STFTL30.png +0 -0
- package/assets/images/mugshot/alpha/STFTL40.png +0 -0
- package/assets/images/mugshot/alpha/STFTR00.png +0 -0
- package/assets/images/mugshot/alpha/STFTR10.png +0 -0
- package/assets/images/mugshot/alpha/STFTR20.png +0 -0
- package/assets/images/mugshot/alpha/STFTR30.png +0 -0
- package/assets/images/mugshot/alpha/STFTR40.png +0 -0
- package/assets/images/mugshot/ans/10/STFDEAD0.ans +10 -0
- package/assets/images/mugshot/ans/10/STFEVL0.ans +10 -0
- package/assets/images/mugshot/ans/10/STFEVL1.ans +10 -0
- package/assets/images/mugshot/ans/10/STFEVL2.ans +10 -0
- package/assets/images/mugshot/ans/10/STFEVL3.ans +10 -0
- package/assets/images/mugshot/ans/10/STFEVL4.ans +10 -0
- package/assets/images/mugshot/ans/10/STFGOD0.ans +10 -0
- package/assets/images/mugshot/ans/10/STFKILL0.ans +10 -0
- package/assets/images/mugshot/ans/10/STFKILL1.ans +10 -0
- package/assets/images/mugshot/ans/10/STFKILL2.ans +10 -0
- package/assets/images/mugshot/ans/10/STFKILL3.ans +10 -0
- package/assets/images/mugshot/ans/10/STFKILL4.ans +10 -0
- package/assets/images/mugshot/ans/10/STFOUCH0.ans +10 -0
- package/assets/images/mugshot/ans/10/STFOUCH1.ans +10 -0
- package/assets/images/mugshot/ans/10/STFOUCH2.ans +10 -0
- package/assets/images/mugshot/ans/10/STFOUCH3.ans +10 -0
- package/assets/images/mugshot/ans/10/STFOUCH4.ans +10 -0
- package/assets/images/mugshot/ans/10/STFST00.ans +10 -0
- package/assets/images/mugshot/ans/10/STFST01.ans +10 -0
- package/assets/images/mugshot/ans/10/STFST02.ans +10 -0
- package/assets/images/mugshot/ans/10/STFST10.ans +10 -0
- package/assets/images/mugshot/ans/10/STFST11.ans +10 -0
- package/assets/images/mugshot/ans/10/STFST12.ans +10 -0
- package/assets/images/mugshot/ans/10/STFST20.ans +10 -0
- package/assets/images/mugshot/ans/10/STFST21.ans +10 -0
- package/assets/images/mugshot/ans/10/STFST22.ans +10 -0
- package/assets/images/mugshot/ans/10/STFST30.ans +10 -0
- package/assets/images/mugshot/ans/10/STFST31.ans +10 -0
- package/assets/images/mugshot/ans/10/STFST32.ans +10 -0
- package/assets/images/mugshot/ans/10/STFST40.ans +10 -0
- package/assets/images/mugshot/ans/10/STFST41.ans +10 -0
- package/assets/images/mugshot/ans/10/STFST42.ans +10 -0
- package/assets/images/mugshot/ans/10/STFTL00.ans +10 -0
- package/assets/images/mugshot/ans/10/STFTL10.ans +10 -0
- package/assets/images/mugshot/ans/10/STFTL20.ans +10 -0
- package/assets/images/mugshot/ans/10/STFTL30.ans +10 -0
- package/assets/images/mugshot/ans/10/STFTL40.ans +10 -0
- package/assets/images/mugshot/ans/10/STFTR00.ans +10 -0
- package/assets/images/mugshot/ans/10/STFTR10.ans +10 -0
- package/assets/images/mugshot/ans/10/STFTR20.ans +10 -0
- package/assets/images/mugshot/ans/10/STFTR30.ans +10 -0
- package/assets/images/mugshot/ans/10/STFTR40.ans +10 -0
- package/assets/images/mugshot/ans/11/STFDEAD0.ans +11 -0
- package/assets/images/mugshot/ans/11/STFEVL0.ans +11 -0
- package/assets/images/mugshot/ans/11/STFEVL1.ans +11 -0
- package/assets/images/mugshot/ans/11/STFEVL2.ans +11 -0
- package/assets/images/mugshot/ans/11/STFEVL3.ans +11 -0
- package/assets/images/mugshot/ans/11/STFEVL4.ans +11 -0
- package/assets/images/mugshot/ans/11/STFGOD0.ans +11 -0
- package/assets/images/mugshot/ans/11/STFKILL0.ans +11 -0
- package/assets/images/mugshot/ans/11/STFKILL1.ans +11 -0
- package/assets/images/mugshot/ans/11/STFKILL2.ans +11 -0
- package/assets/images/mugshot/ans/11/STFKILL3.ans +11 -0
- package/assets/images/mugshot/ans/11/STFKILL4.ans +11 -0
- package/assets/images/mugshot/ans/11/STFOUCH0.ans +11 -0
- package/assets/images/mugshot/ans/11/STFOUCH1.ans +11 -0
- package/assets/images/mugshot/ans/11/STFOUCH2.ans +11 -0
- package/assets/images/mugshot/ans/11/STFOUCH3.ans +11 -0
- package/assets/images/mugshot/ans/11/STFOUCH4.ans +11 -0
- package/assets/images/mugshot/ans/11/STFST00.ans +11 -0
- package/assets/images/mugshot/ans/11/STFST01.ans +11 -0
- package/assets/images/mugshot/ans/11/STFST02.ans +11 -0
- package/assets/images/mugshot/ans/11/STFST10.ans +11 -0
- package/assets/images/mugshot/ans/11/STFST11.ans +11 -0
- package/assets/images/mugshot/ans/11/STFST12.ans +11 -0
- package/assets/images/mugshot/ans/11/STFST20.ans +11 -0
- package/assets/images/mugshot/ans/11/STFST21.ans +11 -0
- package/assets/images/mugshot/ans/11/STFST22.ans +11 -0
- package/assets/images/mugshot/ans/11/STFST30.ans +11 -0
- package/assets/images/mugshot/ans/11/STFST31.ans +11 -0
- package/assets/images/mugshot/ans/11/STFST32.ans +11 -0
- package/assets/images/mugshot/ans/11/STFST40.ans +11 -0
- package/assets/images/mugshot/ans/11/STFST41.ans +11 -0
- package/assets/images/mugshot/ans/11/STFST42.ans +11 -0
- package/assets/images/mugshot/ans/11/STFTL00.ans +11 -0
- package/assets/images/mugshot/ans/11/STFTL10.ans +11 -0
- package/assets/images/mugshot/ans/11/STFTL20.ans +11 -0
- package/assets/images/mugshot/ans/11/STFTL30.ans +11 -0
- package/assets/images/mugshot/ans/11/STFTL40.ans +11 -0
- package/assets/images/mugshot/ans/11/STFTR00.ans +11 -0
- package/assets/images/mugshot/ans/11/STFTR10.ans +11 -0
- package/assets/images/mugshot/ans/11/STFTR20.ans +11 -0
- package/assets/images/mugshot/ans/11/STFTR30.ans +11 -0
- package/assets/images/mugshot/ans/11/STFTR40.ans +11 -0
- package/assets/images/mugshot/ans/12/STFDEAD0.ans +12 -0
- package/assets/images/mugshot/ans/12/STFEVL0.ans +12 -0
- package/assets/images/mugshot/ans/12/STFEVL1.ans +12 -0
- package/assets/images/mugshot/ans/12/STFEVL2.ans +12 -0
- package/assets/images/mugshot/ans/12/STFEVL3.ans +12 -0
- package/assets/images/mugshot/ans/12/STFEVL4.ans +12 -0
- package/assets/images/mugshot/ans/12/STFGOD0.ans +12 -0
- package/assets/images/mugshot/ans/12/STFKILL0.ans +12 -0
- package/assets/images/mugshot/ans/12/STFKILL1.ans +12 -0
- package/assets/images/mugshot/ans/12/STFKILL2.ans +12 -0
- package/assets/images/mugshot/ans/12/STFKILL3.ans +12 -0
- package/assets/images/mugshot/ans/12/STFKILL4.ans +12 -0
- package/assets/images/mugshot/ans/12/STFOUCH0.ans +12 -0
- package/assets/images/mugshot/ans/12/STFOUCH1.ans +12 -0
- package/assets/images/mugshot/ans/12/STFOUCH2.ans +12 -0
- package/assets/images/mugshot/ans/12/STFOUCH3.ans +12 -0
- package/assets/images/mugshot/ans/12/STFOUCH4.ans +12 -0
- package/assets/images/mugshot/ans/12/STFST00.ans +12 -0
- package/assets/images/mugshot/ans/12/STFST01.ans +12 -0
- package/assets/images/mugshot/ans/12/STFST02.ans +12 -0
- package/assets/images/mugshot/ans/12/STFST10.ans +12 -0
- package/assets/images/mugshot/ans/12/STFST11.ans +12 -0
- package/assets/images/mugshot/ans/12/STFST12.ans +12 -0
- package/assets/images/mugshot/ans/12/STFST20.ans +12 -0
- package/assets/images/mugshot/ans/12/STFST21.ans +12 -0
- package/assets/images/mugshot/ans/12/STFST22.ans +12 -0
- package/assets/images/mugshot/ans/12/STFST30.ans +12 -0
- package/assets/images/mugshot/ans/12/STFST31.ans +12 -0
- package/assets/images/mugshot/ans/12/STFST32.ans +12 -0
- package/assets/images/mugshot/ans/12/STFST40.ans +12 -0
- package/assets/images/mugshot/ans/12/STFST41.ans +12 -0
- package/assets/images/mugshot/ans/12/STFST42.ans +12 -0
- package/assets/images/mugshot/ans/12/STFTL00.ans +12 -0
- package/assets/images/mugshot/ans/12/STFTL10.ans +12 -0
- package/assets/images/mugshot/ans/12/STFTL20.ans +12 -0
- package/assets/images/mugshot/ans/12/STFTL30.ans +12 -0
- package/assets/images/mugshot/ans/12/STFTL40.ans +12 -0
- package/assets/images/mugshot/ans/12/STFTR00.ans +12 -0
- package/assets/images/mugshot/ans/12/STFTR10.ans +12 -0
- package/assets/images/mugshot/ans/12/STFTR20.ans +12 -0
- package/assets/images/mugshot/ans/12/STFTR30.ans +12 -0
- package/assets/images/mugshot/ans/12/STFTR40.ans +12 -0
- package/assets/images/mugshot/ans/13/STFDEAD0.ans +13 -0
- package/assets/images/mugshot/ans/13/STFEVL0.ans +13 -0
- package/assets/images/mugshot/ans/13/STFEVL1.ans +13 -0
- package/assets/images/mugshot/ans/13/STFEVL2.ans +13 -0
- package/assets/images/mugshot/ans/13/STFEVL3.ans +13 -0
- package/assets/images/mugshot/ans/13/STFEVL4.ans +13 -0
- package/assets/images/mugshot/ans/13/STFGOD0.ans +13 -0
- package/assets/images/mugshot/ans/13/STFKILL0.ans +13 -0
- package/assets/images/mugshot/ans/13/STFKILL1.ans +13 -0
- package/assets/images/mugshot/ans/13/STFKILL2.ans +13 -0
- package/assets/images/mugshot/ans/13/STFKILL3.ans +13 -0
- package/assets/images/mugshot/ans/13/STFKILL4.ans +13 -0
- package/assets/images/mugshot/ans/13/STFOUCH0.ans +13 -0
- package/assets/images/mugshot/ans/13/STFOUCH1.ans +13 -0
- package/assets/images/mugshot/ans/13/STFOUCH2.ans +13 -0
- package/assets/images/mugshot/ans/13/STFOUCH3.ans +13 -0
- package/assets/images/mugshot/ans/13/STFOUCH4.ans +13 -0
- package/assets/images/mugshot/ans/13/STFST00.ans +13 -0
- package/assets/images/mugshot/ans/13/STFST01.ans +13 -0
- package/assets/images/mugshot/ans/13/STFST02.ans +13 -0
- package/assets/images/mugshot/ans/13/STFST10.ans +13 -0
- package/assets/images/mugshot/ans/13/STFST11.ans +13 -0
- package/assets/images/mugshot/ans/13/STFST12.ans +13 -0
- package/assets/images/mugshot/ans/13/STFST20.ans +13 -0
- package/assets/images/mugshot/ans/13/STFST21.ans +13 -0
- package/assets/images/mugshot/ans/13/STFST22.ans +13 -0
- package/assets/images/mugshot/ans/13/STFST30.ans +13 -0
- package/assets/images/mugshot/ans/13/STFST31.ans +13 -0
- package/assets/images/mugshot/ans/13/STFST32.ans +13 -0
- package/assets/images/mugshot/ans/13/STFST40.ans +13 -0
- package/assets/images/mugshot/ans/13/STFST41.ans +13 -0
- package/assets/images/mugshot/ans/13/STFST42.ans +13 -0
- package/assets/images/mugshot/ans/13/STFTL00.ans +13 -0
- package/assets/images/mugshot/ans/13/STFTL10.ans +13 -0
- package/assets/images/mugshot/ans/13/STFTL20.ans +13 -0
- package/assets/images/mugshot/ans/13/STFTL30.ans +13 -0
- package/assets/images/mugshot/ans/13/STFTL40.ans +13 -0
- package/assets/images/mugshot/ans/13/STFTR00.ans +13 -0
- package/assets/images/mugshot/ans/13/STFTR10.ans +13 -0
- package/assets/images/mugshot/ans/13/STFTR20.ans +13 -0
- package/assets/images/mugshot/ans/13/STFTR30.ans +13 -0
- package/assets/images/mugshot/ans/13/STFTR40.ans +13 -0
- package/assets/images/mugshot/ans/14/STFDEAD0.ans +14 -0
- package/assets/images/mugshot/ans/14/STFEVL0.ans +14 -0
- package/assets/images/mugshot/ans/14/STFEVL1.ans +14 -0
- package/assets/images/mugshot/ans/14/STFEVL2.ans +14 -0
- package/assets/images/mugshot/ans/14/STFEVL3.ans +14 -0
- package/assets/images/mugshot/ans/14/STFEVL4.ans +14 -0
- package/assets/images/mugshot/ans/14/STFGOD0.ans +14 -0
- package/assets/images/mugshot/ans/14/STFKILL0.ans +14 -0
- package/assets/images/mugshot/ans/14/STFKILL1.ans +14 -0
- package/assets/images/mugshot/ans/14/STFKILL2.ans +14 -0
- package/assets/images/mugshot/ans/14/STFKILL3.ans +14 -0
- package/assets/images/mugshot/ans/14/STFKILL4.ans +14 -0
- package/assets/images/mugshot/ans/14/STFOUCH0.ans +14 -0
- package/assets/images/mugshot/ans/14/STFOUCH1.ans +14 -0
- package/assets/images/mugshot/ans/14/STFOUCH2.ans +14 -0
- package/assets/images/mugshot/ans/14/STFOUCH3.ans +14 -0
- package/assets/images/mugshot/ans/14/STFOUCH4.ans +14 -0
- package/assets/images/mugshot/ans/14/STFST00.ans +14 -0
- package/assets/images/mugshot/ans/14/STFST01.ans +14 -0
- package/assets/images/mugshot/ans/14/STFST02.ans +14 -0
- package/assets/images/mugshot/ans/14/STFST10.ans +14 -0
- package/assets/images/mugshot/ans/14/STFST11.ans +14 -0
- package/assets/images/mugshot/ans/14/STFST12.ans +14 -0
- package/assets/images/mugshot/ans/14/STFST20.ans +14 -0
- package/assets/images/mugshot/ans/14/STFST21.ans +14 -0
- package/assets/images/mugshot/ans/14/STFST22.ans +14 -0
- package/assets/images/mugshot/ans/14/STFST30.ans +14 -0
- package/assets/images/mugshot/ans/14/STFST31.ans +14 -0
- package/assets/images/mugshot/ans/14/STFST32.ans +14 -0
- package/assets/images/mugshot/ans/14/STFST40.ans +14 -0
- package/assets/images/mugshot/ans/14/STFST41.ans +14 -0
- package/assets/images/mugshot/ans/14/STFST42.ans +14 -0
- package/assets/images/mugshot/ans/14/STFTL00.ans +14 -0
- package/assets/images/mugshot/ans/14/STFTL10.ans +14 -0
- package/assets/images/mugshot/ans/14/STFTL20.ans +14 -0
- package/assets/images/mugshot/ans/14/STFTL30.ans +14 -0
- package/assets/images/mugshot/ans/14/STFTL40.ans +14 -0
- package/assets/images/mugshot/ans/14/STFTR00.ans +14 -0
- package/assets/images/mugshot/ans/14/STFTR10.ans +14 -0
- package/assets/images/mugshot/ans/14/STFTR20.ans +14 -0
- package/assets/images/mugshot/ans/14/STFTR30.ans +14 -0
- package/assets/images/mugshot/ans/14/STFTR40.ans +14 -0
- package/assets/images/mugshot/ans/15/STFDEAD0.ans +15 -0
- package/assets/images/mugshot/ans/15/STFEVL0.ans +15 -0
- package/assets/images/mugshot/ans/15/STFEVL1.ans +15 -0
- package/assets/images/mugshot/ans/15/STFEVL2.ans +15 -0
- package/assets/images/mugshot/ans/15/STFEVL3.ans +15 -0
- package/assets/images/mugshot/ans/15/STFEVL4.ans +15 -0
- package/assets/images/mugshot/ans/15/STFGOD0.ans +15 -0
- package/assets/images/mugshot/ans/15/STFKILL0.ans +15 -0
- package/assets/images/mugshot/ans/15/STFKILL1.ans +15 -0
- package/assets/images/mugshot/ans/15/STFKILL2.ans +15 -0
- package/assets/images/mugshot/ans/15/STFKILL3.ans +15 -0
- package/assets/images/mugshot/ans/15/STFKILL4.ans +15 -0
- package/assets/images/mugshot/ans/15/STFOUCH0.ans +15 -0
- package/assets/images/mugshot/ans/15/STFOUCH1.ans +15 -0
- package/assets/images/mugshot/ans/15/STFOUCH2.ans +15 -0
- package/assets/images/mugshot/ans/15/STFOUCH3.ans +15 -0
- package/assets/images/mugshot/ans/15/STFOUCH4.ans +15 -0
- package/assets/images/mugshot/ans/15/STFST00.ans +15 -0
- package/assets/images/mugshot/ans/15/STFST01.ans +15 -0
- package/assets/images/mugshot/ans/15/STFST02.ans +15 -0
- package/assets/images/mugshot/ans/15/STFST10.ans +15 -0
- package/assets/images/mugshot/ans/15/STFST11.ans +15 -0
- package/assets/images/mugshot/ans/15/STFST12.ans +15 -0
- package/assets/images/mugshot/ans/15/STFST20.ans +15 -0
- package/assets/images/mugshot/ans/15/STFST21.ans +15 -0
- package/assets/images/mugshot/ans/15/STFST22.ans +15 -0
- package/assets/images/mugshot/ans/15/STFST30.ans +15 -0
- package/assets/images/mugshot/ans/15/STFST31.ans +15 -0
- package/assets/images/mugshot/ans/15/STFST32.ans +15 -0
- package/assets/images/mugshot/ans/15/STFST40.ans +15 -0
- package/assets/images/mugshot/ans/15/STFST41.ans +15 -0
- package/assets/images/mugshot/ans/15/STFST42.ans +15 -0
- package/assets/images/mugshot/ans/15/STFTL00.ans +15 -0
- package/assets/images/mugshot/ans/15/STFTL10.ans +15 -0
- package/assets/images/mugshot/ans/15/STFTL20.ans +15 -0
- package/assets/images/mugshot/ans/15/STFTL30.ans +15 -0
- package/assets/images/mugshot/ans/15/STFTL40.ans +15 -0
- package/assets/images/mugshot/ans/15/STFTR00.ans +15 -0
- package/assets/images/mugshot/ans/15/STFTR10.ans +15 -0
- package/assets/images/mugshot/ans/15/STFTR20.ans +15 -0
- package/assets/images/mugshot/ans/15/STFTR30.ans +15 -0
- package/assets/images/mugshot/ans/15/STFTR40.ans +15 -0
- package/assets/images/mugshot/ans/16/STFDEAD0.ans +16 -0
- package/assets/images/mugshot/ans/16/STFEVL0.ans +15 -0
- package/assets/images/mugshot/ans/16/STFEVL1.ans +15 -0
- package/assets/images/mugshot/ans/16/STFEVL2.ans +15 -0
- package/assets/images/mugshot/ans/16/STFEVL3.ans +15 -0
- package/assets/images/mugshot/ans/16/STFEVL4.ans +15 -0
- package/assets/images/mugshot/ans/16/STFGOD0.ans +15 -0
- package/assets/images/mugshot/ans/16/STFKILL0.ans +15 -0
- package/assets/images/mugshot/ans/16/STFKILL1.ans +15 -0
- package/assets/images/mugshot/ans/16/STFKILL2.ans +15 -0
- package/assets/images/mugshot/ans/16/STFKILL3.ans +15 -0
- package/assets/images/mugshot/ans/16/STFKILL4.ans +15 -0
- package/assets/images/mugshot/ans/16/STFOUCH0.ans +16 -0
- package/assets/images/mugshot/ans/16/STFOUCH1.ans +16 -0
- package/assets/images/mugshot/ans/16/STFOUCH2.ans +16 -0
- package/assets/images/mugshot/ans/16/STFOUCH3.ans +16 -0
- package/assets/images/mugshot/ans/16/STFOUCH4.ans +16 -0
- package/assets/images/mugshot/ans/16/STFST00.ans +15 -0
- package/assets/images/mugshot/ans/16/STFST01.ans +15 -0
- package/assets/images/mugshot/ans/16/STFST02.ans +15 -0
- package/assets/images/mugshot/ans/16/STFST10.ans +15 -0
- package/assets/images/mugshot/ans/16/STFST11.ans +15 -0
- package/assets/images/mugshot/ans/16/STFST12.ans +15 -0
- package/assets/images/mugshot/ans/16/STFST20.ans +15 -0
- package/assets/images/mugshot/ans/16/STFST21.ans +15 -0
- package/assets/images/mugshot/ans/16/STFST22.ans +15 -0
- package/assets/images/mugshot/ans/16/STFST30.ans +16 -0
- package/assets/images/mugshot/ans/16/STFST31.ans +16 -0
- package/assets/images/mugshot/ans/16/STFST32.ans +16 -0
- package/assets/images/mugshot/ans/16/STFST40.ans +16 -0
- package/assets/images/mugshot/ans/16/STFST41.ans +16 -0
- package/assets/images/mugshot/ans/16/STFST42.ans +16 -0
- package/assets/images/mugshot/ans/16/STFTL00.ans +15 -0
- package/assets/images/mugshot/ans/16/STFTL10.ans +15 -0
- package/assets/images/mugshot/ans/16/STFTL20.ans +15 -0
- package/assets/images/mugshot/ans/16/STFTL30.ans +16 -0
- package/assets/images/mugshot/ans/16/STFTL40.ans +16 -0
- package/assets/images/mugshot/ans/16/STFTR00.ans +15 -0
- package/assets/images/mugshot/ans/16/STFTR10.ans +15 -0
- package/assets/images/mugshot/ans/16/STFTR20.ans +15 -0
- package/assets/images/mugshot/ans/16/STFTR30.ans +15 -0
- package/assets/images/mugshot/ans/16/STFTR40.ans +15 -0
- package/assets/images/mugshot/ans/4/STFDEAD0.ans +4 -0
- package/assets/images/mugshot/ans/4/STFEVL0.ans +4 -0
- package/assets/images/mugshot/ans/4/STFEVL1.ans +4 -0
- package/assets/images/mugshot/ans/4/STFEVL2.ans +4 -0
- package/assets/images/mugshot/ans/4/STFEVL3.ans +4 -0
- package/assets/images/mugshot/ans/4/STFEVL4.ans +4 -0
- package/assets/images/mugshot/ans/4/STFGOD0.ans +4 -0
- package/assets/images/mugshot/ans/4/STFKILL0.ans +4 -0
- package/assets/images/mugshot/ans/4/STFKILL1.ans +4 -0
- package/assets/images/mugshot/ans/4/STFKILL2.ans +4 -0
- package/assets/images/mugshot/ans/4/STFKILL3.ans +4 -0
- package/assets/images/mugshot/ans/4/STFKILL4.ans +4 -0
- package/assets/images/mugshot/ans/4/STFOUCH0.ans +4 -0
- package/assets/images/mugshot/ans/4/STFOUCH1.ans +4 -0
- package/assets/images/mugshot/ans/4/STFOUCH2.ans +4 -0
- package/assets/images/mugshot/ans/4/STFOUCH3.ans +4 -0
- package/assets/images/mugshot/ans/4/STFOUCH4.ans +4 -0
- package/assets/images/mugshot/ans/4/STFST00.ans +4 -0
- package/assets/images/mugshot/ans/4/STFST01.ans +4 -0
- package/assets/images/mugshot/ans/4/STFST02.ans +4 -0
- package/assets/images/mugshot/ans/4/STFST10.ans +4 -0
- package/assets/images/mugshot/ans/4/STFST11.ans +4 -0
- package/assets/images/mugshot/ans/4/STFST12.ans +4 -0
- package/assets/images/mugshot/ans/4/STFST20.ans +4 -0
- package/assets/images/mugshot/ans/4/STFST21.ans +4 -0
- package/assets/images/mugshot/ans/4/STFST22.ans +4 -0
- package/assets/images/mugshot/ans/4/STFST30.ans +4 -0
- package/assets/images/mugshot/ans/4/STFST31.ans +4 -0
- package/assets/images/mugshot/ans/4/STFST32.ans +4 -0
- package/assets/images/mugshot/ans/4/STFST40.ans +4 -0
- package/assets/images/mugshot/ans/4/STFST41.ans +4 -0
- package/assets/images/mugshot/ans/4/STFST42.ans +4 -0
- package/assets/images/mugshot/ans/4/STFTL00.ans +4 -0
- package/assets/images/mugshot/ans/4/STFTL10.ans +4 -0
- package/assets/images/mugshot/ans/4/STFTL20.ans +4 -0
- package/assets/images/mugshot/ans/4/STFTL30.ans +4 -0
- package/assets/images/mugshot/ans/4/STFTL40.ans +4 -0
- package/assets/images/mugshot/ans/4/STFTR00.ans +4 -0
- package/assets/images/mugshot/ans/4/STFTR10.ans +4 -0
- package/assets/images/mugshot/ans/4/STFTR20.ans +4 -0
- package/assets/images/mugshot/ans/4/STFTR30.ans +4 -0
- package/assets/images/mugshot/ans/4/STFTR40.ans +4 -0
- package/assets/images/mugshot/ans/5/STFDEAD0.ans +5 -0
- package/assets/images/mugshot/ans/5/STFEVL0.ans +5 -0
- package/assets/images/mugshot/ans/5/STFEVL1.ans +5 -0
- package/assets/images/mugshot/ans/5/STFEVL2.ans +5 -0
- package/assets/images/mugshot/ans/5/STFEVL3.ans +5 -0
- package/assets/images/mugshot/ans/5/STFEVL4.ans +5 -0
- package/assets/images/mugshot/ans/5/STFGOD0.ans +5 -0
- package/assets/images/mugshot/ans/5/STFKILL0.ans +5 -0
- package/assets/images/mugshot/ans/5/STFKILL1.ans +5 -0
- package/assets/images/mugshot/ans/5/STFKILL2.ans +5 -0
- package/assets/images/mugshot/ans/5/STFKILL3.ans +5 -0
- package/assets/images/mugshot/ans/5/STFKILL4.ans +5 -0
- package/assets/images/mugshot/ans/5/STFOUCH0.ans +5 -0
- package/assets/images/mugshot/ans/5/STFOUCH1.ans +5 -0
- package/assets/images/mugshot/ans/5/STFOUCH2.ans +5 -0
- package/assets/images/mugshot/ans/5/STFOUCH3.ans +5 -0
- package/assets/images/mugshot/ans/5/STFOUCH4.ans +5 -0
- package/assets/images/mugshot/ans/5/STFST00.ans +5 -0
- package/assets/images/mugshot/ans/5/STFST01.ans +5 -0
- package/assets/images/mugshot/ans/5/STFST02.ans +5 -0
- package/assets/images/mugshot/ans/5/STFST10.ans +5 -0
- package/assets/images/mugshot/ans/5/STFST11.ans +5 -0
- package/assets/images/mugshot/ans/5/STFST12.ans +5 -0
- package/assets/images/mugshot/ans/5/STFST20.ans +5 -0
- package/assets/images/mugshot/ans/5/STFST21.ans +5 -0
- package/assets/images/mugshot/ans/5/STFST22.ans +5 -0
- package/assets/images/mugshot/ans/5/STFST30.ans +5 -0
- package/assets/images/mugshot/ans/5/STFST31.ans +5 -0
- package/assets/images/mugshot/ans/5/STFST32.ans +5 -0
- package/assets/images/mugshot/ans/5/STFST40.ans +5 -0
- package/assets/images/mugshot/ans/5/STFST41.ans +5 -0
- package/assets/images/mugshot/ans/5/STFST42.ans +5 -0
- package/assets/images/mugshot/ans/5/STFTL00.ans +5 -0
- package/assets/images/mugshot/ans/5/STFTL10.ans +5 -0
- package/assets/images/mugshot/ans/5/STFTL20.ans +5 -0
- package/assets/images/mugshot/ans/5/STFTL30.ans +5 -0
- package/assets/images/mugshot/ans/5/STFTL40.ans +5 -0
- package/assets/images/mugshot/ans/5/STFTR00.ans +5 -0
- package/assets/images/mugshot/ans/5/STFTR10.ans +5 -0
- package/assets/images/mugshot/ans/5/STFTR20.ans +5 -0
- package/assets/images/mugshot/ans/5/STFTR30.ans +5 -0
- package/assets/images/mugshot/ans/5/STFTR40.ans +5 -0
- package/assets/images/mugshot/ans/6/STFDEAD0.ans +6 -0
- package/assets/images/mugshot/ans/6/STFEVL0.ans +6 -0
- package/assets/images/mugshot/ans/6/STFEVL1.ans +6 -0
- package/assets/images/mugshot/ans/6/STFEVL2.ans +6 -0
- package/assets/images/mugshot/ans/6/STFEVL3.ans +6 -0
- package/assets/images/mugshot/ans/6/STFEVL4.ans +6 -0
- package/assets/images/mugshot/ans/6/STFGOD0.ans +6 -0
- package/assets/images/mugshot/ans/6/STFKILL0.ans +6 -0
- package/assets/images/mugshot/ans/6/STFKILL1.ans +6 -0
- package/assets/images/mugshot/ans/6/STFKILL2.ans +6 -0
- package/assets/images/mugshot/ans/6/STFKILL3.ans +6 -0
- package/assets/images/mugshot/ans/6/STFKILL4.ans +6 -0
- package/assets/images/mugshot/ans/6/STFOUCH0.ans +6 -0
- package/assets/images/mugshot/ans/6/STFOUCH1.ans +6 -0
- package/assets/images/mugshot/ans/6/STFOUCH2.ans +6 -0
- package/assets/images/mugshot/ans/6/STFOUCH3.ans +6 -0
- package/assets/images/mugshot/ans/6/STFOUCH4.ans +6 -0
- package/assets/images/mugshot/ans/6/STFST00.ans +6 -0
- package/assets/images/mugshot/ans/6/STFST01.ans +6 -0
- package/assets/images/mugshot/ans/6/STFST02.ans +6 -0
- package/assets/images/mugshot/ans/6/STFST10.ans +6 -0
- package/assets/images/mugshot/ans/6/STFST11.ans +6 -0
- package/assets/images/mugshot/ans/6/STFST12.ans +6 -0
- package/assets/images/mugshot/ans/6/STFST20.ans +6 -0
- package/assets/images/mugshot/ans/6/STFST21.ans +6 -0
- package/assets/images/mugshot/ans/6/STFST22.ans +6 -0
- package/assets/images/mugshot/ans/6/STFST30.ans +6 -0
- package/assets/images/mugshot/ans/6/STFST31.ans +6 -0
- package/assets/images/mugshot/ans/6/STFST32.ans +6 -0
- package/assets/images/mugshot/ans/6/STFST40.ans +6 -0
- package/assets/images/mugshot/ans/6/STFST41.ans +6 -0
- package/assets/images/mugshot/ans/6/STFST42.ans +6 -0
- package/assets/images/mugshot/ans/6/STFTL00.ans +6 -0
- package/assets/images/mugshot/ans/6/STFTL10.ans +6 -0
- package/assets/images/mugshot/ans/6/STFTL20.ans +6 -0
- package/assets/images/mugshot/ans/6/STFTL30.ans +6 -0
- package/assets/images/mugshot/ans/6/STFTL40.ans +6 -0
- package/assets/images/mugshot/ans/6/STFTR00.ans +6 -0
- package/assets/images/mugshot/ans/6/STFTR10.ans +6 -0
- package/assets/images/mugshot/ans/6/STFTR20.ans +6 -0
- package/assets/images/mugshot/ans/6/STFTR30.ans +6 -0
- package/assets/images/mugshot/ans/6/STFTR40.ans +6 -0
- package/assets/images/mugshot/ans/7/STFDEAD0.ans +7 -0
- package/assets/images/mugshot/ans/7/STFEVL0.ans +7 -0
- package/assets/images/mugshot/ans/7/STFEVL1.ans +7 -0
- package/assets/images/mugshot/ans/7/STFEVL2.ans +7 -0
- package/assets/images/mugshot/ans/7/STFEVL3.ans +7 -0
- package/assets/images/mugshot/ans/7/STFEVL4.ans +7 -0
- package/assets/images/mugshot/ans/7/STFGOD0.ans +7 -0
- package/assets/images/mugshot/ans/7/STFKILL0.ans +7 -0
- package/assets/images/mugshot/ans/7/STFKILL1.ans +7 -0
- package/assets/images/mugshot/ans/7/STFKILL2.ans +7 -0
- package/assets/images/mugshot/ans/7/STFKILL3.ans +7 -0
- package/assets/images/mugshot/ans/7/STFKILL4.ans +7 -0
- package/assets/images/mugshot/ans/7/STFOUCH0.ans +7 -0
- package/assets/images/mugshot/ans/7/STFOUCH1.ans +7 -0
- package/assets/images/mugshot/ans/7/STFOUCH2.ans +7 -0
- package/assets/images/mugshot/ans/7/STFOUCH3.ans +7 -0
- package/assets/images/mugshot/ans/7/STFOUCH4.ans +7 -0
- package/assets/images/mugshot/ans/7/STFST00.ans +7 -0
- package/assets/images/mugshot/ans/7/STFST01.ans +7 -0
- package/assets/images/mugshot/ans/7/STFST02.ans +7 -0
- package/assets/images/mugshot/ans/7/STFST10.ans +7 -0
- package/assets/images/mugshot/ans/7/STFST11.ans +7 -0
- package/assets/images/mugshot/ans/7/STFST12.ans +7 -0
- package/assets/images/mugshot/ans/7/STFST20.ans +7 -0
- package/assets/images/mugshot/ans/7/STFST21.ans +7 -0
- package/assets/images/mugshot/ans/7/STFST22.ans +7 -0
- package/assets/images/mugshot/ans/7/STFST30.ans +7 -0
- package/assets/images/mugshot/ans/7/STFST31.ans +7 -0
- package/assets/images/mugshot/ans/7/STFST32.ans +7 -0
- package/assets/images/mugshot/ans/7/STFST40.ans +7 -0
- package/assets/images/mugshot/ans/7/STFST41.ans +7 -0
- package/assets/images/mugshot/ans/7/STFST42.ans +7 -0
- package/assets/images/mugshot/ans/7/STFTL00.ans +7 -0
- package/assets/images/mugshot/ans/7/STFTL10.ans +7 -0
- package/assets/images/mugshot/ans/7/STFTL20.ans +7 -0
- package/assets/images/mugshot/ans/7/STFTL30.ans +7 -0
- package/assets/images/mugshot/ans/7/STFTL40.ans +7 -0
- package/assets/images/mugshot/ans/7/STFTR00.ans +7 -0
- package/assets/images/mugshot/ans/7/STFTR10.ans +7 -0
- package/assets/images/mugshot/ans/7/STFTR20.ans +7 -0
- package/assets/images/mugshot/ans/7/STFTR30.ans +7 -0
- package/assets/images/mugshot/ans/7/STFTR40.ans +7 -0
- package/assets/images/mugshot/ans/8/STFDEAD0.ans +8 -0
- package/assets/images/mugshot/ans/8/STFEVL0.ans +8 -0
- package/assets/images/mugshot/ans/8/STFEVL1.ans +8 -0
- package/assets/images/mugshot/ans/8/STFEVL2.ans +8 -0
- package/assets/images/mugshot/ans/8/STFEVL3.ans +8 -0
- package/assets/images/mugshot/ans/8/STFEVL4.ans +8 -0
- package/assets/images/mugshot/ans/8/STFGOD0.ans +8 -0
- package/assets/images/mugshot/ans/8/STFKILL0.ans +8 -0
- package/assets/images/mugshot/ans/8/STFKILL1.ans +8 -0
- package/assets/images/mugshot/ans/8/STFKILL2.ans +8 -0
- package/assets/images/mugshot/ans/8/STFKILL3.ans +8 -0
- package/assets/images/mugshot/ans/8/STFKILL4.ans +8 -0
- package/assets/images/mugshot/ans/8/STFOUCH0.ans +8 -0
- package/assets/images/mugshot/ans/8/STFOUCH1.ans +8 -0
- package/assets/images/mugshot/ans/8/STFOUCH2.ans +8 -0
- package/assets/images/mugshot/ans/8/STFOUCH3.ans +8 -0
- package/assets/images/mugshot/ans/8/STFOUCH4.ans +8 -0
- package/assets/images/mugshot/ans/8/STFST00.ans +8 -0
- package/assets/images/mugshot/ans/8/STFST01.ans +8 -0
- package/assets/images/mugshot/ans/8/STFST02.ans +8 -0
- package/assets/images/mugshot/ans/8/STFST10.ans +8 -0
- package/assets/images/mugshot/ans/8/STFST11.ans +8 -0
- package/assets/images/mugshot/ans/8/STFST12.ans +8 -0
- package/assets/images/mugshot/ans/8/STFST20.ans +8 -0
- package/assets/images/mugshot/ans/8/STFST21.ans +8 -0
- package/assets/images/mugshot/ans/8/STFST22.ans +8 -0
- package/assets/images/mugshot/ans/8/STFST30.ans +8 -0
- package/assets/images/mugshot/ans/8/STFST31.ans +8 -0
- package/assets/images/mugshot/ans/8/STFST32.ans +8 -0
- package/assets/images/mugshot/ans/8/STFST40.ans +8 -0
- package/assets/images/mugshot/ans/8/STFST41.ans +8 -0
- package/assets/images/mugshot/ans/8/STFST42.ans +8 -0
- package/assets/images/mugshot/ans/8/STFTL00.ans +8 -0
- package/assets/images/mugshot/ans/8/STFTL10.ans +8 -0
- package/assets/images/mugshot/ans/8/STFTL20.ans +8 -0
- package/assets/images/mugshot/ans/8/STFTL30.ans +8 -0
- package/assets/images/mugshot/ans/8/STFTL40.ans +8 -0
- package/assets/images/mugshot/ans/8/STFTR00.ans +8 -0
- package/assets/images/mugshot/ans/8/STFTR10.ans +8 -0
- package/assets/images/mugshot/ans/8/STFTR20.ans +8 -0
- package/assets/images/mugshot/ans/8/STFTR30.ans +8 -0
- package/assets/images/mugshot/ans/8/STFTR40.ans +8 -0
- package/assets/images/mugshot/ans/9/STFDEAD0.ans +9 -0
- package/assets/images/mugshot/ans/9/STFEVL0.ans +9 -0
- package/assets/images/mugshot/ans/9/STFEVL1.ans +9 -0
- package/assets/images/mugshot/ans/9/STFEVL2.ans +9 -0
- package/assets/images/mugshot/ans/9/STFEVL3.ans +9 -0
- package/assets/images/mugshot/ans/9/STFEVL4.ans +9 -0
- package/assets/images/mugshot/ans/9/STFGOD0.ans +9 -0
- package/assets/images/mugshot/ans/9/STFKILL0.ans +9 -0
- package/assets/images/mugshot/ans/9/STFKILL1.ans +9 -0
- package/assets/images/mugshot/ans/9/STFKILL2.ans +9 -0
- package/assets/images/mugshot/ans/9/STFKILL3.ans +9 -0
- package/assets/images/mugshot/ans/9/STFKILL4.ans +9 -0
- package/assets/images/mugshot/ans/9/STFOUCH0.ans +9 -0
- package/assets/images/mugshot/ans/9/STFOUCH1.ans +9 -0
- package/assets/images/mugshot/ans/9/STFOUCH2.ans +9 -0
- package/assets/images/mugshot/ans/9/STFOUCH3.ans +9 -0
- package/assets/images/mugshot/ans/9/STFOUCH4.ans +9 -0
- package/assets/images/mugshot/ans/9/STFST00.ans +9 -0
- package/assets/images/mugshot/ans/9/STFST01.ans +9 -0
- package/assets/images/mugshot/ans/9/STFST02.ans +9 -0
- package/assets/images/mugshot/ans/9/STFST10.ans +9 -0
- package/assets/images/mugshot/ans/9/STFST11.ans +9 -0
- package/assets/images/mugshot/ans/9/STFST12.ans +9 -0
- package/assets/images/mugshot/ans/9/STFST20.ans +9 -0
- package/assets/images/mugshot/ans/9/STFST21.ans +9 -0
- package/assets/images/mugshot/ans/9/STFST22.ans +9 -0
- package/assets/images/mugshot/ans/9/STFST30.ans +9 -0
- package/assets/images/mugshot/ans/9/STFST31.ans +9 -0
- package/assets/images/mugshot/ans/9/STFST32.ans +9 -0
- package/assets/images/mugshot/ans/9/STFST40.ans +9 -0
- package/assets/images/mugshot/ans/9/STFST41.ans +9 -0
- package/assets/images/mugshot/ans/9/STFST42.ans +9 -0
- package/assets/images/mugshot/ans/9/STFTL00.ans +9 -0
- package/assets/images/mugshot/ans/9/STFTL10.ans +9 -0
- package/assets/images/mugshot/ans/9/STFTL20.ans +9 -0
- package/assets/images/mugshot/ans/9/STFTL30.ans +9 -0
- package/assets/images/mugshot/ans/9/STFTL40.ans +9 -0
- package/assets/images/mugshot/ans/9/STFTR00.ans +9 -0
- package/assets/images/mugshot/ans/9/STFTR10.ans +9 -0
- package/assets/images/mugshot/ans/9/STFTR20.ans +9 -0
- package/assets/images/mugshot/ans/9/STFTR30.ans +9 -0
- package/assets/images/mugshot/ans/9/STFTR40.ans +9 -0
- package/assets/images/mugshot/wad/STFDEAD0.png +0 -0
- package/assets/images/mugshot/wad/STFEVL0.png +0 -0
- package/assets/images/mugshot/wad/STFEVL1.png +0 -0
- package/assets/images/mugshot/wad/STFEVL2.png +0 -0
- package/assets/images/mugshot/wad/STFEVL3.png +0 -0
- package/assets/images/mugshot/wad/STFEVL4.png +0 -0
- package/assets/images/mugshot/wad/STFGOD0.png +0 -0
- package/assets/images/mugshot/wad/STFKILL0.png +0 -0
- package/assets/images/mugshot/wad/STFKILL1.png +0 -0
- package/assets/images/mugshot/wad/STFKILL2.png +0 -0
- package/assets/images/mugshot/wad/STFKILL3.png +0 -0
- package/assets/images/mugshot/wad/STFKILL4.png +0 -0
- package/assets/images/mugshot/wad/STFOUCH0.png +0 -0
- package/assets/images/mugshot/wad/STFOUCH1.png +0 -0
- package/assets/images/mugshot/wad/STFOUCH2.png +0 -0
- package/assets/images/mugshot/wad/STFOUCH3.png +0 -0
- package/assets/images/mugshot/wad/STFOUCH4.png +0 -0
- package/assets/images/mugshot/wad/STFST00.png +0 -0
- package/assets/images/mugshot/wad/STFST01.png +0 -0
- package/assets/images/mugshot/wad/STFST02.png +0 -0
- package/assets/images/mugshot/wad/STFST10.png +0 -0
- package/assets/images/mugshot/wad/STFST11.png +0 -0
- package/assets/images/mugshot/wad/STFST12.png +0 -0
- package/assets/images/mugshot/wad/STFST20.png +0 -0
- package/assets/images/mugshot/wad/STFST21.png +0 -0
- package/assets/images/mugshot/wad/STFST22.png +0 -0
- package/assets/images/mugshot/wad/STFST30.png +0 -0
- package/assets/images/mugshot/wad/STFST31.png +0 -0
- package/assets/images/mugshot/wad/STFST32.png +0 -0
- package/assets/images/mugshot/wad/STFST40.png +0 -0
- package/assets/images/mugshot/wad/STFST41.png +0 -0
- package/assets/images/mugshot/wad/STFST42.png +0 -0
- package/assets/images/mugshot/wad/STFTL00.png +0 -0
- package/assets/images/mugshot/wad/STFTL10.png +0 -0
- package/assets/images/mugshot/wad/STFTL20.png +0 -0
- package/assets/images/mugshot/wad/STFTL30.png +0 -0
- package/assets/images/mugshot/wad/STFTL40.png +0 -0
- package/assets/images/mugshot/wad/STFTR00.png +0 -0
- package/assets/images/mugshot/wad/STFTR10.png +0 -0
- package/assets/images/mugshot/wad/STFTR20.png +0 -0
- package/assets/images/mugshot/wad/STFTR30.png +0 -0
- package/assets/images/mugshot/wad/STFTR40.png +0 -0
- package/bin/cli.js +163 -0
- package/package.json +39 -0
- package/presets/default.toml +30 -0
- package/presets/full.toml +80 -0
- package/presets/minimal.toml +19 -0
- package/src/ansi.js +20 -0
- package/src/face.js +126 -0
- package/src/hook.js +136 -0
- package/src/render.js +463 -0
- 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
|
+
}
|