botmux 2.68.1 → 2.70.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/dist/adapters/backend/sandbox.d.ts +7 -0
- package/dist/adapters/backend/sandbox.d.ts.map +1 -1
- package/dist/adapters/backend/sandbox.js +85 -9
- package/dist/adapters/backend/sandbox.js.map +1 -1
- package/dist/adapters/cli/antigravity.d.ts.map +1 -1
- package/dist/adapters/cli/antigravity.js +1 -0
- package/dist/adapters/cli/antigravity.js.map +1 -1
- package/dist/adapters/cli/claude-code.d.ts +2 -0
- package/dist/adapters/cli/claude-code.d.ts.map +1 -1
- package/dist/adapters/cli/claude-code.js +2 -0
- package/dist/adapters/cli/claude-code.js.map +1 -1
- package/dist/adapters/cli/coco.d.ts.map +1 -1
- package/dist/adapters/cli/coco.js +1 -0
- package/dist/adapters/cli/coco.js.map +1 -1
- package/dist/adapters/cli/codex-app.d.ts.map +1 -1
- package/dist/adapters/cli/codex-app.js +1 -0
- package/dist/adapters/cli/codex-app.js.map +1 -1
- package/dist/adapters/cli/codex.d.ts.map +1 -1
- package/dist/adapters/cli/codex.js +1 -0
- package/dist/adapters/cli/codex.js.map +1 -1
- package/dist/adapters/cli/gemini.d.ts.map +1 -1
- package/dist/adapters/cli/gemini.js +1 -0
- package/dist/adapters/cli/gemini.js.map +1 -1
- package/dist/adapters/cli/mtr.d.ts.map +1 -1
- package/dist/adapters/cli/mtr.js +1 -0
- package/dist/adapters/cli/mtr.js.map +1 -1
- package/dist/adapters/cli/oh-my-pi.d.ts.map +1 -1
- package/dist/adapters/cli/oh-my-pi.js +1 -0
- package/dist/adapters/cli/oh-my-pi.js.map +1 -1
- package/dist/adapters/cli/opencode.d.ts.map +1 -1
- package/dist/adapters/cli/opencode.js +1 -0
- package/dist/adapters/cli/opencode.js.map +1 -1
- package/dist/adapters/cli/pi.d.ts.map +1 -1
- package/dist/adapters/cli/pi.js +1 -0
- package/dist/adapters/cli/pi.js.map +1 -1
- package/dist/adapters/cli/seed.d.ts.map +1 -1
- package/dist/adapters/cli/seed.js +1 -0
- package/dist/adapters/cli/seed.js.map +1 -1
- package/dist/adapters/cli/traex.d.ts.map +1 -1
- package/dist/adapters/cli/traex.js +1 -0
- package/dist/adapters/cli/traex.js.map +1 -1
- package/dist/adapters/cli/types.d.ts +9 -0
- package/dist/adapters/cli/types.d.ts.map +1 -1
- package/dist/core/command-handler.d.ts.map +1 -1
- package/dist/core/command-handler.js +113 -0
- package/dist/core/command-handler.js.map +1 -1
- package/dist/core/session-discovery.d.ts.map +1 -1
- package/dist/core/session-discovery.js +13 -1
- package/dist/core/session-discovery.js.map +1 -1
- package/dist/core/types.d.ts +1 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js.map +1 -1
- package/dist/core/worker-pool.d.ts.map +1 -1
- package/dist/core/worker-pool.js +3 -1
- package/dist/core/worker-pool.js.map +1 -1
- package/dist/core/zellij-adopt-discovery.d.ts.map +1 -1
- package/dist/core/zellij-adopt-discovery.js +5 -0
- package/dist/core/zellij-adopt-discovery.js.map +1 -1
- package/dist/i18n/en.d.ts.map +1 -1
- package/dist/i18n/en.js +11 -1
- package/dist/i18n/en.js.map +1 -1
- package/dist/i18n/zh.d.ts.map +1 -1
- package/dist/i18n/zh.js +11 -1
- package/dist/i18n/zh.js.map +1 -1
- package/dist/im/lark/card-builder.d.ts.map +1 -1
- package/dist/im/lark/card-builder.js +20 -0
- package/dist/im/lark/card-builder.js.map +1 -1
- package/dist/im/lark/card-handler.d.ts.map +1 -1
- package/dist/im/lark/card-handler.js +161 -68
- package/dist/im/lark/card-handler.js.map +1 -1
- package/dist/services/git-worktree.d.ts +24 -0
- package/dist/services/git-worktree.d.ts.map +1 -0
- package/dist/services/git-worktree.js +120 -0
- package/dist/services/git-worktree.js.map +1 -0
- package/dist/worker.js +1 -0
- package/dist/worker.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Git worktree creation for repo selection — "pick a repo, open it as a
|
|
3
|
+
* fresh worktree". Creates a linked worktree next to the repo, branched off
|
|
4
|
+
* the remote default branch (origin/master / origin/main), so each session
|
|
5
|
+
* can get an isolated checkout without touching the main one.
|
|
6
|
+
*
|
|
7
|
+
* Async (execFile) on purpose: a `git fetch` can take many seconds and this
|
|
8
|
+
* runs inside the daemon's event loop.
|
|
9
|
+
*/
|
|
10
|
+
import { execFile } from 'node:child_process';
|
|
11
|
+
import { promisify } from 'node:util';
|
|
12
|
+
import { existsSync } from 'node:fs';
|
|
13
|
+
import { basename, dirname, join, resolve } from 'node:path';
|
|
14
|
+
import { logger } from '../utils/logger.js';
|
|
15
|
+
const execFileP = promisify(execFile);
|
|
16
|
+
async function git(args, cwd, timeoutMs = 10_000) {
|
|
17
|
+
try {
|
|
18
|
+
const { stdout } = await execFileP('git', args, { cwd, timeout: timeoutMs, encoding: 'utf-8' });
|
|
19
|
+
return stdout.trim();
|
|
20
|
+
}
|
|
21
|
+
catch (e) {
|
|
22
|
+
const stderr = typeof e?.stderr === 'string' ? e.stderr.trim() : '';
|
|
23
|
+
throw new Error(stderr || e?.message || String(e));
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
async function tryGit(args, cwd, timeoutMs = 10_000) {
|
|
27
|
+
try {
|
|
28
|
+
return await git(args, cwd, timeoutMs);
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
async function localBranchExists(repo, branch) {
|
|
35
|
+
return (await tryGit(['rev-parse', '--verify', '--quiet', `refs/heads/${branch}`], repo)) !== null;
|
|
36
|
+
}
|
|
37
|
+
/** The remote default branch (`origin/master` / `origin/main`), or `HEAD`
|
|
38
|
+
* for repos without a usable remote. `origin/HEAD` is only set on clone, so
|
|
39
|
+
* fall through to probing the usual names when it's missing. */
|
|
40
|
+
async function resolveBaseRef(repo) {
|
|
41
|
+
const originHead = await tryGit(['symbolic-ref', '--short', 'refs/remotes/origin/HEAD'], repo);
|
|
42
|
+
if (originHead)
|
|
43
|
+
return originHead;
|
|
44
|
+
for (const cand of ['origin/master', 'origin/main']) {
|
|
45
|
+
if ((await tryGit(['rev-parse', '--verify', '--quiet', cand], repo)) !== null)
|
|
46
|
+
return cand;
|
|
47
|
+
}
|
|
48
|
+
return 'HEAD';
|
|
49
|
+
}
|
|
50
|
+
/** Branch names may contain `/` etc. — flatten to a filesystem-safe suffix. */
|
|
51
|
+
function dirSuffixForBranch(branch) {
|
|
52
|
+
return branch.replace(/[^A-Za-z0-9._-]+/g, '-').replace(/^-+|-+$/g, '');
|
|
53
|
+
}
|
|
54
|
+
/** A linked worktree resolves to its repo's MAIN checkout (entry 0 of
|
|
55
|
+
* `git worktree list`), so sibling placement and `<repo>-…` naming follow
|
|
56
|
+
* the main repo no matter which checkout the caller picked. */
|
|
57
|
+
async function resolveMainWorktree(dir) {
|
|
58
|
+
const out = await tryGit(['worktree', 'list', '--porcelain'], dir);
|
|
59
|
+
const first = out?.split('\n').find(l => l.startsWith('worktree '));
|
|
60
|
+
return first ? first.slice('worktree '.length) : dir;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Create a linked worktree for `repoPath`, as a sibling of the repo's MAIN
|
|
64
|
+
* checkout (a linked-worktree input is resolved back to the main one first).
|
|
65
|
+
*
|
|
66
|
+
* - No `branch` given → auto-pick `wt/N` (first free N), dir `<repo>-wt-N`.
|
|
67
|
+
* - `branch` given and exists locally → check it out into the worktree.
|
|
68
|
+
* - `branch` given and new → create it from the remote default branch.
|
|
69
|
+
*
|
|
70
|
+
* The base ref is fetched first so the worktree starts from the remote's
|
|
71
|
+
* latest state; fetch failure degrades to the local (possibly stale) ref.
|
|
72
|
+
*/
|
|
73
|
+
export async function createRepoWorktree(repoPath, opts = {}) {
|
|
74
|
+
const startDir = resolve(repoPath);
|
|
75
|
+
await git(['rev-parse', '--git-dir'], startDir); // not a repo → throw early
|
|
76
|
+
const repo = await resolveMainWorktree(startDir);
|
|
77
|
+
const baseRef = await resolveBaseRef(repo);
|
|
78
|
+
if (baseRef.startsWith('origin/')) {
|
|
79
|
+
const remoteBranch = baseRef.slice('origin/'.length);
|
|
80
|
+
try {
|
|
81
|
+
await git(['fetch', 'origin', remoteBranch], repo, 30_000);
|
|
82
|
+
}
|
|
83
|
+
catch (e) {
|
|
84
|
+
logger.warn(`[git-worktree] fetch origin ${remoteBranch} failed, using local ref: ${e instanceof Error ? e.message : e}`);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
const parent = dirname(repo);
|
|
88
|
+
const repoBase = basename(repo);
|
|
89
|
+
let branch = opts.branch?.trim() ?? '';
|
|
90
|
+
let wtPath;
|
|
91
|
+
if (branch) {
|
|
92
|
+
wtPath = join(parent, `${repoBase}-${dirSuffixForBranch(branch)}`);
|
|
93
|
+
if (existsSync(wtPath))
|
|
94
|
+
throw new Error(`worktree target already exists: ${wtPath}`);
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
let n = 1;
|
|
98
|
+
for (;; n++) {
|
|
99
|
+
if (n > 1000)
|
|
100
|
+
throw new Error('no free wt/N slot under 1000');
|
|
101
|
+
const candPath = join(parent, `${repoBase}-wt-${n}`);
|
|
102
|
+
if (existsSync(candPath) || (await localBranchExists(repo, `wt/${n}`)))
|
|
103
|
+
continue;
|
|
104
|
+
branch = `wt/${n}`;
|
|
105
|
+
wtPath = candPath;
|
|
106
|
+
break;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
if (await localBranchExists(repo, branch)) {
|
|
110
|
+
// Existing branch: check it out as-is (git rejects it if the branch is
|
|
111
|
+
// already checked out in another worktree — surface that error verbatim).
|
|
112
|
+
await git(['worktree', 'add', wtPath, branch], repo, 60_000);
|
|
113
|
+
logger.info(`[git-worktree] created ${wtPath} on existing branch ${branch}`);
|
|
114
|
+
return { path: wtPath, branch, baseRef: branch };
|
|
115
|
+
}
|
|
116
|
+
await git(['worktree', 'add', '-b', branch, wtPath, baseRef], repo, 60_000);
|
|
117
|
+
logger.info(`[git-worktree] created ${wtPath} (branch ${branch} from ${baseRef})`);
|
|
118
|
+
return { path: wtPath, branch, baseRef };
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=git-worktree.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-worktree.js","sourceRoot":"","sources":["../../src/services/git-worktree.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7D,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,MAAM,SAAS,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAYtC,KAAK,UAAU,GAAG,CAAC,IAAc,EAAE,GAAW,EAAE,SAAS,GAAG,MAAM;IAChE,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;QAChG,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;IACvB,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QAChB,MAAM,MAAM,GAAG,OAAO,CAAC,EAAE,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACpE,MAAM,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,OAAO,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IACrD,CAAC;AACH,CAAC;AAED,KAAK,UAAU,MAAM,CAAC,IAAc,EAAE,GAAW,EAAE,SAAS,GAAG,MAAM;IACnE,IAAI,CAAC;QACH,OAAO,MAAM,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;IACzC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,IAAY,EAAE,MAAc;IAC3D,OAAO,CAAC,MAAM,MAAM,CAAC,CAAC,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,cAAc,MAAM,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC;AACrG,CAAC;AAED;;iEAEiE;AACjE,KAAK,UAAU,cAAc,CAAC,IAAY;IACxC,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,CAAC,cAAc,EAAE,SAAS,EAAE,0BAA0B,CAAC,EAAE,IAAI,CAAC,CAAC;IAC/F,IAAI,UAAU;QAAE,OAAO,UAAU,CAAC;IAClC,KAAK,MAAM,IAAI,IAAI,CAAC,eAAe,EAAE,aAAa,CAAC,EAAE,CAAC;QACpD,IAAI,CAAC,MAAM,MAAM,CAAC,CAAC,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;IAC7F,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,+EAA+E;AAC/E,SAAS,kBAAkB,CAAC,MAAc;IACxC,OAAO,MAAM,CAAC,OAAO,CAAC,mBAAmB,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;AAC1E,CAAC;AAED;;gEAEgE;AAChE,KAAK,UAAU,mBAAmB,CAAC,GAAW;IAC5C,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,CAAC,UAAU,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,GAAG,CAAC,CAAC;IACnE,MAAM,KAAK,GAAG,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC;IACpE,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;AACvD,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,QAAgB,EAChB,OAA4B,EAAE;IAE9B,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IACnC,MAAM,GAAG,CAAC,CAAC,WAAW,EAAE,WAAW,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,2BAA2B;IAC5E,MAAM,IAAI,GAAG,MAAM,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IAEjD,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,CAAC;IAC3C,IAAI,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAClC,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACrD,IAAI,CAAC;YACH,MAAM,GAAG,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,YAAY,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QAC7D,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,CAAC,IAAI,CAAC,+BAA+B,YAAY,6BAA6B,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC5H,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAEhC,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACvC,IAAI,MAAc,CAAC;IACnB,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,QAAQ,IAAI,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACnE,IAAI,UAAU,CAAC,MAAM,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,MAAM,EAAE,CAAC,CAAC;IACvF,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,QAAQ,CAAC,EAAE,EAAE,CAAC;YACZ,IAAI,CAAC,GAAG,IAAI;gBAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;YAC9D,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,QAAQ,OAAO,CAAC,EAAE,CAAC,CAAC;YACrD,IAAI,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,iBAAiB,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;gBAAE,SAAS;YACjF,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;YACnB,MAAM,GAAG,QAAQ,CAAC;YAClB,MAAM;QACR,CAAC;IACH,CAAC;IAED,IAAI,MAAM,iBAAiB,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC;QAC1C,uEAAuE;QACvE,0EAA0E;QAC1E,MAAM,GAAG,CAAC,CAAC,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QAC7D,MAAM,CAAC,IAAI,CAAC,0BAA0B,MAAM,uBAAuB,MAAM,EAAE,CAAC,CAAC;QAC7E,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IACnD,CAAC;IAED,MAAM,GAAG,CAAC,CAAC,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IAC5E,MAAM,CAAC,IAAI,CAAC,0BAA0B,MAAM,YAAY,MAAM,SAAS,OAAO,GAAG,CAAC,CAAC;IACnF,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;AAC3C,CAAC"}
|