@howlil/ez-agents 2.0.0 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -21
- package/README.md +93 -93
- package/agents/ez-plan-checker.md +2 -2
- package/agents/ez-research-synthesizer.md +1 -1
- package/agents/ez-ui-researcher.md +1 -1
- package/agents/ez-verifier.md +1 -1
- package/bin/install.js +132 -132
- package/get-shit-done/bin/lib/assistant-adapter.cjs +205 -205
- package/get-shit-done/bin/lib/audit-exec.cjs +150 -150
- package/get-shit-done/bin/lib/auth.cjs +175 -175
- package/get-shit-done/bin/lib/circuit-breaker.cjs +118 -118
- package/get-shit-done/bin/lib/commands.cjs +666 -666
- package/get-shit-done/bin/lib/config.cjs +183 -183
- package/get-shit-done/bin/lib/core.cjs +495 -495
- package/get-shit-done/bin/lib/file-lock.cjs +236 -236
- package/get-shit-done/bin/lib/frontmatter.cjs +299 -299
- package/get-shit-done/bin/lib/fs-utils.cjs +153 -153
- package/get-shit-done/bin/lib/git-utils.cjs +203 -203
- package/get-shit-done/bin/lib/health-check.cjs +163 -163
- package/get-shit-done/bin/lib/index.cjs +113 -113
- package/get-shit-done/bin/lib/init.cjs +710 -710
- package/get-shit-done/bin/lib/logger.cjs +117 -117
- package/get-shit-done/bin/lib/milestone.cjs +241 -241
- package/get-shit-done/bin/lib/model-provider.cjs +146 -146
- package/get-shit-done/bin/lib/phase.cjs +908 -908
- package/get-shit-done/bin/lib/retry.cjs +119 -119
- package/get-shit-done/bin/lib/roadmap.cjs +305 -305
- package/get-shit-done/bin/lib/safe-exec.cjs +128 -128
- package/get-shit-done/bin/lib/safe-path.cjs +130 -130
- package/get-shit-done/bin/lib/state.cjs +721 -721
- package/get-shit-done/bin/lib/temp-file.cjs +239 -239
- package/get-shit-done/bin/lib/template.cjs +222 -222
- package/get-shit-done/bin/lib/test-file-lock.cjs +112 -112
- package/get-shit-done/bin/lib/test-graceful.cjs +93 -93
- package/get-shit-done/bin/lib/test-logger.cjs +60 -60
- package/get-shit-done/bin/lib/test-safe-exec.cjs +38 -38
- package/get-shit-done/bin/lib/test-safe-path.cjs +33 -33
- package/get-shit-done/bin/lib/test-temp-file.cjs +125 -125
- package/get-shit-done/bin/lib/timeout-exec.cjs +62 -62
- package/get-shit-done/bin/lib/verify.cjs +820 -820
- package/get-shit-done/references/checkpoints.md +776 -776
- package/get-shit-done/references/questioning.md +162 -162
- package/get-shit-done/references/tdd.md +263 -263
- package/get-shit-done/templates/codebase/concerns.md +310 -310
- package/get-shit-done/templates/codebase/conventions.md +307 -307
- package/get-shit-done/templates/codebase/integrations.md +280 -280
- package/get-shit-done/templates/codebase/stack.md +186 -186
- package/get-shit-done/templates/codebase/testing.md +480 -480
- package/get-shit-done/templates/config.json +37 -37
- package/get-shit-done/templates/continue-here.md +78 -78
- package/get-shit-done/templates/milestone-archive.md +123 -123
- package/get-shit-done/templates/milestone.md +115 -115
- package/get-shit-done/templates/requirements.md +231 -231
- package/get-shit-done/templates/research-project/ARCHITECTURE.md +204 -204
- package/get-shit-done/templates/research-project/FEATURES.md +147 -147
- package/get-shit-done/templates/research-project/PITFALLS.md +200 -200
- package/get-shit-done/templates/research-project/STACK.md +120 -120
- package/get-shit-done/templates/research-project/SUMMARY.md +170 -170
- package/get-shit-done/templates/retrospective.md +54 -54
- package/get-shit-done/templates/roadmap.md +202 -202
- package/get-shit-done/templates/summary-minimal.md +41 -41
- package/get-shit-done/templates/summary-standard.md +48 -48
- package/get-shit-done/templates/summary.md +248 -248
- package/get-shit-done/templates/user-setup.md +311 -311
- package/get-shit-done/templates/verification-report.md +322 -322
- package/get-shit-done/workflows/add-phase.md +112 -112
- package/get-shit-done/workflows/add-tests.md +351 -351
- package/get-shit-done/workflows/add-todo.md +158 -158
- package/get-shit-done/workflows/audit-milestone.md +332 -332
- package/get-shit-done/workflows/autonomous.md +743 -743
- package/get-shit-done/workflows/check-todos.md +177 -177
- package/get-shit-done/workflows/cleanup.md +152 -152
- package/get-shit-done/workflows/complete-milestone.md +766 -766
- package/get-shit-done/workflows/diagnose-issues.md +219 -219
- package/get-shit-done/workflows/discovery-phase.md +289 -289
- package/get-shit-done/workflows/discuss-phase.md +762 -762
- package/get-shit-done/workflows/execute-phase.md +468 -468
- package/get-shit-done/workflows/execute-plan.md +483 -483
- package/get-shit-done/workflows/health.md +159 -159
- package/get-shit-done/workflows/help.md +492 -492
- package/get-shit-done/workflows/insert-phase.md +130 -130
- package/get-shit-done/workflows/list-phase-assumptions.md +178 -178
- package/get-shit-done/workflows/map-codebase.md +316 -316
- package/get-shit-done/workflows/new-milestone.md +384 -384
- package/get-shit-done/workflows/new-project.md +1111 -1111
- package/get-shit-done/workflows/node-repair.md +92 -92
- package/get-shit-done/workflows/pause-work.md +122 -122
- package/get-shit-done/workflows/plan-milestone-gaps.md +274 -274
- package/get-shit-done/workflows/plan-phase.md +651 -651
- package/get-shit-done/workflows/progress.md +382 -382
- package/get-shit-done/workflows/quick.md +610 -610
- package/get-shit-done/workflows/remove-phase.md +155 -155
- package/get-shit-done/workflows/research-phase.md +74 -74
- package/get-shit-done/workflows/resume-project.md +307 -307
- package/get-shit-done/workflows/set-profile.md +81 -81
- package/get-shit-done/workflows/settings.md +242 -242
- package/get-shit-done/workflows/stats.md +57 -57
- package/get-shit-done/workflows/transition.md +544 -544
- package/get-shit-done/workflows/ui-phase.md +290 -290
- package/get-shit-done/workflows/ui-review.md +157 -157
- package/get-shit-done/workflows/update.md +320 -320
- package/get-shit-done/workflows/validate-phase.md +167 -167
- package/get-shit-done/workflows/verify-phase.md +243 -243
- package/package.json +1 -1
- package/scripts/build-hooks.js +43 -43
- package/scripts/run-tests.cjs +29 -29
|
@@ -1,205 +1,205 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* GSD Assistant Adapters — Unified interface for AI coding assistants
|
|
5
|
-
*
|
|
6
|
-
* Adapters for: Claude Code, OpenCode, Gemini CLI, Codex
|
|
7
|
-
*
|
|
8
|
-
* Usage:
|
|
9
|
-
* const { createAdapter } = require('./assistant-adapter.cjs');
|
|
10
|
-
* const adapter = createAdapter('claude-code');
|
|
11
|
-
* await adapter.spawnAgent('planner', { prompt: '...' });
|
|
12
|
-
*/
|
|
13
|
-
|
|
14
|
-
const Logger = require('./logger.cjs');
|
|
15
|
-
const logger = new Logger();
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* Base adapter interface
|
|
19
|
-
*/
|
|
20
|
-
class AssistantAdapter {
|
|
21
|
-
constructor(name) {
|
|
22
|
-
if (new.target === AssistantAdapter) {
|
|
23
|
-
throw new Error('AssistantAdapter is abstract - use a concrete subclass');
|
|
24
|
-
}
|
|
25
|
-
this.name = name;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* Spawn a subagent
|
|
30
|
-
* @param {string} type - Agent type
|
|
31
|
-
* @param {Object} options - Agent options
|
|
32
|
-
* @returns {Promise<Object>} - Agent result
|
|
33
|
-
*/
|
|
34
|
-
async spawnAgent(type, options) {
|
|
35
|
-
throw new Error('spawnAgent must be implemented');
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* Call a tool/function
|
|
40
|
-
* @param {string} tool - Tool name
|
|
41
|
-
* @param {Object} params - Tool parameters
|
|
42
|
-
* @returns {Promise<any>} - Tool result
|
|
43
|
-
*/
|
|
44
|
-
async callTool(tool, params) {
|
|
45
|
-
throw new Error('callTool must be implemented');
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
/**
|
|
49
|
-
* Select model for task
|
|
50
|
-
* @param {string} taskType - Task type (planning, execution, verification)
|
|
51
|
-
* @returns {string} - Model name
|
|
52
|
-
*/
|
|
53
|
-
selectModel(taskType) {
|
|
54
|
-
throw new Error('selectModel must be implemented');
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
/**
|
|
58
|
-
* Get adapter info
|
|
59
|
-
* @returns {Object} - Adapter information
|
|
60
|
-
*/
|
|
61
|
-
getInfo() {
|
|
62
|
-
return {
|
|
63
|
-
name: this.name,
|
|
64
|
-
type: this.constructor.name
|
|
65
|
-
};
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
/**
|
|
70
|
-
* Claude Code adapter
|
|
71
|
-
*/
|
|
72
|
-
class ClaudeCodeAdapter extends AssistantAdapter {
|
|
73
|
-
constructor() {
|
|
74
|
-
super('claude-code');
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
async spawnAgent(type, options) {
|
|
78
|
-
logger.info('Claude Code: spawning agent', { type });
|
|
79
|
-
// Would use Claude Code's Task tool in production
|
|
80
|
-
return { type, status: 'completed', result: '[Claude Code agent result]' };
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
async callTool(tool, params) {
|
|
84
|
-
logger.info('Claude Code: calling tool', { tool });
|
|
85
|
-
// Would use Claude Code's tool system
|
|
86
|
-
return { tool, status: 'success' };
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
selectModel(taskType) {
|
|
90
|
-
const models = {
|
|
91
|
-
planning: 'claude-3-opus',
|
|
92
|
-
execution: 'claude-3-sonnet',
|
|
93
|
-
verification: 'claude-3-sonnet'
|
|
94
|
-
};
|
|
95
|
-
return models[taskType] || models.execution;
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
/**
|
|
100
|
-
* OpenCode adapter
|
|
101
|
-
*/
|
|
102
|
-
class OpenCodeAdapter extends AssistantAdapter {
|
|
103
|
-
constructor() {
|
|
104
|
-
super('opencode');
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
async spawnAgent(type, options) {
|
|
108
|
-
logger.info('OpenCode: spawning agent', { type });
|
|
109
|
-
return { type, status: 'completed', result: '[OpenCode agent result]' };
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
async callTool(tool, params) {
|
|
113
|
-
logger.info('OpenCode: calling tool', { tool });
|
|
114
|
-
return { tool, status: 'success' };
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
selectModel(taskType) {
|
|
118
|
-
return 'gpt-4-turbo';
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
/**
|
|
123
|
-
* Gemini CLI adapter
|
|
124
|
-
*/
|
|
125
|
-
class GeminiAdapter extends AssistantAdapter {
|
|
126
|
-
constructor() {
|
|
127
|
-
super('gemini');
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
async spawnAgent(type, options) {
|
|
131
|
-
logger.info('Gemini: spawning agent', { type });
|
|
132
|
-
return { type, status: 'completed', result: '[Gemini agent result]' };
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
async callTool(tool, params) {
|
|
136
|
-
logger.info('Gemini: calling tool', { tool });
|
|
137
|
-
return { tool, status: 'success' };
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
selectModel(taskType) {
|
|
141
|
-
return 'gemini-pro';
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
/**
|
|
146
|
-
* Codex adapter
|
|
147
|
-
*/
|
|
148
|
-
class CodexAdapter extends AssistantAdapter {
|
|
149
|
-
constructor() {
|
|
150
|
-
super('codex');
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
async spawnAgent(type, options) {
|
|
154
|
-
logger.info('Codex: spawning agent', { type });
|
|
155
|
-
return { type, status: 'completed', result: '[Codex agent result]' };
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
async callTool(tool, params) {
|
|
159
|
-
logger.info('Codex: calling tool', { tool });
|
|
160
|
-
return { tool, status: 'success' };
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
selectModel(taskType) {
|
|
164
|
-
return 'codex-latest';
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
/**
|
|
169
|
-
* Factory function to create adapter
|
|
170
|
-
* @param {string} type - Adapter type
|
|
171
|
-
* @returns {AssistantAdapter} - Adapter instance
|
|
172
|
-
*/
|
|
173
|
-
function createAdapter(type) {
|
|
174
|
-
const adapters = {
|
|
175
|
-
'claude-code': ClaudeCodeAdapter,
|
|
176
|
-
'opencode': OpenCodeAdapter,
|
|
177
|
-
'gemini': GeminiAdapter,
|
|
178
|
-
'codex': CodexAdapter
|
|
179
|
-
};
|
|
180
|
-
|
|
181
|
-
const AdapterClass = adapters[type];
|
|
182
|
-
if (!AdapterClass) {
|
|
183
|
-
throw new Error(`Unknown adapter type: ${type}. Available: ${Object.keys(adapters).join(', ')}`);
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
return new AdapterClass();
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
/**
|
|
190
|
-
* Get available adapters
|
|
191
|
-
* @returns {string[]} - List of adapter names
|
|
192
|
-
*/
|
|
193
|
-
function getAvailableAdapters() {
|
|
194
|
-
return ['claude-code', 'opencode', 'gemini', 'codex'];
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
module.exports = {
|
|
198
|
-
AssistantAdapter,
|
|
199
|
-
ClaudeCodeAdapter,
|
|
200
|
-
OpenCodeAdapter,
|
|
201
|
-
GeminiAdapter,
|
|
202
|
-
CodexAdapter,
|
|
203
|
-
createAdapter,
|
|
204
|
-
getAvailableAdapters
|
|
205
|
-
};
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* GSD Assistant Adapters — Unified interface for AI coding assistants
|
|
5
|
+
*
|
|
6
|
+
* Adapters for: Claude Code, OpenCode, Gemini CLI, Codex
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* const { createAdapter } = require('./assistant-adapter.cjs');
|
|
10
|
+
* const adapter = createAdapter('claude-code');
|
|
11
|
+
* await adapter.spawnAgent('planner', { prompt: '...' });
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
const Logger = require('./logger.cjs');
|
|
15
|
+
const logger = new Logger();
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Base adapter interface
|
|
19
|
+
*/
|
|
20
|
+
class AssistantAdapter {
|
|
21
|
+
constructor(name) {
|
|
22
|
+
if (new.target === AssistantAdapter) {
|
|
23
|
+
throw new Error('AssistantAdapter is abstract - use a concrete subclass');
|
|
24
|
+
}
|
|
25
|
+
this.name = name;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Spawn a subagent
|
|
30
|
+
* @param {string} type - Agent type
|
|
31
|
+
* @param {Object} options - Agent options
|
|
32
|
+
* @returns {Promise<Object>} - Agent result
|
|
33
|
+
*/
|
|
34
|
+
async spawnAgent(type, options) {
|
|
35
|
+
throw new Error('spawnAgent must be implemented');
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Call a tool/function
|
|
40
|
+
* @param {string} tool - Tool name
|
|
41
|
+
* @param {Object} params - Tool parameters
|
|
42
|
+
* @returns {Promise<any>} - Tool result
|
|
43
|
+
*/
|
|
44
|
+
async callTool(tool, params) {
|
|
45
|
+
throw new Error('callTool must be implemented');
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Select model for task
|
|
50
|
+
* @param {string} taskType - Task type (planning, execution, verification)
|
|
51
|
+
* @returns {string} - Model name
|
|
52
|
+
*/
|
|
53
|
+
selectModel(taskType) {
|
|
54
|
+
throw new Error('selectModel must be implemented');
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Get adapter info
|
|
59
|
+
* @returns {Object} - Adapter information
|
|
60
|
+
*/
|
|
61
|
+
getInfo() {
|
|
62
|
+
return {
|
|
63
|
+
name: this.name,
|
|
64
|
+
type: this.constructor.name
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Claude Code adapter
|
|
71
|
+
*/
|
|
72
|
+
class ClaudeCodeAdapter extends AssistantAdapter {
|
|
73
|
+
constructor() {
|
|
74
|
+
super('claude-code');
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
async spawnAgent(type, options) {
|
|
78
|
+
logger.info('Claude Code: spawning agent', { type });
|
|
79
|
+
// Would use Claude Code's Task tool in production
|
|
80
|
+
return { type, status: 'completed', result: '[Claude Code agent result]' };
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
async callTool(tool, params) {
|
|
84
|
+
logger.info('Claude Code: calling tool', { tool });
|
|
85
|
+
// Would use Claude Code's tool system
|
|
86
|
+
return { tool, status: 'success' };
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
selectModel(taskType) {
|
|
90
|
+
const models = {
|
|
91
|
+
planning: 'claude-3-opus',
|
|
92
|
+
execution: 'claude-3-sonnet',
|
|
93
|
+
verification: 'claude-3-sonnet'
|
|
94
|
+
};
|
|
95
|
+
return models[taskType] || models.execution;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* OpenCode adapter
|
|
101
|
+
*/
|
|
102
|
+
class OpenCodeAdapter extends AssistantAdapter {
|
|
103
|
+
constructor() {
|
|
104
|
+
super('opencode');
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
async spawnAgent(type, options) {
|
|
108
|
+
logger.info('OpenCode: spawning agent', { type });
|
|
109
|
+
return { type, status: 'completed', result: '[OpenCode agent result]' };
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
async callTool(tool, params) {
|
|
113
|
+
logger.info('OpenCode: calling tool', { tool });
|
|
114
|
+
return { tool, status: 'success' };
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
selectModel(taskType) {
|
|
118
|
+
return 'gpt-4-turbo';
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Gemini CLI adapter
|
|
124
|
+
*/
|
|
125
|
+
class GeminiAdapter extends AssistantAdapter {
|
|
126
|
+
constructor() {
|
|
127
|
+
super('gemini');
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
async spawnAgent(type, options) {
|
|
131
|
+
logger.info('Gemini: spawning agent', { type });
|
|
132
|
+
return { type, status: 'completed', result: '[Gemini agent result]' };
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
async callTool(tool, params) {
|
|
136
|
+
logger.info('Gemini: calling tool', { tool });
|
|
137
|
+
return { tool, status: 'success' };
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
selectModel(taskType) {
|
|
141
|
+
return 'gemini-pro';
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* Codex adapter
|
|
147
|
+
*/
|
|
148
|
+
class CodexAdapter extends AssistantAdapter {
|
|
149
|
+
constructor() {
|
|
150
|
+
super('codex');
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
async spawnAgent(type, options) {
|
|
154
|
+
logger.info('Codex: spawning agent', { type });
|
|
155
|
+
return { type, status: 'completed', result: '[Codex agent result]' };
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
async callTool(tool, params) {
|
|
159
|
+
logger.info('Codex: calling tool', { tool });
|
|
160
|
+
return { tool, status: 'success' };
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
selectModel(taskType) {
|
|
164
|
+
return 'codex-latest';
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* Factory function to create adapter
|
|
170
|
+
* @param {string} type - Adapter type
|
|
171
|
+
* @returns {AssistantAdapter} - Adapter instance
|
|
172
|
+
*/
|
|
173
|
+
function createAdapter(type) {
|
|
174
|
+
const adapters = {
|
|
175
|
+
'claude-code': ClaudeCodeAdapter,
|
|
176
|
+
'opencode': OpenCodeAdapter,
|
|
177
|
+
'gemini': GeminiAdapter,
|
|
178
|
+
'codex': CodexAdapter
|
|
179
|
+
};
|
|
180
|
+
|
|
181
|
+
const AdapterClass = adapters[type];
|
|
182
|
+
if (!AdapterClass) {
|
|
183
|
+
throw new Error(`Unknown adapter type: ${type}. Available: ${Object.keys(adapters).join(', ')}`);
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
return new AdapterClass();
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
* Get available adapters
|
|
191
|
+
* @returns {string[]} - List of adapter names
|
|
192
|
+
*/
|
|
193
|
+
function getAvailableAdapters() {
|
|
194
|
+
return ['claude-code', 'opencode', 'gemini', 'codex'];
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
module.exports = {
|
|
198
|
+
AssistantAdapter,
|
|
199
|
+
ClaudeCodeAdapter,
|
|
200
|
+
OpenCodeAdapter,
|
|
201
|
+
GeminiAdapter,
|
|
202
|
+
CodexAdapter,
|
|
203
|
+
createAdapter,
|
|
204
|
+
getAvailableAdapters
|
|
205
|
+
};
|