* fix: handle missing @anthropic-ai/claude-code SDK gracefully
Add defensive checks to prevent "Right-hand side of 'instanceof' is not an object" errors when the optional Claude Code SDK is not installed.
Changes:
- Check if AbortError exists before using instanceof
- Check if query function exists before calling it
- Provide clear error messages when SDK is missing
This fixes the issue reported by users in v0.24.0 and v0.25.0 where Task Master would crash with instanceof errors when using the claude-code provider without the SDK installed.
* chore: bump @anthropic-ai/claude-code to ^1.0.88 and regenerate lockfile
* initial cutover
* update log to debug
* update tracker to pass units
* update test to match new base tracker format
* add streamTextService mocks
* remove unused imports
* Ensure the CLI waits for async main() completion
* refactor to reduce code duplication
* update comment
* reuse function
* ensure targetTag is defined in streaming mode
* avoid throwing inside process.exit spy
* check for null
* remove reference to generate
* fix formatting
* fix textStream assignment
* ensure no division by 0
* fix jest chalk mocks
* refactor for maintainability
* Improve bar chart calculation logic for consistent visual representation
* use custom streaming error types; fix mocks
* Update streamText extraction in parse-prd.js to match actual service response
* remove check - doesn't belong here
* update mocks
* remove streaming test that wasn't really doing anything
* add comment
* make parsing logic more DRY
* fix formatting
* Fix textStream extraction to match actual service response
* fix mock
* Add a cleanup method to ensure proper resource disposal and prevent memory leaks
* debounce progress updates to reduce UI flicker during rapid updates
* Implement timeout protection for streaming operations (60-second timeout) with automatic fallback to non-streaming mode.
* clear timeout properly
* Add a maximum buffer size limit (1MB) to prevent unbounded memory growth with very large streaming responses.
* fix formatting
* remove duplicate mock
* better docs
* fix formatting
* sanitize the dynamic property name
* Fix incorrect remaining progress calculation
* Use onError callback instead of console.warn
* Remove unused chalk import
* Add missing custom validator in fallback parsing configuration
* add custom validator parameter in fallback parsing
* chore: fix package-lock.json
* chore: large code refactor
* chore: increase timeout from 1 minute to 3 minutes
* fix: refactor and fix streaming
* Merge remote-tracking branch 'origin/next' into joedanz/parse-prd-progress
* fix: cleanup and fix unit tests
* chore: fix unit tests
* chore: fix format
* chore: run format
* chore: fix weird CI unit test error
* chore: fix format
---------
Co-authored-by: Ralph Khreish <35776126+Crunchyman-ralph@users.noreply.github.com>
* feat: complete Groq provider integration and add Kimi K2 model
- Add missing getRequiredApiKeyName() method to GroqProvider class
- Register GroqProvider in ai-services-unified.js PROVIDERS object
- Add Groq API key handling to config-manager.js (isApiKeySet and getMcpApiKeyStatus)
- Add GROQ_API_KEY to env.example with format hint
- Add moonshotai/kimi-k2-instruct model to Groq provider ($1/$3 per 1M tokens, 16k max)
- Fix import sorting for linting compliance
- Add GroqProvider mock to ai-services-unified tests
Fixes missing implementation pieces that prevented Groq provider from working.
* chore: improve changeset
---------
Co-authored-by: Ben Vargas <ben@example.com>
Co-authored-by: Ralph Khreish <35776126+Crunchyman-ralph@users.noreply.github.com>
* feat: support MCP sampling
* support provider registry
* use standard config options for MCP provider
* update fastmcp to support passing params to requestSampling
* move key name definition to base provider
* moved check for required api key to provider class
* remove unused code
* more cleanup
* more cleanup
* refactor provider
* remove not needed files
* more cleanup
* more cleanup
* more cleanup
* update docs
* fix tests
* add tests
* format fix
* clean files
* merge fixes
* format fix
* feat: add support for MCP Sampling as AI provider
* initial mcp ai sdk
* fix references to old provider
* update models
* lint
* fix gemini-cli conflicts
* ran format
* Update src/provider-registry/index.js
Co-authored-by: Ralph Khreish <35776126+Crunchyman-ralph@users.noreply.github.com>
* fix circular dependency
Circular Dependency Issue ✅ FIXED
Root Cause: BaseAIProvider was importing from index.js, which includes commands.js and other modules that eventually import back to AI providers
Solution: Changed imports to use direct paths to avoid circular dependencies:
Updated base-provider.js to import log directly from utils.js
Updated gemini-cli.js to import log directly from utils.js
Result: Fixed 11 failing tests in mcp-provider.test.js
* fix gemini test
* fix(claude-code): recover from CLI JSON truncation bug (#913) (#920)
Gracefully handle SyntaxError thrown by @anthropic-ai/claude-code when the CLI truncates large JSON outputs (4–16 kB cut-offs).\n\nKey points:\n• Detect JSON parse error + existing buffered text in both doGenerate() and doStream() code paths.\n• Convert the failure into a recoverable 'truncated' finish state and push a provider-warning.\n• Allows Task Master to continue parsing long PRDs / expand-task operations instead of crashing.\n\nA patch changeset (.changeset/claude-code-json-truncation.md) is included for the next release.\n\nRef: eyaltoledano/claude-task-master#913
* docs: fix gemini-cli authentication documentation (#923)
Remove erroneous 'gemini auth login' command references and replace with correct 'gemini' command authentication flow. Update documentation to reflect proper OAuth setup process via the gemini CLI interactive interface.
* fix tests
* fix: update ai-sdk-provider-gemini-cli to 0.0.4 for improved authentication (#932)
- Fixed authentication compatibility issues with Google auth
- Added support for 'api-key' auth type alongside 'gemini-api-key'
- Resolved "Unsupported authType: undefined" runtime errors
- Updated @google/gemini-cli-core dependency to 0.1.9
- Improved documentation and removed invalid auth references
- Maintained backward compatibility while enhancing type validation
* call logging directly
Need to patch upstream fastmcp to allow easier access and bootstrap the TM mcp logger to use the fastmcp logger which today is only exposed in the tools handler
* fix tests
* removing logs until we figure out how to pass mcp logger
* format
* fix tests
* format
* clean up
* cleanup
* readme fix
---------
Co-authored-by: Oren Melamed <oren.m@gloat.com>
Co-authored-by: Ralph Khreish <35776126+Crunchyman-ralph@users.noreply.github.com>
Co-authored-by: Ben Vargas <ben@vargas.com>
* feat: Add GROQ API key support and integrate GROQ provider
* feat: Add support for Groq provider
- Added a new changeset documenting the addition of Groq provider support.
-Ran npm run format
* feat: Add support for Groq provider
- Added a new changeset documenting the addition of Groq provider support.
-Ran npm run format
Remove erroneous 'gemini auth login' command references and replace with correct 'gemini' command authentication flow. Update documentation to reflect proper OAuth setup process via the gemini CLI interactive interface.
Gracefully handle SyntaxError thrown by @anthropic-ai/claude-code when the CLI truncates large JSON outputs (4–16 kB cut-offs).\n\nKey points:\n• Detect JSON parse error + existing buffered text in both doGenerate() and doStream() code paths.\n• Convert the failure into a recoverable 'truncated' finish state and push a provider-warning.\n• Allows Task Master to continue parsing long PRDs / expand-task operations instead of crashing.\n\nA patch changeset (.changeset/claude-code-json-truncation.md) is included for the next release.\n\nRef: eyaltoledano/claude-task-master#913
* Feat: Implemented advanced settings for Claude Code AI provider
- Added new 'claudeCode' property to default config
- Added getters and validation functions to 'config-manager.js'
- Added new 'isEmpty' utility to 'utils.js'
- Added new constants file 'commands.js' for AI_COMMAND_NAMES
- Updated Claude Code AI provider to use new config functions
- Updated 'claude-code-usage.md' documentation
- Added 'config-manager.test.js' tests to cover new settings
* chore: run format
---------
Co-authored-by: Ralph Khreish <35776126+Crunchyman-ralph@users.noreply.github.com>
* feat: Add gemini-cli provider integration for Task Master
This commit adds comprehensive support for the Gemini CLI provider, enabling users
to leverage Google's Gemini models through OAuth authentication via the gemini CLI
tool. This integration provides a seamless experience for users who prefer using
their existing Google account authentication rather than managing API keys.
## Implementation Details
### Provider Class (`src/ai-providers/gemini-cli.js`)
- Created GeminiCliProvider extending BaseAIProvider
- Implements dual authentication support:
- Primary: OAuth authentication via `gemini auth login` (authType: 'oauth-personal')
- Secondary: API key authentication for compatibility (authType: 'api-key')
- Uses the npm package `ai-sdk-provider-gemini-cli` (v0.0.3) for SDK integration
- Properly handles authentication validation without console output
### Model Configuration (`scripts/modules/supported-models.json`)
- Added two Gemini models with accurate specifications:
- gemini-2.5-pro: 72% SWE score, 65,536 max output tokens
- gemini-2.5-flash: 71% SWE score, 65,536 max output tokens
- Both models support main, fallback, and research roles
- Configured with zero cost (free tier)
### System Integration
- Registered provider in PROVIDERS map (`scripts/modules/ai-services-unified.js`)
- Added to OPTIONAL_AUTH_PROVIDERS set for flexible authentication
- Added GEMINI_CLI constant to provider constants (`src/constants/providers.js`)
- Exported GeminiCliProvider from index (`src/ai-providers/index.js`)
### Command Line Support (`scripts/modules/commands.js`)
- Added --gemini-cli flag to models command for provider hint
- Integrated into model selection logic (setModel function)
- Updated error messages to include gemini-cli in provider list
- Removed unrelated azure/vertex changes to maintain PR focus
### Documentation (`docs/providers/gemini-cli.md`)
- Comprehensive provider documentation emphasizing OAuth-first approach
- Clear explanation of why users would choose gemini-cli over standard google provider
- Detailed installation, authentication, and configuration instructions
- Troubleshooting section with common issues and solutions
### Testing (`tests/unit/ai-providers/gemini-cli.test.js`)
- Complete test suite with 12 tests covering all functionality
- Tests for both OAuth and API key authentication paths
- Error handling and edge case coverage
- Updated mocks in ai-services-unified.test.js for integration testing
## Key Design Decisions
1. **OAuth-First Design**: The provider assumes users want to leverage their existing
`gemini auth login` credentials, making this the default authentication method.
2. **Authentication Type Mapping**: Discovered through testing that the SDK expects:
- 'oauth-personal' for OAuth/CLI authentication (not 'gemini-cli' or 'oauth')
- 'api-key' for API key authentication (not 'gemini-api-key')
3. **Silent Operation**: Removed console.log statements from validateAuth to match
the pattern used by other providers like claude-code.
4. **Limited Model Support**: Only gemini-2.5-pro and gemini-2.5-flash are available
through the CLI, as confirmed by the package author.
## Usage
```bash
# Install gemini CLI globally
npm install -g @google/gemini-cli
# Authenticate with Google account
gemini auth login
# Configure Task Master to use gemini-cli
task-master models --set-main gemini-2.5-pro --gemini-cli
# Use Task Master normally
task-master new "Create a REST API endpoint"
```
## Dependencies
- Added `ai-sdk-provider-gemini-cli@^0.0.3` to package.json
- This package wraps the Google Gemini CLI Core functionality for Vercel AI SDK
## Testing
All tests pass (613 total), including the new gemini-cli provider tests.
Code has been formatted with biome to maintain consistency.
This implementation provides a clean, well-tested integration that follows Task Master's
existing patterns while offering users a convenient way to use Gemini models with their
existing Google authentication.
* feat: implement lazy loading for gemini-cli provider
- Move ai-sdk-provider-gemini-cli to optionalDependencies
- Implement dynamic import with loadGeminiCliModule() function
- Make getClient() async to support lazy loading
- Update base-provider to handle async getClient() calls
- Update tests to handle async getClient() method
This allows the application to start without the gemini-cli package
installed, only loading it when actually needed.
* feat(gemini-cli): replace regex-based JSON extraction with jsonc-parser
- Add jsonc-parser dependency for robust JSON parsing
- Replace simple regex approach with progressive parsing strategy:
1. Direct parsing after cleanup
2. Smart boundary detection with single-pass analysis
3. Limited fallback for edge cases
- Optimize performance with early termination and strategic sampling
- Add comprehensive tests for variable declarations, trailing commas,
escaped quotes, nested objects, and performance edge cases
- Improve reliability for complex JSON structures that Gemini commonly produces
- Fix code formatting with biome
This addresses JSON parsing failures in generateObject operations while
maintaining backward compatibility and significantly improving performance
for large responses.
* fix: update package-lock.json and fix formatting for CI/CD
- Add jsonc-parser to package-lock.json for proper npm ci compatibility
- Fix biome formatting issues in gemini-cli provider and tests
- Ensure all CI/CD checks pass
* feat(gemini-cli): implement comprehensive JSON output reliability system
- Add automatic JSON request detection via content analysis patterns
- Implement task-specific prompt simplification for improved AI compliance
- Add strict JSON enforcement through enhanced system prompts
- Implement response interception with intelligent JSON extraction fallback
- Add comprehensive test coverage for all new JSON handling methods
- Move debug logging to appropriate level for clean user experience
This multi-layered approach addresses gemini-cli's conversational response
tendencies, ensuring reliable structured JSON output for task expansion
operations. Achieves 100% success rate in end-to-end testing while
maintaining full backward compatibility with existing functionality.
Technical implementation includes:
• JSON detection via user message content analysis
• Expand-task prompt simplification with cleaner instructions
• System prompt enhancement with strict JSON enforcement
• Response processing with jsonc-parser-based extraction
• Comprehensive unit test coverage for edge cases
• Debug-level logging to prevent user interface clutter
Resolves: gemini-cli JSON formatting inconsistencies
Tested: All 46 test suites pass, formatting verified
* chore: add changeset for gemini-cli provider implementation
Adds minor version bump for comprehensive gemini-cli provider with:
- Lazy loading and optional dependency management
- Advanced JSON parsing with jsonc-parser
- Multi-layer reliability system for structured output
- Complete test coverage and CI/CD compliance
* refactor: consolidate optional auth provider logic
- Add gemini-cli to existing providersWithoutApiKeys array in config-manager
- Export providersWithoutApiKeys for reuse across modules
- Remove duplicate OPTIONAL_AUTH_PROVIDERS Set from ai-services-unified
- Update ai-services-unified to import and use centralized array
- Fix Jest mock to include new providersWithoutApiKeys export
This eliminates code duplication and provides a single source of truth
for which providers support optional authentication, addressing PR
reviewer feedback about existing similar functionality in src/constants.
This change makes the Claude Code SDK package optional, preventing installation failures for users who don't need Claude Code functionality.
Changes:
- Added @anthropic-ai/claude-code to optionalDependencies in package.json
- Implemented lazy loading in language-model.js to only import the SDK when actually used
- Updated documentation to explain the optional installation requirement
- Applied formatting fixes to ensure code consistency
Benefits:
- Users without Claude Code subscriptions don't need to install the dependency
- Reduces package size for users who don't use Claude Code
- Prevents installation failures if the package is unavailable
- Provides clear error messages when the package is needed but not installed
The implementation uses dynamic imports to load the SDK only when doGenerate() or doStream() is called, ensuring the provider can be instantiated without the package present.
Implements Claude Code as a new AI provider that uses the Claude Code CLI
without requiring API keys. This enables users to leverage Claude models
through their local Claude Code installation.
Key changes:
- Add complete AI SDK v1 implementation for Claude Code provider
- Custom SDK with streaming/non-streaming support
- Session management for conversation continuity
- JSON extraction for object generation mode
- Support for advanced settings (maxTurns, allowedTools, etc.)
- Integrate Claude Code into Task Master's provider system
- Update ai-services-unified.js to handle keyless authentication
- Add provider to supported-models.json with opus/sonnet models
- Ensure correct maxTokens values are applied (opus: 32000, sonnet: 64000)
- Fix maxTokens configuration issue
- Add max_tokens property to getAvailableModels() output
- Update setModel() to properly handle claude-code models
- Create update-config-tokens.js utility for init process
- Add comprehensive documentation
- User guide with configuration examples
- Advanced settings explanation and future integration options
The implementation maintains full backward compatibility with existing
providers while adding seamless Claude Code support to all Task Master
commands.
* fix(bedrock): improve AWS credential handling and add model definitions
- Change error to warning when AWS credentials are missing in environment
- Allow fallback to system configuration (aws config files or instance profiles)
- Remove hardcoded region and profile parameters in Bedrock client
- Add Claude 3.7 Sonnet and DeepSeek R1 model definitions for Bedrock
- Update config manager to properly handle Bedrock provider
* chore: cleanup and format and small refactor
---------
Co-authored-by: Ray Krueger <raykrueger@gmail.com>
Fixes Perplexity research role failing with 'tool-mode object generation' error
The hardcoded 'tool' mode was incompatible with providers like Perplexity that support structured JSON output but not function calling/tool use
Using 'auto' mode allows the AI SDK to choose the best approach for each provider
* fix: claude-4 not having the right max_tokens
* feat: add bedrock support
* chore: fix package-lock.json
* fix: rename baseUrl to baseURL
* feat: add azure support
* fix: final touches of azure integration
* feat: add google vertex provider
* chore: fix tests and refactor task-manager.test.js
* chore: move task 92 to 94
This commit introduces several improvements to AI interactions and
task management functionalities:
- AI Provider Enhancements (for Telemetry & Robustness):
- :
- Added a check in to ensure
is a string, throwing an error if not. This prevents downstream
errors (e.g., in ).
- , , :
- Standardized return structures for their respective
and functions to consistently include /
and fields. This aligns them with other providers (like
Anthropic, Google, Perplexity) for consistent telemetry data
collection, as part of implementing subtask 77.14 and similar work.
- Task Expansion ():
- Updated to be more explicit
about using an empty array for empty to
better guide AI output.
- Implemented a pre-emptive cleanup step in
to replace malformed with
before JSON parsing. This improves resilience to AI output quirks,
particularly observed with Perplexity.
- Adjusts issue in commands.js where successfulRemovals would be undefined. It's properly invoked from the result variable now.
- Updates supported models for Gemini
These changes address issues observed during E2E tests, enhance the
reliability of AI-driven task analysis and expansion, and promote
consistent telemetry data across multiple AI providers.
This commit updates the Perplexity AI provider () to ensure its functions return data in a structure consistent with other providers and the expectations of the unified AI service layer ().
Specifically:
- now returns an object instead of only the text string.
- now returns an object instead of only the result object.
These changes ensure that can correctly extract both the primary AI-generated content and the token usage data for telemetry purposes when Perplexity models are used. This resolves issues encountered during E2E testing where complexity analysis (which can use Perplexity for its research role) failed due to unexpected response formats.
The function was already compliant.
This commit introduces two key improvements:
1. **Google Provider Telemetry:**
- Updated to include token usage data (, ) in the responses from and .
- This aligns the Google provider with others for consistent AI usage telemetry.
2. **Robust AI Object Response Handling:**
- Modified to more flexibly handle responses from .
- The add-task module now check for the AI-generated object in both and , improving compatibility with different AI provider response structures (e.g., Gemini).
These changes enhance the reliability of AI interactions, particularly with the Google provider, and ensure accurate telemetry collection.
This commit introduces a standardized pattern for capturing and propagating AI usage telemetry (cost, tokens, model used) across the Task Master stack and applies it to the 'add-task' functionality.
Key changes include:
- **Telemetry Pattern Definition:**
- Added defining the integration pattern for core logic, direct functions, MCP tools, and CLI commands.
- Updated related rules (, ,
Usage: mcp [OPTIONS] COMMAND [ARGS]...
MCP development tools
╭─ Options ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --help Show this message and exit. │
╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Commands ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ version Show the MCP version. │
│ dev Run a MCP server with the MCP Inspector. │
│ run Run a MCP server. │
│ install Install a MCP server in the Claude desktop app. │
╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯, , ) to reference the new telemetry rule.
- **Core Telemetry Implementation ():**
- Refactored the unified AI service to generate and return a object alongside the main AI result.
- Fixed an MCP server startup crash by removing redundant local loading of and instead using the imported from for cost calculations.
- Added to the object.
- ** Integration:**
- Modified (core) to receive from the AI service, return it, and call the new UI display function for CLI output.
- Updated to receive from the core function and include it in the payload of its response.
- Ensured (MCP tool) correctly passes the through via .
- Updated to correctly pass context (, ) to the core function and rely on it for CLI telemetry display.
- **UI Enhancement:**
- Added function to to show telemetry details in the CLI.
- **Project Management:**
- Added subtasks 77.6 through 77.12 to track the rollout of this telemetry pattern to other AI-powered commands (, , , , , , ).
This establishes the foundation for tracking AI usage across the application.
Integrates the OpenRouter AI provider using the Vercel AI SDK adapter (@openrouter/ai-sdk-provider). This allows users to configure and utilize models available through the OpenRouter platform.
- Added src/ai-providers/openrouter.js with standard Vercel AI SDK wrapper functions (generateText, streamText, generateObject).
- Updated ai-services-unified.js to include the OpenRouter provider in the PROVIDER_FUNCTIONS map and API key resolution logic.
- Verified config-manager.js handles OpenRouter API key checks correctly.
- Users can configure OpenRouter models via .taskmasterconfig using the task-master models command or MCP models tool. Requires OPENROUTER_API_KEY.
- Enhanced error handling in ai-services-unified.js to provide clearer messages when generateObjectService fails due to lack of underlying tool support in the selected model/provider endpoint.
Integrates the xAI provider into the unified AI service layer, allowing the use of Grok models (e.g., grok-3, grok-3-mini).
Changes include:
- Added dependency.
- Created with implementations for generateText, streamText, and generateObject (stubbed).
- Updated to include the xAI provider in the function map.
- Updated to recognize the 'xai' provider and the environment variable.
- Updated to include known Grok models and their capabilities (object generation marked as likely unsupported).
- Add OpenAI provider implementation using @ai-sdk/openai.\n- Update `models` command/tool to display API key status for configured providers.\n- Implement model-specific `maxTokens` override logic in `config-manager.js` using `supported-models.json`.\n- Improve AI error message parsing in `ai-services-unified.js` for better clarity.
Resolves persistent 404 'Not Found' errors when calling Anthropic models via the Vercel AI SDK. The primary issue was likely related to incorrect or missing API headers.
- Refactors Anthropic provider (src/ai-providers/anthropic.js) to use the standard 'anthropic-version' header instead of potentially outdated/incorrect beta headers when creating the client instance.
- Updates the default fallback model ID in .taskmasterconfig to 'claude-3-5-sonnet-20241022'.
- Fixes the interactive model setup (task-master models --setup) in scripts/modules/commands.js to correctly filter and default the main model selection.
- Improves the cost display in the 'task-master models' command output to explicitly show 'Free' for models with zero cost.
- Updates description for the 'id' parameter in the 'set_task_status' MCP tool definition for clarity.
- Updates list of models and costs
- Unified Service: Introduced 'scripts/modules/ai-services-unified.js' to centralize AI interactions using provider modules ('src/ai-providers/') and the Vercel AI SDK.
- Provider Modules: Implemented 'anthropic.js' and 'perplexity.js' wrappers for Vercel SDK.
- 'updateSubtaskById' Fix: Refactored the AI call within 'updateSubtaskById' to use 'generateTextService' from the unified layer, resolving runtime errors related to parameter passing and streaming. This serves as the pattern for refactoring other AI calls in 'scripts/modules/task-manager/'.
- Task Status: Marked Subtask 61.19 as 'done'.
- Rules: Added new 'ai-services.mdc' rule.
This centralizes AI logic, replacing previous direct SDK calls and custom implementations. API keys are resolved via 'resolveEnvVariable' within the service layer. The refactoring of 'updateSubtaskById' establishes the standard approach for migrating other AI-dependent functions in the task manager module to use the unified service.
Relates to Task 61.