gitgrip 0.3.0 → 0.4.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/README.md CHANGED
@@ -29,6 +29,15 @@ Inspired by Android's [repo tool](https://source.android.com/docs/setup/create/r
29
29
 
30
30
  ## Installation
31
31
 
32
+ ### Homebrew (macOS/Linux)
33
+
34
+ ```bash
35
+ brew tap laynepenney/tap
36
+ brew install gitgrip
37
+ ```
38
+
39
+ ### npm
40
+
32
41
  ```bash
33
42
  npm install -g gitgrip
34
43
  ```
@@ -107,7 +116,11 @@ gr sync
107
116
  | `gr pr create` | Create linked PRs |
108
117
  | `gr pr status` | Show PR status |
109
118
  | `gr pr merge` | Merge all linked PRs |
119
+ | `gr repo add <url>` | Add a new repository to workspace |
110
120
  | `gr forall -c "cmd"` | Run command in each repo |
121
+ | `gr griptree add <branch>` | Create a worktree-based workspace |
122
+ | `gr griptree list` | List all griptrees |
123
+ | `gr griptree remove <branch>` | Remove a griptree |
111
124
 
112
125
  ### Command Details
113
126
 
@@ -159,6 +172,19 @@ Merge all linked PRs atomically.
159
172
  | `--no-delete-branch` | Keep branches after merge |
160
173
  | `-f, --force` | Merge even if checks pending |
161
174
 
175
+ #### `gr repo add <url>`
176
+
177
+ Add a new repository to the workspace. Parses the URL, updates the manifest, and optionally clones the repo.
178
+
179
+ | Option | Description |
180
+ |--------|-------------|
181
+ | `--path <path>` | Local path (default: `./<repo-name>`) |
182
+ | `--name <name>` | Name in manifest (default: from URL) |
183
+ | `--branch <branch>` | Default branch (default: `main`) |
184
+ | `--no-clone` | Only update manifest, skip cloning |
185
+
186
+ If the workspace is on a feature branch, the new repo will be checked out to that branch automatically.
187
+
162
188
  #### `gr forall -c "<command>"`
163
189
 
