vibe-pomo 0.2.2 → 0.2.3

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.md CHANGED
@@ -27,7 +27,7 @@ Every session is logged — what the agent did, what you did — giving you a cl
27
27
 
28
28
  **Prerequisites:** Node.js 20+, Claude Code CLI
29
29
 
30
- **Recommended:** run Claude Code inside `tmux`. That is the primary supported interactive timer experience: vibe-pomo uses a `tmux` popup to cover the current pane during a Pomodoro. Outside `tmux`, sessions still run, but timer UI falls back to headless mode.
30
+ **Recommended:** run Claude Code inside `tmux`. That is the primary supported interactive timer experience: vibe-pomo uses a `tmux` popup to cover the current pane during a Pomodoro. kitty can also support an overlay-style timer; terminals that cannot provide a comparable cover effect fall back to headless mode.
31
31
 
32
32
  ```bash
33
33
  npm i -g vibe-pomo
@@ -84,7 +84,7 @@ pomodoro start 25m Refactor the auth module
84
84
  pomodoro start Refactor the auth module # uses default duration
85
85
  ```
86
86
 
87
- If Claude Code is running inside `tmux`, vibe-pomo opens a popup over the current pane so the ongoing task stays covered until you end or break the session. Outside `tmux`, it stays headless: the session still runs, but visualization remains in the daemon dashboard and stats view instead of opening another terminal window.
87
+ If Claude Code is running inside `tmux`, vibe-pomo opens a popup over the current pane so the ongoing task stays covered until you end or break the session. In kitty, it will try to use an overlay window for the same purpose. Terminals that cannot provide a comparable cover effect stay headless: the session still runs, but visualization remains in the daemon dashboard and stats view instead of opening another terminal window.
88
88
 
89
89
  ```
90
90
  🍅 Pomodoro
@@ -167,7 +167,7 @@ Recent Sessions
167
167
  |--------|--------|-------------|
168
168
  | `defaultDurationMs` | ms | Default session duration (25 min = `1500000`) |
169
169
  | `decisionStrategy` | `"wait"` / `"break"` | When the agent is blocked: wait silently until you end the session (default), or end immediately |
170
- | `terminalEmulator` | `"auto"` / `"tmux"` / `"none"` | Timer surface. `"tmux"` opens a popup overlay, `"none"` forces headless mode, and `"auto"` uses the popup only when `$TMUX` is set. |
170
+ | `terminalEmulator` | `"auto"` / `"tmux"` / `"kitty"` / `"none"` | Timer surface. `"tmux"` opens a popup overlay, `"kitty"` tries a kitty overlay window, `"none"` forces headless mode, and `"auto"` prefers supported cover-style overlays before falling back to headless mode. |
171
171
  | `soundOnOvertime` | bool | Play a sound when the timer hits zero |
172
172
 
173
173
  ---
package/README.zh.md CHANGED
@@ -84,7 +84,7 @@ What did you do during this session?
84
84
 
85
85
  **前置条件:** Node.js 20+、Claude Code CLI
86
86
 
87
- **推荐条件:** 请在 `tmux` 里运行 Claude Code。这是 vibe-pomo 当前主推的交互方式:番茄钟会通过 `tmux popup` 覆盖当前 pane。非 `tmux` 环境下,会话仍然会正常运行,但计时器 UI 会退化为无界面模式。
87
+ **推荐条件:** 请在 `tmux` 里运行 Claude Code。这是 vibe-pomo 当前主推的交互方式:番茄钟会通过 `tmux popup` 覆盖当前 pane。kitty 也可能支持类似的覆盖式计时器;其他无法提供同等级遮罩效果的终端会自动退化为无界面模式。
88
88
 
89
89
  ```bash
90
90
  npm install -g vibe-pomo
@@ -124,7 +124,7 @@ pomodoro start 25m Refactor the auth module
124
124
  pomodoro start Refactor the auth module # 使用默认时长
