pingthings 0.9.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (183) hide show
  1. package/LICENSE +39 -1
  2. package/README.md +40 -1
  3. package/package.json +1 -1
  4. package/packs/nature-animals/manifest.json +52 -0
  5. package/packs/nature-animals/sounds/bark-1.ogg +0 -0
  6. package/packs/nature-animals/sounds/bark-2.ogg +0 -0
  7. package/packs/nature-animals/sounds/chirp-1.ogg +0 -0
  8. package/packs/nature-animals/sounds/chirp-2.ogg +0 -0
  9. package/packs/nature-animals/sounds/chirp-3.ogg +0 -0
  10. package/packs/nature-animals/sounds/coo.ogg +0 -0
  11. package/packs/nature-animals/sounds/cricket-1.ogg +0 -0
  12. package/packs/nature-animals/sounds/cricket-2.ogg +0 -0
  13. package/packs/nature-animals/sounds/howl.ogg +0 -0
  14. package/packs/nature-animals/sounds/insect-1.ogg +0 -0
  15. package/packs/nature-animals/sounds/insect-2.ogg +0 -0
  16. package/packs/nature-animals/sounds/owl-hoot.ogg +0 -0
  17. package/packs/nature-animals/sounds/peep-1.ogg +0 -0
  18. package/packs/nature-animals/sounds/peep-2.ogg +0 -0
  19. package/packs/nature-animals/sounds/snort.ogg +0 -0
  20. package/packs/nature-forest/manifest.json +50 -0
  21. package/packs/nature-forest/sounds/bird-1.ogg +0 -0
  22. package/packs/nature-forest/sounds/bird-2.ogg +0 -0
  23. package/packs/nature-forest/sounds/bird-3.ogg +0 -0
  24. package/packs/nature-forest/sounds/branch-crack.ogg +0 -0
  25. package/packs/nature-forest/sounds/critter-1.ogg +0 -0
  26. package/packs/nature-forest/sounds/critter-2.ogg +0 -0
  27. package/packs/nature-forest/sounds/leaf-rustle-1.ogg +0 -0
  28. package/packs/nature-forest/sounds/leaf-rustle-2.ogg +0 -0
  29. package/packs/nature-forest/sounds/leaf-rustle-3.ogg +0 -0
  30. package/packs/nature-forest/sounds/songbird.ogg +0 -0
  31. package/packs/nature-forest/sounds/stream-splash-1.ogg +0 -0
  32. package/packs/nature-forest/sounds/stream-splash-2.ogg +0 -0
  33. package/packs/nature-forest/sounds/twig-snap-1.ogg +0 -0
  34. package/packs/nature-forest/sounds/twig-snap-2.ogg +0 -0
  35. package/packs/nature-night/manifest.json +50 -0
  36. package/packs/nature-night/sounds/distant-animal-1.ogg +0 -0
  37. package/packs/nature-night/sounds/distant-animal-2.ogg +0 -0
  38. package/packs/nature-night/sounds/eerie-1.ogg +0 -0
  39. package/packs/nature-night/sounds/eerie-2.ogg +0 -0
  40. package/packs/nature-night/sounds/night-call-1.ogg +0 -0
  41. package/packs/nature-night/sounds/night-call-2.ogg +0 -0
  42. package/packs/nature-night/sounds/night-cricket-1.ogg +0 -0
  43. package/packs/nature-night/sounds/night-cricket-2.ogg +0 -0
  44. package/packs/nature-night/sounds/night-owl.ogg +0 -0
  45. package/packs/nature-night/sounds/rustle-1.ogg +0 -0
  46. package/packs/nature-night/sounds/rustle-2.ogg +0 -0
  47. package/packs/nature-night/sounds/rustle-3.ogg +0 -0
  48. package/packs/nature-night/sounds/sleeping-creature.ogg +0 -0
  49. package/packs/nature-night/sounds/wolf-howl.ogg +0 -0
  50. package/packs/nature-ocean/manifest.json +45 -0
  51. package/packs/nature-ocean/sounds/bubble-1.ogg +0 -0
  52. package/packs/nature-ocean/sounds/bubble-2.ogg +0 -0
  53. package/packs/nature-ocean/sounds/current.ogg +0 -0
  54. package/packs/nature-ocean/sounds/deep-1.ogg +0 -0
  55. package/packs/nature-ocean/sounds/deep-2.ogg +0 -0
  56. package/packs/nature-ocean/sounds/shore-1.ogg +0 -0
  57. package/packs/nature-ocean/sounds/shore-2.ogg +0 -0
  58. package/packs/nature-ocean/sounds/wave-1.ogg +0 -0
  59. package/packs/nature-ocean/sounds/wave-2.ogg +0 -0
  60. package/packs/nature-ocean/sounds/wind-1.ogg +0 -0
  61. package/packs/nature-ocean/sounds/wind-2.ogg +0 -0
  62. package/packs/nature-weather/manifest.json +47 -0
  63. package/packs/nature-weather/sounds/distant-thunder.ogg +0 -0
  64. package/packs/nature-weather/sounds/lightning-crack.ogg +0 -0
  65. package/packs/nature-weather/sounds/rain-drop-1.ogg +0 -0
  66. package/packs/nature-weather/sounds/rain-drop-2.ogg +0 -0
  67. package/packs/nature-weather/sounds/storm-1.ogg +0 -0
  68. package/packs/nature-weather/sounds/storm-2.ogg +0 -0
  69. package/packs/nature-weather/sounds/thunder-1.ogg +0 -0
  70. package/packs/nature-weather/sounds/thunder-2.ogg +0 -0
  71. package/packs/nature-weather/sounds/thunder-3.ogg +0 -0
  72. package/packs/nature-weather/sounds/thunder-rumble.ogg +0 -0
  73. package/packs/nature-weather/sounds/wind-gust-1.ogg +0 -0
  74. package/packs/nature-weather/sounds/wind-gust-2.ogg +0 -0
  75. package/packs/office-classic/manifest.json +52 -0
  76. package/packs/office-classic/sounds/desk-knock.ogg +0 -0
  77. package/packs/office-classic/sounds/door-close-1.ogg +0 -0
  78. package/packs/office-classic/sounds/door-close-2.ogg +0 -0
  79. package/packs/office-classic/sounds/door-open.ogg +0 -0
  80. package/packs/office-classic/sounds/drawer-open.ogg +0 -0
  81. package/packs/office-classic/sounds/key-turn-1.ogg +0 -0
  82. package/packs/office-classic/sounds/key-turn-2.ogg +0 -0
  83. package/packs/office-classic/sounds/paper-1.ogg +0 -0
  84. package/packs/office-classic/sounds/paper-2.ogg +0 -0
  85. package/packs/office-classic/sounds/paper-3.ogg +0 -0
  86. package/packs/office-classic/sounds/paper-4.ogg +0 -0
  87. package/packs/office-classic/sounds/pen-click.ogg +0 -0
  88. package/packs/office-classic/sounds/stapler.ogg +0 -0
  89. package/packs/office-classic/sounds/switch-1.ogg +0 -0
  90. package/packs/office-classic/sounds/switch-2.ogg +0 -0
  91. package/packs/office-digital/manifest.json +52 -0
  92. package/packs/office-digital/sounds/alert-1.ogg +0 -0
  93. package/packs/office-digital/sounds/alert-2.ogg +0 -0
  94. package/packs/office-digital/sounds/ascend-1.ogg +0 -0
  95. package/packs/office-digital/sounds/ascend-2.ogg +0 -0
  96. package/packs/office-digital/sounds/ascend-3.ogg +0 -0
  97. package/packs/office-digital/sounds/chime.ogg +0 -0
  98. package/packs/office-digital/sounds/descend.ogg +0 -0
  99. package/packs/office-digital/sounds/down-tone.ogg +0 -0
  100. package/packs/office-digital/sounds/low-alert.ogg +0 -0
  101. package/packs/office-digital/sounds/ping-1.ogg +0 -0
  102. package/packs/office-digital/sounds/ping-2.ogg +0 -0
  103. package/packs/office-digital/sounds/ping-3.ogg +0 -0
  104. package/packs/office-digital/sounds/random-tone.ogg +0 -0
  105. package/packs/office-digital/sounds/up-tone.ogg +0 -0
  106. package/packs/office-digital/sounds/zap-tone.ogg +0 -0
  107. package/packs/office-mechanical/manifest.json +52 -0
  108. package/packs/office-mechanical/sounds/clamp.ogg +0 -0
  109. package/packs/office-mechanical/sounds/hum-1.ogg +0 -0
  110. package/packs/office-mechanical/sounds/hum-2.ogg +0 -0
  111. package/packs/office-mechanical/sounds/machine-1.ogg +0 -0
  112. package/packs/office-mechanical/sounds/machine-2.ogg +0 -0
  113. package/packs/office-mechanical/sounds/machine-3.ogg +0 -0
  114. package/packs/office-mechanical/sounds/ratchet.ogg +0 -0
  115. package/packs/office-mechanical/sounds/stamp-1.ogg +0 -0
  116. package/packs/office-mechanical/sounds/stamp-2.ogg +0 -0
  117. package/packs/office-mechanical/sounds/stamp-3.ogg +0 -0
  118. package/packs/office-mechanical/sounds/tap-1.ogg +0 -0
  119. package/packs/office-mechanical/sounds/tap-2.ogg +0 -0
  120. package/packs/office-mechanical/sounds/tap-3.ogg +0 -0
  121. package/packs/office-mechanical/sounds/tap-4.ogg +0 -0
  122. package/packs/office-mechanical/sounds/wrench.ogg +0 -0
  123. package/packs/office-minimal/manifest.json +52 -0
  124. package/packs/office-minimal/sounds/drop-1.ogg +0 -0
  125. package/packs/office-minimal/sounds/drop-2.ogg +0 -0
  126. package/packs/office-minimal/sounds/scroll-1.ogg +0 -0
  127. package/packs/office-minimal/sounds/scroll-2.ogg +0 -0
  128. package/packs/office-minimal/sounds/select-1.ogg +0 -0
  129. package/packs/office-minimal/sounds/select-2.ogg +0 -0
  130. package/packs/office-minimal/sounds/select-3.ogg +0 -0
  131. package/packs/office-minimal/sounds/switch-1.ogg +0 -0
  132. package/packs/office-minimal/sounds/switch-2.ogg +0 -0
  133. package/packs/office-minimal/sounds/tick-1.ogg +0 -0
  134. package/packs/office-minimal/sounds/tick-2.ogg +0 -0
  135. package/packs/office-minimal/sounds/tick-3.ogg +0 -0
  136. package/packs/office-minimal/sounds/toggle-1.ogg +0 -0
  137. package/packs/office-minimal/sounds/toggle-2.ogg +0 -0
  138. package/packs/office-minimal/sounds/toggle-3.ogg +0 -0
  139. package/packs/serene-bells/manifest.json +49 -0
  140. package/packs/serene-bells/sounds/crystal-1.ogg +0 -0
  141. package/packs/serene-bells/sounds/crystal-2.ogg +0 -0
  142. package/packs/serene-bells/sounds/crystal-3.ogg +0 -0
  143. package/packs/serene-bells/sounds/crystal-4.ogg +0 -0
  144. package/packs/serene-bells/sounds/crystal-5.ogg +0 -0
  145. package/packs/serene-bells/sounds/gong-1.ogg +0 -0
  146. package/packs/serene-bells/sounds/gong-2.ogg +0 -0
  147. package/packs/serene-bells/sounds/temple-bell-1.ogg +0 -0
  148. package/packs/serene-bells/sounds/temple-bell-2.ogg +0 -0
  149. package/packs/serene-bells/sounds/temple-bell-3.ogg +0 -0
  150. package/packs/serene-bells/sounds/wind-chime-1.ogg +0 -0
  151. package/packs/serene-bells/sounds/wind-chime-2.ogg +0 -0
  152. package/packs/serene-bells/sounds/wind-chime-3.ogg +0 -0
  153. package/packs/serene-tones/manifest.json +47 -0
  154. package/packs/serene-tones/sounds/chime-1.ogg +0 -0
  155. package/packs/serene-tones/sounds/chime-2.ogg +0 -0
  156. package/packs/serene-tones/sounds/chime-3.ogg +0 -0
  157. package/packs/serene-tones/sounds/resonance-1.ogg +0 -0
  158. package/packs/serene-tones/sounds/resonance-2.ogg +0 -0
  159. package/packs/serene-tones/sounds/resonance-3.ogg +0 -0
  160. package/packs/serene-tones/sounds/resonance-4.ogg +0 -0
  161. package/packs/serene-tones/sounds/tone-1.ogg +0 -0
  162. package/packs/serene-tones/sounds/tone-2.ogg +0 -0
  163. package/packs/serene-tones/sounds/tone-3.ogg +0 -0
  164. package/packs/serene-tones/sounds/tone-4.ogg +0 -0
  165. package/packs/serene-tones/sounds/tone-5.ogg +0 -0
  166. package/packs/serene-water/manifest.json +47 -0
  167. package/packs/serene-water/sounds/bamboo-1.ogg +0 -0
  168. package/packs/serene-water/sounds/bamboo-2.ogg +0 -0
  169. package/packs/serene-water/sounds/bowl-1.ogg +0 -0
  170. package/packs/serene-water/sounds/bowl-2.ogg +0 -0
  171. package/packs/serene-water/sounds/bowl-3.ogg +0 -0
  172. package/packs/serene-water/sounds/bowl-4.ogg +0 -0
  173. package/packs/serene-water/sounds/drip-1.ogg +0 -0
  174. package/packs/serene-water/sounds/drip-2.ogg +0 -0
  175. package/packs/serene-water/sounds/vessel-1.ogg +0 -0
  176. package/packs/serene-water/sounds/vessel-2.ogg +0 -0
  177. package/packs/serene-water/sounds/water-drop-1.ogg +0 -0
  178. package/packs/serene-water/sounds/water-drop-2.ogg +0 -0
  179. package/src/cli/completions.js +9 -2
  180. package/src/cli/doctor.js +2 -1
  181. package/src/cli/stats.js +4 -2
  182. package/src/notify.js +9 -4
  183. package/src/player.js +2 -1
