@camaradesuk/git-worktree-tools 1.3.0 → 1.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 +290 -3
- package/dist/api/clean.d.ts +65 -0
- package/dist/api/clean.d.ts.map +1 -0
- package/dist/api/clean.js +209 -0
- package/dist/api/clean.js.map +1 -0
- package/dist/api/create.d.ts +88 -0
- package/dist/api/create.d.ts.map +1 -0
- package/dist/api/create.js +370 -0
- package/dist/api/create.js.map +1 -0
- package/dist/api/index.d.ts +15 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +19 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/list.d.ts +74 -0
- package/dist/api/list.d.ts.map +1 -0
- package/dist/api/list.js +80 -0
- package/dist/api/list.js.map +1 -0
- package/dist/api/state.d.ts +43 -0
- package/dist/api/state.d.ts.map +1 -0
- package/dist/api/state.js +70 -0
- package/dist/api/state.js.map +1 -0
- package/dist/cli/cleanpr.js +171 -28
- package/dist/cli/cleanpr.js.map +1 -1
- package/dist/cli/cleanpr.test.js +459 -7
- package/dist/cli/cleanpr.test.js.map +1 -1
- package/dist/cli/newpr.js +189 -28
- package/dist/cli/newpr.js.map +1 -1
- package/dist/cli/newpr.test.js +349 -0
- package/dist/cli/newpr.test.js.map +1 -1
- package/dist/cli/wtconfig.d.ts +14 -0
- package/dist/cli/wtconfig.d.ts.map +1 -0
- package/dist/cli/wtconfig.js +948 -0
- package/dist/cli/wtconfig.js.map +1 -0
- package/dist/cli/wtconfig.test.d.ts +5 -0
- package/dist/cli/wtconfig.test.d.ts.map +1 -0
- package/dist/cli/wtconfig.test.js +1281 -0
- package/dist/cli/wtconfig.test.js.map +1 -0
- package/dist/cli/wtlink.js +5 -0
- package/dist/cli/wtlink.js.map +1 -1
- package/dist/cli/wtstate.d.ts +8 -0
- package/dist/cli/wtstate.d.ts.map +1 -0
- package/dist/cli/wtstate.js +83 -0
- package/dist/cli/wtstate.js.map +1 -0
- package/dist/cli/wtstate.test.d.ts +5 -0
- package/dist/cli/wtstate.test.d.ts.map +1 -0
- package/dist/cli/wtstate.test.js +193 -0
- package/dist/cli/wtstate.test.js.map +1 -0
- package/dist/e2e/cleanpr/cleanpr.e2e.test.d.ts +2 -0
- package/dist/e2e/cleanpr/cleanpr.e2e.test.d.ts.map +1 -0
- package/dist/e2e/cleanpr/cleanpr.e2e.test.js +326 -0
- package/dist/e2e/cleanpr/cleanpr.e2e.test.js.map +1 -0
- package/dist/e2e/helpers/cli-runner.d.ts +103 -0
- package/dist/e2e/helpers/cli-runner.d.ts.map +1 -0
- package/dist/e2e/helpers/cli-runner.js +200 -0
- package/dist/e2e/helpers/cli-runner.js.map +1 -0
- package/dist/e2e/helpers/gh-mock.d.ts +87 -0
- package/dist/e2e/helpers/gh-mock.d.ts.map +1 -0
- package/dist/e2e/helpers/gh-mock.js +384 -0
- package/dist/e2e/helpers/gh-mock.js.map +1 -0
- package/dist/e2e/helpers/index.d.ts +12 -0
- package/dist/e2e/helpers/index.d.ts.map +1 -0
- package/dist/e2e/helpers/index.js +16 -0
- package/dist/e2e/helpers/index.js.map +1 -0
- package/dist/e2e/helpers/pty-wrapper.d.ts +118 -0
- package/dist/e2e/helpers/pty-wrapper.d.ts.map +1 -0
- package/dist/e2e/helpers/pty-wrapper.js +276 -0
- package/dist/e2e/helpers/pty-wrapper.js.map +1 -0
- package/dist/e2e/helpers/scenario-harness.d.ts +55 -0
- package/dist/e2e/helpers/scenario-harness.d.ts.map +1 -0
- package/dist/e2e/helpers/scenario-harness.js +360 -0
- package/dist/e2e/helpers/scenario-harness.js.map +1 -0
- package/dist/e2e/helpers/test-context.d.ts +120 -0
- package/dist/e2e/helpers/test-context.d.ts.map +1 -0
- package/dist/e2e/helpers/test-context.js +263 -0
- package/dist/e2e/helpers/test-context.js.map +1 -0
- package/dist/e2e/lswt/lswt.e2e.test.d.ts +2 -0
- package/dist/e2e/lswt/lswt.e2e.test.d.ts.map +1 -0
- package/dist/e2e/lswt/lswt.e2e.test.js +328 -0
- package/dist/e2e/lswt/lswt.e2e.test.js.map +1 -0
- package/dist/e2e/newpr/newpr.e2e.test.d.ts +2 -0
- package/dist/e2e/newpr/newpr.e2e.test.d.ts.map +1 -0
- package/dist/e2e/newpr/newpr.e2e.test.js +286 -0
- package/dist/e2e/newpr/newpr.e2e.test.js.map +1 -0
- package/dist/e2e/newpr/scenarios.e2e.test.d.ts +2 -0
- package/dist/e2e/newpr/scenarios.e2e.test.d.ts.map +1 -0
- package/dist/e2e/newpr/scenarios.e2e.test.js +426 -0
- package/dist/e2e/newpr/scenarios.e2e.test.js.map +1 -0
- package/dist/e2e/workflows/pr-lifecycle.e2e.test.d.ts +2 -0
- package/dist/e2e/workflows/pr-lifecycle.e2e.test.d.ts.map +1 -0
- package/dist/e2e/workflows/pr-lifecycle.e2e.test.js +298 -0
- package/dist/e2e/workflows/pr-lifecycle.e2e.test.js.map +1 -0
- package/dist/e2e/wtlink/wtlink.e2e.test.d.ts +2 -0
- package/dist/e2e/wtlink/wtlink.e2e.test.d.ts.map +1 -0
- package/dist/e2e/wtlink/wtlink.e2e.test.js +364 -0
- package/dist/e2e/wtlink/wtlink.e2e.test.js.map +1 -0
- package/dist/index.d.ts +15 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/ai/base-provider.d.ts +58 -0
- package/dist/lib/ai/base-provider.d.ts.map +1 -0
- package/dist/lib/ai/base-provider.js +246 -0
- package/dist/lib/ai/base-provider.js.map +1 -0
- package/dist/lib/ai/base-provider.test.d.ts +7 -0
- package/dist/lib/ai/base-provider.test.d.ts.map +1 -0
- package/dist/lib/ai/base-provider.test.js +320 -0
- package/dist/lib/ai/base-provider.test.js.map +1 -0
- package/dist/lib/ai/cli-provider.d.ts +87 -0
- package/dist/lib/ai/cli-provider.d.ts.map +1 -0
- package/dist/lib/ai/cli-provider.js +280 -0
- package/dist/lib/ai/cli-provider.js.map +1 -0
- package/dist/lib/ai/cli-provider.test.d.ts +5 -0
- package/dist/lib/ai/cli-provider.test.d.ts.map +1 -0
- package/dist/lib/ai/cli-provider.test.js +462 -0
- package/dist/lib/ai/cli-provider.test.js.map +1 -0
- package/dist/lib/ai/fallback-provider.d.ts +20 -0
- package/dist/lib/ai/fallback-provider.d.ts.map +1 -0
- package/dist/lib/ai/fallback-provider.js +125 -0
- package/dist/lib/ai/fallback-provider.js.map +1 -0
- package/dist/lib/ai/fallback-provider.test.d.ts +7 -0
- package/dist/lib/ai/fallback-provider.test.d.ts.map +1 -0
- package/dist/lib/ai/fallback-provider.test.js +165 -0
- package/dist/lib/ai/fallback-provider.test.js.map +1 -0
- package/dist/lib/ai/generation-service.d.ts +44 -0
- package/dist/lib/ai/generation-service.d.ts.map +1 -0
- package/dist/lib/ai/generation-service.js +107 -0
- package/dist/lib/ai/generation-service.js.map +1 -0
- package/dist/lib/ai/generation-service.test.d.ts +7 -0
- package/dist/lib/ai/generation-service.test.d.ts.map +1 -0
- package/dist/lib/ai/generation-service.test.js +213 -0
- package/dist/lib/ai/generation-service.test.js.map +1 -0
- package/dist/lib/ai/index.d.ts +19 -0
- package/dist/lib/ai/index.d.ts.map +1 -0
- package/dist/lib/ai/index.js +22 -0
- package/dist/lib/ai/index.js.map +1 -0
- package/dist/lib/ai/provider-manager.d.ts +109 -0
- package/dist/lib/ai/provider-manager.d.ts.map +1 -0
- package/dist/lib/ai/provider-manager.js +270 -0
- package/dist/lib/ai/provider-manager.js.map +1 -0
- package/dist/lib/ai/provider-manager.test.d.ts +5 -0
- package/dist/lib/ai/provider-manager.test.d.ts.map +1 -0
- package/dist/lib/ai/provider-manager.test.js +312 -0
- package/dist/lib/ai/provider-manager.test.js.map +1 -0
- package/dist/lib/ai/types.d.ts +166 -0
- package/dist/lib/ai/types.d.ts.map +1 -0
- package/dist/lib/ai/types.js +19 -0
- package/dist/lib/ai/types.js.map +1 -0
- package/dist/lib/cleanpr/args.d.ts.map +1 -1
- package/dist/lib/cleanpr/args.js +18 -0
- package/dist/lib/cleanpr/args.js.map +1 -1
- package/dist/lib/cleanpr/args.test.js +88 -11
- package/dist/lib/cleanpr/args.test.js.map +1 -1
- package/dist/lib/cleanpr/cleanup.d.ts +2 -0
- package/dist/lib/cleanpr/cleanup.d.ts.map +1 -1
- package/dist/lib/cleanpr/cleanup.js +30 -2
- package/dist/lib/cleanpr/cleanup.js.map +1 -1
- package/dist/lib/cleanpr/cleanup.test.js +37 -5
- package/dist/lib/cleanpr/cleanup.test.js.map +1 -1
- package/dist/lib/cleanpr/types.d.ts +10 -0
- package/dist/lib/cleanpr/types.d.ts.map +1 -1
- package/dist/lib/cleanpr/worktree-info.test.js +72 -1
- package/dist/lib/cleanpr/worktree-info.test.js.map +1 -1
- package/dist/lib/config.d.ts +170 -1
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +129 -2
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/config.test.js +406 -2
- package/dist/lib/config.test.js.map +1 -1
- package/dist/lib/hooks/executor.d.ts +35 -0
- package/dist/lib/hooks/executor.d.ts.map +1 -0
- package/dist/lib/hooks/executor.js +401 -0
- package/dist/lib/hooks/executor.js.map +1 -0
- package/dist/lib/hooks/executor.test.d.ts +5 -0
- package/dist/lib/hooks/executor.test.d.ts.map +1 -0
- package/dist/lib/hooks/executor.test.js +648 -0
- package/dist/lib/hooks/executor.test.js.map +1 -0
- package/dist/lib/hooks/index.d.ts +25 -0
- package/dist/lib/hooks/index.d.ts.map +1 -0
- package/dist/lib/hooks/index.js +26 -0
- package/dist/lib/hooks/index.js.map +1 -0
- package/dist/lib/hooks/templates.d.ts +74 -0
- package/dist/lib/hooks/templates.d.ts.map +1 -0
- package/dist/lib/hooks/templates.js +270 -0
- package/dist/lib/hooks/templates.js.map +1 -0
- package/dist/lib/hooks/templates.test.d.ts +5 -0
- package/dist/lib/hooks/templates.test.d.ts.map +1 -0
- package/dist/lib/hooks/templates.test.js +163 -0
- package/dist/lib/hooks/templates.test.js.map +1 -0
- package/dist/lib/hooks/types.d.ts +161 -0
- package/dist/lib/hooks/types.d.ts.map +1 -0
- package/dist/lib/hooks/types.js +73 -0
- package/dist/lib/hooks/types.js.map +1 -0
- package/dist/lib/hooks/types.test.d.ts +5 -0
- package/dist/lib/hooks/types.test.d.ts.map +1 -0
- package/dist/lib/hooks/types.test.js +132 -0
- package/dist/lib/hooks/types.test.js.map +1 -0
- package/dist/lib/json-output.d.ts +172 -0
- package/dist/lib/json-output.d.ts.map +1 -0
- package/dist/lib/json-output.js +134 -0
- package/dist/lib/json-output.js.map +1 -0
- package/dist/lib/json-output.test.d.ts +5 -0
- package/dist/lib/json-output.test.d.ts.map +1 -0
- package/dist/lib/json-output.test.js +259 -0
- package/dist/lib/json-output.test.js.map +1 -0
- package/dist/lib/lswt/action-executors.test.js +6 -0
- package/dist/lib/lswt/action-executors.test.js.map +1 -1
- package/dist/lib/newpr/action-deps.d.ts +15 -0
- package/dist/lib/newpr/action-deps.d.ts.map +1 -0
- package/dist/lib/newpr/action-deps.js +22 -0
- package/dist/lib/newpr/action-deps.js.map +1 -0
- package/dist/lib/newpr/args.d.ts.map +1 -1
- package/dist/lib/newpr/args.js +56 -0
- package/dist/lib/newpr/args.js.map +1 -1
- package/dist/lib/newpr/hook-runner.d.ts +80 -0
- package/dist/lib/newpr/hook-runner.d.ts.map +1 -0
- package/dist/lib/newpr/hook-runner.js +182 -0
- package/dist/lib/newpr/hook-runner.js.map +1 -0
- package/dist/lib/newpr/hook-runner.test.d.ts +7 -0
- package/dist/lib/newpr/hook-runner.test.d.ts.map +1 -0
- package/dist/lib/newpr/hook-runner.test.js +301 -0
- package/dist/lib/newpr/hook-runner.test.js.map +1 -0
- package/dist/lib/newpr/index.d.ts +3 -0
- package/dist/lib/newpr/index.d.ts.map +1 -1
- package/dist/lib/newpr/index.js +3 -0
- package/dist/lib/newpr/index.js.map +1 -1
- package/dist/lib/newpr/types.d.ts +9 -0
- package/dist/lib/newpr/types.d.ts.map +1 -1
- package/dist/lib/wtconfig/config-manager.d.ts +72 -0
- package/dist/lib/wtconfig/config-manager.d.ts.map +1 -0
- package/dist/lib/wtconfig/config-manager.js +408 -0
- package/dist/lib/wtconfig/config-manager.js.map +1 -0
- package/dist/lib/wtconfig/config-manager.test.d.ts +5 -0
- package/dist/lib/wtconfig/config-manager.test.d.ts.map +1 -0
- package/dist/lib/wtconfig/config-manager.test.js +501 -0
- package/dist/lib/wtconfig/config-manager.test.js.map +1 -0
- package/dist/lib/wtconfig/environment.d.ts +23 -0
- package/dist/lib/wtconfig/environment.d.ts.map +1 -0
- package/dist/lib/wtconfig/environment.js +238 -0
- package/dist/lib/wtconfig/environment.js.map +1 -0
- package/dist/lib/wtconfig/environment.test.d.ts +5 -0
- package/dist/lib/wtconfig/environment.test.d.ts.map +1 -0
- package/dist/lib/wtconfig/environment.test.js +246 -0
- package/dist/lib/wtconfig/environment.test.js.map +1 -0
- package/dist/lib/wtconfig/index.d.ts +7 -0
- package/dist/lib/wtconfig/index.d.ts.map +1 -0
- package/dist/lib/wtconfig/index.js +8 -0
- package/dist/lib/wtconfig/index.js.map +1 -0
- package/dist/lib/wtconfig/types.d.ts +97 -0
- package/dist/lib/wtconfig/types.d.ts.map +1 -0
- package/dist/lib/wtconfig/types.js +5 -0
- package/dist/lib/wtconfig/types.js.map +1 -0
- package/dist/lib/wtstate/analyze.d.ts +13 -0
- package/dist/lib/wtstate/analyze.d.ts.map +1 -0
- package/dist/lib/wtstate/analyze.js +165 -0
- package/dist/lib/wtstate/analyze.js.map +1 -0
- package/dist/lib/wtstate/analyze.test.d.ts +5 -0
- package/dist/lib/wtstate/analyze.test.d.ts.map +1 -0
- package/dist/lib/wtstate/analyze.test.js +282 -0
- package/dist/lib/wtstate/analyze.test.js.map +1 -0
- package/dist/lib/wtstate/args.d.ts +17 -0
- package/dist/lib/wtstate/args.d.ts.map +1 -0
- package/dist/lib/wtstate/args.js +91 -0
- package/dist/lib/wtstate/args.js.map +1 -0
- package/dist/lib/wtstate/args.test.d.ts +5 -0
- package/dist/lib/wtstate/args.test.d.ts.map +1 -0
- package/dist/lib/wtstate/args.test.js +120 -0
- package/dist/lib/wtstate/args.test.js.map +1 -0
- package/dist/lib/wtstate/index.d.ts +7 -0
- package/dist/lib/wtstate/index.d.ts.map +1 -0
- package/dist/lib/wtstate/index.js +8 -0
- package/dist/lib/wtstate/index.js.map +1 -0
- package/dist/lib/wtstate/types.d.ts +64 -0
- package/dist/lib/wtstate/types.d.ts.map +1 -0
- package/dist/lib/wtstate/types.js +5 -0
- package/dist/lib/wtstate/types.js.map +1 -0
- package/dist/mcp/server.d.ts +14 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +339 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/server.test.d.ts +9 -0
- package/dist/mcp/server.test.d.ts.map +1 -0
- package/dist/mcp/server.test.js +390 -0
- package/dist/mcp/server.test.js.map +1 -0
- package/package.json +8 -2
|
@@ -0,0 +1,312 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI Provider Manager Tests
|
|
3
|
+
*/
|
|
4
|
+
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
5
|
+
import { AIProviderManager, createAIProviderManager, getDefaultAIProviderManager, } from './provider-manager.js';
|
|
6
|
+
// Mock the provider modules with static checkAvailability methods
|
|
7
|
+
vi.mock('./cli-provider.js', () => {
|
|
8
|
+
const createMockProviderClass = () => {
|
|
9
|
+
const MockClass = vi.fn();
|
|
10
|
+
MockClass.checkAvailability = vi.fn().mockResolvedValue(true);
|
|
11
|
+
return MockClass;
|
|
12
|
+
};
|
|
13
|
+
return {
|
|
14
|
+
ClaudeProvider: createMockProviderClass(),
|
|
15
|
+
GeminiProvider: createMockProviderClass(),
|
|
16
|
+
OllamaProvider: createMockProviderClass(),
|
|
17
|
+
OpenAIProvider: createMockProviderClass(),
|
|
18
|
+
ScriptProvider: vi.fn(),
|
|
19
|
+
};
|
|
20
|
+
});
|
|
21
|
+
vi.mock('./fallback-provider.js', () => ({
|
|
22
|
+
FallbackProvider: vi.fn(),
|
|
23
|
+
}));
|
|
24
|
+
import { ClaudeProvider, GeminiProvider, OllamaProvider, OpenAIProvider } from './cli-provider.js';
|
|
25
|
+
import { FallbackProvider } from './fallback-provider.js';
|
|
26
|
+
describe('provider-manager', () => {
|
|
27
|
+
const mockProvider = (name, available, result) => ({
|
|
28
|
+
name,
|
|
29
|
+
isAvailable: vi.fn().mockResolvedValue(available),
|
|
30
|
+
generateBranchName: vi
|
|
31
|
+
.fn()
|
|
32
|
+
.mockResolvedValue(result ?? { success: true, content: 'test-branch', provider: name }),
|
|
33
|
+
generatePRTitle: vi
|
|
34
|
+
.fn()
|
|
35
|
+
.mockResolvedValue(result ?? { success: true, content: 'Test PR', provider: name }),
|
|
36
|
+
generatePRDescription: vi
|
|
37
|
+
.fn()
|
|
38
|
+
.mockResolvedValue(result ?? { success: true, content: 'Test description', provider: name }),
|
|
39
|
+
generateCommitMessage: vi
|
|
40
|
+
.fn()
|
|
41
|
+
.mockResolvedValue(result ?? { success: true, content: 'test commit', provider: name }),
|
|
42
|
+
generatePlanDocument: vi
|
|
43
|
+
.fn()
|
|
44
|
+
.mockResolvedValue(result ?? { success: true, content: '# Plan', provider: name }),
|
|
45
|
+
});
|
|
46
|
+
beforeEach(() => {
|
|
47
|
+
vi.clearAllMocks();
|
|
48
|
+
// Reset module state
|
|
49
|
+
vi.resetModules();
|
|
50
|
+
// Reset static checkAvailability mocks to default (return true)
|
|
51
|
+
ClaudeProvider.checkAvailability = vi.fn().mockResolvedValue(true);
|
|
52
|
+
GeminiProvider.checkAvailability = vi.fn().mockResolvedValue(true);
|
|
53
|
+
OllamaProvider.checkAvailability = vi.fn().mockResolvedValue(true);
|
|
54
|
+
OpenAIProvider.checkAvailability = vi.fn().mockResolvedValue(true);
|
|
55
|
+
});
|
|
56
|
+
describe('AIProviderManager', () => {
|
|
57
|
+
describe('constructor', () => {
|
|
58
|
+
it('creates manager with default config', () => {
|
|
59
|
+
const manager = new AIProviderManager();
|
|
60
|
+
const config = manager.getConfig();
|
|
61
|
+
// Default config has AI disabled
|
|
62
|
+
expect(config.provider).toBe('none');
|
|
63
|
+
expect(config.branchName).toBe(false);
|
|
64
|
+
expect(config.prTitle).toBe(false);
|
|
65
|
+
expect(config.prDescription).toBe(false);
|
|
66
|
+
});
|
|
67
|
+
it('creates manager with custom config', () => {
|
|
68
|
+
const manager = new AIProviderManager({
|
|
69
|
+
config: {
|
|
70
|
+
provider: 'claude',
|
|
71
|
+
branchName: false,
|
|
72
|
+
prTitle: true,
|
|
73
|
+
prDescription: false,
|
|
74
|
+
commitMessage: true,
|
|
75
|
+
planDocument: false,
|
|
76
|
+
},
|
|
77
|
+
});
|
|
78
|
+
const config = manager.getConfig();
|
|
79
|
+
expect(config.provider).toBe('claude');
|
|
80
|
+
expect(config.branchName).toBe(false);
|
|
81
|
+
expect(config.prTitle).toBe(true);
|
|
82
|
+
expect(config.prDescription).toBe(false);
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
describe('initialize', () => {
|
|
86
|
+
it('initializes with auto provider detection', async () => {
|
|
87
|
+
const claudeProvider = mockProvider('claude', true);
|
|
88
|
+
vi.mocked(ClaudeProvider).mockImplementation(() => claudeProvider);
|
|
89
|
+
const manager = new AIProviderManager({ config: { provider: 'auto' } });
|
|
90
|
+
await manager.initialize();
|
|
91
|
+
const providerName = await manager.getActiveProviderName();
|
|
92
|
+
expect(providerName).toBe('claude');
|
|
93
|
+
});
|
|
94
|
+
it('skips unavailable providers during auto-detection', async () => {
|
|
95
|
+
const claudeProvider = mockProvider('claude', false);
|
|
96
|
+
const geminiProvider = mockProvider('gemini', true);
|
|
97
|
+
vi.mocked(ClaudeProvider).mockImplementation(() => claudeProvider);
|
|
98
|
+
vi.mocked(GeminiProvider).mockImplementation(() => geminiProvider);
|
|
99
|
+
// Mock static checkAvailability for lazy initialization
|
|
100
|
+
ClaudeProvider.checkAvailability = vi.fn().mockResolvedValue(false);
|
|
101
|
+
GeminiProvider.checkAvailability = vi.fn().mockResolvedValue(true);
|
|
102
|
+
const manager = new AIProviderManager({ config: { provider: 'auto' } });
|
|
103
|
+
await manager.initialize();
|
|
104
|
+
const providerName = await manager.getActiveProviderName();
|
|
105
|
+
expect(providerName).toBe('gemini');
|
|
106
|
+
});
|
|
107
|
+
it('initializes specific provider when configured', async () => {
|
|
108
|
+
const openaiProvider = mockProvider('openai', true);
|
|
109
|
+
vi.mocked(OpenAIProvider).mockImplementation(() => openaiProvider);
|
|
110
|
+
const manager = new AIProviderManager({ config: { provider: 'openai' } });
|
|
111
|
+
await manager.initialize();
|
|
112
|
+
const providerName = await manager.getActiveProviderName();
|
|
113
|
+
expect(providerName).toBe('openai');
|
|
114
|
+
});
|
|
115
|
+
it('initializes fallback provider when configured', async () => {
|
|
116
|
+
const claudeProvider = mockProvider('claude', true);
|
|
117
|
+
const ollamaProvider = mockProvider('ollama', true);
|
|
118
|
+
vi.mocked(ClaudeProvider).mockImplementation(() => claudeProvider);
|
|
119
|
+
vi.mocked(OllamaProvider).mockImplementation(() => ollamaProvider);
|
|
120
|
+
const manager = new AIProviderManager({
|
|
121
|
+
config: { provider: 'claude', fallback: 'ollama' },
|
|
122
|
+
});
|
|
123
|
+
await manager.initialize();
|
|
124
|
+
expect(ClaudeProvider).toHaveBeenCalled();
|
|
125
|
+
expect(OllamaProvider).toHaveBeenCalled();
|
|
126
|
+
});
|
|
127
|
+
it('only initializes once', async () => {
|
|
128
|
+
const claudeProvider = mockProvider('claude', true);
|
|
129
|
+
vi.mocked(ClaudeProvider).mockImplementation(() => claudeProvider);
|
|
130
|
+
const manager = new AIProviderManager({ config: { provider: 'claude' } });
|
|
131
|
+
await manager.initialize();
|
|
132
|
+
await manager.initialize();
|
|
133
|
+
expect(ClaudeProvider).toHaveBeenCalledTimes(1);
|
|
134
|
+
});
|
|
135
|
+
});
|
|
136
|
+
describe('getProvider', () => {
|
|
137
|
+
it('returns primary provider when available', async () => {
|
|
138
|
+
const claudeProvider = mockProvider('claude', true);
|
|
139
|
+
vi.mocked(ClaudeProvider).mockImplementation(() => claudeProvider);
|
|
140
|
+
const manager = new AIProviderManager({ config: { provider: 'claude' } });
|
|
141
|
+
const provider = await manager.getProvider();
|
|
142
|
+
expect(provider.name).toBe('claude');
|
|
143
|
+
});
|
|
144
|
+
it('returns fallback provider when primary unavailable', async () => {
|
|
145
|
+
const claudeProvider = mockProvider('claude', false);
|
|
146
|
+
const geminiProvider = mockProvider('gemini', true);
|
|
147
|
+
vi.mocked(ClaudeProvider).mockImplementation(() => claudeProvider);
|
|
148
|
+
vi.mocked(GeminiProvider).mockImplementation(() => geminiProvider);
|
|
149
|
+
// Mock static checkAvailability for lazy initialization
|
|
150
|
+
ClaudeProvider.checkAvailability = vi.fn().mockResolvedValue(false);
|
|
151
|
+
GeminiProvider.checkAvailability = vi.fn().mockResolvedValue(true);
|
|
152
|
+
const manager = new AIProviderManager({
|
|
153
|
+
config: { provider: 'claude', fallback: 'gemini' },
|
|
154
|
+
});
|
|
155
|
+
const provider = await manager.getProvider();
|
|
156
|
+
expect(provider.name).toBe('gemini');
|
|
157
|
+
});
|
|
158
|
+
it('returns FallbackProvider when no providers available', async () => {
|
|
159
|
+
const claudeProvider = mockProvider('claude', false);
|
|
160
|
+
vi.mocked(ClaudeProvider).mockImplementation(() => claudeProvider);
|
|
161
|
+
// Mock static checkAvailability for lazy initialization
|
|
162
|
+
ClaudeProvider.checkAvailability = vi.fn().mockResolvedValue(false);
|
|
163
|
+
const fallbackProvider = mockProvider('fallback', true);
|
|
164
|
+
vi.mocked(FallbackProvider).mockImplementation(() => fallbackProvider);
|
|
165
|
+
const manager = new AIProviderManager({ config: { provider: 'claude' } });
|
|
166
|
+
const provider = await manager.getProvider();
|
|
167
|
+
expect(provider.name).toBe('fallback');
|
|
168
|
+
});
|
|
169
|
+
});
|
|
170
|
+
describe('isEnabled', () => {
|
|
171
|
+
it('returns true for enabled features', () => {
|
|
172
|
+
const manager = new AIProviderManager({
|
|
173
|
+
config: { branchName: true, prTitle: false },
|
|
174
|
+
});
|
|
175
|
+
expect(manager.isEnabled('branchName')).toBe(true);
|
|
176
|
+
expect(manager.isEnabled('prTitle')).toBe(false);
|
|
177
|
+
});
|
|
178
|
+
});
|
|
179
|
+
describe('generation methods', () => {
|
|
180
|
+
it('generateBranchName uses provider', async () => {
|
|
181
|
+
const claudeProvider = mockProvider('claude', true);
|
|
182
|
+
vi.mocked(ClaudeProvider).mockImplementation(() => claudeProvider);
|
|
183
|
+
const manager = new AIProviderManager({ config: { provider: 'claude' } });
|
|
184
|
+
const result = await manager.generateBranchName({
|
|
185
|
+
description: 'Add feature',
|
|
186
|
+
repoName: 'test-repo',
|
|
187
|
+
branchPrefix: 'feat',
|
|
188
|
+
});
|
|
189
|
+
expect(result.success).toBe(true);
|
|
190
|
+
expect(claudeProvider.generateBranchName).toHaveBeenCalled();
|
|
191
|
+
});
|
|
192
|
+
it('generatePRTitle uses provider', async () => {
|
|
193
|
+
const claudeProvider = mockProvider('claude', true);
|
|
194
|
+
vi.mocked(ClaudeProvider).mockImplementation(() => claudeProvider);
|
|
195
|
+
const manager = new AIProviderManager({ config: { provider: 'claude' } });
|
|
196
|
+
const result = await manager.generatePRTitle({
|
|
197
|
+
description: 'Add feature',
|
|
198
|
+
branchName: 'feat/add-feature',
|
|
199
|
+
baseBranch: 'main',
|
|
200
|
+
});
|
|
201
|
+
expect(result.success).toBe(true);
|
|
202
|
+
expect(claudeProvider.generatePRTitle).toHaveBeenCalled();
|
|
203
|
+
});
|
|
204
|
+
it('generatePRDescription uses provider', async () => {
|
|
205
|
+
const claudeProvider = mockProvider('claude', true);
|
|
206
|
+
vi.mocked(ClaudeProvider).mockImplementation(() => claudeProvider);
|
|
207
|
+
const manager = new AIProviderManager({ config: { provider: 'claude' } });
|
|
208
|
+
const result = await manager.generatePRDescription({
|
|
209
|
+
description: 'Add feature',
|
|
210
|
+
branchName: 'feat/add-feature',
|
|
211
|
+
baseBranch: 'main',
|
|
212
|
+
});
|
|
213
|
+
expect(result.success).toBe(true);
|
|
214
|
+
expect(claudeProvider.generatePRDescription).toHaveBeenCalled();
|
|
215
|
+
});
|
|
216
|
+
it('generateCommitMessage uses provider', async () => {
|
|
217
|
+
const claudeProvider = mockProvider('claude', true);
|
|
218
|
+
vi.mocked(ClaudeProvider).mockImplementation(() => claudeProvider);
|
|
219
|
+
const manager = new AIProviderManager({ config: { provider: 'claude' } });
|
|
220
|
+
const result = await manager.generateCommitMessage({
|
|
221
|
+
stagedFiles: ['src/index.ts'],
|
|
222
|
+
style: 'conventional',
|
|
223
|
+
});
|
|
224
|
+
expect(result.success).toBe(true);
|
|
225
|
+
expect(claudeProvider.generateCommitMessage).toHaveBeenCalled();
|
|
226
|
+
});
|
|
227
|
+
it('generatePlanDocument uses provider', async () => {
|
|
228
|
+
const claudeProvider = mockProvider('claude', true);
|
|
229
|
+
vi.mocked(ClaudeProvider).mockImplementation(() => claudeProvider);
|
|
230
|
+
const manager = new AIProviderManager({ config: { provider: 'claude' } });
|
|
231
|
+
const result = await manager.generatePlanDocument({
|
|
232
|
+
description: 'Add feature',
|
|
233
|
+
branchName: 'feat/add-feature',
|
|
234
|
+
});
|
|
235
|
+
expect(result.success).toBe(true);
|
|
236
|
+
expect(claudeProvider.generatePlanDocument).toHaveBeenCalled();
|
|
237
|
+
});
|
|
238
|
+
it('falls back when primary fails', async () => {
|
|
239
|
+
const claudeProvider = mockProvider('claude', true, {
|
|
240
|
+
success: false,
|
|
241
|
+
error: 'API error',
|
|
242
|
+
provider: 'claude',
|
|
243
|
+
});
|
|
244
|
+
const geminiProvider = mockProvider('gemini', true, {
|
|
245
|
+
success: true,
|
|
246
|
+
content: 'fallback-branch',
|
|
247
|
+
provider: 'gemini',
|
|
248
|
+
});
|
|
249
|
+
vi.mocked(ClaudeProvider).mockImplementation(() => claudeProvider);
|
|
250
|
+
vi.mocked(GeminiProvider).mockImplementation(() => geminiProvider);
|
|
251
|
+
const manager = new AIProviderManager({
|
|
252
|
+
config: { provider: 'claude', fallback: 'gemini' },
|
|
253
|
+
});
|
|
254
|
+
const result = await manager.generateBranchName({
|
|
255
|
+
description: 'Add feature',
|
|
256
|
+
repoName: 'test-repo',
|
|
257
|
+
branchPrefix: 'feat',
|
|
258
|
+
});
|
|
259
|
+
expect(result.success).toBe(true);
|
|
260
|
+
expect(result.content).toBe('fallback-branch');
|
|
261
|
+
});
|
|
262
|
+
});
|
|
263
|
+
describe('getAvailableProviders', () => {
|
|
264
|
+
it('returns list of available providers', async () => {
|
|
265
|
+
const claudeProvider = mockProvider('claude', true);
|
|
266
|
+
const geminiProvider = mockProvider('gemini', false);
|
|
267
|
+
const ollamaProvider = mockProvider('ollama', true);
|
|
268
|
+
const openaiProvider = mockProvider('openai', false);
|
|
269
|
+
vi.mocked(ClaudeProvider).mockImplementation(() => claudeProvider);
|
|
270
|
+
vi.mocked(GeminiProvider).mockImplementation(() => geminiProvider);
|
|
271
|
+
vi.mocked(OllamaProvider).mockImplementation(() => ollamaProvider);
|
|
272
|
+
vi.mocked(OpenAIProvider).mockImplementation(() => openaiProvider);
|
|
273
|
+
// Mock static checkAvailability for lazy initialization
|
|
274
|
+
ClaudeProvider.checkAvailability = vi.fn().mockResolvedValue(true);
|
|
275
|
+
GeminiProvider.checkAvailability = vi.fn().mockResolvedValue(false);
|
|
276
|
+
OllamaProvider.checkAvailability = vi.fn().mockResolvedValue(true);
|
|
277
|
+
OpenAIProvider.checkAvailability = vi.fn().mockResolvedValue(false);
|
|
278
|
+
const manager = new AIProviderManager();
|
|
279
|
+
const available = await manager.getAvailableProviders();
|
|
280
|
+
expect(available).toContain('claude');
|
|
281
|
+
expect(available).toContain('ollama');
|
|
282
|
+
expect(available).not.toContain('gemini');
|
|
283
|
+
expect(available).not.toContain('openai');
|
|
284
|
+
});
|
|
285
|
+
});
|
|
286
|
+
});
|
|
287
|
+
describe('createAIProviderManager', () => {
|
|
288
|
+
it('creates a new manager instance', () => {
|
|
289
|
+
const manager = createAIProviderManager();
|
|
290
|
+
expect(manager).toBeInstanceOf(AIProviderManager);
|
|
291
|
+
});
|
|
292
|
+
it('creates manager with provided config', () => {
|
|
293
|
+
const config = { provider: 'gemini', branchName: false };
|
|
294
|
+
const manager = createAIProviderManager(config);
|
|
295
|
+
expect(manager.getConfig().provider).toBe('gemini');
|
|
296
|
+
expect(manager.getConfig().branchName).toBe(false);
|
|
297
|
+
});
|
|
298
|
+
});
|
|
299
|
+
describe('getDefaultAIProviderManager', () => {
|
|
300
|
+
it('returns a manager instance', () => {
|
|
301
|
+
const manager = getDefaultAIProviderManager();
|
|
302
|
+
expect(manager).toBeInstanceOf(AIProviderManager);
|
|
303
|
+
});
|
|
304
|
+
it('creates new manager when config provided', () => {
|
|
305
|
+
getDefaultAIProviderManager({ provider: 'claude' });
|
|
306
|
+
const manager2 = getDefaultAIProviderManager({ provider: 'gemini' });
|
|
307
|
+
// Second call with config creates new manager
|
|
308
|
+
expect(manager2.getConfig().provider).toBe('gemini');
|
|
309
|
+
});
|
|
310
|
+
});
|
|
311
|
+
});
|
|
312
|
+
//# sourceMappingURL=provider-manager.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider-manager.test.js","sourceRoot":"","sources":["../../../src/lib/ai/provider-manager.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI Provider types and interfaces
|
|
3
|
+
*
|
|
4
|
+
* Defines the contracts for AI content generation providers.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Context for generating branch names
|
|
8
|
+
*/
|
|
9
|
+
export interface BranchContext {
|
|
10
|
+
/** User-provided description/intent for the branch */
|
|
11
|
+
description: string;
|
|
12
|
+
/** Repository name */
|
|
13
|
+
repoName: string;
|
|
14
|
+
/** Branch prefix from config (e.g., 'feat', 'fix') */
|
|
15
|
+
branchPrefix: string;
|
|
16
|
+
/** List of existing branch names to avoid collisions */
|
|
17
|
+
existingBranches?: string[];
|
|
18
|
+
/** Maximum length for branch name */
|
|
19
|
+
maxLength?: number;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Context for generating PR titles and descriptions
|
|
23
|
+
*/
|
|
24
|
+
export interface PRContext {
|
|
25
|
+
/** User-provided description/intent for the PR */
|
|
26
|
+
description: string;
|
|
27
|
+
/** Git diff content */
|
|
28
|
+
diff?: string;
|
|
29
|
+
/** List of commits in the PR */
|
|
30
|
+
commits?: CommitInfo[];
|
|
31
|
+
/** Branch name */
|
|
32
|
+
branchName: string;
|
|
33
|
+
/** Base branch (e.g., 'main') */
|
|
34
|
+
baseBranch: string;
|
|
35
|
+
/** List of changed files */
|
|
36
|
+
changedFiles?: string[];
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Commit information for context
|
|
40
|
+
*/
|
|
41
|
+
export interface CommitInfo {
|
|
42
|
+
/** Commit hash (short) */
|
|
43
|
+
hash: string;
|
|
44
|
+
/** Commit message */
|
|
45
|
+
message: string;
|
|
46
|
+
/** Commit author */
|
|
47
|
+
author?: string;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Context for generating commit messages
|
|
51
|
+
*/
|
|
52
|
+
export interface CommitContext {
|
|
53
|
+
/** List of staged files */
|
|
54
|
+
stagedFiles: string[];
|
|
55
|
+
/** Git diff of staged changes */
|
|
56
|
+
diff?: string;
|
|
57
|
+
/** Recent commit messages for style reference */
|
|
58
|
+
recentCommits?: string[];
|
|
59
|
+
/** Commit message style */
|
|
60
|
+
style?: 'conventional' | 'gitmoji' | 'simple';
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Context for generating plan documents
|
|
64
|
+
*/
|
|
65
|
+
export interface PlanContext {
|
|
66
|
+
/** User-provided description/intent */
|
|
67
|
+
description: string;
|
|
68
|
+
/** Key files and folders in the repo */
|
|
69
|
+
repoStructure?: string[];
|
|
70
|
+
/** Tech stack detected */
|
|
71
|
+
techStack?: string[];
|
|
72
|
+
/** Branch name */
|
|
73
|
+
branchName: string;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Result from AI generation
|
|
77
|
+
*/
|
|
78
|
+
export interface AIGenerationResult {
|
|
79
|
+
/** Whether generation succeeded */
|
|
80
|
+
success: boolean;
|
|
81
|
+
/** Generated content */
|
|
82
|
+
content?: string;
|
|
83
|
+
/** Error message if failed */
|
|
84
|
+
error?: string;
|
|
85
|
+
/** Provider used */
|
|
86
|
+
provider: string;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* AI Provider interface
|
|
90
|
+
*
|
|
91
|
+
* Each provider (Claude, Gemini, OpenAI, Ollama, etc.) implements this interface.
|
|
92
|
+
*/
|
|
93
|
+
export interface AIProvider {
|
|
94
|
+
/** Provider name for identification */
|
|
95
|
+
readonly name: string;
|
|
96
|
+
/** Check if provider is available/configured */
|
|
97
|
+
isAvailable(): Promise<boolean>;
|
|
98
|
+
/** Generate a branch name from description */
|
|
99
|
+
generateBranchName(context: BranchContext): Promise<AIGenerationResult>;
|
|
100
|
+
/** Generate a PR title from context */
|
|
101
|
+
generatePRTitle(context: PRContext): Promise<AIGenerationResult>;
|
|
102
|
+
/** Generate a PR description/body from context */
|
|
103
|
+
generatePRDescription(context: PRContext): Promise<AIGenerationResult>;
|
|
104
|
+
/** Generate a commit message from context */
|
|
105
|
+
generateCommitMessage(context: CommitContext): Promise<AIGenerationResult>;
|
|
106
|
+
/** Generate a plan document from context */
|
|
107
|
+
generatePlanDocument(context: PlanContext): Promise<AIGenerationResult>;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* AI Provider configuration from .worktreerc
|
|
111
|
+
*/
|
|
112
|
+
export interface AIConfig {
|
|
113
|
+
/** Provider to use: 'auto' | 'claude' | 'gemini' | 'openai' | 'ollama' | 'script' | 'none' */
|
|
114
|
+
provider?: AIProviderName;
|
|
115
|
+
/** Fallback provider if primary fails */
|
|
116
|
+
fallback?: AIProviderName;
|
|
117
|
+
/** Enable AI for branch names */
|
|
118
|
+
branchName?: boolean;
|
|
119
|
+
/** Enable AI for PR titles */
|
|
120
|
+
prTitle?: boolean;
|
|
121
|
+
/** Enable AI for PR descriptions */
|
|
122
|
+
prDescription?: boolean;
|
|
123
|
+
/** Enable AI for commit messages */
|
|
124
|
+
commitMessage?: boolean;
|
|
125
|
+
/** Enable AI for plan documents */
|
|
126
|
+
planDocument?: boolean;
|
|
127
|
+
/** Branch naming style */
|
|
128
|
+
branchStyle?: 'conventional' | 'kebab' | 'snake';
|
|
129
|
+
/** Commit message style */
|
|
130
|
+
commitStyle?: 'conventional' | 'gitmoji' | 'simple';
|
|
131
|
+
/** Path to PR description template */
|
|
132
|
+
prTemplate?: string;
|
|
133
|
+
/** Path to plan document template */
|
|
134
|
+
planTemplate?: string;
|
|
135
|
+
/** Claude-specific settings */
|
|
136
|
+
claude?: {
|
|
137
|
+
model?: string;
|
|
138
|
+
};
|
|
139
|
+
/** Gemini-specific settings */
|
|
140
|
+
gemini?: {
|
|
141
|
+
model?: string;
|
|
142
|
+
};
|
|
143
|
+
/** OpenAI-specific settings */
|
|
144
|
+
openai?: {
|
|
145
|
+
model?: string;
|
|
146
|
+
apiKeyEnv?: string;
|
|
147
|
+
};
|
|
148
|
+
/** Ollama-specific settings */
|
|
149
|
+
ollama?: {
|
|
150
|
+
model?: string;
|
|
151
|
+
host?: string;
|
|
152
|
+
};
|
|
153
|
+
/** Custom script provider settings */
|
|
154
|
+
script?: {
|
|
155
|
+
path: string;
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Available AI provider names
|
|
160
|
+
*/
|
|
161
|
+
export type AIProviderName = 'auto' | 'claude' | 'gemini' | 'openai' | 'ollama' | 'script' | 'fallback' | 'none';
|
|
162
|
+
/**
|
|
163
|
+
* Default AI configuration
|
|
164
|
+
*/
|
|
165
|
+
export declare const DEFAULT_AI_CONFIG: AIConfig;
|
|
166
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/lib/ai/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI Provider types and interfaces
|
|
3
|
+
*
|
|
4
|
+
* Defines the contracts for AI content generation providers.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Default AI configuration
|
|
8
|
+
*/
|
|
9
|
+
export const DEFAULT_AI_CONFIG = {
|
|
10
|
+
provider: 'none',
|
|
11
|
+
branchName: false,
|
|
12
|
+
prTitle: false,
|
|
13
|
+
prDescription: false,
|
|
14
|
+
commitMessage: false,
|
|
15
|
+
planDocument: false,
|
|
16
|
+
branchStyle: 'kebab',
|
|
17
|
+
commitStyle: 'conventional',
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/lib/ai/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAyLH;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAa;IACzC,QAAQ,EAAE,MAAM;IAChB,UAAU,EAAE,KAAK;IACjB,OAAO,EAAE,KAAK;IACd,aAAa,EAAE,KAAK;IACpB,aAAa,EAAE,KAAK;IACpB,YAAY,EAAE,KAAK;IACnB,WAAW,EAAE,OAAO;IACpB,WAAW,EAAE,cAAc;CAC5B,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"args.d.ts","sourceRoot":"","sources":["../../../src/lib/cleanpr/args.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAgB,WAAW,EAAE,MAAM,YAAY,CAAC;AAE5D;;;GAGG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,WAAW,
|
|
1
|
+
{"version":3,"file":"args.d.ts","sourceRoot":"","sources":["../../../src/lib/cleanpr/args.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAgB,WAAW,EAAE,MAAM,YAAY,CAAC;AAE5D;;;GAGG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,WAAW,CAqDrD;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,MAAM,CAoCpC"}
|
package/dist/lib/cleanpr/args.js
CHANGED
|
@@ -12,6 +12,8 @@ export function parseArgs(argv) {
|
|
|
12
12
|
force: false,
|
|
13
13
|
all: false,
|
|
14
14
|
interactive: true,
|
|
15
|
+
json: false,
|
|
16
|
+
dryRun: false,
|
|
15
17
|
};
|
|
16
18
|
for (const arg of argv) {
|
|
17
19
|
switch (arg) {
|
|
@@ -31,6 +33,13 @@ export function parseArgs(argv) {
|
|
|
31
33
|
options.all = true;
|
|
32
34
|
options.interactive = false;
|
|
33
35
|
break;
|
|
36
|
+
case '--json':
|
|
37
|
+
options.json = true;
|
|
38
|
+
break;
|
|
39
|
+
case '-n':
|
|
40
|
+
case '--dry-run':
|
|
41
|
+
options.dryRun = true;
|
|
42
|
+
break;
|
|
34
43
|
default:
|
|
35
44
|
if (arg.startsWith('-')) {
|
|
36
45
|
return { kind: 'error', message: `Unknown option: ${arg}` };
|
|
@@ -66,6 +75,10 @@ OPTIONS
|
|
|
66
75
|
-a, --all Clean all merged/closed PR worktrees (non-interactive)
|
|
67
76
|
-h, --help Show this help message
|
|
68
77
|
|
|
78
|
+
AI/AUTOMATION OPTIONS
|
|
79
|
+
--json Output result as JSON for programmatic parsing
|
|
80
|
+
-n, --dry-run Preview what would be cleaned without making changes
|
|
81
|
+
|
|
69
82
|
EXAMPLES
|
|
70
83
|
cleanpr # Interactive mode - select worktrees to clean
|
|
71
84
|
cleanpr 2245 # Remove worktree and local branch for PR #2245
|
|
@@ -73,6 +86,11 @@ EXAMPLES
|
|
|
73
86
|
cleanpr 2245 -f -r # Force cleanup and delete remote
|
|
74
87
|
cleanpr --all # Clean all merged/closed PRs
|
|
75
88
|
|
|
89
|
+
# AI/Automation usage
|
|
90
|
+
cleanpr --all --json # Clean all and output JSON result
|
|
91
|
+
cleanpr --all --dry-run --json
|
|
92
|
+
# Preview cleanup as JSON
|
|
93
|
+
|
|
76
94
|
WHAT IT REMOVES
|
|
77
95
|
- Git worktree directory
|
|
78
96
|
- Local branch associated with the PR
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"args.js","sourceRoot":"","sources":["../../../src/lib/cleanpr/args.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,IAAc;IACtC,IAAI,QAAQ,GAAkB,IAAI,CAAC;IACnC,MAAM,OAAO,GAAiB;QAC5B,YAAY,EAAE,KAAK;QACnB,KAAK,EAAE,KAAK;QACZ,GAAG,EAAE,KAAK;QACV,WAAW,EAAE,IAAI;
|
|
1
|
+
{"version":3,"file":"args.js","sourceRoot":"","sources":["../../../src/lib/cleanpr/args.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,IAAc;IACtC,IAAI,QAAQ,GAAkB,IAAI,CAAC;IACnC,MAAM,OAAO,GAAiB;QAC5B,YAAY,EAAE,KAAK;QACnB,KAAK,EAAE,KAAK;QACZ,GAAG,EAAE,KAAK;QACV,WAAW,EAAE,IAAI;QACjB,IAAI,EAAE,KAAK;QACX,MAAM,EAAE,KAAK;KACd,CAAC;IAEF,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,QAAQ,GAAG,EAAE,CAAC;YACZ,KAAK,IAAI,CAAC;YACV,KAAK,QAAQ;gBACX,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;YAC1B,KAAK,IAAI,CAAC;YACV,KAAK,UAAU;gBACb,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;gBAC5B,MAAM;YACR,KAAK,IAAI,CAAC;YACV,KAAK,SAAS;gBACZ,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;gBACrB,MAAM;YACR,KAAK,IAAI,CAAC;YACV,KAAK,OAAO;gBACV,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC;gBACnB,OAAO,CAAC,WAAW,GAAG,KAAK,CAAC;gBAC5B,MAAM;YACR,KAAK,QAAQ;gBACX,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;gBACpB,MAAM;YACR,KAAK,IAAI,CAAC;YACV,KAAK,WAAW;gBACd,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;gBACtB,MAAM;YACR;gBACE,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;oBACxB,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,mBAAmB,GAAG,EAAE,EAAE,CAAC;gBAC9D,CAAC;gBACD,CAAC;oBACC,oBAAoB;oBACpB,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;oBAC9B,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;wBACf,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,sBAAsB,GAAG,EAAE,EAAE,CAAC;oBACjE,CAAC;oBACD,QAAQ,GAAG,GAAG,CAAC;oBACf,OAAO,CAAC,WAAW,GAAG,KAAK,CAAC;gBAC9B,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;AAChD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW;IACzB,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkCR,CAAC;AACF,CAAC"}
|