125
125
  ```
126
126
 
127
- 如果 Claude Code 跑在 `tmux` 里,vibe-pomo 会在当前 pane 上弹出一个覆盖式 popup,把正在进行的任务界面盖住,直到你结束或中断番茄钟。非 `tmux` 环境下则保持无界面模式:会话照常运行,但只通过 daemon 仪表板和统计视图展示,不再额外弹出终端窗口。
127
+ 如果 Claude Code 跑在 `tmux` 里,vibe-pomo 会在当前 pane 上弹出一个覆盖式 popup,把正在进行的任务界面盖住,直到你结束或中断番茄钟。在 kitty 里,它会尝试使用 overlay 窗口实现同样的遮罩效果。其他无法提供类似覆盖体验的终端则保持无界面模式:会话照常运行,但只通过 daemon 仪表板和统计视图展示,不再额外弹出终端窗口。
128
128
 
129
129
  ### 3. 会话进行中
130
130
 
@@ -181,7 +181,7 @@ Recent Sessions
181
181
  |------|------|------|
182
182
  | `defaultDurationMs` | 毫秒数 | 默认会话时长(25 分钟 = `1500000`) |
183
183
  | `decisionStrategy` | `"wait"` / `"break"` | 代理被阻塞时的策略:静默等待直到你结束会话(默认),或立即结束 |
184
- | `terminalEmulator` | `"auto"` / `"tmux"` / `"none"` | 计时器展示方式。`"tmux"` 打开覆盖式 popup,`"none"` 强制无界面模式,`"auto"` 仅在检测到 `$TMUX` 时使用 popup |
184
+ | `terminalEmulator` | `"auto"` / `"tmux"` / `"kitty"` / `"none"` | 计时器展示方式。`"tmux"` 打开覆盖式 popup,`"kitty"` 尝试使用 kitty overlay,`"none"` 强制无界面模式,`"auto"` 会优先尝试支持遮罩效果的终端,否则退化为无界面模式 |
185
185
  | `soundOnOvertime` | 布尔值 | 计时归零时播放提示音 |
186
186
 
187
187
  ---
package/bin/pomodoro.mjs CHANGED
@@ -184,7 +184,7 @@ async function cmdStopDaemon() {
184
184
 
185
185
  async function launchTerminal({ tsx, entryFile, sessionId, termPref }) {
186
186
  const mode = resolveTimerMode(termPref)
187
- if (mode !== 'tmux-popup') return false
187
+ if (mode === 'none') return false
188
188
  return trySpawn(mode, tsx, entryFile, sessionId)
189
189
  }
190
190
 
@@ -194,12 +194,16 @@ function resolveTimerMode(termPref) {
194
194
  if ((pref === 'auto' || pref === 'tmux' || pref === 'tmux-popup') && process.env.TMUX) {
195
195
  return 'tmux-popup'
196
196
  }
197
+ if ((pref === 'auto' || pref === 'kitty' || pref === 'kitty-overlay') && process.env.KITTY_WINDOW_ID) {
198
+ return 'kitty-overlay'
199
+ }
197
200
  return 'none'
198
201
  }
199
202
 
200
203
  function buildCmd(term, tsx, entryFile, sessionId) {
201
204
  switch (term) {
202
205
  case 'tmux-popup': return buildTmuxPopupCmd(tsx, entryFile, sessionId)
206
+ case 'kitty-overlay': return buildKittyOverlayCmd(tsx, entryFile, sessionId)
203
207
  default: return null
204
208
  }
205
209
  }
@@ -256,6 +260,22 @@ function buildTmuxPopupCmd(tsx, entryFile, sessionId) {
256
260
  ]
257
261
  }
258
262
 
263
+ function buildKittyOverlayCmd(tsx, entryFile, sessionId) {
264
+ return [
265
+ 'kitty',
266
+ '@',
267
+ 'launch',
268
+ '--type=overlay-main',
269
+ '--cwd=current',
270
+ '--title=Pomodoro',
271
+ '--env=POMODORO_MODAL=1',
272
+ process.execPath,
273
+ tsx,
274
+ entryFile,
275
+ sessionId,
276
+ ]
277
+ }
278
+
259
279
  function shellQuote(value) {
260
280
  return `'${String(value).replace(/'/g, `'\\''`)}'`
261
281
  }
package/install.mjs CHANGED
@@ -120,7 +120,7 @@ The user has started a Pomodoro focus session and **will not be checking the scr
120
120
  - Focus only on what is **unambiguously clear** from the task description
121
121
  - If you encounter something that requires a user decision, **stop and record it** in \`.claude/pomodoro-pending.md\` — do NOT make assumptions or proceed on the user's behalf
122
122
  - Do not send notifications or ask questions — the user is in focus mode
123
- - If a timer UI is available, it may appear as a tmux popup. If not, continue headlessly — do not mention missing timer UI to the user unless they ask
123
+ - If a timer UI is available, it may appear as a tmux popup or a kitty overlay. If not, continue headlessly — do not mention missing timer UI to the user unless they ask
124
124
  - When you have done all you can, write a summary to \`.claude/pomodoro-summary.md\`
125
125
  - Then wait quietly — the Pomodoro hook will manage the session lifecycle
126
126
  `
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vibe-pomo",
3
- "version": "0.2.2",
3
+ "version": "0.2.3",
4
4
  "description": "You and your agent, both in flow. A Pomodoro timer for Claude Code that keeps agents working autonomously while you stay deep in focus — uninterrupted.",
5
5
  "type": "module",
6
6
  "bin": {