@mcuste/pi-herdr-worktree 0.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.
- package/LICENSE +21 -0
- package/README.md +137 -0
- package/dist/argument.d.ts +54 -0
- package/dist/argument.d.ts.map +1 -0
- package/dist/argument.js +101 -0
- package/dist/argument.js.map +1 -0
- package/dist/capability.d.ts +30 -0
- package/dist/capability.d.ts.map +1 -0
- package/dist/capability.js +154 -0
- package/dist/capability.js.map +1 -0
- package/dist/guidance.d.ts +22 -0
- package/dist/guidance.d.ts.map +1 -0
- package/dist/guidance.js +20 -0
- package/dist/guidance.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/process.d.ts +33 -0
- package/dist/process.d.ts.map +1 -0
- package/dist/process.js +91 -0
- package/dist/process.js.map +1 -0
- package/dist/response.d.ts +52 -0
- package/dist/response.d.ts.map +1 -0
- package/dist/response.js +129 -0
- package/dist/response.js.map +1 -0
- package/dist/tools.d.ts +79 -0
- package/dist/tools.d.ts.map +1 -0
- package/dist/tools.js +555 -0
- package/dist/tools.js.map +1 -0
- package/dist/worktree.d.ts +16 -0
- package/dist/worktree.d.ts.map +1 -0
- package/dist/worktree.js +47 -0
- package/dist/worktree.js.map +1 -0
- package/package.json +89 -0
- package/src/argument.ts +183 -0
- package/src/capability.ts +223 -0
- package/src/guidance.ts +51 -0
- package/src/index.ts +5 -0
- package/src/process.ts +144 -0
- package/src/response.ts +189 -0
- package/src/tools.ts +952 -0
- package/src/worktree.ts +69 -0
package/dist/tools.js
ADDED
|
@@ -0,0 +1,555 @@
|
|
|
1
|
+
import { readdir, stat } from "node:fs/promises";
|
|
2
|
+
import { isAbsolute, relative } from "node:path";
|
|
3
|
+
import { Type } from "typebox";
|
|
4
|
+
import { hasParsedArgumentSyntax, MAX_BRANCH_NAME_LENGTH, MAX_LABEL_LENGTH, MAX_PATH_LENGTH, MAX_WORKSPACE_ID_LENGTH, MIN_WORKSPACE_ID_LENGTH, parseAbsolutePath, parseBase, parseBranchName, parseLabel, parseWorkspaceId, } from "./argument.js";
|
|
5
|
+
import { HerdrCapabilityResolver, HerdrUnavailableError, } from "./capability.js";
|
|
6
|
+
import { registerHerdrGuidance } from "./guidance.js";
|
|
7
|
+
import { CommandCancelledError, CommandInvocationError, runCommand, } from "./process.js";
|
|
8
|
+
import { parseEnvelope, parseWorktreeList, parseWorktreeOpened, parseWorktreeRemoved, } from "./response.js";
|
|
9
|
+
import { findGitWorktree, readGitWorktrees } from "./worktree.js";
|
|
10
|
+
const BranchName = Type.String({
|
|
11
|
+
minLength: 1,
|
|
12
|
+
maxLength: MAX_BRANCH_NAME_LENGTH,
|
|
13
|
+
description: "Exact branch name. Leading options are rejected.",
|
|
14
|
+
});
|
|
15
|
+
const CheckoutPath = Type.String({
|
|
16
|
+
minLength: 1,
|
|
17
|
+
maxLength: MAX_PATH_LENGTH,
|
|
18
|
+
description: "Absolute path of the worktree checkout.",
|
|
19
|
+
});
|
|
20
|
+
const WorkspaceLabel = Type.String({
|
|
21
|
+
minLength: 1,
|
|
22
|
+
maxLength: MAX_LABEL_LENGTH,
|
|
23
|
+
description: "Single-line label shown for the workspace in the Herdr sidebar.",
|
|
24
|
+
});
|
|
25
|
+
const Focus = Type.Boolean({
|
|
26
|
+
description: "Move the user's view to the new workspace. Defaults to false.",
|
|
27
|
+
});
|
|
28
|
+
const HerdrWorktreeParameters = Type.Union([
|
|
29
|
+
Type.Object({ operation: Type.Literal("list") }, { additionalProperties: false }),
|
|
30
|
+
Type.Object({
|
|
31
|
+
operation: Type.Literal("create"),
|
|
32
|
+
branch: BranchName,
|
|
33
|
+
base: Type.Optional(Type.String({
|
|
34
|
+
minLength: 1,
|
|
35
|
+
maxLength: MAX_BRANCH_NAME_LENGTH,
|
|
36
|
+
description: "Existing commit, branch, or tag the new branch starts from.",
|
|
37
|
+
})),
|
|
38
|
+
path: Type.Optional(CheckoutPath),
|
|
39
|
+
label: Type.Optional(WorkspaceLabel),
|
|
40
|
+
focus: Type.Optional(Focus),
|
|
41
|
+
}, { additionalProperties: false }),
|
|
42
|
+
Type.Object({
|
|
43
|
+
operation: Type.Literal("open"),
|
|
44
|
+
path: Type.Optional(CheckoutPath),
|
|
45
|
+
branch: Type.Optional(BranchName),
|
|
46
|
+
label: Type.Optional(WorkspaceLabel),
|
|
47
|
+
focus: Type.Optional(Focus),
|
|
48
|
+
}, { additionalProperties: false }),
|
|
49
|
+
Type.Object({
|
|
50
|
+
operation: Type.Literal("remove"),
|
|
51
|
+
workspace_id: Type.String({
|
|
52
|
+
minLength: MIN_WORKSPACE_ID_LENGTH,
|
|
53
|
+
maxLength: MAX_WORKSPACE_ID_LENGTH,
|
|
54
|
+
description: "Herdr workspace id of the worktree workspace to remove, such as `wG`.",
|
|
55
|
+
}),
|
|
56
|
+
force: Type.Optional(Type.Boolean({
|
|
57
|
+
description: "Remove the checkout even when it holds uncommitted changes.",
|
|
58
|
+
})),
|
|
59
|
+
}, { additionalProperties: false }),
|
|
60
|
+
]);
|
|
61
|
+
export const OPERATION_FIELDS = {
|
|
62
|
+
list: { required: ["operation"], optional: [] },
|
|
63
|
+
create: { required: ["operation", "branch"], optional: ["base", "path", "label", "focus"] },
|
|
64
|
+
open: { required: ["operation"], optional: ["path", "branch", "label", "focus"] },
|
|
65
|
+
remove: { required: ["operation", "workspace_id"], optional: ["force"] },
|
|
66
|
+
};
|
|
67
|
+
/** The only `herdr` subcommand this extension is allowed to spawn. */
|
|
68
|
+
const HERDR_SUBCOMMAND = "worktree";
|
|
69
|
+
const ALLOWED_OPTIONS = {
|
|
70
|
+
list: ["--cwd"],
|
|
71
|
+
create: ["--cwd", "--branch", "--base", "--path", "--label"],
|
|
72
|
+
open: ["--cwd", "--branch", "--path", "--label"],
|
|
73
|
+
remove: ["--workspace"],
|
|
74
|
+
};
|
|
75
|
+
const ALLOWED_SWITCHES = {
|
|
76
|
+
list: [],
|
|
77
|
+
create: ["--focus", "--no-focus"],
|
|
78
|
+
open: ["--focus", "--no-focus"],
|
|
79
|
+
remove: ["--force"],
|
|
80
|
+
};
|
|
81
|
+
const repositoryQueues = new Map();
|
|
82
|
+
async function withRepositoryLock(repositoryRoot, signal, operation) {
|
|
83
|
+
const predecessor = repositoryQueues.get(repositoryRoot) ?? Promise.resolve();
|
|
84
|
+
const { promise: releasePromise, resolve: release } = Promise.withResolvers();
|
|
85
|
+
const queueTail = predecessor.then(() => releasePromise);
|
|
86
|
+
repositoryQueues.set(repositoryRoot, queueTail);
|
|
87
|
+
await predecessor;
|
|
88
|
+
try {
|
|
89
|
+
if (signal?.aborted) {
|
|
90
|
+
throw new CommandCancelledError("Herdr worktree operation");
|
|
91
|
+
}
|
|
92
|
+
return await operation();
|
|
93
|
+
}
|
|
94
|
+
finally {
|
|
95
|
+
release();
|
|
96
|
+
if (repositoryQueues.get(repositoryRoot) === queueTail) {
|
|
97
|
+
repositoryQueues.delete(repositoryRoot);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
function capabilityDetails(capability) {
|
|
102
|
+
return {
|
|
103
|
+
repositoryRoot: capability.repository.root,
|
|
104
|
+
herdrVersion: capability.herdrVersion,
|
|
105
|
+
cache: capability.cache,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
function commandDetails(result) {
|
|
109
|
+
return { executable: result.command, args: result.args, exitCode: result.exitCode };
|
|
110
|
+
}
|
|
111
|
+
function parseOperationFrom(args) {
|
|
112
|
+
if (!args || typeof args !== "object") {
|
|
113
|
+
return undefined;
|
|
114
|
+
}
|
|
115
|
+
switch (Reflect.get(args, "operation")) {
|
|
116
|
+
case "list":
|
|
117
|
+
return "list";
|
|
118
|
+
case "create":
|
|
119
|
+
return "create";
|
|
120
|
+
case "open":
|
|
121
|
+
return "open";
|
|
122
|
+
case "remove":
|
|
123
|
+
return "remove";
|
|
124
|
+
default:
|
|
125
|
+
return undefined;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
function parseRequestFields(parameters, operation, fields) {
|
|
129
|
+
if (!parameters || typeof parameters !== "object" || Array.isArray(parameters)) {
|
|
130
|
+
throw new Error(`Operation ${operation} requires an object request.`);
|
|
131
|
+
}
|
|
132
|
+
const entries = Object.entries(parameters);
|
|
133
|
+
const present = entries.map(([field]) => field);
|
|
134
|
+
const allowed = [...fields.required, ...fields.optional];
|
|
135
|
+
const unexpected = present.filter((field) => !allowed.includes(field));
|
|
136
|
+
if (unexpected.length > 0) {
|
|
137
|
+
throw new Error(`Operation ${operation} does not accept ${unexpected.join(", ")}. Allowed fields: ${allowed.join(", ")}.`);
|
|
138
|
+
}
|
|
139
|
+
const missing = fields.required.filter((field) => !present.includes(field));
|
|
140
|
+
if (missing.length > 0) {
|
|
141
|
+
throw new Error(`Operation ${operation} requires ${missing.join(", ")}.`);
|
|
142
|
+
}
|
|
143
|
+
// A null prototype, so an absent field cannot resolve to an inherited value.
|
|
144
|
+
return Object.assign(Object.create(null), Object.fromEntries(entries));
|
|
145
|
+
}
|
|
146
|
+
function parseFlag(raw, label) {
|
|
147
|
+
if (raw === undefined || typeof raw === "boolean") {
|
|
148
|
+
return raw === true;
|
|
149
|
+
}
|
|
150
|
+
throw new Error(`${label} must be a boolean.`);
|
|
151
|
+
}
|
|
152
|
+
function optional(raw, parse) {
|
|
153
|
+
return raw === undefined ? undefined : parse(raw);
|
|
154
|
+
}
|
|
155
|
+
async function optionalAsync(raw, parse) {
|
|
156
|
+
return raw === undefined ? undefined : await parse(raw);
|
|
157
|
+
}
|
|
158
|
+
async function parseOperation(parameters, runner, cwd, signal) {
|
|
159
|
+
const operation = parseOperationFrom(parameters);
|
|
160
|
+
if (!operation) {
|
|
161
|
+
throw new Error("Unknown Herdr worktree operation.");
|
|
162
|
+
}
|
|
163
|
+
switch (operation) {
|
|
164
|
+
case "list":
|
|
165
|
+
parseRequestFields(parameters, operation, OPERATION_FIELDS[operation]);
|
|
166
|
+
return { operation };
|
|
167
|
+
case "create": {
|
|
168
|
+
const fields = parseRequestFields(parameters, operation, OPERATION_FIELDS[operation]);
|
|
169
|
+
return {
|
|
170
|
+
operation,
|
|
171
|
+
branch: await parseBranchName(runner, fields.branch, "branch", cwd, signal),
|
|
172
|
+
base: await optionalAsync(fields.base, (raw) => parseBase(runner, raw, "base", cwd, signal)),
|
|
173
|
+
path: optional(fields.path, (raw) => parseAbsolutePath(raw, "path")),
|
|
174
|
+
label: optional(fields.label, (raw) => parseLabel(raw, "label")),
|
|
175
|
+
focus: parseFlag(fields.focus, "focus"),
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
case "open": {
|
|
179
|
+
const fields = parseRequestFields(parameters, operation, OPERATION_FIELDS[operation]);
|
|
180
|
+
const path = optional(fields.path, (raw) => parseAbsolutePath(raw, "path"));
|
|
181
|
+
const branch = await optionalAsync(fields.branch, (raw) => parseBranchName(runner, raw, "branch", cwd, signal));
|
|
182
|
+
if ((path === undefined) === (branch === undefined)) {
|
|
183
|
+
throw new Error("Operation open requires exactly one of path or branch.");
|
|
184
|
+
}
|
|
185
|
+
return {
|
|
186
|
+
operation,
|
|
187
|
+
path,
|
|
188
|
+
branch,
|
|
189
|
+
label: optional(fields.label, (raw) => parseLabel(raw, "label")),
|
|
190
|
+
focus: parseFlag(fields.focus, "focus"),
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
case "remove": {
|
|
194
|
+
const fields = parseRequestFields(parameters, operation, OPERATION_FIELDS[operation]);
|
|
195
|
+
return {
|
|
196
|
+
operation,
|
|
197
|
+
workspaceId: parseWorkspaceId(fields.workspace_id, "workspace_id"),
|
|
198
|
+
force: parseFlag(fields.force, "force"),
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
function approvalFor(args) {
|
|
204
|
+
const operation = parseOperationFrom(args);
|
|
205
|
+
if (operation === "list") {
|
|
206
|
+
return "read";
|
|
207
|
+
}
|
|
208
|
+
if (operation === "remove") {
|
|
209
|
+
return {
|
|
210
|
+
tier: "exec",
|
|
211
|
+
policy: "prompt",
|
|
212
|
+
reason: "Removing a worktree deletes its checkout and closes its Herdr workspace.",
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
// A caller-chosen path writes wherever it names, so the user decides. Otherwise Herdr picks.
|
|
216
|
+
if (operation === "create" && args && typeof args === "object") {
|
|
217
|
+
if (Reflect.get(args, "path") !== undefined) {
|
|
218
|
+
return {
|
|
219
|
+
tier: "exec",
|
|
220
|
+
policy: "prompt",
|
|
221
|
+
reason: "Creating a worktree at an explicit path writes to a directory the caller chose.",
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
if (operation) {
|
|
226
|
+
return "exec";
|
|
227
|
+
}
|
|
228
|
+
return { tier: "exec", policy: "deny", reason: "Unknown Herdr worktree operation." };
|
|
229
|
+
}
|
|
230
|
+
function concurrencyFor(args) {
|
|
231
|
+
return parseOperationFrom(args) === "list" ? "shared" : "exclusive";
|
|
232
|
+
}
|
|
233
|
+
const APPROVAL_VALUE_MAX_LENGTH = 200;
|
|
234
|
+
/**
|
|
235
|
+
* The approval prompt is built before the request is parsed, so it shows raw text. A value must
|
|
236
|
+
* stay on one line, or it could forge the lines around it.
|
|
237
|
+
*/
|
|
238
|
+
function approvalValue(raw) {
|
|
239
|
+
const text = typeof raw === "string" ? raw : (JSON.stringify(raw) ?? String(raw));
|
|
240
|
+
const singleLine = text.replace(/[\p{Cc}\p{Cf}\p{Zl}\p{Zp}]+/gu, " ").trim();
|
|
241
|
+
return singleLine.length > APPROVAL_VALUE_MAX_LENGTH
|
|
242
|
+
? `${singleLine.slice(0, APPROVAL_VALUE_MAX_LENGTH)}...`
|
|
243
|
+
: singleLine;
|
|
244
|
+
}
|
|
245
|
+
function approvalDetails(args) {
|
|
246
|
+
const operation = parseOperationFrom(args);
|
|
247
|
+
if (!operation || !args || typeof args !== "object") {
|
|
248
|
+
return undefined;
|
|
249
|
+
}
|
|
250
|
+
const lines = [`Operation: ${operation}`];
|
|
251
|
+
for (const field of ["branch", "base", "path", "label", "workspace_id"]) {
|
|
252
|
+
const raw = Reflect.get(args, field);
|
|
253
|
+
if (raw !== undefined) {
|
|
254
|
+
lines.push(`${field}: ${approvalValue(raw)}`);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
if (Reflect.get(args, "force") === true) {
|
|
258
|
+
lines.push("force: discards uncommitted changes in the checkout");
|
|
259
|
+
}
|
|
260
|
+
return lines;
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Last line of defence before spawning `herdr`, kept although the types already make most of it
|
|
264
|
+
* impossible. Herdr does not accept `--flag=value`, so every value travels as its own argument.
|
|
265
|
+
*/
|
|
266
|
+
function buildHerdrArguments(command) {
|
|
267
|
+
if (!Object.hasOwn(ALLOWED_OPTIONS, command.action)) {
|
|
268
|
+
throw new Error(`Refusing to run an unknown Herdr worktree action: ${JSON.stringify(command.action)}.`);
|
|
269
|
+
}
|
|
270
|
+
const allowedOptions = ALLOWED_OPTIONS[command.action];
|
|
271
|
+
const allowedSwitches = ALLOWED_SWITCHES[command.action];
|
|
272
|
+
const args = [HERDR_SUBCOMMAND, command.action];
|
|
273
|
+
const used = new Set();
|
|
274
|
+
for (const option of command.options) {
|
|
275
|
+
if (!allowedOptions.includes(option.name)) {
|
|
276
|
+
throw new Error(`Refusing to pass ${option.name} to ${command.action}.`);
|
|
277
|
+
}
|
|
278
|
+
if (used.has(option.name)) {
|
|
279
|
+
throw new Error(`Refusing to pass ${option.name} twice.`);
|
|
280
|
+
}
|
|
281
|
+
const value = option.value;
|
|
282
|
+
if (!hasParsedArgumentSyntax(value)) {
|
|
283
|
+
throw new Error(`Refusing to pass ${option.name} without a safe value.`);
|
|
284
|
+
}
|
|
285
|
+
used.add(option.name);
|
|
286
|
+
args.push(option.name, value);
|
|
287
|
+
}
|
|
288
|
+
for (const flag of command.switches) {
|
|
289
|
+
if (!allowedSwitches.includes(flag)) {
|
|
290
|
+
throw new Error(`Refusing to pass ${flag} to ${command.action}.`);
|
|
291
|
+
}
|
|
292
|
+
if (used.has(flag)) {
|
|
293
|
+
throw new Error(`Refusing to pass ${flag} twice.`);
|
|
294
|
+
}
|
|
295
|
+
used.add(flag);
|
|
296
|
+
args.push(flag);
|
|
297
|
+
}
|
|
298
|
+
if (used.has("--focus") && used.has("--no-focus")) {
|
|
299
|
+
throw new Error("Refusing to pass both --focus and --no-focus.");
|
|
300
|
+
}
|
|
301
|
+
return args;
|
|
302
|
+
}
|
|
303
|
+
async function runHerdr(runner, capabilities, capability, command, signal) {
|
|
304
|
+
const args = buildHerdrArguments(command);
|
|
305
|
+
let result;
|
|
306
|
+
try {
|
|
307
|
+
result = await runner("herdr", args, { cwd: capability.repository.root, signal });
|
|
308
|
+
}
|
|
309
|
+
catch (error) {
|
|
310
|
+
if (error instanceof CommandInvocationError) {
|
|
311
|
+
capabilities.forget(capability.repository.root);
|
|
312
|
+
throw new HerdrUnavailableError("The Herdr session was detected, but the `herdr` executable could not be started.", { cause: error });
|
|
313
|
+
}
|
|
314
|
+
throw error;
|
|
315
|
+
}
|
|
316
|
+
// Exit 2 is a CLI syntax error: the argument vocabulary above and the installed CLI
|
|
317
|
+
// disagree, which is a bug here rather than a rejected request.
|
|
318
|
+
if (result.exitCode === 2) {
|
|
319
|
+
capabilities.forget(capability.repository.root);
|
|
320
|
+
throw new HerdrUnavailableError(`The installed Herdr CLI rejected the argument list: ${[result.stderr, result.stdout]
|
|
321
|
+
.map((text) => text.trim())
|
|
322
|
+
.filter(Boolean)
|
|
323
|
+
.join("\n")}`);
|
|
324
|
+
}
|
|
325
|
+
return { result, payload: parseEnvelope(result) };
|
|
326
|
+
}
|
|
327
|
+
function describeWorktree(worktree) {
|
|
328
|
+
const branch = worktree.branch ?? "detached HEAD";
|
|
329
|
+
const workspace = worktree.openWorkspaceId ? ` in workspace ${worktree.openWorkspaceId}` : "";
|
|
330
|
+
const flags = [
|
|
331
|
+
worktree.isLinkedWorktree ? "linked" : "main checkout",
|
|
332
|
+
worktree.isPrunable ? "prunable" : undefined,
|
|
333
|
+
worktree.isBare ? "bare" : undefined,
|
|
334
|
+
].filter(Boolean);
|
|
335
|
+
return `${worktree.path} [${branch}]${workspace} (${flags.join(", ")})`;
|
|
336
|
+
}
|
|
337
|
+
function textResult(text, details) {
|
|
338
|
+
return { content: [{ type: "text", text }], details };
|
|
339
|
+
}
|
|
340
|
+
async function assertGitWorktreeRegistered(runner, cwd, signal, path, branch, label) {
|
|
341
|
+
const entries = await readGitWorktrees(runner, cwd, signal);
|
|
342
|
+
const entry = findGitWorktree(entries, path);
|
|
343
|
+
if (!entry) {
|
|
344
|
+
throw new Error(`Git does not list ${JSON.stringify(path)} as a worktree of this repository.`);
|
|
345
|
+
}
|
|
346
|
+
if (branch !== null && entry.branch !== branch) {
|
|
347
|
+
throw new Error(`${label} reports branch ${JSON.stringify(branch)}, but Git has ${JSON.stringify(entry.branch)} checked out there.`);
|
|
348
|
+
}
|
|
349
|
+
return entry;
|
|
350
|
+
}
|
|
351
|
+
function isInside(directory, path) {
|
|
352
|
+
const offset = relative(directory, path);
|
|
353
|
+
return offset === "" || (!offset.startsWith("..") && !isAbsolute(offset));
|
|
354
|
+
}
|
|
355
|
+
/**
|
|
356
|
+
* Git refuses to overwrite files too, but only after Herdr made the workspace for it. The tool may
|
|
357
|
+
* run from a linked worktree, where the main checkout is not the root Git reported, so every
|
|
358
|
+
* registered checkout is checked and not only that root.
|
|
359
|
+
*/
|
|
360
|
+
async function assertCheckoutPathAvailable(path, repository, existing) {
|
|
361
|
+
const directories = [
|
|
362
|
+
[repository.root, "repository"],
|
|
363
|
+
[repository.gitDir, "Git directory"],
|
|
364
|
+
...existing.map((entry) => [entry.path, "worktree"]),
|
|
365
|
+
];
|
|
366
|
+
for (const [directory, label] of directories) {
|
|
367
|
+
if (isInside(directory, path)) {
|
|
368
|
+
throw new Error(`path ${JSON.stringify(path)} is inside the ${label} at ${JSON.stringify(directory)}. Create the worktree outside it.`);
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
let target;
|
|
372
|
+
try {
|
|
373
|
+
target = await stat(path);
|
|
374
|
+
}
|
|
375
|
+
catch (error) {
|
|
376
|
+
if (error.code === "ENOENT") {
|
|
377
|
+
return;
|
|
378
|
+
}
|
|
379
|
+
throw new Error(`Unable to inspect path ${JSON.stringify(path)}.`, { cause: error });
|
|
380
|
+
}
|
|
381
|
+
if (!target.isDirectory()) {
|
|
382
|
+
throw new Error(`path ${JSON.stringify(path)} already exists and is not a directory.`);
|
|
383
|
+
}
|
|
384
|
+
if ((await readdir(path)).length > 0) {
|
|
385
|
+
throw new Error(`path ${JSON.stringify(path)} already exists and is not empty.`);
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
function focusSwitch(focus) {
|
|
389
|
+
return focus ? "--focus" : "--no-focus";
|
|
390
|
+
}
|
|
391
|
+
function listCommand(root) {
|
|
392
|
+
return { action: "list", options: [{ name: "--cwd", value: root }], switches: [] };
|
|
393
|
+
}
|
|
394
|
+
export function registerHerdrWorktreeTools(pi, dependencies = {}) {
|
|
395
|
+
const runner = dependencies.runner ?? runCommand;
|
|
396
|
+
const capabilities = dependencies.capabilities ?? new HerdrCapabilityResolver(runner);
|
|
397
|
+
registerHerdrGuidance(pi, capabilities);
|
|
398
|
+
pi.registerTool({
|
|
399
|
+
name: "herdr_worktree",
|
|
400
|
+
label: "Herdr worktree",
|
|
401
|
+
description: "List, create, open, and remove Herdr Git worktree workspaces for the current repository, with checked arguments and verified results.",
|
|
402
|
+
parameters: HerdrWorktreeParameters,
|
|
403
|
+
approval: approvalFor,
|
|
404
|
+
formatApprovalDetails: approvalDetails,
|
|
405
|
+
loadMode: "discoverable",
|
|
406
|
+
concurrency: concurrencyFor,
|
|
407
|
+
executionMode: "sequential",
|
|
408
|
+
async execute(_toolCallId, parameters, signal, _onUpdate, context) {
|
|
409
|
+
const capability = await capabilities.ensure(context.cwd, signal);
|
|
410
|
+
const root = capability.repository.root;
|
|
411
|
+
const operation = await parseOperation(parameters, runner, root, signal);
|
|
412
|
+
switch (operation.operation) {
|
|
413
|
+
case "list": {
|
|
414
|
+
const { result, payload } = await runHerdr(runner, capabilities, capability, listCommand(root), signal);
|
|
415
|
+
const list = parseWorktreeList(payload);
|
|
416
|
+
const lines = list.worktrees.map((worktree) => `- ${describeWorktree(worktree)}`);
|
|
417
|
+
const body = lines.length > 0 ? lines.join("\n") : "No worktrees are registered.";
|
|
418
|
+
return textResult(`${list.source.repoName} (${list.source.repoRoot})\n${body}`, {
|
|
419
|
+
operation: "list",
|
|
420
|
+
capability: capabilityDetails(capability),
|
|
421
|
+
command: commandDetails(result),
|
|
422
|
+
result: list,
|
|
423
|
+
});
|
|
424
|
+
}
|
|
425
|
+
case "create":
|
|
426
|
+
return withRepositoryLock(root, signal, async () => {
|
|
427
|
+
const existing = await readGitWorktrees(runner, root, signal);
|
|
428
|
+
if (existing.some((entry) => entry.branch === operation.branch)) {
|
|
429
|
+
throw new Error(`Branch ${JSON.stringify(operation.branch)} is already checked out in a worktree of this repository. Open it instead of creating it.`);
|
|
430
|
+
}
|
|
431
|
+
if (operation.path && findGitWorktree(existing, operation.path)) {
|
|
432
|
+
throw new Error(`${JSON.stringify(operation.path)} is already a worktree of this repository.`);
|
|
433
|
+
}
|
|
434
|
+
if (operation.path) {
|
|
435
|
+
await assertCheckoutPathAvailable(operation.path, capability.repository, existing);
|
|
436
|
+
}
|
|
437
|
+
const options = [
|
|
438
|
+
{ name: "--cwd", value: root },
|
|
439
|
+
{ name: "--branch", value: operation.branch },
|
|
440
|
+
];
|
|
441
|
+
if (operation.base) {
|
|
442
|
+
options.push({ name: "--base", value: operation.base.revision });
|
|
443
|
+
}
|
|
444
|
+
if (operation.path) {
|
|
445
|
+
options.push({ name: "--path", value: operation.path });
|
|
446
|
+
}
|
|
447
|
+
if (operation.label) {
|
|
448
|
+
options.push({ name: "--label", value: operation.label });
|
|
449
|
+
}
|
|
450
|
+
const { result, payload } = await runHerdr(runner, capabilities, capability, { action: "create", options, switches: [focusSwitch(operation.focus)] }, signal);
|
|
451
|
+
const created = parseWorktreeOpened(payload);
|
|
452
|
+
if (created.type !== "worktree_created") {
|
|
453
|
+
throw new Error(`Herdr answered a create request with ${JSON.stringify(created.type)}.`);
|
|
454
|
+
}
|
|
455
|
+
if (created.worktree.branch !== operation.branch) {
|
|
456
|
+
throw new Error(`Herdr created the worktree on branch ${JSON.stringify(created.worktree.branch)} instead of ${JSON.stringify(operation.branch)}.`);
|
|
457
|
+
}
|
|
458
|
+
if (!created.worktree.isLinkedWorktree) {
|
|
459
|
+
throw new Error("Herdr reported the main checkout instead of a new linked worktree.");
|
|
460
|
+
}
|
|
461
|
+
if (operation.path && created.worktree.path !== operation.path) {
|
|
462
|
+
throw new Error(`Herdr created the worktree at ${JSON.stringify(created.worktree.path)} instead of ${JSON.stringify(operation.path)}.`);
|
|
463
|
+
}
|
|
464
|
+
const entry = await assertGitWorktreeRegistered(runner, root, signal, created.worktree.path, created.worktree.branch, "Herdr");
|
|
465
|
+
// A ref can move between the parse and the create, so the commit is checked again.
|
|
466
|
+
if (operation.base && entry.head !== operation.base.commit) {
|
|
467
|
+
throw new Error(`base ${JSON.stringify(operation.base.revision)} was at ${operation.base.commit}, but the new worktree is at ${JSON.stringify(entry.head)}.`);
|
|
468
|
+
}
|
|
469
|
+
return textResult(`Created ${describeWorktree(created.worktree)}\nWorkspace ${created.workspaceId}, tab ${created.tabId}, pane ${created.rootPaneId}`, {
|
|
470
|
+
operation: "create",
|
|
471
|
+
capability: capabilityDetails(capability),
|
|
472
|
+
command: commandDetails(result),
|
|
473
|
+
result: created,
|
|
474
|
+
});
|
|
475
|
+
});
|
|
476
|
+
case "open":
|
|
477
|
+
return withRepositoryLock(root, signal, async () => {
|
|
478
|
+
const options = [{ name: "--cwd", value: root }];
|
|
479
|
+
if (operation.path) {
|
|
480
|
+
options.push({ name: "--path", value: operation.path });
|
|
481
|
+
}
|
|
482
|
+
if (operation.branch) {
|
|
483
|
+
options.push({ name: "--branch", value: operation.branch });
|
|
484
|
+
}
|
|
485
|
+
if (operation.label) {
|
|
486
|
+
options.push({ name: "--label", value: operation.label });
|
|
487
|
+
}
|
|
488
|
+
const { result, payload } = await runHerdr(runner, capabilities, capability, { action: "open", options, switches: [focusSwitch(operation.focus)] }, signal);
|
|
489
|
+
const opened = parseWorktreeOpened(payload);
|
|
490
|
+
if (opened.type !== "worktree_opened") {
|
|
491
|
+
throw new Error(`Herdr answered an open request with ${JSON.stringify(opened.type)}.`);
|
|
492
|
+
}
|
|
493
|
+
if (operation.branch && opened.worktree.branch !== operation.branch) {
|
|
494
|
+
throw new Error(`Herdr opened branch ${JSON.stringify(opened.worktree.branch)} instead of ${JSON.stringify(operation.branch)}.`);
|
|
495
|
+
}
|
|
496
|
+
if (operation.path && opened.worktree.path !== operation.path) {
|
|
497
|
+
throw new Error(`Herdr opened ${JSON.stringify(opened.worktree.path)} instead of ${JSON.stringify(operation.path)}.`);
|
|
498
|
+
}
|
|
499
|
+
await assertGitWorktreeRegistered(runner, root, signal, opened.worktree.path, opened.worktree.branch, "Herdr");
|
|
500
|
+
const prefix = opened.alreadyOpen ? "Already open:" : "Opened";
|
|
501
|
+
return textResult(`${prefix} ${describeWorktree(opened.worktree)}\nWorkspace ${opened.workspaceId}, tab ${opened.tabId}, pane ${opened.rootPaneId}`, {
|
|
502
|
+
operation: "open",
|
|
503
|
+
capability: capabilityDetails(capability),
|
|
504
|
+
command: commandDetails(result),
|
|
505
|
+
result: opened,
|
|
506
|
+
});
|
|
507
|
+
});
|
|
508
|
+
case "remove":
|
|
509
|
+
return withRepositoryLock(root, signal, async () => {
|
|
510
|
+
const { payload: listPayload } = await runHerdr(runner, capabilities, capability, listCommand(root), signal);
|
|
511
|
+
const list = parseWorktreeList(listPayload);
|
|
512
|
+
const target = list.worktrees.find((worktree) => worktree.openWorkspaceId === operation.workspaceId);
|
|
513
|
+
if (!target) {
|
|
514
|
+
throw new Error(`Workspace ${JSON.stringify(operation.workspaceId)} does not hold a worktree of ${JSON.stringify(list.source.repoRoot)}.`);
|
|
515
|
+
}
|
|
516
|
+
if (!target.isLinkedWorktree) {
|
|
517
|
+
throw new Error(`Workspace ${JSON.stringify(operation.workspaceId)} holds the main checkout at ${JSON.stringify(target.path)}, which cannot be removed.`);
|
|
518
|
+
}
|
|
519
|
+
if (target.path === capability.repository.root) {
|
|
520
|
+
throw new Error("remove cannot remove the repository the tool is running in.");
|
|
521
|
+
}
|
|
522
|
+
const confirmed = await context.ui?.confirm(`Remove Herdr worktree ${target.path}?`, operation.force
|
|
523
|
+
? "This deletes the checkout even if it holds uncommitted changes, and closes its Herdr workspace."
|
|
524
|
+
: "This deletes the checkout and closes its Herdr workspace.");
|
|
525
|
+
if (!confirmed) {
|
|
526
|
+
throw new Error("Removing a worktree requires explicit user confirmation.");
|
|
527
|
+
}
|
|
528
|
+
const { result, payload } = await runHerdr(runner, capabilities, capability, {
|
|
529
|
+
action: "remove",
|
|
530
|
+
options: [{ name: "--workspace", value: operation.workspaceId }],
|
|
531
|
+
switches: operation.force ? ["--force"] : [],
|
|
532
|
+
}, signal);
|
|
533
|
+
const removed = parseWorktreeRemoved(payload);
|
|
534
|
+
if (removed.workspaceId !== operation.workspaceId) {
|
|
535
|
+
throw new Error(`Herdr removed workspace ${JSON.stringify(removed.workspaceId)} instead of ${JSON.stringify(operation.workspaceId)}.`);
|
|
536
|
+
}
|
|
537
|
+
if (removed.path !== target.path) {
|
|
538
|
+
throw new Error(`Herdr removed ${JSON.stringify(removed.path)} instead of ${JSON.stringify(target.path)}.`);
|
|
539
|
+
}
|
|
540
|
+
const remaining = await readGitWorktrees(runner, root, signal);
|
|
541
|
+
if (findGitWorktree(remaining, removed.path)) {
|
|
542
|
+
throw new Error(`Herdr reported ${JSON.stringify(removed.path)} removed, but Git still lists it as a worktree.`);
|
|
543
|
+
}
|
|
544
|
+
return textResult(`Removed ${removed.path} and closed workspace ${removed.workspaceId}${removed.forced ? " (forced)" : ""}.`, {
|
|
545
|
+
operation: "remove",
|
|
546
|
+
capability: capabilityDetails(capability),
|
|
547
|
+
command: commandDetails(result),
|
|
548
|
+
result: removed,
|
|
549
|
+
});
|
|
550
|
+
});
|
|
551
|
+
}
|
|
552
|
+
},
|
|
553
|
+
});
|
|
554
|
+
}
|
|
555
|
+
//# sourceMappingURL=tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type CommandRunner } from "./process.js";
|
|
2
|
+
export interface GitWorktreeEntry {
|
|
3
|
+
readonly path: string;
|
|
4
|
+
readonly head: string | null;
|
|
5
|
+
readonly branch: string | null;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Reads the worktrees Git itself knows about. Herdr reports what it did; this is the
|
|
9
|
+
* independent check that the repository really changed the same way.
|
|
10
|
+
*
|
|
11
|
+
* `-z` ends every record with a NUL, so a path that contains a newline cannot pretend to be
|
|
12
|
+
* another record. It needs Git 2.36 or newer.
|
|
13
|
+
*/
|
|
14
|
+
export declare function readGitWorktrees(runner: CommandRunner, cwd: string, signal: AbortSignal | undefined): Promise<readonly GitWorktreeEntry[]>;
|
|
15
|
+
export declare function findGitWorktree(entries: readonly GitWorktreeEntry[], path: string): GitWorktreeEntry | undefined;
|
|
16
|
+
//# sourceMappingURL=worktree.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worktree.d.ts","sourceRoot":"","sources":["../src/worktree.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,aAAa,EAAc,MAAM,cAAc,CAAC;AAE9D,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAMD;;;;;;GAMG;AACH,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,aAAa,EACrB,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,WAAW,GAAG,SAAS,GAC9B,OAAO,CAAC,SAAS,gBAAgB,EAAE,CAAC,CAoCtC;AAED,wBAAgB,eAAe,CAC7B,OAAO,EAAE,SAAS,gBAAgB,EAAE,EACpC,IAAI,EAAE,MAAM,GACX,gBAAgB,GAAG,SAAS,CAG9B"}
|