@howlil/ez-agents 2.0.0 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -21
- package/README.md +157 -110
- package/README.zh-CN.md +84 -84
- package/agents/ez-plan-checker.md +2 -2
- package/agents/ez-research-synthesizer.md +1 -1
- package/agents/ez-ui-auditor.md +0 -2
- package/agents/ez-ui-checker.md +2 -4
- package/agents/ez-ui-researcher.md +0 -2
- package/agents/ez-verifier.md +1 -1
- package/bin/install.js +211 -211
- package/commands/ez/debug.md +1 -1
- package/commands/ez/map-codebase.md +1 -1
- package/commands/ez/reapply-patches.md +3 -3
- package/commands/ez/research-phase.md +1 -1
- package/{get-shit-done → ez-agents}/bin/ez-tools.cjs +1 -1
- package/{get-shit-done → ez-agents}/bin/lib/assistant-adapter.cjs +205 -205
- package/{get-shit-done → ez-agents}/bin/lib/audit-exec.cjs +150 -150
- package/{get-shit-done → ez-agents}/bin/lib/auth.cjs +175 -175
- package/{get-shit-done → ez-agents}/bin/lib/circuit-breaker.cjs +118 -118
- package/{get-shit-done → ez-agents}/bin/lib/commands.cjs +666 -666
- package/{get-shit-done → ez-agents}/bin/lib/config.cjs +183 -183
- package/{get-shit-done → ez-agents}/bin/lib/core.cjs +495 -495
- package/{get-shit-done → ez-agents}/bin/lib/file-lock.cjs +236 -236
- package/{get-shit-done → ez-agents}/bin/lib/frontmatter.cjs +299 -299
- package/{get-shit-done → ez-agents}/bin/lib/fs-utils.cjs +153 -153
- package/{get-shit-done → ez-agents}/bin/lib/git-utils.cjs +203 -203
- package/{get-shit-done → ez-agents}/bin/lib/health-check.cjs +163 -163
- package/{get-shit-done → ez-agents}/bin/lib/index.cjs +113 -113
- package/{get-shit-done → ez-agents}/bin/lib/init.cjs +710 -710
- package/{get-shit-done → ez-agents}/bin/lib/logger.cjs +117 -117
- package/{get-shit-done → ez-agents}/bin/lib/milestone.cjs +241 -241
- package/{get-shit-done → ez-agents}/bin/lib/model-provider.cjs +146 -146
- package/{get-shit-done → ez-agents}/bin/lib/phase.cjs +908 -908
- package/{get-shit-done → ez-agents}/bin/lib/retry.cjs +119 -119
- package/{get-shit-done → ez-agents}/bin/lib/roadmap.cjs +305 -305
- package/{get-shit-done → ez-agents}/bin/lib/safe-exec.cjs +128 -128
- package/{get-shit-done → ez-agents}/bin/lib/safe-path.cjs +130 -130
- package/{get-shit-done → ez-agents}/bin/lib/state.cjs +721 -721
- package/{get-shit-done → ez-agents}/bin/lib/temp-file.cjs +239 -239
- package/{get-shit-done → ez-agents}/bin/lib/template.cjs +222 -222
- package/{get-shit-done → ez-agents}/bin/lib/test-file-lock.cjs +112 -112
- package/{get-shit-done → ez-agents}/bin/lib/test-graceful.cjs +93 -93
- package/{get-shit-done → ez-agents}/bin/lib/test-logger.cjs +60 -60
- package/{get-shit-done → ez-agents}/bin/lib/test-safe-exec.cjs +38 -38
- package/{get-shit-done → ez-agents}/bin/lib/test-safe-path.cjs +33 -33
- package/{get-shit-done → ez-agents}/bin/lib/test-temp-file.cjs +125 -125
- package/{get-shit-done → ez-agents}/bin/lib/timeout-exec.cjs +62 -62
- package/{get-shit-done → ez-agents}/bin/lib/verify.cjs +820 -820
- package/{get-shit-done → ez-agents}/references/checkpoints.md +776 -776
- package/{get-shit-done → ez-agents}/references/questioning.md +162 -162
- package/{get-shit-done → ez-agents}/references/tdd.md +263 -263
- package/{get-shit-done → ez-agents}/templates/codebase/concerns.md +310 -310
- package/{get-shit-done → ez-agents}/templates/codebase/conventions.md +307 -307
- package/{get-shit-done → ez-agents}/templates/codebase/integrations.md +280 -280
- package/{get-shit-done → ez-agents}/templates/codebase/stack.md +186 -186
- package/{get-shit-done → ez-agents}/templates/codebase/testing.md +480 -480
- package/{get-shit-done → ez-agents}/templates/config.json +37 -37
- package/{get-shit-done → ez-agents}/templates/continue-here.md +78 -78
- package/{get-shit-done → ez-agents}/templates/milestone-archive.md +123 -123
- package/{get-shit-done → ez-agents}/templates/milestone.md +115 -115
- package/{get-shit-done → ez-agents}/templates/requirements.md +231 -231
- package/{get-shit-done → ez-agents}/templates/research-project/ARCHITECTURE.md +204 -204
- package/{get-shit-done → ez-agents}/templates/research-project/FEATURES.md +147 -147
- package/{get-shit-done → ez-agents}/templates/research-project/PITFALLS.md +200 -200
- package/{get-shit-done → ez-agents}/templates/research-project/STACK.md +120 -120
- package/{get-shit-done → ez-agents}/templates/research-project/SUMMARY.md +170 -170
- package/{get-shit-done → ez-agents}/templates/retrospective.md +54 -54
- package/{get-shit-done → ez-agents}/templates/roadmap.md +202 -202
- package/{get-shit-done → ez-agents}/templates/summary-minimal.md +41 -41
- package/{get-shit-done → ez-agents}/templates/summary-standard.md +48 -48
- package/{get-shit-done → ez-agents}/templates/summary.md +248 -248
- package/{get-shit-done → ez-agents}/templates/user-setup.md +311 -311
- package/{get-shit-done → ez-agents}/templates/verification-report.md +322 -322
- package/{get-shit-done → ez-agents}/workflows/add-phase.md +112 -112
- package/{get-shit-done → ez-agents}/workflows/add-tests.md +351 -351
- package/{get-shit-done → ez-agents}/workflows/add-todo.md +158 -158
- package/{get-shit-done → ez-agents}/workflows/audit-milestone.md +332 -332
- package/{get-shit-done → ez-agents}/workflows/autonomous.md +743 -743
- package/{get-shit-done → ez-agents}/workflows/check-todos.md +177 -177
- package/{get-shit-done → ez-agents}/workflows/cleanup.md +152 -152
- package/{get-shit-done → ez-agents}/workflows/complete-milestone.md +766 -766
- package/ez-agents/workflows/debug.md +0 -0
- package/{get-shit-done → ez-agents}/workflows/diagnose-issues.md +219 -219
- package/{get-shit-done → ez-agents}/workflows/discovery-phase.md +289 -289
- package/{get-shit-done → ez-agents}/workflows/discuss-phase.md +762 -762
- package/{get-shit-done → ez-agents}/workflows/execute-phase.md +468 -468
- package/{get-shit-done → ez-agents}/workflows/execute-plan.md +483 -483
- package/{get-shit-done → ez-agents}/workflows/health.md +159 -159
- package/{get-shit-done → ez-agents}/workflows/help.md +492 -492
- package/{get-shit-done → ez-agents}/workflows/insert-phase.md +130 -130
- package/{get-shit-done → ez-agents}/workflows/list-phase-assumptions.md +178 -178
- package/{get-shit-done → ez-agents}/workflows/map-codebase.md +316 -316
- package/{get-shit-done → ez-agents}/workflows/new-milestone.md +384 -384
- package/{get-shit-done → ez-agents}/workflows/new-project.md +1111 -1111
- package/{get-shit-done → ez-agents}/workflows/node-repair.md +92 -92
- package/{get-shit-done → ez-agents}/workflows/pause-work.md +122 -122
- package/{get-shit-done → ez-agents}/workflows/plan-milestone-gaps.md +274 -274
- package/{get-shit-done → ez-agents}/workflows/plan-phase.md +651 -651
- package/{get-shit-done → ez-agents}/workflows/progress.md +382 -382
- package/{get-shit-done → ez-agents}/workflows/quick.md +610 -610
- package/{get-shit-done → ez-agents}/workflows/remove-phase.md +155 -155
- package/{get-shit-done → ez-agents}/workflows/research-phase.md +74 -74
- package/{get-shit-done → ez-agents}/workflows/resume-project.md +307 -307
- package/{get-shit-done → ez-agents}/workflows/set-profile.md +81 -81
- package/{get-shit-done → ez-agents}/workflows/settings.md +242 -242
- package/{get-shit-done → ez-agents}/workflows/stats.md +57 -57
- package/{get-shit-done → ez-agents}/workflows/transition.md +544 -544
- package/{get-shit-done → ez-agents}/workflows/ui-phase.md +290 -290
- package/{get-shit-done → ez-agents}/workflows/ui-review.md +157 -157
- package/{get-shit-done → ez-agents}/workflows/update.md +320 -320
- package/{get-shit-done → ez-agents}/workflows/validate-phase.md +167 -167
- package/{get-shit-done → ez-agents}/workflows/verify-phase.md +243 -243
- package/{get-shit-done → ez-agents}/workflows/verify-work.md +5 -5
- package/hooks/dist/ez-check-update.js +81 -0
- package/hooks/dist/ez-context-monitor.js +141 -0
- package/hooks/dist/ez-statusline.js +115 -0
- package/package.json +13 -3
- package/scripts/build-hooks.js +43 -43
- package/scripts/run-tests.cjs +29 -29
- /package/{get-shit-done → ez-agents}/references/continuation-format.md +0 -0
- /package/{get-shit-done → ez-agents}/references/decimal-phase-calculation.md +0 -0
- /package/{get-shit-done → ez-agents}/references/git-integration.md +0 -0
- /package/{get-shit-done → ez-agents}/references/git-planning-commit.md +0 -0
- /package/{get-shit-done → ez-agents}/references/model-profile-resolution.md +0 -0
- /package/{get-shit-done → ez-agents}/references/model-profiles.md +0 -0
- /package/{get-shit-done → ez-agents}/references/phase-argument-parsing.md +0 -0
- /package/{get-shit-done → ez-agents}/references/planning-config.md +0 -0
- /package/{get-shit-done → ez-agents}/references/ui-brand.md +0 -0
- /package/{get-shit-done → ez-agents}/references/verification-patterns.md +0 -0
- /package/{get-shit-done → ez-agents}/templates/DEBUG.md +0 -0
- /package/{get-shit-done → ez-agents}/templates/UAT.md +0 -0
- /package/{get-shit-done → ez-agents}/templates/UI-SPEC.md +0 -0
- /package/{get-shit-done → ez-agents}/templates/VALIDATION.md +0 -0
- /package/{get-shit-done → ez-agents}/templates/codebase/architecture.md +0 -0
- /package/{get-shit-done → ez-agents}/templates/codebase/structure.md +0 -0
- /package/{get-shit-done → ez-agents}/templates/context.md +0 -0
- /package/{get-shit-done → ez-agents}/templates/copilot-instructions.md +0 -0
- /package/{get-shit-done → ez-agents}/templates/debug-subagent-prompt.md +0 -0
- /package/{get-shit-done → ez-agents}/templates/discovery.md +0 -0
- /package/{get-shit-done → ez-agents}/templates/phase-prompt.md +0 -0
- /package/{get-shit-done → ez-agents}/templates/planner-subagent-prompt.md +0 -0
- /package/{get-shit-done → ez-agents}/templates/project.md +0 -0
- /package/{get-shit-done → ez-agents}/templates/research.md +0 -0
- /package/{get-shit-done → ez-agents}/templates/state.md +0 -0
- /package/{get-shit-done → ez-agents}/templates/summary-complex.md +0 -0
package/commands/ez/debug.md
CHANGED
|
@@ -162,7 +162,7 @@ Task(
|
|
|
162
162
|
<success_criteria>
|
|
163
163
|
- [ ] Active sessions checked
|
|
164
164
|
- [ ] Symptoms gathered (if new)
|
|
165
|
-
- [ ]
|
|
165
|
+
- [ ] ez-debugger spawned with context
|
|
166
166
|
- [ ] Checkpoints handled correctly
|
|
167
167
|
- [ ] Root cause confirmed before fixing
|
|
168
168
|
</success_criteria>
|
|
@@ -51,7 +51,7 @@ Check for .planning/STATE.md - loads context if project already initialized
|
|
|
51
51
|
<process>
|
|
52
52
|
1. Check if .planning/codebase/ already exists (offer to refresh or skip)
|
|
53
53
|
2. Create .planning/codebase/ directory structure
|
|
54
|
-
3. Spawn 4 parallel
|
|
54
|
+
3. Spawn 4 parallel ez-codebase-mapper agents:
|
|
55
55
|
- Agent 1: tech focus → writes STACK.md, INTEGRATIONS.md
|
|
56
56
|
- Agent 2: arch focus → writes ARCHITECTURE.md, STRUCTURE.md
|
|
57
57
|
- Agent 3: quality focus → writes CONVENTIONS.md, TESTING.md
|
|
@@ -66,7 +66,7 @@ Exit.
|
|
|
66
66
|
|
|
67
67
|
For each file in `backup-meta.json`:
|
|
68
68
|
|
|
69
|
-
1. **Read the backed-up version** (user's modified copy from `
|
|
69
|
+
1. **Read the backed-up version** (user's modified copy from `ez-local-patches/`)
|
|
70
70
|
2. **Read the newly installed version** (current file after update)
|
|
71
71
|
3. **Compare and merge:**
|
|
72
72
|
|
|
@@ -97,8 +97,8 @@ After reapplying, regenerate the file manifest so future updates correctly detec
|
|
|
97
97
|
## Step 5: Cleanup option
|
|
98
98
|
|
|
99
99
|
Ask user:
|
|
100
|
-
- "Keep patch backups for reference?" → preserve `
|
|
101
|
-
- "Clean up patch backups?" → remove `
|
|
100
|
+
- "Keep patch backups for reference?" → preserve `ez-local-patches/`
|
|
101
|
+
- "Clean up patch backups?" → remove `ez-local-patches/` directory
|
|
102
102
|
|
|
103
103
|
## Step 6: Report
|
|
104
104
|
|
|
@@ -184,7 +184,7 @@ Task(
|
|
|
184
184
|
<success_criteria>
|
|
185
185
|
- [ ] Phase validated against roadmap
|
|
186
186
|
- [ ] Existing research checked
|
|
187
|
-
- [ ]
|
|
187
|
+
- [ ] ez-phase-researcher spawned with context
|
|
188
188
|
- [ ] Checkpoints handled correctly
|
|
189
189
|
- [ ] User knows next steps
|
|
190
190
|
</success_criteria>
|
|
@@ -172,7 +172,7 @@ async function main() {
|
|
|
172
172
|
const command = args[0];
|
|
173
173
|
|
|
174
174
|
if (!command) {
|
|
175
|
-
error('Usage:
|
|
175
|
+
error('Usage: ez-tools <command> [args] [--raw] [--cwd <path>]\nCommands: state, resolve-model, find-phase, commit, verify-summary, verify, frontmatter, template, generate-slug, current-timestamp, list-todos, verify-path-exists, config-ensure-section, init');
|
|
176
176
|
}
|
|
177
177
|
|
|
178
178
|
switch (command) {
|
|
@@ -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
|
+
};
|