@iservu-inc/adf-cli 0.12.10 → 0.12.11
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/CHANGELOG.md +40 -0
- package/README.md +9 -5
- package/lib/generators/tool-config-generator.js +110 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,46 @@ All notable changes to `@iservu-inc/adf-cli` will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [0.12.10] - 2025-12-23
|
|
9
|
+
|
|
10
|
+
### 🐛 Critical Bug Fixes
|
|
11
|
+
|
|
12
|
+
**Patch Release:** Two critical bug fixes for deployment and AI provider error handling.
|
|
13
|
+
|
|
14
|
+
#### Fixed
|
|
15
|
+
|
|
16
|
+
**Deployment Error Fix:**
|
|
17
|
+
- 🔧 **Fixed EISDIR error** when deploying to directory-based tools (claude-code, deepagent, generic)
|
|
18
|
+
- Error: `EISDIR: illegal operation on a directory, open '.framework/agents'`
|
|
19
|
+
- Root cause: Attempting to write file to directory path
|
|
20
|
+
- Solution: Skip generic config writing for tools with directory-based configs (ending with `/`)
|
|
21
|
+
- These tools use dedicated generators that handle file creation properly
|
|
22
|
+
|
|
23
|
+
**AI Provider Error Handling:**
|
|
24
|
+
- 🔧 **Improved rate limit error detection** for Google Gemini models
|
|
25
|
+
- Now distinguishes between rate limit/quota errors vs model availability issues
|
|
26
|
+
- Clear messaging for quota exceeded scenarios with actionable solutions:
|
|
27
|
+
- Try different model with available quota
|
|
28
|
+
- Wait for quota reset
|
|
29
|
+
- Upgrade to paid tier
|
|
30
|
+
- Use different AI provider
|
|
31
|
+
- Added **Google Gemini free tier model recommendations**:
|
|
32
|
+
- `gemini-1.5-flash` (fastest, lowest quota usage) - Recommended
|
|
33
|
+
- `gemini-1.5-flash-8b` (ultra-fast, minimal quota)
|
|
34
|
+
- `gemini-2.0-flash-exp` (newer, experimental)
|
|
35
|
+
- Warns about Pro models (gemini-pro, gemini-2.5-pro) potentially exceeding free tier quota
|
|
36
|
+
|
|
37
|
+
#### Technical Details
|
|
38
|
+
|
|
39
|
+
**Modified Files:**
|
|
40
|
+
- `lib/commands/deploy.js` - Skip config writing for directory-based tools
|
|
41
|
+
- `lib/ai/ai-config.js` - Enhanced error detection and messaging for rate limits
|
|
42
|
+
|
|
43
|
+
#### Impact
|
|
44
|
+
- ✅ Deployment now succeeds for all 11 supported tools
|
|
45
|
+
- ✅ Users get clear guidance when hitting API rate limits
|
|
46
|
+
- ✅ Reduces confusion about model availability vs quota issues
|
|
47
|
+
|
|
8
48
|
## [0.12.9] - 2025-12-23
|
|
9
49
|
|
|
10
50
|
### 🚀 Multi-Tool Expansion & AI Provider Robustness
|
package/README.md
CHANGED
|
@@ -501,16 +501,20 @@ When we release updates to the framework:
|
|
|
501
501
|
|
|
502
502
|
See [CHANGELOG.md](./CHANGELOG.md) for detailed version history.
|
|
503
503
|
|
|
504
|
-
**Latest:** v0.12.
|
|
505
|
-
- **
|
|
504
|
+
**Latest:** v0.12.10 (2025-12-23)
|
|
505
|
+
- **Critical Bug Fixes (v0.12.10)** - Patch release
|
|
506
|
+
- Fixed EISDIR deployment error for directory-based tools
|
|
507
|
+
- Improved rate limit error detection for Gemini models
|
|
508
|
+
- Added free tier model recommendations for Google Gemini
|
|
509
|
+
- Clear messaging for quota vs availability issues
|
|
510
|
+
|
|
511
|
+
**Previous Releases:**
|
|
512
|
+
- **v0.12.9 (2025-12-23)** - Multi-Tool Expansion & AI Provider Robustness
|
|
506
513
|
- Added 4 new CLI tools: OpenCode, Gemini CLI, DeepAgent, verified Zed support
|
|
507
514
|
- Comprehensive AI provider improvements with model verification
|
|
508
515
|
- Fixed Google Gemini API integration and expanded Anthropic models (3 → 11)
|
|
509
516
|
- Enhanced help system with detailed documentation
|
|
510
517
|
- OpenAI/OpenRouter parameter compatibility for GPT-5 and o-series models
|
|
511
|
-
- All models now tested before configuration save
|
|
512
|
-
|
|
513
|
-
**Previous Releases:**
|
|
514
518
|
- **v0.12.0 (2025-12-22)** - ANDF Standard Implementation
|
|
515
519
|
- Complete AGENTS.md standard compliance with YAML frontmatter
|
|
516
520
|
- .context/ directory support with architecture and glossary generation
|
|
@@ -177,6 +177,116 @@ class ToolConfigGenerator {
|
|
|
177
177
|
await fs.ensureDir(path.join(this.projectPath, dirPath));
|
|
178
178
|
}
|
|
179
179
|
|
|
180
|
+
/**
|
|
181
|
+
* Get project context (name, commands, directories)
|
|
182
|
+
*/
|
|
183
|
+
async getProjectContext() {
|
|
184
|
+
const context = {
|
|
185
|
+
name: this.getProjectName(),
|
|
186
|
+
overview: '',
|
|
187
|
+
buildCommand: 'npm run build',
|
|
188
|
+
testCommand: 'npm test',
|
|
189
|
+
lintCommand: 'npm run lint',
|
|
190
|
+
sourceDir: 'src/',
|
|
191
|
+
testDir: 'tests/',
|
|
192
|
+
docsDir: 'docs/'
|
|
193
|
+
};
|
|
194
|
+
|
|
195
|
+
// Try to extract overview from outputs
|
|
196
|
+
if (this.outputs.constitution) {
|
|
197
|
+
const overview = this.extractSection(this.outputs.constitution, 'overview');
|
|
198
|
+
if (overview) context.overview = overview;
|
|
199
|
+
} else if (this.outputs.prd) {
|
|
200
|
+
const overview = this.extractSection(this.outputs.prd, 'overview');
|
|
201
|
+
if (overview) context.overview = overview;
|
|
202
|
+
} else if (this.outputs.prp) {
|
|
203
|
+
const overview = this.extractSection(this.outputs.prp, 'overview');
|
|
204
|
+
if (overview) context.overview = overview;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
// Try to read package.json for accurate commands
|
|
208
|
+
try {
|
|
209
|
+
const packageJsonPath = path.join(this.projectPath, 'package.json');
|
|
210
|
+
if (await fs.pathExists(packageJsonPath)) {
|
|
211
|
+
const packageJson = await fs.readJson(packageJsonPath);
|
|
212
|
+
if (packageJson.scripts) {
|
|
213
|
+
if (packageJson.scripts.build) context.buildCommand = 'npm run build';
|
|
214
|
+
if (packageJson.scripts.test) context.testCommand = 'npm test';
|
|
215
|
+
if (packageJson.scripts.lint) context.lintCommand = 'npm run lint';
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
} catch (error) {
|
|
219
|
+
// Ignore, use defaults
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
return context;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/**
|
|
226
|
+
* Get framework-specific context
|
|
227
|
+
*/
|
|
228
|
+
async getFrameworkContext() {
|
|
229
|
+
const context = {
|
|
230
|
+
type: this.framework,
|
|
231
|
+
keyPoints: ''
|
|
232
|
+
};
|
|
233
|
+
|
|
234
|
+
// Extract key points from outputs
|
|
235
|
+
if (this.outputs.constitution) {
|
|
236
|
+
context.keyPoints = this.extractSection(this.outputs.constitution, 'key principles');
|
|
237
|
+
} else if (this.outputs.prd) {
|
|
238
|
+
context.keyPoints = this.extractSection(this.outputs.prd, 'key requirements');
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
return context;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
/**
|
|
245
|
+
* Get summary of generated outputs
|
|
246
|
+
*/
|
|
247
|
+
async getOutputSummary() {
|
|
248
|
+
const files = Object.keys(this.outputs);
|
|
249
|
+
if (files.length === 0) return null;
|
|
250
|
+
|
|
251
|
+
return `Generated outputs: ${files.map(f => `${f}.md`).join(', ')}`;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
/**
|
|
255
|
+
* Deploy agent files to target directory
|
|
256
|
+
*/
|
|
257
|
+
async deployAgentFiles(targetDir) {
|
|
258
|
+
const agentsList = this.getAgentsList();
|
|
259
|
+
const deployedFiles = [];
|
|
260
|
+
|
|
261
|
+
for (const agent of agentsList) {
|
|
262
|
+
const srcAgent = path.join(__dirname, '../templates/shared/agents', `${agent}.md`);
|
|
263
|
+
const destAgent = path.join(targetDir, `${agent}.md`);
|
|
264
|
+
|
|
265
|
+
if (await fs.pathExists(srcAgent)) {
|
|
266
|
+
await fs.copy(srcAgent, destAgent);
|
|
267
|
+
deployedFiles.push(destAgent);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
return deployedFiles;
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
/**
|
|
275
|
+
* Get list of agents based on framework
|
|
276
|
+
*/
|
|
277
|
+
getAgentsList() {
|
|
278
|
+
switch (this.framework) {
|
|
279
|
+
case 'rapid':
|
|
280
|
+
return ['dev', 'qa'];
|
|
281
|
+
case 'balanced':
|
|
282
|
+
return ['analyst', 'pm', 'dev', 'qa'];
|
|
283
|
+
case 'comprehensive':
|
|
284
|
+
return ['analyst', 'pm', 'architect', 'sm', 'dev', 'qa'];
|
|
285
|
+
default:
|
|
286
|
+
return ['dev', 'qa'];
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
|
|
180
290
|
/**
|
|
181
291
|
* Generate all configurations (override in subclasses)
|
|
182
292
|
*/
|