@@ -0,0 +1,52 @@
1
+ {
2
+ "name": "office-digital",
3
+ "description": "Digital pings, alerts, and chimes",
4
+ "version": "1.0.0",
5
+ "license": "CC0-1.0",
6
+ "credits": "Kenney (https://kenney.nl)",
7
+ "category": "digital",
8
+ "sounds": [
9
+ "sounds/alert-1.ogg",
10
+ "sounds/alert-2.ogg",
11
+ "sounds/ascend-1.ogg",
12
+ "sounds/ascend-2.ogg",
13
+ "sounds/ascend-3.ogg",
14
+ "sounds/chime.ogg",
15
+ "sounds/descend.ogg",
16
+ "sounds/down-tone.ogg",
17
+ "sounds/low-alert.ogg",
18
+ "sounds/ping-1.ogg",
19
+ "sounds/ping-2.ogg",
20
+ "sounds/ping-3.ogg",
21
+ "sounds/random-tone.ogg",
22
+ "sounds/up-tone.ogg",
23
+ "sounds/zap-tone.ogg"
24
+ ],
25
+ "events": {
26
+ "done": [
27
+ "sounds/alert-1.ogg",
28
+ "sounds/alert-2.ogg",
29
+ "sounds/ascend-1.ogg",
30
+ "sounds/ascend-2.ogg"
31
+ ],
32
+ "permission": [
33
+ "sounds/ascend-3.ogg",
34
+ "sounds/chime.ogg",
35
+ "sounds/descend.ogg"
36
+ ],
37
+ "complete": [
38
+ "sounds/down-tone.ogg",
39
+ "sounds/low-alert.ogg",
40
+ "sounds/ping-1.ogg"
41
+ ],
42
+ "error": [
43
+ "sounds/ping-2.ogg",
44
+ "sounds/ping-3.ogg",
45
+ "sounds/random-tone.ogg"
46
+ ],
47
+ "blocked": [
48
+ "sounds/up-tone.ogg",
49
+ "sounds/zap-tone.ogg"
50
+ ]
51
+ }
52
+ }
@@ -0,0 +1,52 @@
1
+ {
2
+ "name": "office-mechanical",
3
+ "description": "Machines, stamps, taps, and tools",
4
+ "version": "1.0.0",
5
+ "license": "CC0-1.0",
6
+ "credits": "rubberduck (https://opengameart.org/content/100-cc0-sfx)",
7
+ "category": "mechanical",
8
+ "sounds": [
9
+ "sounds/clamp.ogg",
10
+ "sounds/hum-1.ogg",
11
+ "sounds/hum-2.ogg",
12
+ "sounds/machine-1.ogg",
13
+ "sounds/machine-2.ogg",
14
+ "sounds/machine-3.ogg",
15
+ "sounds/ratchet.ogg",
16
+ "sounds/stamp-1.ogg",
17
+ "sounds/stamp-2.ogg",
18
+ "sounds/stamp-3.ogg",
19
+ "sounds/tap-1.ogg",
20
+ "sounds/tap-2.ogg",
21
+ "sounds/tap-3.ogg",
22
+ "sounds/tap-4.ogg",
23
+ "sounds/wrench.ogg"
24
+ ],
25
+ "events": {
26
+ "done": [
27
+ "sounds/clamp.ogg",
28
+ "sounds/hum-1.ogg",
29
+ "sounds/hum-2.ogg",
30
+ "sounds/machine-1.ogg"
31
+ ],
32
+ "permission": [
33
+ "sounds/machine-2.ogg",
34
+ "sounds/machine-3.ogg",
35
+ "sounds/ratchet.ogg"
36
+ ],
37
+ "complete": [
38
+ "sounds/stamp-1.ogg",
39
+ "sounds/stamp-2.ogg",
40
+ "sounds/stamp-3.ogg"
41
+ ],
42
+ "error": [
43
+ "sounds/tap-1.ogg",
44
+ "sounds/tap-2.ogg",
45
+ "sounds/tap-3.ogg"
46
+ ],
47
+ "blocked": [
48
+ "sounds/tap-4.ogg",
49
+ "sounds/wrench.ogg"
50
+ ]
51
+ }
52
+ }
@@ -0,0 +1,52 @@
1
+ {
2
+ "name": "office-minimal",
3
+ "description": "Subtle clicks, ticks, and toggles",
4
+ "version": "1.0.0",
5
+ "license": "CC0-1.0",
6
+ "credits": "Kenney (https://kenney.nl)",
7
+ "category": "minimal",
8
+ "sounds": [
9
+ "sounds/drop-1.ogg",
10
+ "sounds/drop-2.ogg",
11
+ "sounds/scroll-1.ogg",
12
+ "sounds/scroll-2.ogg",
13
+ "sounds/select-1.ogg",
14
+ "sounds/select-2.ogg",
15
+ "sounds/select-3.ogg",
16
+ "sounds/switch-1.ogg",
17
+ "sounds/switch-2.ogg",
18
+ "sounds/tick-1.ogg",
19
+ "sounds/tick-2.ogg",
20
+ "sounds/tick-3.ogg",
21
+ "sounds/toggle-1.ogg",
22
+ "sounds/toggle-2.ogg",
23
+ "sounds/toggle-3.ogg"
24
+ ],
25
+ "events": {
26
+ "done": [
27
+ "sounds/drop-1.ogg",
28
+ "sounds/drop-2.ogg",
29
+ "sounds/scroll-1.ogg",
30
+ "sounds/scroll-2.ogg"
31
+ ],
32
+ "permission": [
33
+ "sounds/select-1.ogg",
34
+ "sounds/select-2.ogg",
35
+ "sounds/select-3.ogg"
36
+ ],
37
+ "complete": [
38
+ "sounds/switch-1.ogg",
39
+ "sounds/switch-2.ogg",
40
+ "sounds/tick-1.ogg"
41
+ ],
42
+ "error": [
43
+ "sounds/tick-2.ogg",
44
+ "sounds/tick-3.ogg",
45
+ "sounds/toggle-1.ogg"
46
+ ],
47
+ "blocked": [
48
+ "sounds/toggle-2.ogg",
49
+ "sounds/toggle-3.ogg"
50
+ ]
51
+ }
52
+ }
@@ -0,0 +1,49 @@
1
+ {
2
+ "name": "serene-bells",
3
+ "description": "Temple bells, gongs, and crystal chimes",
4
+ "version": "1.0.0",
5
+ "license": "CC0-1.0",
6
+ "credits": "rubberduck (https://opengameart.org/content/100-cc0-sfx)",
7
+ "category": "bells",
8
+ "sounds": [
9
+ "sounds/crystal-1.ogg",
10
+ "sounds/crystal-2.ogg",
11
+ "sounds/crystal-3.ogg",
12
+ "sounds/crystal-4.ogg",
13
+ "sounds/crystal-5.ogg",
14
+ "sounds/gong-1.ogg",
15
+ "sounds/gong-2.ogg",
16
+ "sounds/temple-bell-1.ogg",
17
+ "sounds/temple-bell-2.ogg",
18
+ "sounds/temple-bell-3.ogg",
19
+ "sounds/wind-chime-1.ogg",
20
+ "sounds/wind-chime-2.ogg",
21
+ "sounds/wind-chime-3.ogg"
22
+ ],
23
+ "events": {
24
+ "done": [
25
+ "sounds/crystal-1.ogg",
26
+ "sounds/crystal-2.ogg",
27
+ "sounds/crystal-3.ogg",
28
+ "sounds/crystal-4.ogg"
29
+ ],
30
+ "permission": [
31
+ "sounds/crystal-5.ogg",
32
+ "sounds/gong-1.ogg",
33
+ "sounds/gong-2.ogg"
34
+ ],
35
+ "complete": [
36
+ "sounds/temple-bell-1.ogg",
37
+ "sounds/temple-bell-2.ogg",
38
+ "sounds/temple-bell-3.ogg"
39
+ ],
40
+ "error": [
41
+ "sounds/wind-chime-1.ogg",
42
+ "sounds/wind-chime-2.ogg",
43
+ "sounds/wind-chime-3.ogg"
44
+ ],
45
+ "blocked": [
46
+ "sounds/crystal-1.ogg"
47
+ ]
48
+ }
49
+ }
@@ -0,0 +1,47 @@
1
+ {
2
+ "name": "serene-tones",
3
+ "description": "Soft metallic tones, chimes, and resonances",
4
+ "version": "1.0.0",
5
+ "license": "CC0-1.0",
6
+ "credits": "rubberduck (https://opengameart.org/content/100-cc0-sfx)",
7
+ "category": "tones",
8
+ "sounds": [
9
+ "sounds/chime-1.ogg",
10
+ "sounds/chime-2.ogg",
11
+ "sounds/chime-3.ogg",
12
+ "sounds/resonance-1.ogg",
13
+ "sounds/resonance-2.ogg",
14
+ "sounds/resonance-3.ogg",
15
+ "sounds/resonance-4.ogg",
16
+ "sounds/tone-1.ogg",
17
+ "sounds/tone-2.ogg",
18
+ "sounds/tone-3.ogg",
19
+ "sounds/tone-4.ogg",
20
+ "sounds/tone-5.ogg"
21
+ ],
22
+ "events": {
23
+ "done": [
24
+ "sounds/chime-1.ogg",
25
+ "sounds/chime-2.ogg",
26
+ "sounds/chime-3.ogg",
27
+ "sounds/resonance-1.ogg"
28
+ ],
29
+ "permission": [
30
+ "sounds/resonance-2.ogg",
31
+ "sounds/resonance-3.ogg",
32
+ "sounds/resonance-4.ogg"
33
+ ],
34
+ "complete": [
35
+ "sounds/tone-1.ogg",
36
+ "sounds/tone-2.ogg",
37
+ "sounds/tone-3.ogg"
38
+ ],
39
+ "error": [
40
+ "sounds/tone-4.ogg",
41
+ "sounds/tone-5.ogg"
42
+ ],
43
+ "blocked": [
44
+ "sounds/chime-1.ogg"
45
+ ]
46
+ }
47
+ }
@@ -0,0 +1,47 @@
1
+ {
2
+ "name": "serene-water",
3
+ "description": "Water drops, drips, and gentle splashes",
4
+ "version": "1.0.0",
5
+ "license": "CC0-1.0",
6
+ "credits": "rubberduck (https://opengameart.org/content/100-cc0-sfx)",
7
+ "category": "water",
8
+ "sounds": [
9
+ "sounds/bamboo-1.ogg",
10
+ "sounds/bamboo-2.ogg",
11
+ "sounds/bowl-1.ogg",
12
+ "sounds/bowl-2.ogg",
13
+ "sounds/bowl-3.ogg",
14
+ "sounds/bowl-4.ogg",
15
+ "sounds/drip-1.ogg",
16
+ "sounds/drip-2.ogg",
17
+ "sounds/vessel-1.ogg",
18
+ "sounds/vessel-2.ogg",
19
+ "sounds/water-drop-1.ogg",
20
+ "sounds/water-drop-2.ogg"
21
+ ],
22
+ "events": {
23
+ "done": [
24
+ "sounds/bamboo-1.ogg",
25
+ "sounds/bamboo-2.ogg",
26
+ "sounds/bowl-1.ogg",
27
+ "sounds/bowl-2.ogg"
28
+ ],
29
+ "permission": [
30
+ "sounds/bowl-3.ogg",
31
+ "sounds/bowl-4.ogg",
32
+ "sounds/drip-1.ogg"
33
+ ],
34
+ "complete": [
35
+ "sounds/drip-2.ogg",
36
+ "sounds/vessel-1.ogg",
37
+ "sounds/vessel-2.ogg"
38
+ ],
39
+ "error": [
40
+ "sounds/water-drop-1.ogg",
41
+ "sounds/water-drop-2.ogg"
42
+ ],
43
+ "blocked": [
44
+ "sounds/bamboo-1.ogg"
45
+ ]
46
+ }
47
+ }
@@ -17,12 +17,14 @@ Install:
17
17
  const COMMANDS = [
18
18
  'play', 'list', 'select', 'browse', 'search', 'sounds',
19
19
  'use', 'preview', 'test-events', 'theme', 'config',
20
- 'init', 'create', 'install', 'uninstall', 'random-pack', 'doctor', 'completions',
20
+ 'init', 'setup', 'demo', 'stats', 'create', 'install', 'uninstall',
21
+ 'random-pack', 'doctor', 'update', 'cesp', 'completions',
21
22
  ];