164
190
  Run a command in each repository (like AOSP's `repo forall`).
@@ -271,6 +297,47 @@ repos:
271
297
  baseUrl: https://gitlab.company.com
272
298
  ```
273
299
 
300
+ ## Griptrees (Multi-Branch Workspaces)
301
+
302
+ Work on multiple branches simultaneously without switching. Griptrees use git worktrees to create parallel workspace directories.
303
+
304
+ <p align="center">
305
+ <img src="assets/griptree-concept.svg" alt="Griptrees Concept" width="700">
306
+ </p>
307
+
308
+ ```bash
309
+ # Create a griptree for a feature branch
310
+ gr griptree add feat/new-feature
311
+
312
+ # Creates a sibling directory with all repos on that branch:
313
+ # ../feat-new-feature/
314
+ # ├── frontend/
315
+ # ├── backend/
316
+ # └── shared/
317
+
318
+ # Work in the griptree
319
+ cd ../feat-new-feature
320
+ gr status
321
+
322
+ # List all griptrees
323
+ gr griptree list
324
+
325
+ # Lock to prevent accidental removal
326
+ gr griptree lock feat/new-feature
327
+
328
+ # Remove when done (branches are preserved)
329
+ gr griptree remove feat/new-feature
330
+ ```
331
+
332
+ <p align="center">
333
+ <img src="assets/griptree-workflow.svg" alt="Griptree Workflow" width="700">
334
+ </p>
335
+
336
+ **Benefits:**
337
+ - No branch switching required
338
+ - Shared git objects (fast creation, minimal disk usage)
339
+ - Independent working directories
340
+
274
341
  ## Shorthand
275
342
 
276
343
  Use `gr` as the primary command:
@@ -0,0 +1,118 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 500">
2
+ <defs>
3
+ <linearGradient id="mainGrad" x1="0%" y1="0%" x2="100%" y2="100%">
4
+ <stop offset="0%" style="stop-color:#10B981;stop-opacity:1" />
5
+ <stop offset="100%" style="stop-color:#059669;stop-opacity:1" />
6
+ </linearGradient>
7
+ <linearGradient id="treeGrad" x1="0%" y1="0%" x2="100%" y2="100%">
8
+ <stop offset="0%" style="stop-color:#3B82F6;stop-opacity:1" />
9
+ <stop offset="100%" style="stop-color:#1D4ED8;stop-opacity:1" />
10
+ </linearGradient>
11
+ <linearGradient id="repoGrad" x1="0%" y1="0%" x2="0%" y2="100%">
12
+ <stop offset="0%" style="stop-color:#374151;stop-opacity:1" />
13
+ <stop offset="100%" style="stop-color:#1F2937;stop-opacity:1" />
14
+ </linearGradient>
15
+ <filter id="shadow" x="-20%" y="-20%" width="140%" height="140%">
16
+ <feDropShadow dx="2" dy="4" stdDeviation="4" flood-opacity="0.2"/>
17
+ </filter>
18
+ </defs>
19
+
20
+ <!-- Background -->
21
+ <rect width="800" height="500" fill="#0F172A"/>
22
+
23
+ <!-- Title -->
24
+ <text x="400" y="45" font-family="system-ui, -apple-system, sans-serif" font-size="28" font-weight="bold" fill="#F8FAFC" text-anchor="middle">Griptrees: Multi-Branch Workspaces</text>
25
+ <text x="400" y="75" font-family="system-ui, -apple-system, sans-serif" font-size="14" fill="#94A3B8" text-anchor="middle">Work on multiple features simultaneously without switching branches</text>
26
+
27
+ <!-- Main Workspace Box -->
28
+ <g transform="translate(50, 110)">
29
+ <rect x="0" y="0" width="220" height="280" rx="12" fill="url(#mainGrad)" filter="url(#shadow)"/>
30
+ <text x="110" y="30" font-family="system-ui, -apple-system, sans-serif" font-size="16" font-weight="bold" fill="white" text-anchor="middle">Main Workspace</text>
31
+ <text x="110" y="50" font-family="monospace" font-size="12" fill="#D1FAE5" text-anchor="middle">branch: main</text>
32
+
33
+ <!-- Repos in main -->
34
+ <g transform="translate(20, 70)">
35
+ <rect x="0" y="0" width="180" height="45" rx="6" fill="url(#repoGrad)"/>
36
+ <text x="15" y="20" font-family="monospace" font-size="11" fill="#10B981">frontend/</text>
37
+ <text x="15" y="35" font-family="monospace" font-size="10" fill="#6B7280">.git/objects (shared)</text>
38
+ </g>
39
+ <g transform="translate(20, 125)">
40
+ <rect x="0" y="0" width="180" height="45" rx="6" fill="url(#repoGrad)"/>
41
+ <text x="15" y="20" font-family="monospace" font-size="11" fill="#10B981">backend/</text>
42
+ <text x="15" y="35" font-family="monospace" font-size="10" fill="#6B7280">.git/objects (shared)</text>
43
+ </g>
44
+ <g transform="translate(20, 180)">
45
+ <rect x="0" y="0" width="180" height="45" rx="6" fill="url(#repoGrad)"/>
46
+ <text x="15" y="20" font-family="monospace" font-size="11" fill="#10B981">shared/</text>
47
+ <text x="15" y="35" font-family="monospace" font-size="10" fill="#6B7280">.git/objects (shared)</text>
48
+ </g>
49
+ </g>
50
+
51
+ <!-- Griptree 1 -->
52
+ <g transform="translate(290, 110)">
53
+ <rect x="0" y="0" width="220" height="280" rx="12" fill="url(#treeGrad)" filter="url(#shadow)"/>
54
+ <text x="110" y="30" font-family="system-ui, -apple-system, sans-serif" font-size="16" font-weight="bold" fill="white" text-anchor="middle">Griptree: feat/auth</text>
55
+ <text x="110" y="50" font-family="monospace" font-size="12" fill="#BFDBFE" text-anchor="middle">branch: feat/auth</text>
56
+
57
+ <!-- Repos as worktrees -->
58
+ <g transform="translate(20, 70)">
59
+ <rect x="0" y="0" width="180" height="45" rx="6" fill="url(#repoGrad)"/>
60
+ <text x="15" y="20" font-family="monospace" font-size="11" fill="#60A5FA">frontend/</text>
61
+ <text x="15" y="35" font-family="monospace" font-size="10" fill="#6B7280">worktree (instant)</text>
62
+ </g>
63
+ <g transform="translate(20, 125)">
64
+ <rect x="0" y="0" width="180" height="45" rx="6" fill="url(#repoGrad)"/>
65
+ <text x="15" y="20" font-family="monospace" font-size="11" fill="#60A5FA">backend/</text>
66
+ <text x="15" y="35" font-family="monospace" font-size="10" fill="#6B7280">worktree (instant)</text>
67
+ </g>
68
+ <g transform="translate(20, 180)">
69
+ <rect x="0" y="0" width="180" height="45" rx="6" fill="url(#repoGrad)"/>
70
+ <text x="15" y="20" font-family="monospace" font-size="11" fill="#60A5FA">shared/</text>
71
+ <text x="15" y="35" font-family="monospace" font-size="10" fill="#6B7280">worktree (instant)</text>
72
+ </g>
73
+ </g>
74
+
75
+ <!-- Griptree 2 -->
76
+ <g transform="translate(530, 110)">
77
+ <rect x="0" y="0" width="220" height="280" rx="12" fill="url(#treeGrad)" filter="url(#shadow)"/>
78
+ <text x="110" y="30" font-family="system-ui, -apple-system, sans-serif" font-size="16" font-weight="bold" fill="white" text-anchor="middle">Griptree: feat/api</text>
79
+ <text x="110" y="50" font-family="monospace" font-size="12" fill="#BFDBFE" text-anchor="middle">branch: feat/api</text>
80
+
81
+ <!-- Repos as worktrees -->
82
+ <g transform="translate(20, 70)">
83
+ <rect x="0" y="0" width="180" height="45" rx="6" fill="url(#repoGrad)"/>
84
+ <text x="15" y="20" font-family="monospace" font-size="11" fill="#60A5FA">frontend/</text>
85
+ <text x="15" y="35" font-family="monospace" font-size="10" fill="#6B7280">worktree (instant)</text>
86
+ </g>
87
+ <g transform="translate(20, 125)">
88
+ <rect x="0" y="0" width="180" height="45" rx="6" fill="url(#repoGrad)"/>
89
+ <text x="15" y="20" font-family="monospace" font-size="11" fill="#60A5FA">backend/</text>
90
+ <text x="15" y="35" font-family="monospace" font-size="10" fill="#6B7280">worktree (instant)</text>
91
+ </g>
92
+ <g transform="translate(20, 180)">
93
+ <rect x="0" y="0" width="180" height="45" rx="6" fill="url(#repoGrad)"/>
94
+ <text x="15" y="20" font-family="monospace" font-size="11" fill="#60A5FA">shared/</text>
95
+ <text x="15" y="35" font-family="monospace" font-size="10" fill="#6B7280">worktree (instant)</text>
96
+ </g>
97
+ </g>
98
+
99
+ <!-- Connecting arrows showing shared objects -->
100
+ <defs>
101
+ <marker id="arrowhead" markerWidth="10" markerHeight="7" refX="9" refY="3.5" orient="auto">
102
+ <polygon points="0 0, 10 3.5, 0 7" fill="#10B981"/>
103
+ </marker>
104
+ </defs>
105
+
106
+ <!-- Curved lines from main to griptrees -->
107
+ <path d="M 270 250 Q 280 200 290 250" stroke="#10B981" stroke-width="2" fill="none" stroke-dasharray="5,5"/>
108
+ <path d="M 270 250 Q 400 150 530 250" stroke="#10B981" stroke-width="2" fill="none" stroke-dasharray="5,5"/>
109
+
110
+ <!-- Legend -->
111
+ <g transform="translate(50, 420)">
112
+ <rect x="0" y="0" width="700" height="65" rx="8" fill="#1E293B"/>
113
+ <text x="20" y="25" font-family="system-ui, -apple-system, sans-serif" font-size="13" font-weight="bold" fill="#F8FAFC">Benefits:</text>
114
+ <text x="20" y="48" font-family="system-ui, -apple-system, sans-serif" font-size="12" fill="#94A3B8">No branch switching needed</text>
115
+ <text x="200" y="48" font-family="system-ui, -apple-system, sans-serif" font-size="12" fill="#94A3B8">Shared git objects (minimal disk)</text>
116
+ <text x="430" y="48" font-family="system-ui, -apple-system, sans-serif" font-size="12" fill="#94A3B8">Instant creation via git worktree</text>
117
+ </g>
118
+ </svg>
@@ -0,0 +1,79 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 300">
2
+ <defs>
3
+ <linearGradient id="cmdGrad" x1="0%" y1="0%" x2="100%" y2="0%">
4
+ <stop offset="0%" style="stop-color:#10B981"/>
5
+ <stop offset="100%" style="stop-color:#059669"/>
6
+ </linearGradient>
7
+ <filter id="glow">
8
+ <feGaussianBlur stdDeviation="2" result="coloredBlur"/>
9
+ <feMerge>
10
+ <feMergeNode in="coloredBlur"/>
11
+ <feMergeNode in="SourceGraphic"/>
12
+ </feMerge>
13
+ </filter>
14
+ </defs>
15
+
16
+ <!-- Background -->
17
+ <rect width="800" height="300" fill="#0F172A"/>
18
+
19
+ <!-- Title -->
20
+ <text x="400" y="35" font-family="system-ui, -apple-system, sans-serif" font-size="20" font-weight="bold" fill="#F8FAFC" text-anchor="middle">Griptree Workflow</text>
21
+
22
+ <!-- Step 1: Create -->
23
+ <g transform="translate(60, 70)">
24
+ <rect x="0" y="0" width="180" height="90" rx="10" fill="#1E293B" stroke="#10B981" stroke-width="2"/>
25
+ <text x="90" y="25" font-family="system-ui, -apple-system, sans-serif" font-size="14" font-weight="bold" fill="#10B981" text-anchor="middle">1. Create</text>
26
+ <text x="90" y="50" font-family="monospace" font-size="11" fill="#94A3B8" text-anchor="middle">gr griptree add</text>
27
+ <text x="90" y="68" font-family="monospace" font-size="11" fill="#60A5FA" text-anchor="middle">feat/my-feature</text>
28
+ </g>
29
+
30
+ <!-- Arrow 1 -->
31
+ <path d="M 250 115 L 300 115" stroke="#10B981" stroke-width="2" marker-end="url(#arrow)"/>
32
+ <defs>
33
+ <marker id="arrow" markerWidth="10" markerHeight="10" refX="8" refY="5" orient="auto">
34
+ <path d="M 0 0 L 10 5 L 0 10 Z" fill="#10B981"/>
35
+ </marker>
36
+ </defs>
37
+
38
+ <!-- Step 2: Work -->
39
+ <g transform="translate(310, 70)">
40
+ <rect x="0" y="0" width="180" height="90" rx="10" fill="#1E293B" stroke="#3B82F6" stroke-width="2"/>
41
+ <text x="90" y="25" font-family="system-ui, -apple-system, sans-serif" font-size="14" font-weight="bold" fill="#3B82F6" text-anchor="middle">2. Work</text>
42
+ <text x="90" y="50" font-family="monospace" font-size="11" fill="#94A3B8" text-anchor="middle">cd ../feat-my-feature</text>
43
+ <text x="90" y="68" font-family="monospace" font-size="11" fill="#94A3B8" text-anchor="middle">gr status / commit / push</text>
44
+ </g>
45
+
46
+ <!-- Arrow 2 -->
47
+ <path d="M 500 115 L 550 115" stroke="#3B82F6" stroke-width="2" marker-end="url(#arrow2)"/>
48
+ <defs>
49
+ <marker id="arrow2" markerWidth="10" markerHeight="10" refX="8" refY="5" orient="auto">
50
+ <path d="M 0 0 L 10 5 L 0 10 Z" fill="#3B82F6"/>
51
+ </marker>
52
+ </defs>
53
+
54
+ <!-- Step 3: Remove -->
55
+ <g transform="translate(560, 70)">
56
+ <rect x="0" y="0" width="180" height="90" rx="10" fill="#1E293B" stroke="#F59E0B" stroke-width="2"/>
57
+ <text x="90" y="25" font-family="system-ui, -apple-system, sans-serif" font-size="14" font-weight="bold" fill="#F59E0B" text-anchor="middle">3. Cleanup</text>
58
+ <text x="90" y="50" font-family="monospace" font-size="11" fill="#94A3B8" text-anchor="middle">gr griptree remove</text>
59
+ <text x="90" y="68" font-family="monospace" font-size="11" fill="#60A5FA" text-anchor="middle">feat/my-feature</text>
60
+ </g>
61
+
62
+ <!-- Commands reference -->
63
+ <g transform="translate(60, 190)">
64
+ <rect x="0" y="0" width="680" height="90" rx="8" fill="#1E293B"/>
65
+ <text x="20" y="25" font-family="system-ui, -apple-system, sans-serif" font-size="13" font-weight="bold" fill="#F8FAFC">Quick Reference:</text>
66
+
67
+ <text x="20" y="50" font-family="monospace" font-size="11" fill="#10B981">gr griptree add &lt;branch&gt;</text>
68
+ <text x="200" y="50" font-family="system-ui, sans-serif" font-size="11" fill="#6B7280">Create parallel workspace</text>
69
+
70
+ <text x="20" y="70" font-family="monospace" font-size="11" fill="#10B981">gr griptree list</text>
71
+ <text x="200" y="70" font-family="system-ui, sans-serif" font-size="11" fill="#6B7280">Show all griptrees</text>
72
+
73
+ <text x="380" y="50" font-family="monospace" font-size="11" fill="#10B981">gr griptree lock &lt;branch&gt;</text>
74
+ <text x="560" y="50" font-family="system-ui, sans-serif" font-size="11" fill="#6B7280">Protect from removal</text>
75
+
76
+ <text x="380" y="70" font-family="monospace" font-size="11" fill="#10B981">gr griptree remove &lt;branch&gt;</text>
77
+ <text x="590" y="70" font-family="system-ui, sans-serif" font-size="11" fill="#6B7280">Remove worktrees</text>
78
+ </g>
79
+ </svg>
@@ -4,6 +4,7 @@ interface CommitOptions {
4
4
  }
5
5
  /**
6
6
  * Commit staged changes across all repositories
7
+ * Uses two-phase parallel approach for better performance
7
8
  */
8
9
  export declare function commit(options: CommitOptions): Promise<void>;
9
10
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"commit.d.ts","sourceRoot":"","sources":["../../src/commands/commit.ts"],"names":[],"mappings":"AAMA,UAAU,aAAa;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAkCD;;GAEG;AACH,wBAAsB,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA4ElE"}
1
+ {"version":3,"file":"commit.d.ts","sourceRoot":"","sources":["../../src/commands/commit.ts"],"names":[],"mappings":"AAMA,UAAU,aAAa;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAuCD;;;GAGG;AACH,wBAAsB,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAiFlE"}
@@ -26,6 +26,7 @@ async function commitChanges(repoPath, message) {
26
26
  }
27
27
  /**
28
28
  * Commit staged changes across all repositories
29
+ * Uses two-phase parallel approach for better performance
29
30
  */
30
31
  export async function commit(options) {
31
32
  const { message, all = false } = options;
@@ -40,13 +41,12 @@ export async function commit(options) {
40
41
  if (manifestInfo && await isGitRepo(manifestInfo.absolutePath)) {
41
42
  repos = [...repos, manifestInfo];
42
43
  }
43
- const results = [];
44
- let hasChanges = false;
45
44
  console.log(chalk.blue('Checking repositories for changes...\n'));
46
- for (const repo of repos) {
45
+ // Phase 1: Check status and optionally stage changes in parallel
46
+ const repoInfoResults = await Promise.all(repos.map(async (repo) => {
47
47
  const exists = await pathExists(repo.absolutePath);
48
48
  if (!exists) {
49
- continue;
49
+ return null;
50
50
  }
51
51
  // If --all flag, stage all changes first
52
52
  if (all) {
@@ -57,29 +57,31 @@ export async function commit(options) {
57
57
  }
58
58
  // Check if there are staged changes
59
59
  const hasStaged = await hasStagedChanges(repo.absolutePath);
60
- if (!hasStaged) {
61
- continue;
60
+ return { repo, hasStaged };
61
+ }));
62
+ // Filter to repos with staged changes
63
+ const reposToCommit = repoInfoResults.filter((info) => info !== null && info.hasStaged);
64
+ if (reposToCommit.length === 0) {
65
+ console.log(chalk.yellow('No staged changes to commit in any repository.'));
66
+ if (!all) {
67
+ console.log(chalk.dim('Use --all to stage and commit all changes, or stage changes with git add first.'));
62
68
  }
63
- hasChanges = true;
69
+ return;
70
+ }
71
+ // Phase 2: Commit in parallel
72
+ const results = await Promise.all(reposToCommit.map(async ({ repo }) => {
64
73
  const spinner = ora(`Committing ${repo.name}...`).start();
65
74
  try {
66
75
  await commitChanges(repo.absolutePath, message);
67
76
  spinner.succeed(`${repo.name}: committed`);
68
- results.push({ repo, success: true, committed: true });
77
+ return { repo, success: true, committed: true };
69
78
  }
70
79
  catch (error) {
71
80
  const errorMsg = error instanceof Error ? error.message : String(error);
72
81
  spinner.fail(`${repo.name}: ${errorMsg}`);
73
- results.push({ repo, success: false, committed: false, error: errorMsg });
74
- }
75
- }
76
- if (!hasChanges) {
77
- console.log(chalk.yellow('No staged changes to commit in any repository.'));
78
- if (!all) {
79
- console.log(chalk.dim('Use --all to stage and commit all changes, or stage changes with git add first.'));
82
+ return { repo, success: false, committed: false, error: errorMsg };
80
83
  }
81
- return;
82
- }
84
+ }));
83
85
  // Summary
84
86
  console.log('');
85
87
  const committed = results.filter((r) => r.committed).length;
@@ -1 +1 @@
1
- {"version":3,"file":"commit.js","sourceRoot":"","sources":["../../src/commands/commit.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"commit.js","sourceRoot":"","sources":["../../src/commands/commit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACvF,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,qBAAqB,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAe7F;;GAEG;AACH,KAAK,UAAU,gBAAgB,CAAC,QAAgB;IAC9C,MAAM,GAAG,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;IACrC,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,MAAM,EAAE,CAAC;IAClC,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;AAClC,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,QAAQ,CAAC,QAAgB;IACtC,MAAM,GAAG,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;IACrC,MAAM,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACtB,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,aAAa,CAAC,QAAgB,EAAE,OAAe;IAC5D,MAAM,GAAG,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;IACrC,MAAM,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AAC5B,CAAC;AAOD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,OAAsB;IACjD,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,KAAK,EAAE,GAAG,OAAO,CAAC;IAEzC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC,CAAC;QACzE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,MAAM,YAAY,EAAE,CAAC;IACnD,IAAI,KAAK,GAAe,cAAc,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAE1D,qCAAqC;IACrC,MAAM,YAAY,GAAG,mBAAmB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC5D,IAAI,YAAY,IAAI,MAAM,SAAS,CAAC,YAAY,CAAC,YAAY,CAAC,EAAE,CAAC;QAC/D,KAAK,GAAG,CAAC,GAAG,KAAK,EAAE,YAAY,CAAC,CAAC;IACnC,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC,CAAC;IAElE,iEAAiE;IACjE,MAAM,eAAe,GAAG,MAAM,OAAO,CAAC,GAAG,CACvC,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAkC,EAAE;QACvD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACnD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,IAAI,CAAC;QACd,CAAC;QAED,yCAAyC;QACzC,IAAI,GAAG,EAAE,CAAC;YACR,MAAM,iBAAiB,GAAG,MAAM,qBAAqB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACzE,IAAI,iBAAiB,EAAE,CAAC;gBACtB,MAAM,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACpC,CAAC;QACH,CAAC;QAED,oCAAoC;QACpC,MAAM,SAAS,GAAG,MAAM,gBAAgB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC5D,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;IAC7B,CAAC,CAAC,CACH,CAAC;IAEF,sCAAsC;IACtC,MAAM,aAAa,GAAG,eAAe,CAAC,MAAM,CAC1C,CAAC,IAAI,EAA0B,EAAE,CAAC,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,SAAS,CAClE,CAAC;IAEF,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,gDAAgD,CAAC,CAAC,CAAC;QAC5E,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,iFAAiF,CAAC,CAAC,CAAC;QAC5G,CAAC;QACD,OAAO;IACT,CAAC;IAED,8BAA8B;IAC9B,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,aAAa,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,EAAyB,EAAE;QAC1D,MAAM,OAAO,GAAG,GAAG,CAAC,cAAc,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC;QAE1D,IAAI,CAAC;YACH,MAAM,aAAa,CAAC,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;YAChD,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,IAAI,aAAa,CAAC,CAAC;YAC3C,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QAClD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,QAAQ,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACxE,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC,CAAC;YAC1C,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;QACrE,CAAC;IACH,CAAC,CAAC,CACH,CAAC;IAEF,UAAU;IACV,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC;IAC5D,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;IAExD,IAAI,MAAM,KAAK,CAAC,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,gBAAgB,SAAS,iBAAiB,CAAC,CAAC,CAAC;IACvE,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,gBAAgB,SAAS,mBAAmB,MAAM,UAAU,CAAC,CAAC,CAAC;IAC1F,CAAC;AACH,CAAC"}
@@ -0,0 +1,27 @@
1
+ interface GriptreeAddOptions {
2
+ path?: string;
3
+ }
4
+ /**
5
+ * Create a griptree (worktree-based workspace) for a branch
6
+ */
7
+ export declare function griptreeAdd(branch: string, options?: GriptreeAddOptions): Promise<void>;
8
+ /**
9
+ * List all griptrees in the workspace
10
+ */
11
+ export declare function griptreeList(): Promise<void>;
12
+ /**
13
+ * Remove a griptree
14
+ */
15
+ export declare function griptreeRemove(branch: string, options?: {
16
+ force?: boolean;
17
+ }): Promise<void>;
18
+ /**
19
+ * Lock a griptree to prevent accidental removal
20
+ */
21
+ export declare function griptreeLock(branch: string): Promise<void>;
22
+ /**
23
+ * Unlock a griptree
24
+ */
25
+ export declare function griptreeUnlock(branch: string): Promise<void>;
26
+ export {};
27
+ //# sourceMappingURL=griptree.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"griptree.d.ts","sourceRoot":"","sources":["../../src/commands/griptree.ts"],"names":[],"mappings":"AAUA,UAAU,kBAAkB;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAuED;;GAEG;AACH,wBAAsB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,CA2HjG;AAED;;GAEG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAgFlD;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CA8ErG;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAmBhE;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAmBlE"}