forge-cc 0.1.40 → 1.0.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.
Files changed (72) hide show
  1. package/README.md +454 -338
  2. package/dist/cli.js +194 -906
  3. package/dist/cli.js.map +1 -1
  4. package/dist/config/loader.d.ts +1 -1
  5. package/dist/config/loader.js +49 -56
  6. package/dist/config/loader.js.map +1 -1
  7. package/dist/config/schema.d.ts +37 -125
  8. package/dist/config/schema.js +13 -28
  9. package/dist/config/schema.js.map +1 -1
  10. package/dist/doctor.d.ts +10 -0
  11. package/dist/doctor.js +148 -0
  12. package/dist/doctor.js.map +1 -0
  13. package/dist/gates/index.d.ts +14 -12
  14. package/dist/gates/index.js +53 -105
  15. package/dist/gates/index.js.map +1 -1
  16. package/dist/gates/lint-gate.d.ts +2 -2
  17. package/dist/gates/lint-gate.js +60 -66
  18. package/dist/gates/lint-gate.js.map +1 -1
  19. package/dist/gates/tests-gate.d.ts +2 -4
  20. package/dist/gates/tests-gate.js +75 -203
  21. package/dist/gates/tests-gate.js.map +1 -1
  22. package/dist/gates/types-gate.d.ts +2 -2
  23. package/dist/gates/types-gate.js +53 -59
  24. package/dist/gates/types-gate.js.map +1 -1
  25. package/dist/go/linear-sync-cli.js +13 -4
  26. package/dist/go/linear-sync-cli.js.map +1 -1
  27. package/dist/go/linear-sync.d.ts +1 -0
  28. package/dist/go/linear-sync.js +67 -4
  29. package/dist/go/linear-sync.js.map +1 -1
  30. package/dist/linear/client.d.ts +34 -105
  31. package/dist/linear/client.js +85 -365
  32. package/dist/linear/client.js.map +1 -1
  33. package/dist/linear/issues.d.ts +3 -1
  34. package/dist/linear/issues.js +14 -2
  35. package/dist/linear/issues.js.map +1 -1
  36. package/dist/linear/projects.js +3 -2
  37. package/dist/linear/projects.js.map +1 -1
  38. package/dist/linear/sync.d.ts +15 -0
  39. package/dist/linear/sync.js +102 -0
  40. package/dist/linear/sync.js.map +1 -0
  41. package/dist/runner/loop.d.ts +4 -0
  42. package/dist/runner/loop.js +168 -0
  43. package/dist/runner/loop.js.map +1 -0
  44. package/dist/runner/prompt.d.ts +14 -0
  45. package/dist/runner/prompt.js +59 -0
  46. package/dist/runner/prompt.js.map +1 -0
  47. package/dist/runner/update.d.ts +1 -0
  48. package/dist/runner/update.js +72 -0
  49. package/dist/runner/update.js.map +1 -0
  50. package/dist/server.d.ts +6 -2
  51. package/dist/server.js +43 -101
  52. package/dist/server.js.map +1 -1
  53. package/dist/setup.d.ts +5 -0
  54. package/dist/setup.js +208 -0
  55. package/dist/setup.js.map +1 -0
  56. package/dist/state/cache.d.ts +3 -0
  57. package/dist/state/cache.js +23 -0
  58. package/dist/state/cache.js.map +1 -0
  59. package/dist/state/status.d.ts +66 -0
  60. package/dist/state/status.js +96 -0
  61. package/dist/state/status.js.map +1 -0
  62. package/dist/types.d.ts +46 -114
  63. package/dist/worktree/manager.d.ts +6 -103
  64. package/dist/worktree/manager.js +25 -296
  65. package/dist/worktree/manager.js.map +1 -1
  66. package/hooks/pre-commit-verify.js +109 -109
  67. package/package.json +3 -2
  68. package/skills/forge-go.md +583 -575
  69. package/skills/forge-setup.md +149 -388
  70. package/skills/forge-spec.md +367 -342
  71. package/skills/forge-triage.md +179 -133
  72. package/skills/forge-update.md +87 -93
