@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 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.9 (2025-12-23)
505
- - **Multi-Tool Expansion & AI Provider Robustness (v0.12.9)**
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
  */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@iservu-inc/adf-cli",
3
- "version": "0.12.10",
3
+ "version": "0.12.11",
4
4
  "description": "CLI tool for AgentDevFramework - AI-assisted development framework with multi-provider AI support",
5
5
  "main": "index.js",
6
6
  "bin": {