vibe-notify 0.1.0 → 0.1.2
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/README.ja.md +112 -0
- package/README.md +2 -0
- package/README.zh-CN.md +112 -0
- package/dist/beep.js +2 -9
- package/dist/beep.js.map +1 -1
- package/dist/config.d.ts +0 -1
- package/dist/config.js +3 -15
- package/dist/config.js.map +1 -1
- package/dist/index.js +16 -25
- package/dist/index.js.map +1 -1
- package/dist/player.d.ts +6 -1
- package/dist/player.js +84 -33
- package/dist/player.js.map +1 -1
- package/package.json +3 -1
package/README.ja.md
ADDED
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
# vibe-notify 🔊
|
|
2
|
+
|
|
3
|
+
Claude Code セッションの通知音。Claude の応答が完了したときにカスタマイズ可能なビープ音/ジングルを再生します。席を離れていてもタスクの完了がわかります。
|
|
4
|
+
|
|
5
|
+
## クイックスタート
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
# グローバルにインストール
|
|
9
|
+
npm install -g vibe-notify
|
|
10
|
+
|
|
11
|
+
# テスト
|
|
12
|
+
vibe-notify victory
|
|
13
|
+
|
|
14
|
+
# 設定ファイルを作成
|
|
15
|
+
vibe-notify --init
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
インストールなしでも実行できます:
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
npx -y vibe-notify victory
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## 内蔵サウンド
|
|
25
|
+
|
|
26
|
+
| サウンド | 説明 |
|
|
27
|
+
|-------|-------------|
|
|
28
|
+
| `short-beep` | 短いビープ音 — クイック確認 |
|
|
29
|
+
| `double-beep` | 2回の短いビープ音 — 「処理が完了しました」 |
|
|
30
|
+
| `ascending` | 3つの上昇音 — ポジティブな進行 |
|
|
31
|
+
| `descending` | 3つの下降音 — タスク完了、落ち着く |
|
|
32
|
+
| `victory` | C-E-G-C アルペジオ — 勝利のジングル |
|
|
33
|
+
| `custom` | 自分の `.wav` ファイルを再生 |
|
|
34
|
+
|
|
35
|
+
いつでも一覧表示:`vibe-notify --list`
|
|
36
|
+
|
|
37
|
+
## 設定
|
|
38
|
+
|
|
39
|
+
設定ファイルの場所(優先順):
|
|
40
|
+
1. **プロジェクトローカル**:プロジェクトルートの `.vibe-notify.json`
|
|
41
|
+
2. **グローバル**:`~/.vibe-notify/config.json`
|
|
42
|
+
|
|
43
|
+
```json
|
|
44
|
+
{
|
|
45
|
+
"sound": "ascending",
|
|
46
|
+
"customFile": null,
|
|
47
|
+
"volume": 0.7,
|
|
48
|
+
"playback": {
|
|
49
|
+
"method": "auto"
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### カスタムサウンドファイル
|
|
55
|
+
|
|
56
|
+
```json
|
|
57
|
+
{
|
|
58
|
+
"sound": "custom",
|
|
59
|
+
"customFile": "C:\\Users\\You\\sounds\\done.wav",
|
|
60
|
+
"volume": 1.0
|
|
61
|
+
}
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## Claude Code フック設定
|
|
65
|
+
|
|
66
|
+
Claude の応答完了時に自動再生するには、`.claude/settings.json`(プロジェクトまたはグローバル)に以下を追加します:
|
|
67
|
+
|
|
68
|
+
```json
|
|
69
|
+
{
|
|
70
|
+
"hooks": {
|
|
71
|
+
"Stop": [
|
|
72
|
+
{
|
|
73
|
+
"hooks": [
|
|
74
|
+
{
|
|
75
|
+
"type": "command",
|
|
76
|
+
"command": "npx",
|
|
77
|
+
"args": ["-y", "vibe-notify"],
|
|
78
|
+
"timeout": 15
|
|
79
|
+
}
|
|
80
|
+
]
|
|
81
|
+
}
|
|
82
|
+
]
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
グローバルインストールしている場合は `"npx", "-y", "vibe-notify"` を `"vibe-notify"` に置き換えてください。args にサウンド名(例:`"victory"`)を追加すると設定ファイルの設定を上書きできます。
|
|
88
|
+
|
|
89
|
+
## CLI リファレンス
|
|
90
|
+
|
|
91
|
+
```
|
|
92
|
+
vibe-notify [options] [sound-name]
|
|
93
|
+
|
|
94
|
+
オプション:
|
|
95
|
+
--help, -h ヘルプを表示
|
|
96
|
+
--list, -l 利用可能なサウンドを一覧表示
|
|
97
|
+
--config, -c 設定ファイルのパスを表示
|
|
98
|
+
--init デフォルト設定ファイルを作成
|
|
99
|
+
--version, -v バージョンを表示
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
## 仕組み
|
|
103
|
+
|
|
104
|
+
- **ランタイム依存ゼロ** — すべてのサウンド生成は純粋な Node.js で行います
|
|
105
|
+
- 内蔵サウンドは WAV オーディオとしてメモリ上で生成(エンベロープ付き正弦波)
|
|
106
|
+
- 再生にはネイティブシステムプレイヤーを使用:PowerShell SoundPlayer (Windows)、afplay (macOS)、paplay/aplay (Linux)
|
|
107
|
+
- WAV 再生に失敗した場合は `[System.Console]::Beep()` または端末ベルにフォールバック
|
|
108
|
+
- 一時ファイルは再生後すぐにクリーンアップ
|
|
109
|
+
|
|
110
|
+
## ライセンス
|
|
111
|
+
|
|
112
|
+
MIT
|
package/README.md
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# vibe-notify 🔊
|
|
2
2
|
|
|
3
|
+
[English](./README.md) | [中文](./README.zh-CN.md) | [日本語](./README.ja.md)
|
|
4
|
+
|
|
3
5
|
Notification sounds for Claude Code sessions. Plays a customizable beep/jingle when Claude finishes responding — so you can step away and still know when your task is done.
|
|
4
6
|
|
|
5
7
|
## Quick Start
|
package/README.zh-CN.md
ADDED
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
# vibe-notify 🔊
|
|
2
|
+
|
|
3
|
+
Claude Code 会话的通知提示音。当 Claude 完成响应时播放可自定义的提示音/铃声 — 让你可以走开也能知道任务已完成。
|
|
4
|
+
|
|
5
|
+
## 快速开始
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
# 全局安装
|
|
9
|
+
npm install -g vibe-notify
|
|
10
|
+
|
|
11
|
+
# 测试一下
|
|
12
|
+
vibe-notify victory
|
|
13
|
+
|
|
14
|
+
# 创建配置文件
|
|
15
|
+
vibe-notify --init
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
或者无需安装直接运行:
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
npx -y vibe-notify victory
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## 内置音效
|
|
25
|
+
|
|
26
|
+
| 音效 | 描述 |
|
|
27
|
+
|-------|-------------|
|
|
28
|
+
| `short-beep` | 一声短促提示音 — 快速确认 |
|
|
29
|
+
| `double-beep` | 两声短促提示音 — "任务完成了" |
|
|
30
|
+
| `ascending` | 三声渐高音调 — 正向进展 |
|
|
31
|
+
| `descending` | 三声渐低音调 — 任务完成,放松下来 |
|
|
32
|
+
| `victory` | C-E-G-C 琶音 — 庆祝胜利 |
|
|
33
|
+
| `custom` | 播放你自己的 `.wav` 文件 |
|
|
34
|
+
|
|
35
|
+
随时查看音效列表:`vibe-notify --list`
|
|
36
|
+
|
|
37
|
+
## 配置
|
|
38
|
+
|
|
39
|
+
配置文件位置(按顺序查找):
|
|
40
|
+
1. **项目本地**:项目根目录下的 `.vibe-notify.json`
|
|
41
|
+
2. **全局**:`~/.vibe-notify/config.json`
|
|
42
|
+
|
|
43
|
+
```json
|
|
44
|
+
{
|
|
45
|
+
"sound": "ascending",
|
|
46
|
+
"customFile": null,
|
|
47
|
+
"volume": 0.7,
|
|
48
|
+
"playback": {
|
|
49
|
+
"method": "auto"
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### 自定义音频文件
|
|
55
|
+
|
|
56
|
+
```json
|
|
57
|
+
{
|
|
58
|
+
"sound": "custom",
|
|
59
|
+
"customFile": "C:\\Users\\You\\sounds\\done.wav",
|
|
60
|
+
"volume": 1.0
|
|
61
|
+
}
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## Claude Code Hook 设置
|
|
65
|
+
|
|
66
|
+
将以下内容添加到 `.claude/settings.json`(项目或全局),在 Claude 完成响应时自动播放:
|
|
67
|
+
|
|
68
|
+
```json
|
|
69
|
+
{
|
|
70
|
+
"hooks": {
|
|
71
|
+
"Stop": [
|
|
72
|
+
{
|
|
73
|
+
"hooks": [
|
|
74
|
+
{
|
|
75
|
+
"type": "command",
|
|
76
|
+
"command": "npx",
|
|
77
|
+
"args": ["-y", "vibe-notify"],
|
|
78
|
+
"timeout": 15
|
|
79
|
+
}
|
|
80
|
+
]
|
|
81
|
+
}
|
|
82
|
+
]
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
如果已全局安装,将 `"npx", "-y", "vibe-notify"` 替换为 `"vibe-notify"`。在 args 中添加音效名称(如 `"victory"`)可覆盖配置文件中的设置。
|
|
88
|
+
|
|
89
|
+
## CLI 参考
|
|
90
|
+
|
|
91
|
+
```
|
|
92
|
+
vibe-notify [options] [sound-name]
|
|
93
|
+
|
|
94
|
+
选项:
|
|
95
|
+
--help, -h 显示帮助
|
|
96
|
+
--list, -l 列出可用音效
|
|
97
|
+
--config, -c 打印配置文件路径
|
|
98
|
+
--init 创建默认配置文件
|
|
99
|
+
--version, -v 显示版本
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
## 工作原理
|
|
103
|
+
|
|
104
|
+
- **零运行时依赖** — 所有音频均使用纯 Node.js 生成
|
|
105
|
+
- 内置音效以 WAV 格式在内存中生成(带包络的正弦波)
|
|
106
|
+
- 播放使用系统原生播放器:PowerShell SoundPlayer (Windows)、afplay (macOS)、paplay/aplay (Linux)
|
|
107
|
+
- 如果 WAV 播放失败,回退到 `[System.Console]::Beep()` 或终端响铃
|
|
108
|
+
- 临时文件在播放后立即清理
|
|
109
|
+
|
|
110
|
+
## 许可证
|
|
111
|
+
|
|
112
|
+
MIT
|
package/dist/beep.js
CHANGED
|
@@ -8,7 +8,7 @@ exports.generateWav = generateWav;
|
|
|
8
8
|
const SAMPLE_RATE = 44100;
|
|
9
9
|
const BITS_PER_SAMPLE = 16;
|
|
10
10
|
const NUM_CHANNELS = 1;
|
|
11
|
-
const BYTES_PER_SAMPLE =
|
|
11
|
+
const BYTES_PER_SAMPLE = 2; // 16-bit = 2 bytes
|
|
12
12
|
// ── Built-in sound patterns ────────────────────────────────────────────────
|
|
13
13
|
exports.PATTERNS = [
|
|
14
14
|
{
|
|
@@ -72,14 +72,7 @@ function buildPatternBuffer(patternName, volume = 0.7) {
|
|
|
72
72
|
* Generate a WAV file buffer from an array of Tone objects.
|
|
73
73
|
*/
|
|
74
74
|
function generateWav(tones, sampleRate, volume) {
|
|
75
|
-
|
|
76
|
-
let totalSamples = 0;
|
|
77
|
-
for (const tone of tones) {
|
|
78
|
-
totalSamples += Math.ceil(tone.duration * sampleRate);
|
|
79
|
-
if (tone.gap && tone.gap > 0) {
|
|
80
|
-
totalSamples += Math.ceil(tone.gap * sampleRate);
|
|
81
|
-
}
|
|
82
|
-
}
|
|
75
|
+
const totalSamples = tones.reduce((sum, t) => sum + Math.ceil(t.duration * sampleRate) + Math.ceil((t.gap || 0) * sampleRate), 0);
|
|
83
76
|
const dataSize = totalSamples * BYTES_PER_SAMPLE;
|
|
84
77
|
const headerSize = 44;
|
|
85
78
|
const buffer = Buffer.alloc(headerSize + dataSize);
|
package/dist/beep.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"beep.js","sourceRoot":"","sources":["../src/beep.ts"],"names":[],"mappings":";;;AAwDA,4CAEC;AAQD,gDAOC;AAKD,
|
|
1
|
+
{"version":3,"file":"beep.js","sourceRoot":"","sources":["../src/beep.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
CHANGED
|
@@ -2,7 +2,6 @@ import { VibeNotifyConfig } from './types';
|
|
|
2
2
|
export declare const DEFAULT_CONFIG: VibeNotifyConfig;
|
|
3
3
|
export declare function getConfigDir(): string;
|
|
4
4
|
export declare function getConfigPath(): string;
|
|
5
|
-
export declare function getConfigFilePath(): string;
|
|
6
5
|
export declare function loadConfig(): VibeNotifyConfig;
|
|
7
6
|
export declare function saveConfig(config: VibeNotifyConfig): void;
|
|
8
7
|
export declare function initConfig(): string;
|
package/dist/config.js
CHANGED
|
@@ -3,7 +3,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.DEFAULT_CONFIG = void 0;
|
|
4
4
|
exports.getConfigDir = getConfigDir;
|
|
5
5
|
exports.getConfigPath = getConfigPath;
|
|
6
|
-
exports.getConfigFilePath = getConfigFilePath;
|
|
7
6
|
exports.loadConfig = loadConfig;
|
|
8
7
|
exports.saveConfig = saveConfig;
|
|
9
8
|
exports.initConfig = initConfig;
|
|
@@ -32,9 +31,6 @@ function getConfigPath() {
|
|
|
32
31
|
// Fall back to global config
|
|
33
32
|
return (0, path_1.join)(getConfigDir(), 'config.json');
|
|
34
33
|
}
|
|
35
|
-
function getConfigFilePath() {
|
|
36
|
-
return getConfigPath();
|
|
37
|
-
}
|
|
38
34
|
// ── Load / Save ────────────────────────────────────────────────────────────
|
|
39
35
|
function loadConfig() {
|
|
40
36
|
const configPath = getConfigPath();
|
|
@@ -61,14 +57,9 @@ function saveConfig(config) {
|
|
|
61
57
|
}
|
|
62
58
|
function initConfig() {
|
|
63
59
|
const configPath = getConfigPath();
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
(0, fs_1.mkdirSync)(dir, { recursive: true });
|
|
67
|
-
}
|
|
68
|
-
if ((0, fs_1.existsSync)(configPath)) {
|
|
69
|
-
return configPath; // Already exists, don't overwrite
|
|
60
|
+
if (!(0, fs_1.existsSync)(configPath)) {
|
|
61
|
+
saveConfig({ ...exports.DEFAULT_CONFIG });
|
|
70
62
|
}
|
|
71
|
-
saveConfig({ ...exports.DEFAULT_CONFIG });
|
|
72
63
|
return configPath;
|
|
73
64
|
}
|
|
74
65
|
// ── Helpers ────────────────────────────────────────────────────────────────
|
|
@@ -76,10 +67,7 @@ function mergeConfig(defaults, overrides) {
|
|
|
76
67
|
return {
|
|
77
68
|
...defaults,
|
|
78
69
|
...overrides,
|
|
79
|
-
playback: {
|
|
80
|
-
...defaults.playback,
|
|
81
|
-
...(overrides.playback || {}),
|
|
82
|
-
},
|
|
70
|
+
playback: { ...defaults.playback, ...overrides.playback },
|
|
83
71
|
};
|
|
84
72
|
}
|
|
85
73
|
//# sourceMappingURL=config.js.map
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":";;;AAkBA,oCAEC;AAED,sCAQC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":";;;AAkBA,oCAEC;AAED,sCAQC;AAKD,gCAiBC;AAED,gCASC;AAED,gCAMC;AAvED,2BAAwE;AACxE,2BAA6B;AAC7B,+BAAqC;AAGrC,8EAA8E;AAEjE,QAAA,cAAc,GAAqB;IAC9C,KAAK,EAAE,YAAY;IACnB,UAAU,EAAE,IAAI;IAChB,MAAM,EAAE,GAAG;IACX,QAAQ,EAAE;QACR,MAAM,EAAE,MAAM;KACf;CACF,CAAC;AAEF,8EAA8E;AAE9E,SAAgB,YAAY;IAC1B,OAAO,IAAA,WAAI,EAAC,IAAA,YAAO,GAAE,EAAE,cAAc,CAAC,CAAC;AACzC,CAAC;AAED,SAAgB,aAAa;IAC3B,sCAAsC;IACtC,MAAM,KAAK,GAAG,IAAA,cAAO,EAAC,mBAAmB,CAAC,CAAC;IAC3C,IAAI,IAAA,eAAU,EAAC,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,6BAA6B;IAC7B,OAAO,IAAA,WAAI,EAAC,YAAY,EAAE,EAAE,aAAa,CAAC,CAAC;AAC7C,CAAC;AAGD,8EAA8E;AAE9E,SAAgB,UAAU;IACxB,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;IAEnC,IAAI,CAAC,IAAA,eAAU,EAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,OAAO,EAAE,GAAG,sBAAc,EAAE,CAAC;IAC/B,CAAC;IAED,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAA,iBAAY,EAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC/B,OAAO,WAAW,CAAC,sBAAc,EAAE,MAAM,CAAC,CAAC;IAC7C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CACX,qCAAqC,UAAU,mBAAmB,CACnE,CAAC;QACF,OAAO,EAAE,GAAG,sBAAc,EAAE,CAAC;IAC/B,CAAC;AACH,CAAC;AAED,SAAgB,UAAU,CAAC,MAAwB;IACjD,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;IACnC,MAAM,GAAG,GAAG,YAAY,EAAE,CAAC;IAE3B,IAAI,CAAC,IAAA,eAAU,EAAC,GAAG,CAAC,EAAE,CAAC;QACrB,IAAA,cAAS,EAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtC,CAAC;IAED,IAAA,kBAAa,EAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AACtE,CAAC;AAED,SAAgB,UAAU;IACxB,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;IACnC,IAAI,CAAC,IAAA,eAAU,EAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,UAAU,CAAC,EAAE,GAAG,sBAAc,EAAE,CAAC,CAAC;IACpC,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,8EAA8E;AAE9E,SAAS,WAAW,CAClB,QAA0B,EAC1B,SAAoC;IAEpC,OAAO;QACL,GAAG,QAAQ;QACX,GAAG,SAAS;QACZ,QAAQ,EAAE,EAAE,GAAG,QAAQ,CAAC,QAAQ,EAAE,GAAG,SAAS,CAAC,QAAQ,EAAE;KAC1D,CAAC;AACJ,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
"use strict";
|
|
3
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
4
|
const fs_1 = require("fs");
|
|
5
|
+
const path_1 = require("path");
|
|
5
6
|
const cli_1 = require("./cli");
|
|
6
7
|
const config_1 = require("./config");
|
|
7
8
|
const beep_1 = require("./beep");
|
|
@@ -9,13 +10,10 @@ const player_1 = require("./player");
|
|
|
9
10
|
// Read version from package.json
|
|
10
11
|
let VERSION = '0.1.0';
|
|
11
12
|
try {
|
|
12
|
-
|
|
13
|
-
const pkg = JSON.parse((0, fs_1.readFileSync)(__dirname + '/../package.json', 'utf-8'));
|
|
13
|
+
const pkg = JSON.parse((0, fs_1.readFileSync)((0, path_1.join)(__dirname, '..', 'package.json'), 'utf-8'));
|
|
14
14
|
VERSION = pkg.version || VERSION;
|
|
15
15
|
}
|
|
16
|
-
catch {
|
|
17
|
-
// Fallback version
|
|
18
|
-
}
|
|
16
|
+
catch { /* use default */ }
|
|
19
17
|
async function main() {
|
|
20
18
|
const cli = (0, cli_1.parseArgs)(process.argv.slice(2));
|
|
21
19
|
// ── Info actions (no sound played) ───────────────────────────────────
|
|
@@ -27,7 +25,7 @@ async function main() {
|
|
|
27
25
|
(0, cli_1.listSounds)();
|
|
28
26
|
return;
|
|
29
27
|
case 'config':
|
|
30
|
-
console.log((0, config_1.
|
|
28
|
+
console.log((0, config_1.getConfigPath)());
|
|
31
29
|
return;
|
|
32
30
|
case 'init': {
|
|
33
31
|
const path = (0, config_1.initConfig)();
|
|
@@ -54,7 +52,7 @@ async function main() {
|
|
|
54
52
|
if (soundName === 'custom') {
|
|
55
53
|
if (!config.customFile) {
|
|
56
54
|
console.error('Sound is set to "custom" but no customFile is configured.');
|
|
57
|
-
console.error(`Set "customFile" in ${(0, config_1.
|
|
55
|
+
console.error(`Set "customFile" in ${(0, config_1.getConfigPath)()} to a .wav or .mp3 file path.`);
|
|
58
56
|
process.exit(1);
|
|
59
57
|
}
|
|
60
58
|
if (!(0, fs_1.existsSync)(config.customFile)) {
|
|
@@ -71,30 +69,23 @@ async function main() {
|
|
|
71
69
|
return;
|
|
72
70
|
}
|
|
73
71
|
// ── Built-in pattern playback ────────────────────────────────────────
|
|
72
|
+
const pattern = (0, beep_1.getPatternByName)(soundName);
|
|
74
73
|
const buffer = (0, beep_1.buildPatternBuffer)(soundName, config.volume);
|
|
75
|
-
|
|
76
|
-
|
|
74
|
+
try {
|
|
75
|
+
if (buffer) {
|
|
77
76
|
await (0, player_1.playBuffer)(buffer, config.playback.method);
|
|
78
77
|
}
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
const pattern = (0, beep_1.getPatternByName)(soundName);
|
|
82
|
-
if (pattern) {
|
|
83
|
-
try {
|
|
84
|
-
await (0, player_1.fallbackBeep)(pattern.tones);
|
|
85
|
-
}
|
|
86
|
-
catch {
|
|
87
|
-
// Both methods failed — non-fatal, just warn
|
|
88
|
-
console.error(`Could not play sound: ${err.message}`);
|
|
89
|
-
}
|
|
90
|
-
}
|
|
78
|
+
else if (pattern) {
|
|
79
|
+
await (0, player_1.fallbackBeep)(pattern.tones);
|
|
91
80
|
}
|
|
92
81
|
}
|
|
93
|
-
|
|
94
|
-
//
|
|
95
|
-
const pattern = (0, beep_1.getPatternByName)(soundName);
|
|
82
|
+
catch {
|
|
83
|
+
// WAV failed — try system beep as last resort
|
|
96
84
|
if (pattern) {
|
|
97
|
-
|
|
85
|
+
try {
|
|
86
|
+
await (0, player_1.fallbackBeep)(pattern.tones);
|
|
87
|
+
}
|
|
88
|
+
catch { /* both failed, exit silently */ }
|
|
98
89
|
}
|
|
99
90
|
}
|
|
100
91
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAEA,2BAA8C;AAC9C,+BAAwD;AACxD,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/player.d.ts
CHANGED
|
@@ -1,11 +1,16 @@
|
|
|
1
1
|
import { Tone, PlaybackMethod } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Play a WAV buffer through the system audio output.
|
|
4
|
+
* Writes to a temp file, plays it, then cleans up.
|
|
5
|
+
*/
|
|
2
6
|
/**
|
|
3
7
|
* Play a WAV buffer through the system audio output.
|
|
4
8
|
* Writes to a temp file, plays it, then cleans up.
|
|
5
9
|
*/
|
|
6
10
|
export declare function playBuffer(buffer: Buffer, method?: PlaybackMethod): Promise<void>;
|
|
7
11
|
/**
|
|
8
|
-
* Play a custom audio file
|
|
12
|
+
* Play a custom audio file directly.
|
|
13
|
+
* Supports .wav, .mp3, and any format the system can play.
|
|
9
14
|
*/
|
|
10
15
|
export declare function playFile(filePath: string, method?: PlaybackMethod): Promise<void>;
|
|
11
16
|
/**
|
package/dist/player.js
CHANGED
|
@@ -8,6 +8,10 @@ const fs_1 = require("fs");
|
|
|
8
8
|
const os_1 = require("os");
|
|
9
9
|
const path_1 = require("path");
|
|
10
10
|
// ── Public API ─────────────────────────────────────────────────────────────
|
|
11
|
+
/**
|
|
12
|
+
* Play a WAV buffer through the system audio output.
|
|
13
|
+
* Writes to a temp file, plays it, then cleans up.
|
|
14
|
+
*/
|
|
11
15
|
/**
|
|
12
16
|
* Play a WAV buffer through the system audio output.
|
|
13
17
|
* Writes to a temp file, plays it, then cleans up.
|
|
@@ -16,58 +20,52 @@ async function playBuffer(buffer, method = 'auto') {
|
|
|
16
20
|
const tempFile = (0, path_1.join)((0, os_1.tmpdir)(), `vibe-notify-${Date.now()}.wav`);
|
|
17
21
|
try {
|
|
18
22
|
(0, fs_1.writeFileSync)(tempFile, buffer);
|
|
19
|
-
|
|
20
|
-
if (method === 'powershell' || (method === 'auto' && platform === 'win32')) {
|
|
21
|
-
await playWithPowerShell(tempFile);
|
|
22
|
-
}
|
|
23
|
-
else if (method === 'afplay' || (method === 'auto' && platform === 'darwin')) {
|
|
24
|
-
await playWithAfplay(tempFile);
|
|
25
|
-
}
|
|
26
|
-
else if (method === 'aplay' || (method === 'auto' && platform === 'linux')) {
|
|
27
|
-
await playWithLinux(tempFile);
|
|
28
|
-
}
|
|
29
|
-
else if (method === 'native') {
|
|
30
|
-
// "native" means try whatever the platform supports but don't use powershell/afplay/aplay
|
|
31
|
-
// On Windows this falls through to the beep fallback
|
|
32
|
-
throw new Error('Native method not supported for WAV playback');
|
|
33
|
-
}
|
|
34
|
-
else {
|
|
35
|
-
// Cross-platform fallback: try PowerShell even on non-Windows (WSL, etc.)
|
|
36
|
-
try {
|
|
37
|
-
await playWithPowerShell(tempFile);
|
|
38
|
-
}
|
|
39
|
-
catch {
|
|
40
|
-
await playWithLinux(tempFile);
|
|
41
|
-
}
|
|
42
|
-
}
|
|
23
|
+
await dispatchPlay(tempFile, method);
|
|
43
24
|
}
|
|
44
25
|
finally {
|
|
45
26
|
try {
|
|
46
27
|
(0, fs_1.unlinkSync)(tempFile);
|
|
47
28
|
}
|
|
48
|
-
catch {
|
|
49
|
-
// Temp file cleanup is best-effort
|
|
50
|
-
}
|
|
29
|
+
catch { /* best-effort */ }
|
|
51
30
|
}
|
|
52
31
|
}
|
|
53
32
|
/**
|
|
54
|
-
* Play a custom audio file
|
|
33
|
+
* Play a custom audio file directly.
|
|
34
|
+
* Supports .wav, .mp3, and any format the system can play.
|
|
55
35
|
*/
|
|
56
36
|
async function playFile(filePath, method = 'auto') {
|
|
37
|
+
await dispatchPlay(filePath, method);
|
|
38
|
+
}
|
|
39
|
+
// ── Platform dispatch ─────────────────────────────────────────────────────
|
|
40
|
+
async function dispatchPlay(filePath, method) {
|
|
57
41
|
const platform = process.platform;
|
|
58
|
-
|
|
59
|
-
|
|
42
|
+
const isWav = (0, path_1.extname)(filePath).toLowerCase() === '.wav';
|
|
43
|
+
// Determine the target platform
|
|
44
|
+
const target = resolvePlatform(method, platform);
|
|
45
|
+
if (target === 'win32') {
|
|
46
|
+
await (isWav ? playWithPowerShell(filePath) : playWithWindowsMedia(filePath));
|
|
60
47
|
}
|
|
61
|
-
else if (
|
|
48
|
+
else if (target === 'darwin') {
|
|
62
49
|
await playWithAfplay(filePath);
|
|
63
50
|
}
|
|
64
|
-
else if (
|
|
51
|
+
else if (target === 'linux') {
|
|
65
52
|
await playWithLinux(filePath);
|
|
66
53
|
}
|
|
67
54
|
else {
|
|
68
|
-
|
|
55
|
+
throw new Error(`Unsupported platform: ${target}`);
|
|
69
56
|
}
|
|
70
57
|
}
|
|
58
|
+
function resolvePlatform(method, platform) {
|
|
59
|
+
if (method === 'powershell')
|
|
60
|
+
return 'win32';
|
|
61
|
+
if (method === 'afplay')
|
|
62
|
+
return 'darwin';
|
|
63
|
+
if (method === 'aplay')
|
|
64
|
+
return 'linux';
|
|
65
|
+
if (method === 'auto')
|
|
66
|
+
return platform;
|
|
67
|
+
return platform; // native or unknown → use current platform
|
|
68
|
+
}
|
|
71
69
|
/**
|
|
72
70
|
* Fallback: play tones using system beep (no WAV generation needed).
|
|
73
71
|
* Uses [System.Console]::Beep on Windows, terminal BEL on Unix.
|
|
@@ -103,6 +101,59 @@ async function playWithPowerShell(filePath) {
|
|
|
103
101
|
`$p = New-Object System.Media.SoundPlayer('${escaped}'); $p.PlaySync()`,
|
|
104
102
|
]);
|
|
105
103
|
}
|
|
104
|
+
/**
|
|
105
|
+
* Play any audio format (mp3, wma, etc.) using ffplay.
|
|
106
|
+
* Requires ffmpeg: `winget install ffmpeg`
|
|
107
|
+
* Searches common install locations automatically.
|
|
108
|
+
*/
|
|
109
|
+
async function playWithWindowsMedia(filePath) {
|
|
110
|
+
const ffplayPath = findFfplay();
|
|
111
|
+
if (!ffplayPath) {
|
|
112
|
+
throw new Error('ffplay not found. Install ffmpeg to play .mp3 files:\n' +
|
|
113
|
+
' winget install ffmpeg\n' +
|
|
114
|
+
'Or use a .wav file instead (plays natively).');
|
|
115
|
+
}
|
|
116
|
+
await execPromise(ffplayPath, ['-nodisp', '-autoexit', '-loglevel', 'quiet', filePath]);
|
|
117
|
+
}
|
|
118
|
+
function findFfplay() {
|
|
119
|
+
// Check common locations
|
|
120
|
+
const candidates = [
|
|
121
|
+
'ffplay', // In PATH
|
|
122
|
+
...scanWingetFfmpeg(),
|
|
123
|
+
// Common manual install locations
|
|
124
|
+
'C:\\ffmpeg\\bin\\ffplay.exe',
|
|
125
|
+
'C:\\Program Files\\ffmpeg\\bin\\ffplay.exe',
|
|
126
|
+
];
|
|
127
|
+
for (const candidate of candidates) {
|
|
128
|
+
// For bare command name, just trust PATH (spawn will find it)
|
|
129
|
+
if (candidate === 'ffplay') {
|
|
130
|
+
try {
|
|
131
|
+
require('child_process').execSync('where ffplay', { stdio: 'ignore' });
|
|
132
|
+
return 'ffplay';
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
continue;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
if ((0, fs_1.existsSync)(candidate))
|
|
139
|
+
return candidate;
|
|
140
|
+
}
|
|
141
|
+
return null;
|
|
142
|
+
}
|
|
143
|
+
function scanWingetFfmpeg() {
|
|
144
|
+
try {
|
|
145
|
+
const wingetBase = process.env.LOCALAPPDATA + '\\Microsoft\\WinGet\\Packages\\Gyan.FFmpeg_Microsoft.Winget.Source_8wekyb3d8bbwe';
|
|
146
|
+
if (!(0, fs_1.existsSync)(wingetBase))
|
|
147
|
+
return [];
|
|
148
|
+
const dirs = (0, fs_1.readdirSync)(wingetBase).filter((d) => d.startsWith('ffmpeg-'));
|
|
149
|
+
// Use most recent version first
|
|
150
|
+
dirs.sort().reverse();
|
|
151
|
+
return dirs.map((d) => wingetBase + '\\' + d + '\\bin\\ffplay.exe');
|
|
152
|
+
}
|
|
153
|
+
catch {
|
|
154
|
+
return [];
|
|
155
|
+
}
|
|
156
|
+
}
|
|
106
157
|
async function playWithAfplay(filePath) {
|
|
107
158
|
await execPromise('afplay', [filePath]);
|
|
108
159
|
}
|
package/dist/player.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"player.js","sourceRoot":"","sources":["../src/player.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"player.js","sourceRoot":"","sources":["../src/player.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "vibe-notify",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"description": "Notification sounds for Claude Code completions — customizable beeps when your session finishes",
|
|
5
5
|
"keywords": ["claude", "claude-code", "notification", "sound", "beep", "alert"],
|
|
6
6
|
"license": "MIT",
|
|
@@ -14,6 +14,8 @@
|
|
|
14
14
|
"files": [
|
|
15
15
|
"dist/",
|
|
16
16
|
"README.md",
|
|
17
|
+
"README.zh-CN.md",
|
|
18
|
+
"README.ja.md",
|
|
17
19
|
"LICENSE"
|
|
18
20
|
],
|
|
19
21
|
"scripts": {
|