@@ -1,103 +1,6 @@
1
- import type { Session } from "./session.js";
2
- export interface WorktreeInfo {
3
- path: string;
4
- branch: string;
5
- head: string;
6
- isMain: boolean;
7
- }
8
- export interface CreateWorktreeOptions {
9
- /** Base branch to create worktree from (default: current branch) */
10
- baseBranch?: string;
11
- /** Custom branch name. Default: forge/<user>/<slug> */
12
- branchName?: string;
13
- }
14
- /**
15
- * Get the root directory of the current git repository.
16
- */
17
- export declare function getRepoRoot(cwd?: string): string;
18
- /**
19
- * Compute the worktree base directory: ../.forge-wt/<repo-name>/
20
- * Uses short paths to avoid Windows 260-char limit.
21
- */
22
- export declare function getWorktreeBaseDir(repoRoot: string): string;
23
- /**
24
- * Create a new git worktree with an auto-generated short session ID.
25
- *
26
- * Path: ../.forge-wt/<repo>/<8-char-id>/
27
- * Branch: branchName or forge/<user>/<slug>
28
- *
29
- * Returns the absolute path to the new worktree and its branch name.
30
- */
31
- export declare function createWorktree(repoRoot: string, slug: string, userName: string, options?: CreateWorktreeOptions): {
32
- worktreePath: string;
33
- branch: string;
34
- sessionId: string;
35
- };
36
- /**
37
- * List all git worktrees for the repository.
38
- *
39
- * Parses the porcelain output of `git worktree list --porcelain`.
40
- * Each block is separated by a blank line and contains lines like:
41
- * worktree <path>
42
- * HEAD <sha>
43
- * branch refs/heads/<name>
44
- */
45
- export declare function listWorktrees(repoRoot: string): WorktreeInfo[];
46
- /**
47
- * Remove a git worktree and clean up its directory.
48
- * Uses `git worktree remove --force` then prunes stale entries.
49
- */
50
- export declare function removeWorktree(repoRoot: string, worktreePath: string): void;
51
- /**
52
- * Check if a worktree path exists and is valid (still tracked by git).
53
- */
54
- export declare function isWorktreeValid(worktreePath: string): boolean;
55
- /**
56
- * Delete a local branch by name.
57
- *
58
- * Safety: refuses to delete `main`, `master`, or the currently checked-out branch.
59
- *
60
- * By default uses `git branch -d` (safe delete) which only removes branches that
61
- * are fully merged into HEAD. Pass `force: true` to use `git branch -D` for
62
- * worktree branches that were merged via the worktree merge flow but may not
63
- * appear merged from HEAD's perspective.
64
- *
65
- * Non-fatal: returns boolean success, never throws.
66
- */
67
- export declare function deleteBranch(repoRoot: string, branch: string, options?: {
68
- force?: boolean;
69
- }): boolean;
70
- export interface BranchCleanupResult {
71
- deleted: string[];
72
- errors: Array<{
73
- branch: string;
74
- error: string;
75
- }>;
76
- }
77
- /**
78
- * Find and delete local branches whose remote tracking branch is gone
79
- * (i.e., the PR was merged and GitHub auto-deleted the remote).
80
- *
81
- * Logic:
82
- * 1. `git fetch --prune` to update remote tracking state
83
- * 2. `git branch -vv` to list local branches with tracking status
84
- * 3. Find branches where tracking shows `[origin/...: gone]`
85
- * 4. Delete each with `deleteBranch()`
86
- */
87
- export declare function cleanupMergedBranches(repoRoot: string): BranchCleanupResult;
88
- export interface CleanupResult {
89
- removed: Array<{
90
- sessionId: string;
91
- worktreePath: string;
92
- branch: string;
93
- }>;
94
- errors: Array<{
95
- sessionId: string;
96
- error: string;
97
- }>;
98
- }
99
- /**
100
- * Remove worktrees associated with stale sessions.
101
- * Idempotent — if a worktree is already gone, it counts as success.
102
- */
103
- export declare function cleanupStaleWorktrees(repoRoot: string, staleSessions: Session[]): CleanupResult;
1
+ /** Create a new worktree with a fresh branch based on baseBranch. */
2
+ export declare function createWorktree(worktreePath: string, branch: string, baseBranch: string, cwd?: string): Promise<void>;
3
+ /** Merge a branch into targetBranch (fast-forward preferred). */
4
+ export declare function mergeWorktree(branch: string, targetBranch: string, cwd?: string): Promise<void>;
5
+ /** Remove a worktree and prune its reference. */
6
+ export declare function removeWorktree(worktreePath: string, cwd?: string): Promise<void>;
@@ -1,307 +1,36 @@
1
- import { execSync } from "node:child_process";
2
- import { existsSync, rmSync } from "node:fs";
3
- import { basename, dirname, resolve, join } from "node:path";
4
- import { generateSessionId, normalizePath, shellQuote, } from "../utils/platform.js";
5
- // ---------------------------------------------------------------------------
6
- // Helpers
7
- // ---------------------------------------------------------------------------
8
- /** Run a git command and return trimmed stdout. */
9
- function git(args, cwd) {
10
- try {
11
- return execSync(`git ${args}`, {
12
- cwd,
13
- encoding: "utf-8",
14
- stdio: "pipe",
15
- }).trim();
16
- }
17
- catch (err) {
18
- const message = err instanceof Error ? err.message : String(err);
19
- throw new Error(`git ${args.split(" ")[0]} failed: ${message}`);
20
- }
21
- }
22
- // ---------------------------------------------------------------------------
23
- // Public API
24
- // ---------------------------------------------------------------------------
25
- /**
26
- * Get the root directory of the current git repository.
27
- */
28
- export function getRepoRoot(cwd) {
29
- const raw = git("rev-parse --show-toplevel", cwd);
30
- return normalizePath(raw);
31
- }
32
- /**
33
- * Compute the worktree base directory: ../.forge-wt/<repo-name>/
34
- * Uses short paths to avoid Windows 260-char limit.
35
- */
36
- export function getWorktreeBaseDir(repoRoot) {
37
- const parent = dirname(resolve(repoRoot));
38
- const repoName = basename(resolve(repoRoot));
39
- return normalizePath(parent, ".forge-wt", repoName);
40
- }
41
- /**
42
- * Create a new git worktree with an auto-generated short session ID.
43
- *
44
- * Path: ../.forge-wt/<repo>/<8-char-id>/
45
- * Branch: branchName or forge/<user>/<slug>
46
- *
47
- * Returns the absolute path to the new worktree and its branch name.
48
- */
49
- export function createWorktree(repoRoot, slug, userName, options) {
50
- const sessionId = generateSessionId();
51
- const baseDir = getWorktreeBaseDir(repoRoot);
52
- const worktreePath = join(baseDir, sessionId);
53
- // Sanitize userName for use in branch refs — git rejects spaces and
54
- // most special characters in branch names.
55
- const safeName = userName
56
- .toLowerCase()
57
- .replace(/\s+/g, "-")
58
- .replace(/[^a-z0-9._/-]/g, "");
59
- const branch = options?.branchName ?? `forge/${safeName}/${slug}`;
60
- // Build the git worktree add command.
61
- // Try creating with a new branch first (-b). If the branch already exists
62
- // the command will fail, so fall back to attaching to the existing branch.
63
- const quotedPath = shellQuote(worktreePath);
64
- const quotedBranch = shellQuote(branch);
65
- const baseBranchArg = options?.baseBranch
66
- ? ` ${shellQuote(options.baseBranch)}`
67
- : "";
68
- try {
69
- // Attempt: create new branch
70
- git(`worktree add -b ${quotedBranch} ${quotedPath}${baseBranchArg}`, repoRoot);
71
- }
72
- catch {
73
- // Branch may already exist — try without -b
74
- try {
75
- git(`worktree add ${quotedPath} ${quotedBranch}`, repoRoot);
76
- }
77
- catch (err) {
78
- const message = err instanceof Error ? err.message : String(err);
79
- throw new Error(`Failed to create worktree at ${worktreePath} on branch ${branch}: ${message}`);
80
- }
1
+ import { exec } from "node:child_process";
2
+ import { promisify } from "node:util";
3
+ const execAsync = promisify(exec);
4
+ function shellQuote(arg) {
5
+ if (process.platform === "win32") {
6
+ return `"${arg}"`;
81
7
  }
82
- return { worktreePath: normalizePath(worktreePath), branch, sessionId };
8
+ return `'${arg.replace(/'/g, "'\\''")}'`;
83
9
  }
84
- /**
85
- * List all git worktrees for the repository.
86
- *
87
- * Parses the porcelain output of `git worktree list --porcelain`.
88
- * Each block is separated by a blank line and contains lines like:
89
- * worktree <path>
90
- * HEAD <sha>
91
- * branch refs/heads/<name>
92
- */
93
- export function listWorktrees(repoRoot) {
94
- const raw = git("worktree list --porcelain", repoRoot);
95
- if (!raw)
96
- return [];
97
- const blocks = raw.split("\n\n").filter((b) => b.trim().length > 0);
98
- const worktrees = [];
99
- for (const block of blocks) {
100
- const lines = block.split("\n");
101
- let path = "";
102
- let head = "";
103
- let branch = "";
104
- let isBare = false;
105
- for (const line of lines) {
106
- if (line.startsWith("worktree ")) {
107
- path = line.slice("worktree ".length);
108
- }
109
- else if (line.startsWith("HEAD ")) {
110
- head = line.slice("HEAD ".length);
111
- }
112
- else if (line.startsWith("branch ")) {
113
- // branch refs/heads/<name> → <name>
114
- const ref = line.slice("branch ".length);
115
- branch = ref.replace(/^refs\/heads\//, "");
116
- }
117
- else if (line === "bare") {
118
- isBare = true;
119
- }
120
- else if (line === "detached") {
121
- branch = "(detached)";
122
- }
123
- }
124
- if (path) {
125
- worktrees.push({
126
- path: normalizePath(path),
127
- branch,
128
- head,
129
- isMain: worktrees.length === 0 || isBare,
130
- });
131
- }
132
- }
133
- return worktrees;
134
- }
135
- /**
136
- * Remove a git worktree and clean up its directory.
137
- * Uses `git worktree remove --force` then prunes stale entries.
138
- */
139
- export function removeWorktree(repoRoot, worktreePath) {
140
- const resolved = normalizePath(worktreePath);
141
- const quoted = shellQuote(resolved);
142
- try {
143
- git(`worktree remove --force ${quoted}`, repoRoot);
144
- }
145
- catch (err) {
146
- // If the git command fails (e.g. worktree already partially removed),
147
- // we still want to clean up the directory and prune.
148
- const message = err instanceof Error ? err.message : String(err);
149
- // Only throw if the directory still exists and we can't remove it
150
- if (existsSync(resolved)) {
151
- try {
152
- rmSync(resolved, { recursive: true, force: true });
153
- }
154
- catch (rmErr) {
155
- const rmMessage = rmErr instanceof Error ? rmErr.message : String(rmErr);
156
- throw new Error(`Failed to remove worktree at ${resolved}: git error: ${message}, cleanup error: ${rmMessage}`);
157
- }
158
- }
159
- }
160
- // Clean up leftover directory if git remove succeeded but dir remains
161
- if (existsSync(resolved)) {
162
- rmSync(resolved, { recursive: true, force: true });
163
- }
164
- // Prune stale worktree entries
165
- try {
166
- git("worktree prune", repoRoot);
167
- }
168
- catch {
169
- // Non-fatal: prune is best-effort cleanup
170
- }
171
- }
172
- /**
173
- * Check if a worktree path exists and is valid (still tracked by git).
174
- */
175
- export function isWorktreeValid(worktreePath) {
176
- const resolved = normalizePath(worktreePath);
177
- if (!existsSync(resolved)) {
178
- return false;
179
- }
180
- // Determine the repo root from the worktree path itself.
181
- // A valid worktree has a .git file pointing back to the main repo.
182
- try {
183
- const repoRoot = getRepoRoot(resolved);
184
- const worktrees = listWorktrees(repoRoot);
185
- return worktrees.some((wt) => wt.path === resolved);
186
- }
187
- catch {
188
- return false;
189
- }
10
+ function git(args, cwd) {
11
+ const cmd = ["git", ...args.map(shellQuote)].join(" ");
12
+ return execAsync(cmd, { cwd });
190
13
  }
191
- // ---------------------------------------------------------------------------
192
- // Branch deletion
193
- // ---------------------------------------------------------------------------
194
- const PROTECTED_BRANCHES = new Set(["main", "master"]);
195
- /**
196
- * Delete a local branch by name.
197
- *
198
- * Safety: refuses to delete `main`, `master`, or the currently checked-out branch.
199
- *
200
- * By default uses `git branch -d` (safe delete) which only removes branches that
201
- * are fully merged into HEAD. Pass `force: true` to use `git branch -D` for
202
- * worktree branches that were merged via the worktree merge flow but may not
203
- * appear merged from HEAD's perspective.
204
- *
205
- * Non-fatal: returns boolean success, never throws.
206
- */
207
- export function deleteBranch(repoRoot, branch, options) {
208
- if (!branch || PROTECTED_BRANCHES.has(branch)) {
209
- return false;
210
- }
211
- // Don't delete the currently checked-out branch
212
- try {
213
- const current = git("rev-parse --abbrev-ref HEAD", repoRoot);
214
- if (current === branch) {
215
- return false;
216
- }
217
- }
218
- catch {
219
- // Can't determine current branch — bail out safely
220
- return false;
221
- }
222
- const flag = options?.force ? "-D" : "-d";
223
- try {
224
- git(`branch ${flag} ${shellQuote(branch)}`, repoRoot);
225
- return true;
226
- }
227
- catch {
228
- return false;
229
- }
14
+ /** Create a new worktree with a fresh branch based on baseBranch. */
15
+ export async function createWorktree(worktreePath, branch, baseBranch, cwd) {
16
+ await git(["worktree", "add", "-b", branch, worktreePath, baseBranch], cwd);
230
17
  }
231
- /**
232
- * Find and delete local branches whose remote tracking branch is gone
233
- * (i.e., the PR was merged and GitHub auto-deleted the remote).
234
- *
235
- * Logic:
236
- * 1. `git fetch --prune` to update remote tracking state
237
- * 2. `git branch -vv` to list local branches with tracking status
238
- * 3. Find branches where tracking shows `[origin/...: gone]`
239
- * 4. Delete each with `deleteBranch()`
240
- */
241
- export function cleanupMergedBranches(repoRoot) {
242
- const result = { deleted: [], errors: [] };
243
- // Prune remote tracking refs
244
- try {
245
- git("fetch --prune", repoRoot);
246
- }
247
- catch {
248
- // Non-fatal: proceed with current state
249
- }
250
- // List branches with tracking info
251
- let branchOutput;
18
+ /** Merge a branch into targetBranch (fast-forward preferred). */
19
+ export async function mergeWorktree(branch, targetBranch, cwd) {
20
+ const { stdout } = await git(["rev-parse", "--abbrev-ref", "HEAD"], cwd);
21
+ const original = stdout.trim();
252
22
  try {
253
- branchOutput = git("branch -vv", repoRoot);
23
+ await git(["checkout", targetBranch], cwd);
24
+ await git(["merge", "--ff-only", branch], cwd);
254
25
  }
255
- catch {
256
- return result;
257
- }
258
- if (!branchOutput)
259
- return result;
260
- // Parse lines like:
261
- // feat/auth abc1234 [origin/feat/auth: gone] commit message
262
- // * main def5678 [origin/main] commit message
263
- const gonePattern = /^\s*\*?\s*(\S+)\s+\S+\s+\[.+:\s*gone\]/;
264
- for (const line of branchOutput.split("\n")) {
265
- const match = line.match(gonePattern);
266
- if (!match)
267
- continue;
268
- const branch = match[1];
269
- const deleted = deleteBranch(repoRoot, branch);
270
- if (deleted) {
271
- result.deleted.push(branch);
272
- }
273
- else if (!PROTECTED_BRANCHES.has(branch)) {
274
- result.errors.push({ branch, error: "delete failed" });
26
+ finally {
27
+ if (original !== targetBranch) {
28
+ await git(["checkout", original], cwd);
275
29
  }
276
30
  }
277
- return result;
278
31
  }
279
- /**
280
- * Remove worktrees associated with stale sessions.
281
- * Idempotent — if a worktree is already gone, it counts as success.
282
- */
283
- export function cleanupStaleWorktrees(repoRoot, staleSessions) {
284
- const result = { removed: [], errors: [] };
285
- for (const session of staleSessions) {
286
- try {
287
- // If the worktree directory still exists, remove it via git
288
- if (existsSync(session.worktreePath)) {
289
- removeWorktree(repoRoot, session.worktreePath);
290
- }
291
- // Delete the worktree branch — force-delete since it was merged via worktree flow
292
- deleteBranch(repoRoot, session.branch, { force: true });
293
- // Whether it existed or not, record as successfully removed
294
- result.removed.push({
295
- sessionId: session.id,
296
- worktreePath: session.worktreePath,
297
- branch: session.branch,
298
- });
299
- }
300
- catch (err) {
301
- const message = err instanceof Error ? err.message : String(err);
302
- result.errors.push({ sessionId: session.id, error: message });
303
- }
304
- }
305
- return result;
32
+ /** Remove a worktree and prune its reference. */
33
+ export async function removeWorktree(worktreePath, cwd) {
34
+ await git(["worktree", "remove", worktreePath, "--force"], cwd);
306
35
  }
307
36
  //# sourceMappingURL=manager.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/worktree/manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC7D,OAAO,EACL,iBAAiB,EACjB,aAAa,EACb,UAAU,GACX,MAAM,sBAAsB,CAAC;AAqB9B,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E,mDAAmD;AACnD,SAAS,GAAG,CAAC,IAAY,EAAE,GAAY;IACrC,IAAI,CAAC;QACH,OAAO,QAAQ,CAAC,OAAO,IAAI,EAAE,EAAE;YAC7B,GAAG;YACH,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,MAAM;SACd,CAAC,CAAC,IAAI,EAAE,CAAC;IACZ,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,OAAO,GACX,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACnD,MAAM,IAAI,KAAK,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,OAAO,EAAE,CAAC,CAAC;IAClE,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,aAAa;AACb,8EAA8E;AAE9E;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,GAAY;IACtC,MAAM,GAAG,GAAG,GAAG,CAAC,2BAA2B,EAAE,GAAG,CAAC,CAAC;IAClD,OAAO,aAAa,CAAC,GAAG,CAAC,CAAC;AAC5B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,QAAgB;IACjD,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC1C,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC7C,OAAO,aAAa,CAAC,MAAM,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;AACtD,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,cAAc,CAC5B,QAAgB,EAChB,IAAY,EACZ,QAAgB,EAChB,OAA+B;IAE/B,MAAM,SAAS,GAAG,iBAAiB,EAAE,CAAC;IACtC,MAAM,OAAO,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IAC7C,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAC9C,oEAAoE;IACpE,2CAA2C;IAC3C,MAAM,QAAQ,GAAG,QAAQ;SACtB,WAAW,EAAE;SACb,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;SACpB,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC;IACjC,MAAM,MAAM,GAAG,OAAO,EAAE,UAAU,IAAI,SAAS,QAAQ,IAAI,IAAI,EAAE,CAAC;IAElE,sCAAsC;IACtC,0EAA0E;IAC1E,2EAA2E;IAC3E,MAAM,UAAU,GAAG,UAAU,CAAC,YAAY,CAAC,CAAC;IAC5C,MAAM,YAAY,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;IACxC,MAAM,aAAa,GAAG,OAAO,EAAE,UAAU;QACvC,CAAC,CAAC,IAAI,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE;QACtC,CAAC,CAAC,EAAE,CAAC;IAEP,IAAI,CAAC;QACH,6BAA6B;QAC7B,GAAG,CACD,mBAAmB,YAAY,IAAI,UAAU,GAAG,aAAa,EAAE,EAC/D,QAAQ,CACT,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,4CAA4C;QAC5C,IAAI,CAAC;YACH,GAAG,CACD,gBAAgB,UAAU,IAAI,YAAY,EAAE,EAC5C,QAAQ,CACT,CAAC;QACJ,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,OAAO,GACX,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACnD,MAAM,IAAI,KAAK,CACb,gCAAgC,YAAY,cAAc,MAAM,KAAK,OAAO,EAAE,CAC/E,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,EAAE,YAAY,EAAE,aAAa,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;AAC1E,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,aAAa,CAAC,QAAgB;IAC5C,MAAM,GAAG,GAAG,GAAG,CAAC,2BAA2B,EAAE,QAAQ,CAAC,CAAC;IAEvD,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC;IAEpB,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACpE,MAAM,SAAS,GAAmB,EAAE,CAAC;IAErC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAEhC,IAAI,IAAI,GAAG,EAAE,CAAC;QACd,IAAI,IAAI,GAAG,EAAE,CAAC;QACd,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,MAAM,GAAG,KAAK,CAAC;QAEnB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;gBACjC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YACxC,CAAC;iBAAM,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBACpC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YACpC,CAAC;iBAAM,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;gBACtC,sCAAsC;gBACtC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;gBACzC,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC;YAC7C,CAAC;iBAAM,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;gBAC3B,MAAM,GAAG,IAAI,CAAC;YAChB,CAAC;iBAAM,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;gBAC/B,MAAM,GAAG,YAAY,CAAC;YACxB,CAAC;QACH,CAAC;QAED,IAAI,IAAI,EAAE,CAAC;YACT,SAAS,CAAC,IAAI,CAAC;gBACb,IAAI,EAAE,aAAa,CAAC,IAAI,CAAC;gBACzB,MAAM;gBACN,IAAI;gBACJ,MAAM,EAAE,SAAS,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM;aACzC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAC5B,QAAgB,EAChB,YAAoB;IAEpB,MAAM,QAAQ,GAAG,aAAa,CAAC,YAAY,CAAC,CAAC;IAC7C,MAAM,MAAM,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;IAEpC,IAAI,CAAC;QACH,GAAG,CAAC,2BAA2B,MAAM,EAAE,EAAE,QAAQ,CAAC,CAAC;IACrD,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,sEAAsE;QACtE,qDAAqD;QACrD,MAAM,OAAO,GACX,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACnD,kEAAkE;QAClE,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzB,IAAI,CAAC;gBACH,MAAM,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YACrD,CAAC;YAAC,OAAO,KAAc,EAAE,CAAC;gBACxB,MAAM,SAAS,GACb,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACzD,MAAM,IAAI,KAAK,CACb,gCAAgC,QAAQ,gBAAgB,OAAO,oBAAoB,SAAS,EAAE,CAC/F,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,sEAAsE;IACtE,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzB,MAAM,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACrD,CAAC;IAED,+BAA+B;IAC/B,IAAI,CAAC;QACH,GAAG,CAAC,gBAAgB,EAAE,QAAQ,CAAC,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,0CAA0C;IAC5C,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,YAAoB;IAClD,MAAM,QAAQ,GAAG,aAAa,CAAC,YAAY,CAAC,CAAC;IAE7C,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,yDAAyD;IACzD,mEAAmE;IACnE,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;QACvC,MAAM,SAAS,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;QAC1C,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;IACtD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,kBAAkB;AAClB,8EAA8E;AAE9E,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;AAEvD;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,YAAY,CAC1B,QAAgB,EAChB,MAAc,EACd,OAA6B;IAE7B,IAAI,CAAC,MAAM,IAAI,kBAAkB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;QAC9C,OAAO,KAAK,CAAC;IACf,CAAC;IAED,gDAAgD;IAChD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,GAAG,CAAC,6BAA6B,EAAE,QAAQ,CAAC,CAAC;QAC7D,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;YACvB,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,mDAAmD;QACnD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,IAAI,GAAG,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IAC1C,IAAI,CAAC;QACH,GAAG,CAAC,UAAU,IAAI,IAAI,UAAU,CAAC,MAAM,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;QACtD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAWD;;;;;;;;;GASG;AACH,MAAM,UAAU,qBAAqB,CAAC,QAAgB;IACpD,MAAM,MAAM,GAAwB,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IAEhE,6BAA6B;IAC7B,IAAI,CAAC;QACH,GAAG,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC;IACjC,CAAC;IAAC,MAAM,CAAC;QACP,wCAAwC;IAC1C,CAAC;IAED,mCAAmC;IACnC,IAAI,YAAoB,CAAC;IACzB,IAAI,CAAC;QACH,YAAY,GAAG,GAAG,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;IAC7C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,IAAI,CAAC,YAAY;QAAE,OAAO,MAAM,CAAC;IAEjC,oBAAoB;IACpB,qEAAqE;IACrE,0DAA0D;IAC1D,MAAM,WAAW,GAAG,wCAAwC,CAAC;IAE7D,KAAK,MAAM,IAAI,IAAI,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QACtC,IAAI,CAAC,KAAK;YAAE,SAAS;QAErB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACxB,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC/C,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC9B,CAAC;aAAM,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3C,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAWD;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CACnC,QAAgB,EAChB,aAAwB;IAExB,MAAM,MAAM,GAAkB,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IAE1D,KAAK,MAAM,OAAO,IAAI,aAAa,EAAE,CAAC;QACpC,IAAI,CAAC;YACH,4DAA4D;YAC5D,IAAI,UAAU,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;gBACrC,cAAc,CAAC,QAAQ,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;YACjD,CAAC;YACD,kFAAkF;YAClF,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YACxD,4DAA4D;YAC5D,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC;gBAClB,SAAS,EAAE,OAAO,CAAC,EAAE;gBACrB,YAAY,EAAE,OAAO,CAAC,YAAY;gBAClC,MAAM,EAAE,OAAO,CAAC,MAAM;aACvB,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/worktree/manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;AAElC,SAAS,UAAU,CAAC,GAAW;IAC7B,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,OAAO,IAAI,GAAG,GAAG,CAAC;IACpB,CAAC;IACD,OAAO,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC;AAC3C,CAAC;AAED,SAAS,GAAG,CAAC,IAAc,EAAE,GAAY;IACvC,MAAM,GAAG,GAAG,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACvD,OAAO,SAAS,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;AACjC,CAAC;AAED,qEAAqE;AACrE,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,YAAoB,EACpB,MAAc,EACd,UAAkB,EAClB,GAAY;IAEZ,MAAM,GAAG,CAAC,CAAC,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,UAAU,CAAC,EAAE,GAAG,CAAC,CAAC;AAC9E,CAAC;AAED,iEAAiE;AACjE,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,MAAc,EACd,YAAoB,EACpB,GAAY;IAEZ,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,CAAC,CAAC,WAAW,EAAE,cAAc,EAAE,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC;IACzE,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;IAC/B,IAAI,CAAC;QACH,MAAM,GAAG,CAAC,CAAC,UAAU,EAAE,YAAY,CAAC,EAAE,GAAG,CAAC,CAAC;QAC3C,MAAM,GAAG,CAAC,CAAC,OAAO,EAAE,WAAW,EAAE,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC;IACjD,CAAC;YAAS,CAAC;QACT,IAAI,QAAQ,KAAK,YAAY,EAAE,CAAC;YAC9B,MAAM,GAAG,CAAC,CAAC,UAAU,EAAE,QAAQ,CAAC,EAAE,GAAG,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;AACH,CAAC;AAED,iDAAiD;AACjD,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,YAAoB,EACpB,GAAY;IAEZ,MAAM,GAAG,CAAC,CAAC,UAAU,EAAE,QAAQ,EAAE,YAAY,EAAE,SAAS,CAAC,EAAE,GAAG,CAAC,CAAC;AAClE,CAAC"}