22
23
 
23
24
  const THEMES = [
24
25
  'retro', 'sci-fi', 'arena', 'fantasy', 'ancient',
25
- 'professional', '8bit', 'space', 'chaos', 'reset',
26
+ 'professional', '8bit', 'space', 'developer', 'arcade',
27
+ 'tabletop', 'tournament', 'chaos', 'reset',
26
28
  ];
27
29
 
28
30
  const EVENTS = ['done', 'permission', 'complete', 'error', 'blocked'];
@@ -92,6 +94,11 @@ _pingthings() {
92
94
  'uninstall:Remove a user-installed pack'
93
95
  'random-pack:Switch to a random pack'
94
96
  'doctor:Diagnose audio setup'
97
+ 'setup:Configure hooks for any IDE'
98
+ 'demo:Play one sound from every pack'
99
+ 'stats:Show usage statistics'
100
+ 'update:Check for new versions'
101
+ 'cesp:Generate CESP manifests'
95
102
  'completions:Generate shell completions'
96
103
  )
97
104
  themes=(${THEMES.join(' ')})
package/src/cli/doctor.js CHANGED
@@ -33,7 +33,8 @@ function check(label, fn) {
33
33
 
34
34
  function commandExists(cmd) {
35
35
  try {
36
- execFileSync('which', [cmd], { stdio: 'pipe' });
36
+ const checker = platform() === 'win32' ? 'where' : 'which';
37
+ execFileSync(checker, [cmd], { stdio: 'pipe' });
37
38
  return true;
38
39
  } catch {
39
40
  return false;
package/src/cli/stats.js CHANGED
@@ -1,4 +1,4 @@
1
- import { existsSync, readFileSync, writeFileSync } from 'node:fs';
1
+ import { existsSync, readFileSync, writeFileSync, renameSync } from 'node:fs';
2
2
  import { join } from 'node:path';
3
3
  import { readConfig, getConfigDir } from '../config.js';
4
4
  import { listPacks } from '../packs.js';
@@ -40,7 +40,9 @@ export function recordPlay(packName, event) {
40
40
  stats.dailyPlays[today] = (stats.dailyPlays[today] || 0) + 1;
41
41
 
42
42
  try {
43
- writeFileSync(statsPath, JSON.stringify(stats, null, 2) + '\n', 'utf8');
43
+ const tmpPath = statsPath + '.tmp';
44
+ writeFileSync(tmpPath, JSON.stringify(stats, null, 2) + '\n', 'utf8');
45
+ renameSync(tmpPath, statsPath);
44
46
  } catch {}
45
47
  }
46
48
 
package/src/notify.js CHANGED
@@ -1,19 +1,24 @@
1
1
  import { spawn } from 'node:child_process';
2
2
  import { platform } from 'node:os';
3
3
 
4
+ function sanitize(str) {
5
+ return str.replace(/[\\"]/g, '').replace(/[^\x20-\x7E]/g, '');
6
+ }
7
+
4
8
  export function sendNotification(title, message) {
5
9
  const os = platform();
10
+ const safeTitle = sanitize(title);
11
+ const safeMessage = sanitize(message);
6
12
 
7
13
  if (os === 'darwin') {
8
14
  spawn('osascript', [
9
15
  '-e',
10
- `display notification "${message}" with title "${title}"`,
11
- ], { detached: true, stdio: 'ignore' }).unref();
16
+ `display notification "${safeMessage}" with title "${safeTitle}"`,
17
+ ], { detached: true, stdio: 'ignore' }).on('error', () => {}).unref();
12
18
  } else if (os === 'linux') {
13
- spawn('notify-send', [title, message], {
19
+ spawn('notify-send', [safeTitle, safeMessage], {
14
20
  detached: true,
15
21
  stdio: 'ignore',
16
22
  }).on('error', () => {}).unref();
17
23
  }
18
- // Windows: no native CLI notification without dependencies, skip for now
19
24
  }
package/src/player.js CHANGED
@@ -4,7 +4,8 @@ import { platform } from 'node:os';
4
4
 
5
5
  function commandExists(cmd) {
6
6
  try {
7
- execFileSync('which', [cmd], { stdio: 'pipe' });
7
+ const checker = platform() === 'win32' ? 'where' : 'which';
8
+ execFileSync(checker, [cmd], { stdio: 'pipe' });
8
9
  return true;
9
10
  } catch {
10
11
  return false;