hungry-ghost-hive 0.10.3 → 0.12.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
@@ -1,5 +1,11 @@
1
1
  # Hive - AI Agent Orchestrator
2
2
 
3
+ [![CI](https://img.shields.io/github/actions/workflow/status/nikrich/hungry-ghost-hive/ci.yml?branch=main&style=flat-square)](https://github.com/nikrich/hungry-ghost-hive/actions/workflows/ci.yml)
4
+ [![npm](https://img.shields.io/npm/v/hungry-ghost-hive?style=flat-square)](https://www.npmjs.com/package/hungry-ghost-hive)
5
+ [![Node.js](https://img.shields.io/badge/node-%3E%3D18-brightgreen?style=flat-square)](https://nodejs.org/)
6
+ [![License](https://img.shields.io/badge/license-MIT-blue?style=flat-square)](LICENSE)
7
+ [![TypeScript](https://img.shields.io/badge/language-TypeScript-blue?style=flat-square)](https://www.typescriptlang.org/)
8
+
3
9
  <img width="1263" height="651" alt="image" src="https://github.com/user-attachments/assets/76eb8bd9-d5ec-45b7-9ee2-b7ef910f3e88" />
4
10
 
5
11
  Hive is a CLI tool that orchestrates AI agents modeled after agile software development teams. You act as the **Product Owner**, providing requirements. Hive's AI agents handle the rest—from planning through to PR submission.
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=branches.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"branches.test.d.ts","sourceRoot":"","sources":["../../src/git/branches.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,331 @@
1
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
2
+ import * as branches from './branches.js';
3
+ // Mock execa
4
+ vi.mock('execa', () => ({
5
+ execa: vi.fn(),
6
+ }));
7
+ import { execa as mockExeca } from 'execa';
8
+ const mockedExeca = vi.mocked(mockExeca);
9
+ describe('branches module', () => {
10
+ beforeEach(() => {
11
+ vi.clearAllMocks();
12
+ });
13
+ describe('getCurrentBranch', () => {
14
+ const workDir = '/test/repo';
15
+ it('should get current branch name', async () => {
16
+ mockedExeca.mockResolvedValueOnce({
17
+ stdout: 'main\n',
18
+ stderr: '',
19
+ });
20
+ const result = await branches.getCurrentBranch(workDir);
21
+ expect(result).toBe('main');
22
+ expect(mockedExeca).toHaveBeenCalledWith('git', ['branch', '--show-current'], {
23
+ cwd: workDir,
24
+ });
25
+ });
26
+ it('should trim whitespace from branch name', async () => {
27
+ mockedExeca.mockResolvedValueOnce({
28
+ stdout: ' feature/test-branch \n',
29
+ stderr: '',
30
+ });
31
+ const result = await branches.getCurrentBranch(workDir);
32
+ expect(result).toBe('feature/test-branch');
33
+ });
34
+ it('should throw error if git command fails', async () => {
35
+ mockedExeca.mockRejectedValueOnce(new Error('Not a git repository'));
36
+ await expect(branches.getCurrentBranch(workDir)).rejects.toThrow('Not a git repository');
37
+ });
38
+ });
39
+ describe('listBranches', () => {
40
+ const workDir = '/test/repo';
41
+ it('should list all branches with their info', async () => {
42
+ mockedExeca.mockResolvedValueOnce({
43
+ stdout: `main|abc1234|
44
+ feature/test|def5678|*
45
+ bugfix/urgent|ghi9012|`,
46
+ stderr: '',
47
+ });
48
+ const result = await branches.listBranches(workDir);
49
+ expect(result).toHaveLength(3);
50
+ expect(result[0]).toEqual({
51
+ name: 'main',
52
+ current: false,
53
+ lastCommit: 'abc1234',
54
+ });
55
+ expect(result[1]).toEqual({
56
+ name: 'feature/test',
57
+ current: true,
58
+ lastCommit: 'def5678',
59
+ });
60
+ expect(result[2]).toEqual({
61
+ name: 'bugfix/urgent',
62
+ current: false,
63
+ lastCommit: 'ghi9012',
64
+ });
65
+ });
66
+ it('should handle empty branch list', async () => {
67
+ mockedExeca.mockResolvedValueOnce({
68
+ stdout: '',
69
+ stderr: '',
70
+ });
71
+ const result = await branches.listBranches(workDir);
72
+ expect(result).toHaveLength(0);
73
+ });
74
+ it('should filter empty lines', async () => {
75
+ mockedExeca.mockResolvedValueOnce({
76
+ stdout: `main|abc1234|
77
+
78
+ feature/test|def5678|
79
+ `,
80
+ stderr: '',
81
+ });
82
+ const result = await branches.listBranches(workDir);
83
+ expect(result).toHaveLength(2);
84
+ });
85
+ });
86
+ describe('createBranch', () => {
87
+ const workDir = '/test/repo';
88
+ const branchName = 'feature/new-feature';
89
+ it('should create a new branch without start point', async () => {
90
+ mockedExeca.mockResolvedValueOnce({
91
+ stdout: '',
92
+ stderr: '',
93
+ });
94
+ await branches.createBranch(workDir, branchName);
95
+ expect(mockedExeca).toHaveBeenCalledWith('git', ['branch', branchName], {
96
+ cwd: workDir,
97
+ });
98
+ });
99
+ it('should create a new branch with start point', async () => {
100
+ mockedExeca.mockResolvedValueOnce({
101
+ stdout: '',
102
+ stderr: '',
103
+ });
104
+ await branches.createBranch(workDir, branchName, 'main');
105
+ expect(mockedExeca).toHaveBeenCalledWith('git', ['branch', branchName, 'main'], {
106
+ cwd: workDir,
107
+ });
108
+ });
109
+ it('should throw error if branch already exists', async () => {
110
+ mockedExeca.mockRejectedValueOnce(new Error('fatal: A branch named feature/new-feature already exists'));
111
+ await expect(branches.createBranch(workDir, branchName)).rejects.toThrow();
112
+ });
113
+ });
114
+ describe('checkoutBranch', () => {
115
+ const workDir = '/test/repo';
116
+ const branchName = 'feature/test';
117
+ it('should checkout existing branch', async () => {
118
+ mockedExeca.mockResolvedValueOnce({
119
+ stdout: 'Switched to branch feature/test',
120
+ stderr: '',
121
+ });
122
+ await branches.checkoutBranch(workDir, branchName);
123
+ expect(mockedExeca).toHaveBeenCalledWith('git', ['checkout', branchName], {
124
+ cwd: workDir,
125
+ });
126
+ });
127
+ it('should create and checkout new branch', async () => {
128
+ mockedExeca.mockResolvedValueOnce({
129
+ stdout: 'Switched to a new branch feature/new',
130
+ stderr: '',
131
+ });
132
+ await branches.checkoutBranch(workDir, 'feature/new', true);
133
+ expect(mockedExeca).toHaveBeenCalledWith('git', ['checkout', '-b', 'feature/new'], {
134
+ cwd: workDir,
135
+ });
136
+ });
137
+ it('should throw error if branch does not exist', async () => {
138
+ mockedExeca.mockRejectedValueOnce(new Error('error: pathspec \'nonexistent\' did not match any file(s) known to git'));
139
+ await expect(branches.checkoutBranch(workDir, 'nonexistent')).rejects.toThrow();
140
+ });
141
+ });
142
+ describe('deleteBranch', () => {
143
+ const workDir = '/test/repo';
144
+ const branchName = 'feature/old';
145
+ it('should delete branch safely', async () => {
146
+ mockedExeca.mockResolvedValueOnce({
147
+ stdout: 'Deleted branch feature/old',
148
+ stderr: '',
149
+ });
150
+ await branches.deleteBranch(workDir, branchName);
151
+ expect(mockedExeca).toHaveBeenCalledWith('git', ['branch', '-d', branchName], {
152
+ cwd: workDir,
153
+ });
154
+ });
155
+ it('should force delete branch', async () => {
156
+ mockedExeca.mockResolvedValueOnce({
157
+ stdout: 'Deleted branch feature/old (was abc1234)',
158
+ stderr: '',
159
+ });
160
+ await branches.deleteBranch(workDir, branchName, true);
161
+ expect(mockedExeca).toHaveBeenCalledWith('git', ['branch', '-D', branchName], {
162
+ cwd: workDir,
163
+ });
164
+ });
165
+ it('should throw error if branch is not fully merged', async () => {
166
+ mockedExeca.mockRejectedValueOnce(new Error('error: The branch feature/old is not fully merged'));
167
+ await expect(branches.deleteBranch(workDir, branchName)).rejects.toThrow();
168
+ });
169
+ });
170
+ describe('branchExists', () => {
171
+ const workDir = '/test/repo';
172
+ it('should return true if branch exists', async () => {
173
+ mockedExeca.mockResolvedValueOnce({
174
+ stdout: 'abc1234',
175
+ stderr: '',
176
+ });
177
+ const exists = await branches.branchExists(workDir, 'main');
178
+ expect(exists).toBe(true);
179
+ expect(mockedExeca).toHaveBeenCalledWith('git', ['rev-parse', '--verify', 'main'], {
180
+ cwd: workDir,
181
+ });
182
+ });
183
+ it('should return false if branch does not exist', async () => {
184
+ mockedExeca.mockRejectedValueOnce(new Error('fatal: Needed a single revision'));
185
+ const exists = await branches.branchExists(workDir, 'nonexistent');
186
+ expect(exists).toBe(false);
187
+ });
188
+ });
189
+ describe('getBranchTracking', () => {
190
+ const workDir = '/test/repo';
191
+ const branchName = 'feature/test';
192
+ it('should get branch tracking info when upstream exists', async () => {
193
+ mockedExeca
194
+ .mockResolvedValueOnce({
195
+ stdout: 'origin/feature/test\n',
196
+ stderr: '',
197
+ })
198
+ .mockResolvedValueOnce({
199
+ stdout: '2\t5\n',
200
+ stderr: '',
201
+ });
202
+ const result = await branches.getBranchTracking(workDir, branchName);
203
+ expect(result).toEqual({
204
+ upstream: 'origin/feature/test',
205
+ ahead: 5,
206
+ behind: 2,
207
+ });
208
+ expect(mockedExeca).toHaveBeenCalledTimes(2);
209
+ });
210
+ it('should return zeros when branch has no upstream', async () => {
211
+ mockedExeca.mockRejectedValueOnce(new Error('fatal: no upstream'));
212
+ const result = await branches.getBranchTracking(workDir, branchName);
213
+ expect(result).toEqual({
214
+ upstream: null,
215
+ ahead: 0,
216
+ behind: 0,
217
+ });
218
+ });
219
+ });
220
+ describe('pushBranch', () => {
221
+ const workDir = '/test/repo';
222
+ const branchName = 'feature/test';
223
+ it('should push branch to remote', async () => {
224
+ mockedExeca.mockResolvedValueOnce({
225
+ stdout: 'To github.com:test/repo.git\n * [new branch] feature/test -> feature/test',
226
+ stderr: '',
227
+ });
228
+ await branches.pushBranch(workDir, branchName);
229
+ expect(mockedExeca).toHaveBeenCalledWith('git', ['push', 'origin', branchName], {
230
+ cwd: workDir,
231
+ });
232
+ });
233
+ it('should push branch with upstream set', async () => {
234
+ mockedExeca.mockResolvedValueOnce({
235
+ stdout: 'To github.com:test/repo.git\n * [new branch] feature/test -> feature/test\nBranch feature/test set up to track remote branch feature/test from origin.',
236
+ stderr: '',
237
+ });
238
+ await branches.pushBranch(workDir, branchName, 'origin', true);
239
+ const callArgs = mockedExeca.mock.calls[0]?.[1];
240
+ expect(callArgs[0]).toBe('push');
241
+ expect(callArgs).toContain('-u');
242
+ expect(callArgs).toContain('origin');
243
+ expect(callArgs).toContain(branchName);
244
+ });
245
+ it('should push to custom remote', async () => {
246
+ mockedExeca.mockResolvedValueOnce({
247
+ stdout: '',
248
+ stderr: '',
249
+ });
250
+ await branches.pushBranch(workDir, branchName, 'upstream');
251
+ expect(mockedExeca).toHaveBeenCalledWith('git', ['push', 'upstream', branchName], {
252
+ cwd: workDir,
253
+ });
254
+ });
255
+ it('should throw error if push fails', async () => {
256
+ mockedExeca.mockRejectedValueOnce(new Error('fatal: The current branch feature/test has no upstream branch'));
257
+ await expect(branches.pushBranch(workDir, branchName)).rejects.toThrow();
258
+ });
259
+ });
260
+ describe('createFeatureBranch', () => {
261
+ const workDir = '/test/repo';
262
+ const storyId = 'STORY-123';
263
+ const description = 'Add User Authentication';
264
+ it('should create feature branch with normalized name', async () => {
265
+ mockedExeca
266
+ .mockResolvedValueOnce({ stdout: 'Switched to branch main', stderr: '' })
267
+ .mockRejectedValueOnce(new Error('no upstream')) // git pull fails
268
+ .mockResolvedValueOnce({ stdout: 'Switched to a new branch', stderr: '' });
269
+ const result = await branches.createFeatureBranch(workDir, storyId, description);
270
+ expect(result).toBe('feature/story-123-add-user-authentication');
271
+ expect(mockedExeca).toHaveBeenCalledTimes(3);
272
+ });
273
+ it('should truncate long descriptions to 30 chars', async () => {
274
+ const longDescription = 'This is a very long description that should be truncated to maintain reasonable branch name length';
275
+ mockedExeca
276
+ .mockResolvedValueOnce({ stdout: 'Switched to branch main', stderr: '' })
277
+ .mockRejectedValueOnce(new Error('no upstream'))
278
+ .mockResolvedValueOnce({ stdout: 'Switched to a new branch', stderr: '' });
279
+ const result = await branches.createFeatureBranch(workDir, storyId, longDescription);
280
+ expect(result).toBe('feature/story-123-this-is-a-very-long-descriptio');
281
+ });
282
+ it('should handle descriptions with special characters', async () => {
283
+ const specialDescription = 'Fix: API@#$% rate-limiting & caching!';
284
+ mockedExeca
285
+ .mockResolvedValueOnce({ stdout: 'Switched to branch main', stderr: '' })
286
+ .mockRejectedValueOnce(new Error('no upstream'))
287
+ .mockResolvedValueOnce({ stdout: 'Switched to a new branch', stderr: '' });
288
+ const result = await branches.createFeatureBranch(workDir, storyId, specialDescription);
289
+ expect(result).toBe('feature/story-123-fix-api-rate-limiting-caching');
290
+ });
291
+ it('should use custom base branch', async () => {
292
+ mockedExeca
293
+ .mockResolvedValueOnce({ stdout: 'Switched to branch develop', stderr: '' })
294
+ .mockResolvedValueOnce({ stdout: 'Already up to date', stderr: '' })
295
+ .mockResolvedValueOnce({ stdout: 'Switched to a new branch', stderr: '' });
296
+ const result = await branches.createFeatureBranch(workDir, storyId, description, 'develop');
297
+ expect(result).toBe('feature/story-123-add-user-authentication');
298
+ const firstCall = mockedExeca.mock.calls[0];
299
+ expect(firstCall[1]).toContain('develop');
300
+ });
301
+ });
302
+ describe('mergeBranch', () => {
303
+ const workDir = '/test/repo';
304
+ const branchName = 'feature/test';
305
+ it('should merge branch with no-ff flag', async () => {
306
+ mockedExeca.mockResolvedValueOnce({
307
+ stdout: 'Merge made by the recursive strategy',
308
+ stderr: '',
309
+ });
310
+ await branches.mergeBranch(workDir, branchName);
311
+ expect(mockedExeca).toHaveBeenCalledWith('git', ['merge', '--no-ff', branchName], {
312
+ cwd: workDir,
313
+ });
314
+ });
315
+ it('should merge branch without no-ff flag when disabled', async () => {
316
+ mockedExeca.mockResolvedValueOnce({
317
+ stdout: 'Fast-forward',
318
+ stderr: '',
319
+ });
320
+ await branches.mergeBranch(workDir, branchName, false);
321
+ expect(mockedExeca).toHaveBeenCalledWith('git', ['merge', branchName], {
322
+ cwd: workDir,
323
+ });
324
+ });
325
+ it('should throw error if merge has conflicts', async () => {
326
+ mockedExeca.mockRejectedValueOnce(new Error('CONFLICT (content): Merge conflict in file.txt'));
327
+ await expect(branches.mergeBranch(workDir, branchName)).rejects.toThrow();
328
+ });
329
+ });
330
+ });
331
+ //# sourceMappingURL=branches.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"branches.test.js","sourceRoot":"","sources":["../../src/git/branches.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=github.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github.test.d.ts","sourceRoot":"","sources":["../../src/git/github.test.ts"],"names":[],"mappings":""}