worktree-bay 2.3.3 → 2.3.4

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.
@@ -1,17 +1,17 @@
1
1
  import { scanOccupancy, readLabels } from '../slots.js';
2
2
  import { portOf } from '../ports.js';
3
3
  import { log } from '../util/log.js';
4
- import { recordedFor, pidAlive } from '../proc.js';
4
+ import { recordedFor, pidOnPort } from '../proc.js';
5
5
  import { t } from '../i18n.js';
6
- // worktree 是否有存活的托管 dev server(用于 ls 标注 ▸run)
7
- function running(cfg, dir) { const r = recordedFor(cfg.workspaceRoot, dir); return !!r && pidAlive(r.pid); }
6
+ // 该服务的约定端口是否有进程在监听(按端口判,不受 shell/pnpm 让记录 pid 漂移的影响)
7
+ function running(cfg, dir, port) { return !!recordedFor(cfg.workspaceRoot, dir) && !!pidOnPort(port); }
8
8
  export function renderSlots(cfg) {
9
9
  const occ = scanOccupancy(cfg);
10
10
  const labels = readLabels(cfg);
11
11
  const slots = new Set([...occ.keys(), ...Object.keys(labels).map(Number)]);
12
12
  const lines = [];
13
13
  for (const n of [...slots].sort((a, b) => a - b)) {
14
- const svc = (occ.get(n) ?? []).map((o) => `${o.service}@${portOf(cfg.services[o.service].port, n)}${running(cfg, o.dir) ? ' ▸run' : ''}`);
14
+ const svc = (occ.get(n) ?? []).map((o) => { const p = portOf(cfg.services[o.service].port, n); return `${o.service}@${p}${running(cfg, o.dir, p) ? ' ▸run' : ''}`; });
15
15
  lines.push(`slot ${n} ${labels[String(n)] ?? t('(未命名)', '(unnamed)')} [${svc.join(', ') || t('无 worktree', 'no worktree')}]`);
16
16
  }
17
17
  return lines.join('\n') || t('(无槽位在用)', '(no slots in use)');
@@ -22,7 +22,7 @@ export function slotsData(cfg) {
22
22
  const slots = new Set([...occ.keys(), ...Object.keys(labels).map(Number)]);
23
23
  return [...slots].sort((a, b) => a - b).map((n) => ({
24
24
  slot: n, feature: labels[String(n)] ?? null,
25
- services: (occ.get(n) ?? []).map((o) => ({ service: o.service, port: portOf(cfg.services[o.service].port, n), dir: o.dir, running: running(cfg, o.dir) })),
25
+ services: (occ.get(n) ?? []).map((o) => { const p = portOf(cfg.services[o.service].port, n); return { service: o.service, port: p, dir: o.dir, running: running(cfg, o.dir, p) }; }),
26
26
  }));
27
27
  }
28
28
  export function lsCommand(cfg, json = false) { log(json ? JSON.stringify(slotsData(cfg), null, 2) : renderSlots(cfg)); }
package/dist/engine.js CHANGED
@@ -88,8 +88,9 @@ export async function ensureStarted(ctx) {
88
88
  }
89
89
  const cmd = renderTemplate(sp.start, vars);
90
90
  const r = startDetached(ws, dir, service, slug, port, cmd);
91
- // 等它在【约定端口】上监听(最多 ~12s)。起来后按端口查出真实 pid 回填(shell/pnpm 会让记录 pid 漂移)。
92
- const up = await waitForListen(port, 12000);
91
+ // 等它在【约定端口】上监听(最多 ~25s,给 vite 冷启动 + 偶发 restart 留足时间)。
92
+ // 起来后按端口查出真实 pid 回填(shell/pnpm 会让记录 pid 漂移)。
93
+ const up = await waitForListen(port, 25000);
93
94
  if (up) {
94
95
  const real = pidOnPort(port);
95
96
  if (real && real > 0)
@@ -97,8 +98,9 @@ export async function ensureStarted(ctx) {
97
98
  log(t(` ▸ 已后台启动 ${service} dev server(pid ${real || r.pid},端口 ${port}) 日志: ${r.log}`, ` ▸ started ${service} dev server in background (pid ${real || r.pid}, port ${port}) log: ${r.log}`));
98
99
  }
99
100
  else {
101
+ // 超时不等于失败:dev server 可能仍在启动/重启。给中性提示 + 日志末尾,让用户稍后 ls 复查或排查。
100
102
  const tail = readLogTail(r.log);
101
- warn(t(` ${service} dev server 未在约定端口 ${port} 上监听(12s 内)。多半是 start 命令不对,或端口被占后退避了——建议给 vite --strictPort。\n 命令: ${cmd}\n 手动排查: cd ${dir} && ${cmd}\n 日志(${r.log}):\n${tail || '(空)'}`, ` ${service} dev server is not listening on the expected port ${port} (within 12s). The start command may be wrong, or it fell back to another port add --strictPort for vite.\n command: ${cmd}\n reproduce: cd ${dir} && ${cmd}\n log (${r.log}):\n${tail || '(empty)'}`));
103
+ warn(t(` ${service} dev server 已在后台启动,但 25s 内端口 ${port} 还没就绪——可能仍在启动/重启。\n 稍后用 \`worktree-bay ls\` 看是否 ▸run;若起不来,多半是 start 命令不对或端口被占退避(vite 建议加 --strictPort)。\n 命令: ${cmd} 日志: ${r.log}\n ${tail ? '日志末尾:\n' + tail : ''}`, ` ${service} dev server launched, but port ${port} isn't ready within 25s it may still be starting/restarting.\n Check \`worktree-bay ls\` shortly for ▸run; if it never comes up, the start command is likely wrong or it fell back to another port (add --strictPort for vite).\n command: ${cmd} log: ${r.log}\n ${tail ? 'log tail:\n' + tail : ''}`));
102
104
  }
103
105
  }
104
106
  // 轮询直到约定端口被监听(true),或超时(false)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "worktree-bay",
3
- "version": "2.3.3",
3
+ "version": "2.3.4",
4
4
  "description": "Per-feature git worktree + port slots for parallel multi-service development: auto deps, env wiring, frontend-to-backend, merge-aware reclaim, plus an MCP server for AI agents.",
5
5
  "keywords": [
6
6
  "git",