Conversation
…-specific detection (#1049) Removes the default empty array value from the complexity report option to properly detect when tags are explicitly provided vs when no tags are provided, fixing the expand --all command behavior with tagged tasks. Co-authored-by: Ben Vargas <ben@example.com>
…1063) * fix: normalize task IDs to numbers on load to fix comparison issues When tasks.json contains string IDs (e.g., "5" instead of 5), task lookups fail because the code uses parseInt() and strict equality (===) for comparisons. This fix normalizes all task and subtask IDs to numbers when loading the JSON, ensuring consistent comparisons throughout the codebase without requiring changes to multiple comparison locations. Fixes task not found errors when using string IDs in tasks.json. * Added test * Don't mess up formatting * Fix formatting once and for all * Update scripts/modules/utils.js Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * Update scripts/modules/utils.js Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * Update scripts/modules/utils.js Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * fix: normalize task IDs to numbers on load to fix comparison issues - Added normalizeTaskIds function to convert string IDs to numbers - Applied normalization in readJSON for all code paths - Fixed set-task-status, add-task, and move-task to normalize IDs when working with raw data - Exported normalizeTaskIds function for use in other modules - Added test case for string ID normalization 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com> * Simplified implementation * refactor: normalize IDs once when loading JSON instead of scattered calls - Normalize all tags' data when creating _rawTaggedData in readJSON - Add support for handling malformed dotted subtask IDs (e.g., "5.1" -> 1) - Remove redundant normalizeTaskIds calls from set-task-status, add-task, and move-task - Add comprehensive test for mixed ID formats (string IDs and dotted notation) - Cleaner, more maintainable solution that normalizes IDs at load time 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com> * chore: run format to resolve CI issues --------- Co-authored-by: Carl Mercier <carl@carlmercier.com> Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> Co-authored-by: Claude <noreply@anthropic.com>
🦋 Changeset detectedLatest commit: 028ed9c The changes in this PR will be included in the next version bump. Not sure what this means? Click here to learn what changesets are. Click here if you're a maintainer who wants to add another changeset to this PR |
WalkthroughThis update introduces new CLI commands ( Changes
Sequence Diagram(s)sequenceDiagram
participant User
participant CLI
participant TaskManager
participant MCPServer
participant AI
participant FileSystem
User->>CLI: task-master scope-up --id 5 --strength heavy
CLI->>TaskManager: scopeUpTask(tasksPath, [5], 'heavy', ...)
TaskManager->>FileSystem: Read tasks.json
TaskManager->>AI: Generate new complexity & subtasks (scope-up)
AI-->>TaskManager: New task details/subtasks
TaskManager->>FileSystem: Write updated tasks.json
TaskManager-->>CLI: Success message
User->>CLI: task-master scope-down --id 5 --strength light
CLI->>TaskManager: scopeDownTask(tasksPath, [5], 'light', ...)
TaskManager->>FileSystem: Read tasks.json
TaskManager->>AI: Generate simplified task/subtasks (scope-down)
AI-->>TaskManager: Updated task details/subtasks
TaskManager->>FileSystem: Write updated tasks.json
TaskManager-->>CLI: Success message
sequenceDiagram
participant VSCodeUser
participant VSCodeExtension
participant MCPServer
participant AI
VSCodeUser->>VSCodeExtension: Drag task to new column (status change)
VSCodeExtension->>MCPServer: updateTaskStatus(taskId, newStatus)
MCPServer-->>VSCodeExtension: Success/Failure
VSCodeUser->>VSCodeExtension: Click "Scope Up" on task
VSCodeExtension->>MCPServer: scope_up_task(taskId, strength)
MCPServer->>AI: Generate more complex task breakdown
AI-->>MCPServer: New task/subtasks
MCPServer-->>VSCodeExtension: Updated task data
VSCodeExtension-->>VSCodeUser: UI updates with new complexity
Estimated code review effort🎯 5 (Critical) | ⏱️ ~90+ minutes
Possibly related issues
Possibly related PRs
Suggested reviewers
✨ Finishing Touches
🧪 Generate unit tests
🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
SupportNeed help? Create a ticket on our support page for assistance with any issues or questions. Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. CodeRabbit Commands (Invoked using PR comments)
Other keywords and placeholders
Documentation and Community
|
There was a problem hiding this comment.
Actionable comments posted: 2
♻️ Duplicate comments (1)
package.json (1)
3-3: Version–title mismatch (see previous comment)
"version": "0.22.1-rc.0"conflicts with the PR title “Release 0.23.0”. Align the version or the PR messaging before publishing.
📜 Review details
Configuration used: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro
📒 Files selected for processing (3)
.changeset/pre.json(1 hunks)CHANGELOG.md(1 hunks)package.json(2 hunks)
🧰 Additional context used
📓 Path-based instructions (1)
.changeset/*
📄 CodeRabbit Inference Engine (.cursor/rules/new_features.mdc)
Create appropriate changesets for new features, use semantic versioning, include tagged system information in release notes, and document breaking changes if any.
Files:
.changeset/pre.json
🧠 Learnings (46)
📓 Common learnings
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/git_workflow.mdc:0-0
Timestamp: 2025-07-18T17:10:31.810Z
Learning: Pull Request titles must follow the format: Task <ID>: <Task Title>
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/git_workflow.mdc:0-0
Timestamp: 2025-07-18T17:10:31.810Z
Learning: Pull Request descriptions must use the provided template, including Task Overview, Subtasks Completed, Implementation Details, Testing, Breaking Changes, and Related Tasks
Learnt from: Crunchyman-ralph
PR: eyaltoledano/claude-task-master#997
File: apps/extension/src/services/task-repository.ts:25-57
Timestamp: 2025-07-31T21:48:00.361Z
Learning: In the eyaltoledano/claude-task-master repository, every task is always part of a tag - there is no concept of untagged tasks. The tag system is mandatory and comprehensive, meaning all tasks exist within a tag context (with 'master' as the default tag if none specified).
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: CLAUDE.md:0-0
Timestamp: 2025-07-31T22:07:14.017Z
Learning: Import Task Master's development workflow commands and guidelines, treat as if import is in the main CLAUDE.md file.
Learnt from: Crunchyman-ralph
PR: eyaltoledano/claude-task-master#1002
File: .changeset/puny-friends-give.md:2-3
Timestamp: 2025-07-17T21:33:57.585Z
Learning: In the eyaltoledano/claude-task-master repository, the MCP server code in mcp-server/src/ is part of the main "task-master-ai" package, not a separate "mcp-server" package. When creating changesets for MCP server changes, use "task-master-ai" as the package name.
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/dependencies.mdc:0-0
Timestamp: 2025-07-18T17:09:45.690Z
Learning: Applies to scripts/modules/dependency-manager.js : Allow numeric subtask IDs to reference other subtasks within the same parent
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/dependencies.mdc:0-0
Timestamp: 2025-07-18T17:09:40.548Z
Learning: Applies to scripts/modules/dependency-manager.js : Allow numeric subtask IDs to reference other subtasks within the same parent
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/tasks.mdc:0-0
Timestamp: 2025-07-18T17:14:29.399Z
Learning: Applies to scripts/modules/task-manager.js : Use consistent formatting for task files, include all task properties in text files, and format dependencies with status indicators.
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/tasks.mdc:0-0
Timestamp: 2025-07-18T17:14:29.399Z
Learning: Applies to scripts/modules/task-manager.js : Subtasks must use consistent properties, maintain simple numeric IDs unique within the parent task, and must not duplicate parent task properties.
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/dependencies.mdc:0-0
Timestamp: 2025-07-18T17:09:45.690Z
Learning: Applies to scripts/modules/dependency-manager.js : Use string IDs with dot notation (e.g., "1.2") for subtask references
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/dependencies.mdc:0-0
Timestamp: 2025-07-18T17:09:40.548Z
Learning: Applies to scripts/modules/dependency-manager.js : Use string IDs with dot notation (e.g., "1.2") for subtask references
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/utilities.mdc:0-0
Timestamp: 2025-07-18T17:18:17.759Z
Learning: Applies to scripts/modules/utils.js : Use tagged task system aware functions for task finding and manipulation, handle both task and subtask operations, and validate task IDs before operations.
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/utilities.mdc:0-0
Timestamp: 2025-07-18T17:18:17.759Z
Learning: Applies to scripts/modules/utils.js : Create utilities for consistent task ID handling and support different ID formats (numeric, string, dot notation); do not duplicate formatting logic across modules.
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/dependencies.mdc:0-0
Timestamp: 2025-07-18T17:09:45.690Z
Learning: Applies to scripts/modules/dependency-manager.js : Use numeric IDs for direct task references
📚 Learning: applies to .changeset/* : create appropriate changesets for new features, use semantic versioning, i...
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/new_features.mdc:0-0
Timestamp: 2025-07-18T17:12:57.903Z
Learning: Applies to .changeset/* : Create appropriate changesets for new features, use semantic versioning, include tagged system information in release notes, and document breaking changes if any.
Applied to files:
.changeset/pre.json
📚 Learning: applies to .taskmaster/state.json : track taskmaster's current tag context and migration status in `...
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/dev_workflow.mdc:0-0
Timestamp: 2025-07-18T17:10:12.881Z
Learning: Applies to .taskmaster/state.json : Track Taskmaster's current tag context and migration status in `.taskmaster/state.json`, which is automatically created and managed by the system.
Applied to files:
.changeset/pre.json
📚 Learning: every pull request containing new features, bug fixes, breaking changes, performance improvements, s...
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/changeset.mdc:0-0
Timestamp: 2025-07-18T17:07:53.100Z
Learning: Every pull request containing new features, bug fixes, breaking changes, performance improvements, significant refactoring, user-facing documentation updates, dependency updates, or impactful build/tooling changes should include a changeset file.
Applied to files:
.changeset/pre.jsonpackage.jsonCHANGELOG.md
📚 Learning: applies to .changeset/*.md : the changeset summary should be user-facing, describing what changed in...
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/changeset.mdc:0-0
Timestamp: 2025-07-18T17:07:53.100Z
Learning: Applies to .changeset/*.md : The changeset summary should be user-facing, describing what changed in the released version that is relevant to users or consumers of the package.
Applied to files:
.changeset/pre.jsonCHANGELOG.md
📚 Learning: coderabbit configuration files like .coderabbit.yaml are internal development tooling that affect th...
Learnt from: Crunchyman-ralph
PR: eyaltoledano/claude-task-master#992
File: .coderabbit.yaml:1-169
Timestamp: 2025-07-16T16:06:07.169Z
Learning: CodeRabbit configuration files like .coderabbit.yaml are internal development tooling that affect the review process but don't impact end users, so changesets are not required for these configuration additions.
Applied to files:
.changeset/pre.json
📚 Learning: guidelines for using changesets (npm run changeset) to manage versioning and changelogs (changeset.m...
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/glossary.mdc:0-0
Timestamp: 2025-07-18T17:10:53.657Z
Learning: Guidelines for using Changesets (npm run changeset) to manage versioning and changelogs (changeset.mdc).
Applied to files:
.changeset/pre.jsonpackage.json
📚 Learning: applies to .taskmaster/config.json : store taskmaster configuration settings (ai model selections, p...
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/dev_workflow.mdc:0-0
Timestamp: 2025-07-18T17:10:02.683Z
Learning: Applies to .taskmaster/config.json : Store Taskmaster configuration settings (AI model selections, parameters, logging level, default subtasks/priority, project name, tag management) in `.taskmaster/config.json` in the project root. Do not configure these via environment variables.
Applied to files:
.changeset/pre.jsonpackage.json
📚 Learning: in the eyaltoledano/claude-task-master repository, the vs code extension uses a 3-file packaging sys...
Learnt from: Crunchyman-ralph
PR: eyaltoledano/claude-task-master#997
File: apps/extension/package.publish.json:2-8
Timestamp: 2025-07-31T20:49:04.613Z
Learning: In the eyaltoledano/claude-task-master repository, the VS Code extension uses a 3-file packaging system where package.json (with name "extension") is for development within the monorepo, while package.publish.json (with name "task-master-hamster") contains the clean manifest for VS Code marketplace publishing. The different names are intentional and serve distinct purposes in the build and publishing workflow.
Applied to files:
.changeset/pre.jsonpackage.json
📚 Learning: do not add a changeset for local configuration changes, such as updates to personal editor settings ...
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/changeset.mdc:0-0
Timestamp: 2025-07-18T17:07:53.100Z
Learning: Do not add a changeset for local configuration changes, such as updates to personal editor settings or local `.env` files.
Applied to files:
.changeset/pre.json
📚 Learning: always stage and commit the generated `.changeset/*.md` file along with your relevant code changes....
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/changeset.mdc:0-0
Timestamp: 2025-07-18T17:07:53.100Z
Learning: Always stage and commit the generated `.changeset/*.md` file along with your relevant code changes.
Applied to files:
.changeset/pre.json
📚 Learning: applies to scripts/modules/task-manager.js : tasks must be organized into separate contexts (tags) w...
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/tasks.mdc:0-0
Timestamp: 2025-07-18T17:14:29.399Z
Learning: Applies to scripts/modules/task-manager.js : Tasks must be organized into separate contexts (tags) within tasks.json, using the tagged format: {"master": {"tasks": [...]}, "feature-branch": {"tasks": [...]}}. Legacy format {"tasks": [...]} must be silently migrated to the tagged format on first use.
Applied to files:
.changeset/pre.json
📚 Learning: guidelines for integrating new features into the task master cli with tagged system considerations (...
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/glossary.mdc:0-0
Timestamp: 2025-07-18T17:10:53.657Z
Learning: Guidelines for integrating new features into the Task Master CLI with tagged system considerations (new_features.mdc).
Applied to files:
.changeset/pre.jsonCHANGELOG.md
📚 Learning: applies to scripts/modules/task-manager.js : the default tag 'master' must be used for all existing ...
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/tasks.mdc:0-0
Timestamp: 2025-07-18T17:14:29.399Z
Learning: Applies to scripts/modules/task-manager.js : The default tag 'master' must be used for all existing and new tasks unless otherwise specified.
Applied to files:
.changeset/pre.jsonpackage.jsonCHANGELOG.md
📚 Learning: applies to scripts/modules/utils.js : use tag resolution functions for all task data access, provide...
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/utilities.mdc:0-0
Timestamp: 2025-07-18T17:18:17.759Z
Learning: Applies to scripts/modules/utils.js : Use tag resolution functions for all task data access, provide backward compatibility with legacy format, and default to 'master' tag when no tag is specified.
Applied to files:
.changeset/pre.json
📚 Learning: applies to .changeset/*.md : when running `npm run changeset` or `npx changeset add`, provide a conc...
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/changeset.mdc:0-0
Timestamp: 2025-07-18T17:07:53.100Z
Learning: Applies to .changeset/*.md : When running `npm run changeset` or `npx changeset add`, provide a concise summary of the changes for the `CHANGELOG.md` in imperative mood, typically a single line, and not a detailed Git commit message.
Applied to files:
.changeset/pre.jsonCHANGELOG.md
📚 Learning: for prd-driven feature development, create a dedicated tag, draft a prd in `.taskmaster/docs/`, pars...
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/dev_workflow.mdc:0-0
Timestamp: 2025-07-18T17:10:12.881Z
Learning: For PRD-driven feature development, create a dedicated tag, draft a PRD in `.taskmaster/docs/`, parse it into tasks, and add a high-level reference in the master tag.
Applied to files:
.changeset/pre.json
📚 Learning: document breaking changes...
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/self_improve.mdc:0-0
Timestamp: 2025-07-18T17:13:11.229Z
Learning: Document breaking changes
Applied to files:
package.json
📚 Learning: when implementation differs significantly from planned approach, call `node scripts/dev.js update --...
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: assets/.windsurfrules:0-0
Timestamp: 2025-07-18T17:19:27.365Z
Learning: When implementation differs significantly from planned approach, call `node scripts/dev.js update --from=<futureTaskId> --prompt="<explanation>"` to update tasks.json.
Applied to files:
package.json
📚 Learning: for cli usage, install taskmaster globally with `npm install -g task-master-ai` or use locally via `...
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/dev_workflow.mdc:0-0
Timestamp: 2025-07-18T17:10:12.881Z
Learning: For CLI usage, install Taskmaster globally with `npm install -g task-master-ai` or use locally via `npx task-master-ai ...`.
Applied to files:
package.jsonCHANGELOG.md
📚 Learning: use the global `task-master` cli command instead of directly invoking `node scripts/dev.js` for all ...
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: assets/.windsurfrules:0-0
Timestamp: 2025-07-18T17:19:27.365Z
Learning: Use the global `task-master` CLI command instead of directly invoking `node scripts/dev.js` for all task management operations.
Applied to files:
package.json
📚 Learning: use `task-master add-task` to add a new task to tasks.json using ai....
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: assets/.windsurfrules:0-0
Timestamp: 2025-07-18T17:19:27.365Z
Learning: Use `task-master add-task` to add a new task to tasks.json using AI.
Applied to files:
package.json
📚 Learning: start new projects by running `task-master init` or `node scripts/dev.js parse-prd --input=
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: assets/.windsurfrules:0-0
Timestamp: 2025-07-18T17:19:27.365Z
Learning: Start new projects by running `task-master init` or `node scripts/dev.js parse-prd --input=<prd-file.txt>` to generate the initial tasks.json.
Applied to files:
package.json
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: assets/.windsurfrules:0-0
Timestamp: 2025-07-18T17:19:27.365Z
Learning: Start new projects by running `task-master init` or `node scripts/dev.js parse-prd --input=<prd-file.txt>` to generate the initial tasks.json.
package.json📚 Learning: in the eyaltoledano/claude-task-master repository, the mcp server code in mcp-server/src/ is part of...
Learnt from: Crunchyman-ralph
PR: eyaltoledano/claude-task-master#1002
File: .changeset/puny-friends-give.md:2-3
Timestamp: 2025-07-17T21:33:57.585Z
Learning: In the eyaltoledano/claude-task-master repository, the MCP server code in mcp-server/src/ is part of the main "task-master-ai" package, not a separate "mcp-server" package. When creating changesets for MCP server changes, use "task-master-ai" as the package name.
Applied to files:
package.json
📚 Learning: applies to scripts/modules/task-manager.js : extract tasks from prd documents using ai, create them ...
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/tasks.mdc:0-0
Timestamp: 2025-07-18T17:14:29.399Z
Learning: Applies to scripts/modules/task-manager.js : Extract tasks from PRD documents using AI, create them in the current tag context (defaulting to 'master'), provide clear prompts to guide AI task generation, and validate/clean up AI-generated tasks.
Applied to files:
package.json
📚 Learning: applies to scripts/modules/task-manager.js : use consistent formatting for task files, include all t...
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/tasks.mdc:0-0
Timestamp: 2025-07-18T17:14:29.399Z
Learning: Applies to scripts/modules/task-manager.js : Use consistent formatting for task files, include all task properties in text files, and format dependencies with status indicators.
Applied to files:
package.json
📚 Learning: applies to scripts/modules/**/*.test.js : test cli and mcp interfaces with real task data, verify en...
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/new_features.mdc:0-0
Timestamp: 2025-07-18T17:12:57.903Z
Learning: Applies to scripts/modules/**/*.test.js : Test CLI and MCP interfaces with real task data, verify end-to-end workflows across tag contexts, and test error scenarios and recovery in integration tests.
Applied to files:
package.json
📚 Learning: applies to **/*.test.js : do not modify real task files (tasks.json) during tests....
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/tests.mdc:0-0
Timestamp: 2025-07-18T17:16:13.793Z
Learning: Applies to **/*.test.js : Do not modify real task files (tasks.json) during tests.
Applied to files:
package.json
📚 Learning: applies to **/*.test.js : use test-specific file paths (e.g., 'test-tasks.json') for all file operat...
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/tests.mdc:0-0
Timestamp: 2025-07-18T17:16:13.793Z
Learning: Applies to **/*.test.js : Use test-specific file paths (e.g., 'test-tasks.json') for all file operations in tests.
Applied to files:
package.json
📚 Learning: applies to mcp-server/src/{core/utils,tools}/**/*.js : place utilities specifically designed to supp...
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/utilities.mdc:0-0
Timestamp: 2025-07-18T17:18:17.759Z
Learning: Applies to mcp-server/src/{core/utils,tools}/**/*.js : Place utilities specifically designed to support the MCP server implementation into the appropriate subdirectories within `mcp-server/src/` (e.g., path/core logic helpers in `mcp-server/src/core/utils/`, tool execution/response helpers in `mcp-server/src/tools/utils.js`).
Applied to files:
package.json
📚 Learning: applies to scripts/modules/*.js : each module in scripts/modules/ should be focused on a single resp...
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/architecture.mdc:0-0
Timestamp: 2025-07-18T17:07:39.336Z
Learning: Applies to scripts/modules/*.js : Each module in scripts/modules/ should be focused on a single responsibility, following the modular architecture (e.g., commands.js for CLI command handling, task-manager.js for task data and core logic, dependency-manager.js for dependency management, ui.js for CLI output formatting, ai-services-unified.js for AI service integration, config-manager.js for configuration management, utils.js for utility functions).
Applied to files:
package.json
📚 Learning: applies to scripts/modules/*.js : use consistent file naming conventions: 'task_${id.tostring().pads...
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/new_features.mdc:0-0
Timestamp: 2025-07-18T17:12:57.903Z
Learning: Applies to scripts/modules/*.js : Use consistent file naming conventions: 'task_${id.toString().padStart(3, '0')}.txt', use path.join for composing file paths, and use appropriate file extensions (.txt for tasks, .json for data).
Applied to files:
package.json
📚 Learning: applies to tests/{unit,integration,e2e,fixtures}/**/*.js : test files must be organized as follows: ...
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/architecture.mdc:0-0
Timestamp: 2025-07-18T17:07:39.336Z
Learning: Applies to tests/{unit,integration,e2e,fixtures}/**/*.js : Test files must be organized as follows: unit tests in tests/unit/, integration tests in tests/integration/, end-to-end tests in tests/e2e/, and test fixtures in tests/fixtures/.
Applied to files:
package.json
📚 Learning: applies to tests/{unit,integration,e2e}/**/*.test.js : use sample task fixtures for consistent test ...
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/tests.mdc:0-0
Timestamp: 2025-07-18T17:16:13.793Z
Learning: Applies to tests/{unit,integration,e2e}/**/*.test.js : Use sample task fixtures for consistent test data, mock file system operations, and test both success and error paths for task operations.
Applied to files:
package.json
📚 Learning: applies to mcp-server/src/tools/*.js : mcp server tools in mcp-server/src/tools/*.js must have their...
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/architecture.mdc:0-0
Timestamp: 2025-07-18T17:07:39.336Z
Learning: Applies to mcp-server/src/tools/*.js : MCP server tools in mcp-server/src/tools/*.js must have their execute methods wrapped with the withNormalizedProjectRoot higher-order function from tools/utils.js to ensure consistent path handling.
Applied to files:
package.json
📚 Learning: todo comments about adding tag support to internal functions like readcomplexityreport are obsolete ...
Learnt from: mm-parthy
PR: eyaltoledano/claude-task-master#943
File: scripts/modules/task-manager/list-tasks.js:0-0
Timestamp: 2025-07-18T08:29:52.384Z
Learning: TODO comments about adding tag support to internal functions like readComplexityReport are obsolete in the boundary-first tag resolution pattern because report paths are already resolved at the CLI command boundary layer before reaching these functions.
Applied to files:
CHANGELOG.md
📚 Learning: commands such as `analyze-complexity`, `expand-task`, `update-task`, and `add-task` should consider ...
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/context_gathering.mdc:0-0
Timestamp: 2025-07-18T17:09:13.815Z
Learning: Commands such as `analyze-complexity`, `expand-task`, `update-task`, and `add-task` should consider adopting the context gathering pattern for improved AI-powered assistance.
Applied to files:
CHANGELOG.md
📚 Learning: describes the high-level architecture of the task master cli application, including the new tagged t...
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/glossary.mdc:0-0
Timestamp: 2025-07-18T17:10:53.657Z
Learning: Describes the high-level architecture of the Task Master CLI application, including the new tagged task lists system (architecture.mdc).
Applied to files:
CHANGELOG.md
📚 Learning: when breaking down complex tasks, use the `expand_task` command with appropriate flags (`--force`, `...
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/dev_workflow.mdc:0-0
Timestamp: 2025-07-18T17:10:12.881Z
Learning: When breaking down complex tasks, use the `expand_task` command with appropriate flags (`--force`, `--research`, `--num`, `--prompt`) and review generated subtasks for accuracy.
Applied to files:
CHANGELOG.md
📚 Learning: applies to scripts/modules/task-manager.js : use ai to generate detailed subtasks within the current...
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/tasks.mdc:0-0
Timestamp: 2025-07-18T17:14:29.399Z
Learning: Applies to scripts/modules/task-manager.js : Use AI to generate detailed subtasks within the current tag context, considering complexity analysis for subtask counts and ensuring proper IDs for newly created subtasks.
Applied to files:
CHANGELOG.md
📚 Learning: use the taskmaster command set (`task-master` cli or mcp tools) for all task management operations: ...
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/dev_workflow.mdc:0-0
Timestamp: 2025-07-18T17:10:12.881Z
Learning: Use the Taskmaster command set (`task-master` CLI or MCP tools) for all task management operations: listing, expanding, updating, tagging, and status changes.
Applied to files:
CHANGELOG.md
📚 Learning: in the eyaltoledano/claude-task-master repository, every task is always part of a tag - there is no ...
Learnt from: Crunchyman-ralph
PR: eyaltoledano/claude-task-master#997
File: apps/extension/src/services/task-repository.ts:25-57
Timestamp: 2025-07-31T21:48:00.361Z
Learning: In the eyaltoledano/claude-task-master repository, every task is always part of a tag - there is no concept of untagged tasks. The tag system is mandatory and comprehensive, meaning all tasks exist within a tag context (with 'master' as the default tag if none specified).
Applied to files:
CHANGELOG.md
📚 Learning: use `task-master complexity-report` to display the task complexity analysis report in a formatted, e...
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: assets/.windsurfrules:0-0
Timestamp: 2025-07-18T17:19:27.365Z
Learning: Use `task-master complexity-report` to display the task complexity analysis report in a formatted, easy-to-read way.
Applied to files:
CHANGELOG.md
📚 Learning: analyze task complexity with `task-master analyze-complexity --research` before breaking down tasks....
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: assets/.windsurfrules:0-0
Timestamp: 2025-07-18T17:19:27.365Z
Learning: Analyze task complexity with `task-master analyze-complexity --research` before breaking down tasks.
Applied to files:
CHANGELOG.md
📚 Learning: comprehensive reference for taskmaster mcp tools and cli commands with tagged task lists information...
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/glossary.mdc:0-0
Timestamp: 2025-07-18T17:10:53.657Z
Learning: Comprehensive reference for Taskmaster MCP tools and CLI commands with tagged task lists information (taskmaster.mdc).
Applied to files:
CHANGELOG.md
📚 Learning: break down complex tasks using `task-master expand --id=` with appropriate flags....
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: assets/.windsurfrules:0-0
Timestamp: 2025-07-18T17:19:27.365Z
Learning: Break down complex tasks using `task-master expand --id=<id>` with appropriate flags.
Applied to files:
CHANGELOG.md
🔇 Additional comments (1)
.changeset/pre.json (1)
2-11: Clarify pre-release mode vs. “Release 0.23.0” target
The PR title says “Release 0.23.0”, yet this file keeps the repo in Changesets pre mode ("mode": "pre"/ tagrc) and implies the next version is0.22.1-rc.0.
• If you intend to publish a full 0.23.0 release, runchangeset pre exit, delete this file, and bump versions accordingly.
• Otherwise, rename the PR to indicate an RC/pre-release.
Please verify before merging.
| ## 0.22.1-rc.0 | ||
|
|
||
| ### Patch Changes | ||
|
|
||
| - [#1063](https://github.com/eyaltoledano/claude-task-master/pull/1063) [`2ae6e7e`](https://github.com/eyaltoledano/claude-task-master/commit/2ae6e7e6be3605c3c4d353f34666e54750dba973) Thanks [@Crunchyman-ralph](https://github.com/Crunchyman-ralph)! - Fix for tasks not found when using string IDs | ||
|
|
||
| - [#1049](https://github.com/eyaltoledano/claude-task-master/pull/1049) [`45a14c3`](https://github.com/eyaltoledano/claude-task-master/commit/45a14c323d21071c15106335e89ad1f4a20976ab) Thanks [@ben-vargas](https://github.com/ben-vargas)! - Fix tag-specific complexity report detection in expand command | ||
|
|
||
| The expand command now correctly finds and uses tag-specific complexity reports (e.g., `task-complexity-report_feature-xyz.json`) when operating in a tag context. Previously, it would always look for the generic `task-complexity-report.json` file due to a default value in the CLI option definition. | ||
|
|
There was a problem hiding this comment.
Version header conflicts with PR goal – update to 0.23.0 (or clarify)
The PR is titled “Release 0.23.0”, but the changelog introduces 0.22.1-rc.0.
Shipping with a lower RC tag will confuse both npm consumers and semantic-release automation.
Proposed quick fix:
-## 0.22.1-rc.0
+## 0.23.0If you do intend a 0.22.1-rc.0 hot-fix, rename the PR accordingly and adjust the milestone label.
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| ## 0.22.1-rc.0 | |
| ### Patch Changes | |
| - [#1063](https://github.com/eyaltoledano/claude-task-master/pull/1063) [`2ae6e7e`](https://github.com/eyaltoledano/claude-task-master/commit/2ae6e7e6be3605c3c4d353f34666e54750dba973) Thanks [@Crunchyman-ralph](https://github.com/Crunchyman-ralph)! - Fix for tasks not found when using string IDs | |
| - [#1049](https://github.com/eyaltoledano/claude-task-master/pull/1049) [`45a14c3`](https://github.com/eyaltoledano/claude-task-master/commit/45a14c323d21071c15106335e89ad1f4a20976ab) Thanks [@ben-vargas](https://github.com/ben-vargas)! - Fix tag-specific complexity report detection in expand command | |
| The expand command now correctly finds and uses tag-specific complexity reports (e.g., `task-complexity-report_feature-xyz.json`) when operating in a tag context. Previously, it would always look for the generic `task-complexity-report.json` file due to a default value in the CLI option definition. | |
| ## 0.23.0 | |
| ### Patch Changes | |
| - [#1063](https://github.com/eyaltoledano/claude-task-master/pull/1063) [`2ae6e7e`](https://github.com/eyaltoledano/claude-task-master/commit/2ae6e7e6be3605c3c4d353f34666e54750dba973) Thanks [@Crunchyman-ralph](https://github.com/Crunchyman-ralph)! - Fix for tasks not found when using string IDs | |
| - [#1049](https://github.com/eyaltoledano/claude-task-master/pull/1049) [`45a14c3`](https://github.com/eyaltoledano/claude-task-master/commit/45a14c323d21071c15106335e89ad1f4a20976ab) Thanks [@ben-vargas](https://github.com/ben-vargas)! - Fix tag-specific complexity report detection in expand command | |
| The expand command now correctly finds and uses tag-specific complexity reports (e.g., `task-complexity-report_feature-xyz.json`) when operating in a tag context. Previously, it would always look for the generic `task-complexity-report.json` file due to a default value in the CLI option definition. |
🤖 Prompt for AI Agents
In CHANGELOG.md around lines 3 to 12, the version header is set to 0.22.1-rc.0,
which conflicts with the PR title "Release 0.23.0". To fix this, update the
version header in the changelog to 0.23.0 to match the PR title and intended
release version. Alternatively, if the intention is to release a 0.22.1-rc.0
hotfix, rename the PR and adjust the milestone label accordingly to avoid
confusion.
| "workspaces": [ | ||
| "apps/*", | ||
| "." | ||
| ], |
There was a problem hiding this comment.
🧹 Nitpick (assertive)
Nit: root "." entry in workspaces is superfluous
The root package is implicitly part of the workspace; removing "." keeps the list minimal without affecting functionality.
🤖 Prompt for AI Agents
In package.json around lines 12 to 15, the root entry "." in the workspaces
array is unnecessary because the root package is implicitly included. Remove the
"." entry from the workspaces array to keep the configuration minimal without
changing functionality.
There was a problem hiding this comment.
Actionable comments posted: 4
📜 Review details
Configuration used: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro
📒 Files selected for processing (3)
.changeset/pre.json(1 hunks)CHANGELOG.md(1 hunks)package.json(2 hunks)
🧰 Additional context used
📓 Path-based instructions (1)
.changeset/*
📄 CodeRabbit Inference Engine (.cursor/rules/new_features.mdc)
Create appropriate changesets for new features, use semantic versioning, include tagged system information in release notes, and document breaking changes if any.
Files:
.changeset/pre.json
🧠 Learnings (44)
📓 Common learnings
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/git_workflow.mdc:0-0
Timestamp: 2025-07-18T17:10:31.810Z
Learning: Pull Request titles must follow the format: Task <ID>: <Task Title>
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/git_workflow.mdc:0-0
Timestamp: 2025-07-18T17:10:31.810Z
Learning: Pull Request descriptions must use the provided template, including Task Overview, Subtasks Completed, Implementation Details, Testing, Breaking Changes, and Related Tasks
Learnt from: Crunchyman-ralph
PR: eyaltoledano/claude-task-master#997
File: apps/extension/src/services/task-repository.ts:25-57
Timestamp: 2025-07-31T21:48:00.361Z
Learning: In the eyaltoledano/claude-task-master repository, every task is always part of a tag - there is no concept of untagged tasks. The tag system is mandatory and comprehensive, meaning all tasks exist within a tag context (with 'master' as the default tag if none specified).
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: CLAUDE.md:0-0
Timestamp: 2025-07-31T22:07:14.017Z
Learning: Import Task Master's development workflow commands and guidelines, treat as if import is in the main CLAUDE.md file.
Learnt from: Crunchyman-ralph
PR: eyaltoledano/claude-task-master#1002
File: .changeset/puny-friends-give.md:2-3
Timestamp: 2025-07-17T21:33:57.585Z
Learning: In the eyaltoledano/claude-task-master repository, the MCP server code in mcp-server/src/ is part of the main "task-master-ai" package, not a separate "mcp-server" package. When creating changesets for MCP server changes, use "task-master-ai" as the package name.
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/dependencies.mdc:0-0
Timestamp: 2025-07-18T17:09:45.690Z
Learning: Applies to scripts/modules/dependency-manager.js : Allow numeric subtask IDs to reference other subtasks within the same parent
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/dependencies.mdc:0-0
Timestamp: 2025-07-18T17:09:40.548Z
Learning: Applies to scripts/modules/dependency-manager.js : Allow numeric subtask IDs to reference other subtasks within the same parent
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/tasks.mdc:0-0
Timestamp: 2025-07-18T17:14:29.399Z
Learning: Applies to scripts/modules/task-manager.js : Use consistent formatting for task files, include all task properties in text files, and format dependencies with status indicators.
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/tasks.mdc:0-0
Timestamp: 2025-07-18T17:14:29.399Z
Learning: Applies to scripts/modules/task-manager.js : Subtasks must use consistent properties, maintain simple numeric IDs unique within the parent task, and must not duplicate parent task properties.
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/dependencies.mdc:0-0
Timestamp: 2025-07-18T17:09:45.690Z
Learning: Applies to scripts/modules/dependency-manager.js : Use string IDs with dot notation (e.g., "1.2") for subtask references
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/dependencies.mdc:0-0
Timestamp: 2025-07-18T17:09:40.548Z
Learning: Applies to scripts/modules/dependency-manager.js : Use string IDs with dot notation (e.g., "1.2") for subtask references
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/utilities.mdc:0-0
Timestamp: 2025-07-18T17:18:17.759Z
Learning: Applies to scripts/modules/utils.js : Use tagged task system aware functions for task finding and manipulation, handle both task and subtask operations, and validate task IDs before operations.
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/utilities.mdc:0-0
Timestamp: 2025-07-18T17:18:17.759Z
Learning: Applies to scripts/modules/utils.js : Create utilities for consistent task ID handling and support different ID formats (numeric, string, dot notation); do not duplicate formatting logic across modules.
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/dependencies.mdc:0-0
Timestamp: 2025-07-18T17:09:45.690Z
Learning: Applies to scripts/modules/dependency-manager.js : Use numeric IDs for direct task references
📚 Learning: guidelines for using changesets (npm run changeset) to manage versioning and changelogs (changeset.m...
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/glossary.mdc:0-0
Timestamp: 2025-07-18T17:10:53.657Z
Learning: Guidelines for using Changesets (npm run changeset) to manage versioning and changelogs (changeset.mdc).
Applied to files:
package.json.changeset/pre.jsonCHANGELOG.md
📚 Learning: in the eyaltoledano/claude-task-master repository, the vs code extension uses a 3-file packaging sys...
Learnt from: Crunchyman-ralph
PR: eyaltoledano/claude-task-master#997
File: apps/extension/package.publish.json:2-8
Timestamp: 2025-07-31T20:49:04.613Z
Learning: In the eyaltoledano/claude-task-master repository, the VS Code extension uses a 3-file packaging system where package.json (with name "extension") is for development within the monorepo, while package.publish.json (with name "task-master-hamster") contains the clean manifest for VS Code marketplace publishing. The different names are intentional and serve distinct purposes in the build and publishing workflow.
Applied to files:
package.json
📚 Learning: document breaking changes...
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/self_improve.mdc:0-0
Timestamp: 2025-07-18T17:13:11.229Z
Learning: Document breaking changes
Applied to files:
package.jsonCHANGELOG.md
📚 Learning: when implementation differs significantly from planned approach, call `node scripts/dev.js update --...
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: assets/.windsurfrules:0-0
Timestamp: 2025-07-18T17:19:27.365Z
Learning: When implementation differs significantly from planned approach, call `node scripts/dev.js update --from=<futureTaskId> --prompt="<explanation>"` to update tasks.json.
Applied to files:
package.json
📚 Learning: for cli usage, install taskmaster globally with `npm install -g task-master-ai` or use locally via `...
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/dev_workflow.mdc:0-0
Timestamp: 2025-07-18T17:10:12.881Z
Learning: For CLI usage, install Taskmaster globally with `npm install -g task-master-ai` or use locally via `npx task-master-ai ...`.
Applied to files:
package.jsonCHANGELOG.md
📚 Learning: use the global `task-master` cli command instead of directly invoking `node scripts/dev.js` for all ...
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: assets/.windsurfrules:0-0
Timestamp: 2025-07-18T17:19:27.365Z
Learning: Use the global `task-master` CLI command instead of directly invoking `node scripts/dev.js` for all task management operations.
Applied to files:
package.json
📚 Learning: use `task-master add-task` to add a new task to tasks.json using ai....
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: assets/.windsurfrules:0-0
Timestamp: 2025-07-18T17:19:27.365Z
Learning: Use `task-master add-task` to add a new task to tasks.json using AI.
Applied to files:
package.json
📚 Learning: start new projects by running `task-master init` or `node scripts/dev.js parse-prd --input=
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: assets/.windsurfrules:0-0
Timestamp: 2025-07-18T17:19:27.365Z
Learning: Start new projects by running `task-master init` or `node scripts/dev.js parse-prd --input=<prd-file.txt>` to generate the initial tasks.json.
Applied to files:
package.json
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: assets/.windsurfrules:0-0
Timestamp: 2025-07-18T17:19:27.365Z
Learning: Start new projects by running `task-master init` or `node scripts/dev.js parse-prd --input=<prd-file.txt>` to generate the initial tasks.json.
package.json📚 Learning: in the eyaltoledano/claude-task-master repository, the mcp server code in mcp-server/src/ is part of...
Learnt from: Crunchyman-ralph
PR: eyaltoledano/claude-task-master#1002
File: .changeset/puny-friends-give.md:2-3
Timestamp: 2025-07-17T21:33:57.585Z
Learning: In the eyaltoledano/claude-task-master repository, the MCP server code in mcp-server/src/ is part of the main "task-master-ai" package, not a separate "mcp-server" package. When creating changesets for MCP server changes, use "task-master-ai" as the package name.
Applied to files:
package.json
📚 Learning: applies to scripts/modules/task-manager.js : the default tag 'master' must be used for all existing ...
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/tasks.mdc:0-0
Timestamp: 2025-07-18T17:14:29.399Z
Learning: Applies to scripts/modules/task-manager.js : The default tag 'master' must be used for all existing and new tasks unless otherwise specified.
Applied to files:
package.json.changeset/pre.jsonCHANGELOG.md
📚 Learning: applies to .taskmaster/config.json : store taskmaster configuration settings (ai model selections, p...
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/dev_workflow.mdc:0-0
Timestamp: 2025-07-18T17:10:02.683Z
Learning: Applies to .taskmaster/config.json : Store Taskmaster configuration settings (AI model selections, parameters, logging level, default subtasks/priority, project name, tag management) in `.taskmaster/config.json` in the project root. Do not configure these via environment variables.
Applied to files:
package.json.changeset/pre.json
📚 Learning: applies to scripts/modules/task-manager.js : extract tasks from prd documents using ai, create them ...
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/tasks.mdc:0-0
Timestamp: 2025-07-18T17:14:29.399Z
Learning: Applies to scripts/modules/task-manager.js : Extract tasks from PRD documents using AI, create them in the current tag context (defaulting to 'master'), provide clear prompts to guide AI task generation, and validate/clean up AI-generated tasks.
Applied to files:
package.json
📚 Learning: applies to scripts/modules/task-manager.js : use consistent formatting for task files, include all t...
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/tasks.mdc:0-0
Timestamp: 2025-07-18T17:14:29.399Z
Learning: Applies to scripts/modules/task-manager.js : Use consistent formatting for task files, include all task properties in text files, and format dependencies with status indicators.
Applied to files:
package.json
📚 Learning: applies to scripts/modules/**/*.test.js : test cli and mcp interfaces with real task data, verify en...
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/new_features.mdc:0-0
Timestamp: 2025-07-18T17:12:57.903Z
Learning: Applies to scripts/modules/**/*.test.js : Test CLI and MCP interfaces with real task data, verify end-to-end workflows across tag contexts, and test error scenarios and recovery in integration tests.
Applied to files:
package.json
📚 Learning: applies to **/*.test.js : do not modify real task files (tasks.json) during tests....
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/tests.mdc:0-0
Timestamp: 2025-07-18T17:16:13.793Z
Learning: Applies to **/*.test.js : Do not modify real task files (tasks.json) during tests.
Applied to files:
package.json
📚 Learning: applies to mcp-server/src/{core/utils,tools}/**/*.js : place utilities specifically designed to supp...
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/utilities.mdc:0-0
Timestamp: 2025-07-18T17:18:17.759Z
Learning: Applies to mcp-server/src/{core/utils,tools}/**/*.js : Place utilities specifically designed to support the MCP server implementation into the appropriate subdirectories within `mcp-server/src/` (e.g., path/core logic helpers in `mcp-server/src/core/utils/`, tool execution/response helpers in `mcp-server/src/tools/utils.js`).
Applied to files:
package.json
📚 Learning: applies to **/*.test.js : use test-specific file paths (e.g., 'test-tasks.json') for all file operat...
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/tests.mdc:0-0
Timestamp: 2025-07-18T17:16:13.793Z
Learning: Applies to **/*.test.js : Use test-specific file paths (e.g., 'test-tasks.json') for all file operations in tests.
Applied to files:
package.json
📚 Learning: applies to scripts/modules/*.js : each module in scripts/modules/ should be focused on a single resp...
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/architecture.mdc:0-0
Timestamp: 2025-07-18T17:07:39.336Z
Learning: Applies to scripts/modules/*.js : Each module in scripts/modules/ should be focused on a single responsibility, following the modular architecture (e.g., commands.js for CLI command handling, task-manager.js for task data and core logic, dependency-manager.js for dependency management, ui.js for CLI output formatting, ai-services-unified.js for AI service integration, config-manager.js for configuration management, utils.js for utility functions).
Applied to files:
package.json
📚 Learning: applies to scripts/modules/*.js : use consistent file naming conventions: 'task_${id.tostring().pads...
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/new_features.mdc:0-0
Timestamp: 2025-07-18T17:12:57.903Z
Learning: Applies to scripts/modules/*.js : Use consistent file naming conventions: 'task_${id.toString().padStart(3, '0')}.txt', use path.join for composing file paths, and use appropriate file extensions (.txt for tasks, .json for data).
Applied to files:
package.json
📚 Learning: applies to tests/{unit,integration,e2e,fixtures}/**/*.js : test files must be organized as follows: ...
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/architecture.mdc:0-0
Timestamp: 2025-07-18T17:07:39.336Z
Learning: Applies to tests/{unit,integration,e2e,fixtures}/**/*.js : Test files must be organized as follows: unit tests in tests/unit/, integration tests in tests/integration/, end-to-end tests in tests/e2e/, and test fixtures in tests/fixtures/.
Applied to files:
package.json
📚 Learning: applies to tests/{unit,integration,e2e}/**/*.test.js : use sample task fixtures for consistent test ...
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/tests.mdc:0-0
Timestamp: 2025-07-18T17:16:13.793Z
Learning: Applies to tests/{unit,integration,e2e}/**/*.test.js : Use sample task fixtures for consistent test data, mock file system operations, and test both success and error paths for task operations.
Applied to files:
package.json
📚 Learning: applies to mcp-server/src/tools/*.js : mcp server tools in mcp-server/src/tools/*.js must have their...
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/architecture.mdc:0-0
Timestamp: 2025-07-18T17:07:39.336Z
Learning: Applies to mcp-server/src/tools/*.js : MCP server tools in mcp-server/src/tools/*.js must have their execute methods wrapped with the withNormalizedProjectRoot higher-order function from tools/utils.js to ensure consistent path handling.
Applied to files:
package.json
📚 Learning: applies to .changeset/* : create appropriate changesets for new features, use semantic versioning, i...
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/new_features.mdc:0-0
Timestamp: 2025-07-18T17:12:57.903Z
Learning: Applies to .changeset/* : Create appropriate changesets for new features, use semantic versioning, include tagged system information in release notes, and document breaking changes if any.
Applied to files:
.changeset/pre.jsonCHANGELOG.md
📚 Learning: applies to .changeset/*.md : the changeset summary should be user-facing, describing what changed in...
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/changeset.mdc:0-0
Timestamp: 2025-07-18T17:07:53.100Z
Learning: Applies to .changeset/*.md : The changeset summary should be user-facing, describing what changed in the released version that is relevant to users or consumers of the package.
Applied to files:
.changeset/pre.jsonCHANGELOG.md
📚 Learning: every pull request containing new features, bug fixes, breaking changes, performance improvements, s...
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/changeset.mdc:0-0
Timestamp: 2025-07-18T17:07:53.100Z
Learning: Every pull request containing new features, bug fixes, breaking changes, performance improvements, significant refactoring, user-facing documentation updates, dependency updates, or impactful build/tooling changes should include a changeset file.
Applied to files:
.changeset/pre.jsonCHANGELOG.md
📚 Learning: coderabbit configuration files like .coderabbit.yaml are internal development tooling that affect th...
Learnt from: Crunchyman-ralph
PR: eyaltoledano/claude-task-master#992
File: .coderabbit.yaml:1-169
Timestamp: 2025-07-16T16:06:07.169Z
Learning: CodeRabbit configuration files like .coderabbit.yaml are internal development tooling that affect the review process but don't impact end users, so changesets are not required for these configuration additions.
Applied to files:
.changeset/pre.json
📚 Learning: always stage and commit the generated `.changeset/*.md` file along with your relevant code changes....
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/changeset.mdc:0-0
Timestamp: 2025-07-18T17:07:53.100Z
Learning: Always stage and commit the generated `.changeset/*.md` file along with your relevant code changes.
Applied to files:
.changeset/pre.json
📚 Learning: do not add a changeset for local configuration changes, such as updates to personal editor settings ...
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/changeset.mdc:0-0
Timestamp: 2025-07-18T17:07:53.100Z
Learning: Do not add a changeset for local configuration changes, such as updates to personal editor settings or local `.env` files.
Applied to files:
.changeset/pre.json
📚 Learning: applies to .taskmaster/state.json : track taskmaster's current tag context and migration status in `...
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/dev_workflow.mdc:0-0
Timestamp: 2025-07-18T17:10:12.881Z
Learning: Applies to .taskmaster/state.json : Track Taskmaster's current tag context and migration status in `.taskmaster/state.json`, which is automatically created and managed by the system.
Applied to files:
.changeset/pre.json
📚 Learning: applies to .changeset/*.md : when running `npm run changeset` or `npx changeset add`, provide a conc...
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/changeset.mdc:0-0
Timestamp: 2025-07-18T17:07:53.100Z
Learning: Applies to .changeset/*.md : When running `npm run changeset` or `npx changeset add`, provide a concise summary of the changes for the `CHANGELOG.md` in imperative mood, typically a single line, and not a detailed Git commit message.
Applied to files:
.changeset/pre.jsonCHANGELOG.md
📚 Learning: applies to scripts/modules/task-manager.js : tasks must be organized into separate contexts (tags) w...
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/tasks.mdc:0-0
Timestamp: 2025-07-18T17:14:29.399Z
Learning: Applies to scripts/modules/task-manager.js : Tasks must be organized into separate contexts (tags) within tasks.json, using the tagged format: {"master": {"tasks": [...]}, "feature-branch": {"tasks": [...]}}. Legacy format {"tasks": [...]} must be silently migrated to the tagged format on first use.
Applied to files:
.changeset/pre.json
📚 Learning: guidelines for integrating new features into the task master cli with tagged system considerations (...
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/glossary.mdc:0-0
Timestamp: 2025-07-18T17:10:53.657Z
Learning: Guidelines for integrating new features into the Task Master CLI with tagged system considerations (new_features.mdc).
Applied to files:
.changeset/pre.jsonCHANGELOG.md
📚 Learning: applies to scripts/modules/utils.js : use tag resolution functions for all task data access, provide...
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/utilities.mdc:0-0
Timestamp: 2025-07-18T17:18:17.759Z
Learning: Applies to scripts/modules/utils.js : Use tag resolution functions for all task data access, provide backward compatibility with legacy format, and default to 'master' tag when no tag is specified.
Applied to files:
.changeset/pre.json
📚 Learning: for prd-driven feature development, create a dedicated tag, draft a prd in `.taskmaster/docs/`, pars...
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/dev_workflow.mdc:0-0
Timestamp: 2025-07-18T17:10:12.881Z
Learning: For PRD-driven feature development, create a dedicated tag, draft a PRD in `.taskmaster/docs/`, parse it into tasks, and add a high-level reference in the master tag.
Applied to files:
.changeset/pre.json
📚 Learning: todo comments about adding tag support to internal functions like readcomplexityreport are obsolete ...
Learnt from: mm-parthy
PR: eyaltoledano/claude-task-master#943
File: scripts/modules/task-manager/list-tasks.js:0-0
Timestamp: 2025-07-18T08:29:52.384Z
Learning: TODO comments about adding tag support to internal functions like readComplexityReport are obsolete in the boundary-first tag resolution pattern because report paths are already resolved at the CLI command boundary layer before reaching these functions.
Applied to files:
CHANGELOG.md
📚 Learning: commands such as `analyze-complexity`, `expand-task`, `update-task`, and `add-task` should consider ...
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/context_gathering.mdc:0-0
Timestamp: 2025-07-18T17:09:13.815Z
Learning: Commands such as `analyze-complexity`, `expand-task`, `update-task`, and `add-task` should consider adopting the context gathering pattern for improved AI-powered assistance.
Applied to files:
CHANGELOG.md
📚 Learning: describes the high-level architecture of the task master cli application, including the new tagged t...
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/glossary.mdc:0-0
Timestamp: 2025-07-18T17:10:53.657Z
Learning: Describes the high-level architecture of the Task Master CLI application, including the new tagged task lists system (architecture.mdc).
Applied to files:
CHANGELOG.md
📚 Learning: in the eyaltoledano/claude-task-master repository, every task is always part of a tag - there is no ...
Learnt from: Crunchyman-ralph
PR: eyaltoledano/claude-task-master#997
File: apps/extension/src/services/task-repository.ts:25-57
Timestamp: 2025-07-31T21:48:00.361Z
Learning: In the eyaltoledano/claude-task-master repository, every task is always part of a tag - there is no concept of untagged tasks. The tag system is mandatory and comprehensive, meaning all tasks exist within a tag context (with 'master' as the default tag if none specified).
Applied to files:
CHANGELOG.md
📚 Learning: use the taskmaster command set (`task-master` cli or mcp tools) for all task management operations: ...
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/dev_workflow.mdc:0-0
Timestamp: 2025-07-18T17:10:12.881Z
Learning: Use the Taskmaster command set (`task-master` CLI or MCP tools) for all task management operations: listing, expanding, updating, tagging, and status changes.
Applied to files:
CHANGELOG.md
📚 Learning: use `task-master complexity-report` to display the task complexity analysis report in a formatted, e...
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: assets/.windsurfrules:0-0
Timestamp: 2025-07-18T17:19:27.365Z
Learning: Use `task-master complexity-report` to display the task complexity analysis report in a formatted, easy-to-read way.
Applied to files:
CHANGELOG.md
📚 Learning: analyze task complexity with `task-master analyze-complexity --research` before breaking down tasks....
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: assets/.windsurfrules:0-0
Timestamp: 2025-07-18T17:19:27.365Z
Learning: Analyze task complexity with `task-master analyze-complexity --research` before breaking down tasks.
Applied to files:
CHANGELOG.md
📚 Learning: comprehensive reference for taskmaster mcp tools and cli commands with tagged task lists information...
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/glossary.mdc:0-0
Timestamp: 2025-07-18T17:10:53.657Z
Learning: Comprehensive reference for Taskmaster MCP tools and CLI commands with tagged task lists information (taskmaster.mdc).
Applied to files:
CHANGELOG.md
📚 Learning: break down complex tasks using `task-master expand --id=` with appropriate flags....
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: assets/.windsurfrules:0-0
Timestamp: 2025-07-18T17:19:27.365Z
Learning: Break down complex tasks using `task-master expand --id=<id>` with appropriate flags.
Applied to files:
CHANGELOG.md
🔇 Additional comments (1)
package.json (1)
12-15: Workspace list reformatted — looks goodSwitching to multi-line JSON for the
workspacesarray improves diff readability; no functional change is introduced.
| { | ||
| "mode": "pre", | ||
| "tag": "rc", | ||
| "initialVersions": { | ||
| "task-master-ai": "0.22.0", | ||
| "extension": "0.20.0" | ||
| }, | ||
| "changesets": [ | ||
| "eleven-horses-shop", | ||
| "fix-tag-complexity-detection" | ||
| ] | ||
| } |
There was a problem hiding this comment.
💡 Verification agent
🧩 Analysis chain
Double-check that entering “rc” pre-release mode is intentional
Committing a .changeset/pre.json with "mode": "pre" and "tag": "rc" puts the repo into an ongoing pre-release cycle (0.23.0-rc.x).
If the plan is to cut a stable 0.23.0 immediately (per the PR title), this file should be deleted (or changeset pre exit run) before merging; otherwise the published versions will carry the -rc.* suffix and won’t satisfy consumers expecting a semver final release.
Please also verify that the initialVersions (0.22.0, 0.20.0) exactly match the versions currently in the respective package.json files; a mismatch will cause the Changeset tooling to error out.
I’ll verify that the pre-release mode is intended and that the initialVersions align with your package JSONs.
🏁 Script executed:
#!/bin/bash
set -e
echo ">>> .changeset/pre.json initialVersions:"
jq '.initialVersions' .changeset/pre.json
echo
echo ">>> task-master-ai package.json version:"
task_pkg=$(rg -l '"name": "task-master-ai"' -t json)
echo "Found at: $task_pkg"
jq -r '.version' "$task_pkg"
echo
echo ">>> extension package.json version:"
ext_pkg=$(rg -l '"name": "extension"' -t json)
echo "Found at: $ext_pkg"
jq -r '.version' "$ext_pkg"Length of output: 616
I’ll locate each package’s package.json and compare its version to the initialVersions in .changeset/pre.json.
🏁 Script executed:
#!/bin/bash
set -e
echo ">>> .changeset/pre.json initialVersions:"
jq '.initialVersions' .changeset/pre.json
echo
echo ">>> Locate package.json for task-master-ai"
task_pkg_file=$(find . -type f -name package.json -not -path '*/node_modules/*' -exec grep -l '"name": "task-master-ai"' {} + | head -n1)
if [ -z "$task_pkg_file" ]; then
echo "ERROR: task-master-ai package.json not found"
else
echo "Found at: $task_pkg_file"
echo "Version:" $(jq -r '.version' "$task_pkg_file")
fi
echo
echo ">>> Locate package.json for extension"
ext_pkg_file=$(find . -type f -name package.json -not -path '*/node_modules/*' -exec grep -l '"name": "extension"' {} + | head -n1)
if [ -z "$ext_pkg_file" ]; then
echo "ERROR: extension package.json not found"
else
echo "Found at: $ext_pkg_file"
echo "Version:" $(jq -r '.version' "$ext_pkg_file")
fiLength of output: 1108
Align .changeset/pre.json with actual package versions and confirm pre-release intent
It looks like the entry for task-master-ai in initialVersions doesn’t match the version in its package.json, which will cause Changesets to error out. Also double-check whether you really want to stay in rc pre-release mode (if you intend to ship a stable 0.23.0 now, you’ll need to exit pre-mode).
• The task-master-ai package is at 0.22.1-rc.0, but .changeset/pre.json has 0.22.0.
• The extension entry (0.20.0) already matches apps/extension/package.json.
• If you’re ready for a final 0.23.0, remove .changeset/pre.json or run changeset pre exit before merging.
Suggested fix in .changeset/pre.json:
"initialVersions": {
- "task-master-ai": "0.22.0",
+ "task-master-ai": "0.22.1-rc.0",
"extension": "0.20.0"
}📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| { | |
| "mode": "pre", | |
| "tag": "rc", | |
| "initialVersions": { | |
| "task-master-ai": "0.22.0", | |
| "extension": "0.20.0" | |
| }, | |
| "changesets": [ | |
| "eleven-horses-shop", | |
| "fix-tag-complexity-detection" | |
| ] | |
| } | |
| { | |
| "mode": "pre", | |
| "tag": "rc", | |
| "initialVersions": { | |
| "task-master-ai": "0.22.1-rc.0", | |
| "extension": "0.20.0" | |
| }, | |
| "changesets": [ | |
| "eleven-horses-shop", | |
| "fix-tag-complexity-detection" | |
| ] | |
| } |
🤖 Prompt for AI Agents
In .changeset/pre.json lines 1 to 12, update the task-master-ai version in
initialVersions from 0.22.0 to 0.22.1-rc.0 to match the actual package.json
version. Also confirm if you want to remain in the rc pre-release mode; if you
intend to release a stable 0.23.0, remove this pre.json file or run `changeset
pre exit` before merging to exit pre-release mode.
| @@ -1,5 +1,15 @@ | |||
| # task-master-ai | |||
|
|
|||
| ## 0.22.1-rc.0 | |||
There was a problem hiding this comment.
Version header does not match the PR title or semantic progression
The PR is titled “Release 0.23.0”, yet the changelog introduces ## 0.22.1-rc.0.
Either the PR title or the changelog entry is wrong. Align them (and the package version) before cutting a release to avoid publishing the wrong tag.
🤖 Prompt for AI Agents
In CHANGELOG.md at line 3, the version header "## 0.22.1-rc.0" does not match
the PR title "Release 0.23.0". Update the version header in the changelog to "##
0.23.0" to align with the PR title and ensure semantic version progression is
correct before releasing.
| - [#1063](https://github.com/eyaltoledano/claude-task-master/pull/1063) [`2ae6e7e`](https://github.com/eyaltoledano/claude-task-master/commit/2ae6e7e6be3605c3c4d353f34666e54750dba973) Thanks [@Crunchyman-ralph](https://github.com/Crunchyman-ralph)! - Fix for tasks not found when using string IDs | ||
|
|
||
| - [#1049](https://github.com/eyaltoledano/claude-task-master/pull/1049) [`45a14c3`](https://github.com/eyaltoledano/claude-task-master/commit/45a14c323d21071c15106335e89ad1f4a20976ab) Thanks [@ben-vargas](https://github.com/ben-vargas)! - Fix tag-specific complexity report detection in expand command | ||
|
|
||
| The expand command now correctly finds and uses tag-specific complexity reports (e.g., `task-complexity-report_feature-xyz.json`) when operating in a tag context. Previously, it would always look for the generic `task-complexity-report.json` file due to a default value in the CLI option definition. |
There was a problem hiding this comment.
🧹 Nitpick (assertive)
Minor formatting inconsistencies in multi-line list items
The bullet items mix different indent widths (one space vs. two) and the explanatory paragraph under the second bullet is indented by two spaces instead of the recommended four for continuation lines in CommonMark. This still renders, but uniform four-space (or tab) indents keep long-form bullets readable.
- The expand command now correctly finds ...
+ The expand command now correctly finds ...📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| - [#1063](https://github.com/eyaltoledano/claude-task-master/pull/1063) [`2ae6e7e`](https://github.com/eyaltoledano/claude-task-master/commit/2ae6e7e6be3605c3c4d353f34666e54750dba973) Thanks [@Crunchyman-ralph](https://github.com/Crunchyman-ralph)! - Fix for tasks not found when using string IDs | |
| - [#1049](https://github.com/eyaltoledano/claude-task-master/pull/1049) [`45a14c3`](https://github.com/eyaltoledano/claude-task-master/commit/45a14c323d21071c15106335e89ad1f4a20976ab) Thanks [@ben-vargas](https://github.com/ben-vargas)! - Fix tag-specific complexity report detection in expand command | |
| The expand command now correctly finds and uses tag-specific complexity reports (e.g., `task-complexity-report_feature-xyz.json`) when operating in a tag context. Previously, it would always look for the generic `task-complexity-report.json` file due to a default value in the CLI option definition. | |
| - [#1063](https://github.com/eyaltoledano/claude-task-master/pull/1063) [`2ae6e7e`](https://github.com/eyaltoledano/claude-task-master/commit/2ae6e7e6be3605c3c4d353f34666e54750dba973) Thanks [@Crunchyman-ralph](https://github.com/Crunchyman-ralph)! - Fix for tasks not found when using string IDs | |
| - [#1049](https://github.com/eyaltoledano/claude-task-master/pull/1049) [`45a14c3`](https://github.com/eyaltoledano/claude-task-master/commit/45a14c323d21071c15106335e89ad1f4a20976ab) Thanks [@ben-vargas](https://github.com/ben-vargas)! - Fix tag-specific complexity report detection in expand command | |
| The expand command now correctly finds and uses tag-specific complexity reports (e.g., `task-complexity-report_feature-xyz.json`) when operating in a tag context. Previously, it would always look for the generic `task-complexity-report.json` file due to a default value in the CLI option definition. |
🤖 Prompt for AI Agents
In CHANGELOG.md around lines 7 to 11, the multi-line list items have
inconsistent indentation with some lines indented by one or two spaces and
continuation paragraphs indented by two spaces instead of four. To fix this,
standardize all bullet points and their continuation lines to use four spaces of
indentation for better readability and adherence to CommonMark formatting
guidelines.
package.json
Outdated
| { | ||
| "name": "task-master-ai", | ||
| "version": "0.22.0", | ||
| "version": "0.22.1-rc.0", |
There was a problem hiding this comment.
Version string contradicts PR’s stated release (0.23.0)
The PR title says “Release 0.23.0” but the root package is bumped only to 0.22.1-rc.0 (a patch pre-release).
This mismatch will break the autogenerated changelog and can cause an incorrect tag on publish.
- "version": "0.22.1-rc.0",
+ "version": "0.23.0-rc.0",Please regenerate the changeset (npx changeset version) or update the existing one so all packages and the forthcoming git tag align on 0.23.0-rc.*.
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| "version": "0.22.1-rc.0", | |
| "version": "0.23.0-rc.0", |
🤖 Prompt for AI Agents
In package.json at line 3, the version string is set to "0.22.1-rc.0" which
contradicts the PR title stating release "0.23.0". To fix this, update the
version string to match the PR release version by running `npx changeset
version` to regenerate the changeset or manually update the version to
"0.23.0-rc.0" (or the appropriate 0.23.0 pre-release version) so that the
package version, changelog, and git tag are consistent.
…ce (#997) --------- Co-authored-by: DavidMaliglowka <13022280+DavidMaliglowka@users.noreply.github.com> Co-authored-by: Ralph Khreish <35776126+Crunchyman-ralph@users.noreply.github.com> Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
There was a problem hiding this comment.
Actionable comments posted: 87
🔭 Outside diff range comments (5)
apps/extension/CHANGELOG.md (1)
1-2: Empty changelog entry – populate or drop until first releaseCommitting a virtually blank
CHANGELOG.mdclutters the repo and offers no value to users. Either:
- Add an initial “0.1.0 – first public release” entry following Keep-a-Changelog style, or
- Remove the file entirely and rely on Changesets to generate the file at publish time.
apps/extension/src/webview/hooks/useWebviewHeight.ts (1)
1-43: LGTM with minor suggestions for improvement.The hook implementation is solid with proper event listener management and VS Code-specific handling. A few suggestions for enhancement:
- The magic number
100for the setTimeout delay could be configurable- Consider adding error boundaries for window object access
- The console.log might be verbose in production
Consider this enhancement for better configurability and error handling:
-export const useWebviewHeight = () => { +export const useWebviewHeight = (delay: number = 100) => { const [availableHeight, setAvailableHeight] = useState<number>( - window.innerHeight + typeof window !== 'undefined' ? window.innerHeight : 0 ); const updateAvailableHeight = useCallback(() => { + if (typeof window === 'undefined') return; const height = window.innerHeight; - console.log('📏 Available height updated:', height); + if (process.env.NODE_ENV === 'development') { + console.log('📏 Available height updated:', height); + } setAvailableHeight(height); }, []); const handleVisibilityChange = () => { // Small delay to ensure VS Code has finished resizing - setTimeout(updateAvailableHeight, 100); + setTimeout(updateAvailableHeight, delay); };apps/extension/.vscodeignore (1)
21-26: Fix incomplete comment and extra blank lines.The file logic is correct, but there are formatting issues that should be addressed for maintainability.
-# Exclude +# Exclude unwanted assets assets/.DS_Store assets/banner.png - -.changeset/sour-pans-beam.md (1)
1-43: Changeset content should be concise and technical, not marketing-focused.According to the coding guidelines, changesets should provide "a concise summary of the changes for the CHANGELOG.md in imperative mood, typically a single line, and not a detailed Git commit message." This content reads like marketing material rather than a technical changelog entry.
Consider replacing with a concise technical summary:
-🎉 **Introducing TaskMaster Extension!** - -We're thrilled to launch the first version of our Code extension, bringing the power of TaskMaster directly into your favorite code editor. While this is our initial release and we've kept things focused, it already packs powerful features to supercharge your development workflow. - -## ✨ Key Features - -### 📋 Visual Task Management -- **Kanban Board View**: Visualize all your tasks in an intuitive board layout directly in VS Code -- **Drag & Drop**: Easily change task status by dragging cards between columns -- **Real-time Updates**: See changes instantly as you work through your project - -### 🏷️ Multi-Context Support -- **Tag Switching**: Seamlessly switch between different project contexts/tags -- **Isolated Workflows**: Keep different features or experiments organized separately - -### 🤖 AI-Powered Task Updates -- **Smart Updates**: Use TaskMaster's AI capabilities to update tasks and subtasks -- **Context-Aware**: Leverages your existing TaskMaster configuration and models - -### 📊 Rich Task Information -- **Complexity Scores**: See task complexity ratings at a glance -- **Subtask Visualization**: Expand tasks to view and manage subtasks -- **Dependency Graphs**: Understand task relationships and dependencies visually - -### ⚙️ Configuration Management -- **Visual Config Editor**: View and understand your `.taskmaster/config.json` settings -- **Easy Access**: No more manual JSON editing for common configuration tasks - -### 🚀 Quick Actions -- **Status Updates**: Change task status with a single click -- **Task Details**: Access full task information without leaving VS Code -- **Integrated Commands**: All TaskMaster commands available through the command palette - -## 🎯 What's Next? - -This is just the beginning! We wanted to get a solid foundation into your hands quickly. The extension will evolve rapidly with your feedback, adding more advanced features, better visualizations, and deeper integration with your development workflow. - -Thank you for being part of the TaskMaster journey. Your workflow has never looked better! 🚀 +Add TaskMaster VS Code extension with Kanban board, drag-and-drop task management, multi-tag support, and AI-powered task updates.github/workflows/extension-ci.yml (1)
143-144: Remove trailing blank linesStatic analysis correctly identifies extra blank lines at the end of the file.
- retention-days: 30 - + retention-days: 30
♻️ Duplicate comments (3)
package.json (2)
12-12: Superfluous"."entry inworkspaces(duplicate of earlier feedback)The root package is implicitly part of the workspace; removing
"."keeps the list minimal.- "workspaces": ["apps/*", "."], + "workspaces": ["apps/*"],
3-3: Version still contradicts PR title (duplicate of earlier feedback)PR is titled “Release 0.23.0” but root package is bumped only to
0.22.1-rc.0. Align all packages/changesets on the same version before merging..changeset/pre.json (1)
1-12: Version mismatch and pre-release mode confirmation neededThis is the same issue identified in the previous review - the
task-master-aiversion ininitialVersionsdoesn't match the actual package.json version, and there's a question about whether staying in pre-release mode is intentional for a stable 0.23.0 release.
| const tag = `${pkg.name}@${pkg.version}`; | ||
|
|
||
| // Get repository URL from root package.json | ||
| const repoUrl = rootPkg.repository.url; | ||
|
|
||
| const { status, stdout, error } = spawnSync('git', ['ls-remote', repoUrl, tag]); | ||
|
|
||
| assert.equal(status, 0, error); | ||
|
|
||
| const exists = String(stdout).trim() !== ''; | ||
|
|
||
| if (!exists) { | ||
| console.log(`Creating new extension tag: ${tag}`); | ||
|
|
||
| // Create the tag | ||
| const tagResult = spawnSync('git', ['tag', tag]); | ||
| if (tagResult.status !== 0) { | ||
| console.error( | ||
| 'Failed to create tag:', | ||
| tagResult.error || tagResult.stderr.toString() | ||
| ); | ||
| process.exit(1); | ||
| } | ||
|
|
||
| // Push the tag | ||
| const pushResult = spawnSync('git', ['push', 'origin', tag]); | ||
| if (pushResult.status !== 0) { | ||
| console.error( | ||
| 'Failed to push tag:', | ||
| pushResult.error || pushResult.stderr.toString() | ||
| ); | ||
| process.exit(1); | ||
| } | ||
|
|
||
| console.log(`✅ Successfully created and pushed tag: ${tag}`); | ||
| } else { | ||
| console.log(`Extension tag already exists: ${tag}`); | ||
| } |
There was a problem hiding this comment.
🛠️ Refactor suggestion
Enhance error handling for Git operations.
The script handles basic Git command failures but could provide more specific error messages and handle edge cases better.
Consider these improvements for better error handling:
const tag = `${pkg.name}@${pkg.version}`;
+// Validate tag format
+if (!/^[\w.-]+@\d+\.\d+\.\d+/.test(tag)) {
+ console.error('Invalid tag format:', tag);
+ process.exit(1);
+}
+
// Get repository URL from root package.json
const repoUrl = rootPkg.repository.url;
const { status, stdout, error } = spawnSync('git', ['ls-remote', repoUrl, tag]);
-assert.equal(status, 0, error);
+if (status !== 0) {
+ console.error('Failed to check remote tags:', error || 'Unknown error');
+ console.error('Make sure you have access to the repository and git is configured properly');
+ process.exit(1);
+}
const exists = String(stdout).trim() !== '';
if (!exists) {
console.log(`Creating new extension tag: ${tag}`);
// Create the tag
- const tagResult = spawnSync('git', ['tag', tag]);
+ const tagResult = spawnSync('git', ['tag', '-a', tag, '-m', `Release ${tag}`]);📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| const tag = `${pkg.name}@${pkg.version}`; | |
| // Get repository URL from root package.json | |
| const repoUrl = rootPkg.repository.url; | |
| const { status, stdout, error } = spawnSync('git', ['ls-remote', repoUrl, tag]); | |
| assert.equal(status, 0, error); | |
| const exists = String(stdout).trim() !== ''; | |
| if (!exists) { | |
| console.log(`Creating new extension tag: ${tag}`); | |
| // Create the tag | |
| const tagResult = spawnSync('git', ['tag', tag]); | |
| if (tagResult.status !== 0) { | |
| console.error( | |
| 'Failed to create tag:', | |
| tagResult.error || tagResult.stderr.toString() | |
| ); | |
| process.exit(1); | |
| } | |
| // Push the tag | |
| const pushResult = spawnSync('git', ['push', 'origin', tag]); | |
| if (pushResult.status !== 0) { | |
| console.error( | |
| 'Failed to push tag:', | |
| pushResult.error || pushResult.stderr.toString() | |
| ); | |
| process.exit(1); | |
| } | |
| console.log(`✅ Successfully created and pushed tag: ${tag}`); | |
| } else { | |
| console.log(`Extension tag already exists: ${tag}`); | |
| } | |
| const tag = `${pkg.name}@${pkg.version}`; | |
| // Validate tag format | |
| if (!/^[\w.\-]+@\d+\.\d+\.\d+/.test(tag)) { | |
| console.error('Invalid tag format:', tag); | |
| process.exit(1); | |
| } | |
| // Get repository URL from root package.json | |
| const repoUrl = rootPkg.repository.url; | |
| const { status, stdout, error } = spawnSync('git', ['ls-remote', repoUrl, tag]); | |
| if (status !== 0) { | |
| console.error('Failed to check remote tags:', error || 'Unknown error'); | |
| console.error('Make sure you have access to the repository and git is configured properly'); | |
| process.exit(1); | |
| } | |
| const exists = String(stdout).trim() !== ''; | |
| if (!exists) { | |
| console.log(`Creating new extension tag: ${tag}`); | |
| // Create the tag | |
| const tagResult = spawnSync('git', ['tag', '-a', tag, '-m', `Release ${tag}`]); | |
| if (tagResult.status !== 0) { | |
| console.error( | |
| 'Failed to create tag:', | |
| tagResult.error || tagResult.stderr.toString() | |
| ); | |
| process.exit(1); | |
| } | |
| // Push the tag | |
| const pushResult = spawnSync('git', ['push', 'origin', tag]); | |
| if (pushResult.status !== 0) { | |
| console.error( | |
| 'Failed to push tag:', | |
| pushResult.error || pushResult.stderr.toString() | |
| ); | |
| process.exit(1); | |
| } | |
| console.log(`✅ Successfully created and pushed tag: ${tag}`); | |
| } else { | |
| console.log(`Extension tag already exists: ${tag}`); | |
| } |
🤖 Prompt for AI Agents
In .github/scripts/tag-extension.mjs between lines 40 and 77, improve error
handling for Git commands by capturing and logging more specific error details
from both the error and stderr properties of spawnSync results. Add checks for
unexpected null or undefined values in these properties to avoid misleading or
missing error messages. Ensure that each failure point logs a clear, descriptive
message including the command attempted and the exact error output, then exits
the process with a non-zero status to indicate failure.
| name: Extension Release | ||
|
|
||
| on: | ||
| push: | ||
| tags: | ||
| - "extension@*" | ||
|
|
||
| permissions: | ||
| contents: write | ||
|
|
||
| concurrency: extension-release-${{ github.ref }} | ||
|
|
||
| jobs: | ||
| publish-extension: | ||
| runs-on: ubuntu-latest | ||
| environment: extension-release |
There was a problem hiding this comment.
🛠️ Refactor suggestion
Address YAML formatting issues.
The workflow setup is solid, but there are some YAML formatting issues to fix.
Apply this diff to fix the truthy value warning:
on:
push:
tags:
- - "extension@*"
+ - 'extension@*'Using single quotes avoids the truthy value warning from YAMLlint.
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| name: Extension Release | |
| on: | |
| push: | |
| tags: | |
| - "extension@*" | |
| permissions: | |
| contents: write | |
| concurrency: extension-release-${{ github.ref }} | |
| jobs: | |
| publish-extension: | |
| runs-on: ubuntu-latest | |
| environment: extension-release | |
| name: Extension Release | |
| on: | |
| push: | |
| tags: | |
| - 'extension@*' | |
| permissions: | |
| contents: write | |
| concurrency: extension-release-${{ github.ref }} | |
| jobs: | |
| publish-extension: | |
| runs-on: ubuntu-latest | |
| environment: extension-release |
🧰 Tools
🪛 YAMLlint (1.37.1)
[warning] 3-3: truthy value should be one of [false, true]
(truthy)
🤖 Prompt for AI Agents
In .github/workflows/extension-release.yml lines 1 to 16, fix YAML formatting
issues by enclosing the concurrency value extension-release-${{ github.ref }} in
single quotes to avoid truthy value warnings from YAMLlint. Update the
concurrency line to use single quotes around the entire string expression.
| - name: Upload VSIX to Release | ||
| uses: actions/upload-release-asset@v1 | ||
| env: | ||
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | ||
| with: | ||
| upload_url: ${{ steps.create_release.outputs.upload_url }} | ||
| asset_path: apps/extension/vsix-build/${{ steps.vsix-info.outputs.vsix-filename }} | ||
| asset_name: ${{ steps.vsix-info.outputs.vsix-filename }} | ||
| asset_content_type: application/zip | ||
|
|
There was a problem hiding this comment.
🛠️ Refactor suggestion
Fix step dependency and consider upgrading action.
This step has a dependency on the fixed step ID from the previous comment.
If using the gh CLI approach from the previous comment, replace this step with:
- - name: Upload VSIX to Release
- uses: actions/upload-release-asset@v1
- env:
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- with:
- upload_url: ${{ steps.create_release.outputs.upload_url }}
- asset_path: apps/extension/vsix-build/${{ steps.vsix-info.outputs.vsix-filename }}
- asset_name: ${{ steps.vsix-info.outputs.vsix-filename }}
- asset_content_type: application/zip
+ - name: Upload VSIX to Release
+ run: |
+ gh release upload "${{ github.ref_name }}" \
+ "apps/extension/vsix-build/${{ steps.vsix-info.outputs.vsix-filename }}"
+ env:
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}🧰 Tools
🪛 actionlint (1.7.7)
113-113: property "create_release" is not defined in object type {vsix-info: {conclusion: string; outcome: string; outputs: {string => string}}}
(expression)
🤖 Prompt for AI Agents
In .github/workflows/extension-release.yml around lines 108 to 117, the Upload
VSIX to Release step lacks an explicit dependency on the step that creates the
release, which can cause timing issues. Add a "needs" or "depends-on" attribute
referencing the release creation step to ensure proper execution order.
Additionally, consider upgrading the actions/upload-release-asset action to a
newer version or replace this step with the gh CLI approach as suggested in the
previous comment for better reliability and maintainability.
| notify-success: | ||
| needs: publish-extension | ||
| if: success() | ||
| runs-on: ubuntu-latest | ||
| steps: | ||
| - name: Success Notification | ||
| run: | | ||
| echo "🎉 Extension ${{ github.ref_name }} successfully published!" | ||
| echo "📦 Available on VS Code Marketplace" | ||
| echo "🌍 Available on Open VSX Registry" | ||
| echo "🏷️ GitHub release created: ${{ github.ref_name }}" No newline at end of file |
There was a problem hiding this comment.
🧹 Nitpick (assertive)
Fix file formatting and approve notification job.
The success notification job is well-designed but needs a formatting fix.
Add a newline at the end of the file:
echo "🌍 Available on Open VSX Registry"
echo "🏷️ GitHub release created: ${{ github.ref_name }}"
+🧰 Tools
🪛 YAMLlint (1.37.1)
[error] 137-137: no new line character at the end of file
(new-line-at-end-of-file)
🤖 Prompt for AI Agents
In .github/workflows/extension-release.yml around lines 127 to 137, the
notify-success job is missing a newline at the end of the file. Add a single
newline character after the last line of the file to fix the formatting issue
and ensure proper file termination.
| - name: Exit pre-release mode and clean up | ||
| run: | | ||
| echo "🔄 Ensuring we're not in pre-release mode for main branch..." | ||
|
|
||
| # Exit pre-release mode if we're in it | ||
| npx changeset pre exit || echo "Not in pre-release mode" | ||
|
|
||
| # Remove pre.json file if it exists (belt and suspenders approach) | ||
| if [ -f .changeset/pre.json ]; then | ||
| echo "🧹 Removing pre.json file..." | ||
| rm -f .changeset/pre.json | ||
| fi | ||
|
|
||
| # Verify the file is gone | ||
| if [ ! -f .changeset/pre.json ]; then | ||
| echo "✅ pre.json successfully removed" | ||
| else | ||
| echo "❌ Failed to remove pre.json" | ||
| exit 1 | ||
| fi |
There was a problem hiding this comment.
🧹 Nitpick (assertive)
Remove trailing spaces – YAMLlint is already failing
The lint errors reported will make the workflow fail in repos with strict linters.
- echo "🔄 Ensuring we're not in pre-release mode for main branch..."
+ echo "🔄 Ensuring we're not in pre-release mode for main branch..."
@@
- npx changeset pre exit || echo "Not in pre-release mode"
+ npx changeset pre exit || echo "Not in pre-release mode"
@@
- echo "🧹 Removing pre.json file..."
+ echo "🧹 Removing pre.json file..."📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| - name: Exit pre-release mode and clean up | |
| run: | | |
| echo "🔄 Ensuring we're not in pre-release mode for main branch..." | |
| # Exit pre-release mode if we're in it | |
| npx changeset pre exit || echo "Not in pre-release mode" | |
| # Remove pre.json file if it exists (belt and suspenders approach) | |
| if [ -f .changeset/pre.json ]; then | |
| echo "🧹 Removing pre.json file..." | |
| rm -f .changeset/pre.json | |
| fi | |
| # Verify the file is gone | |
| if [ ! -f .changeset/pre.json ]; then | |
| echo "✅ pre.json successfully removed" | |
| else | |
| echo "❌ Failed to remove pre.json" | |
| exit 1 | |
| fi | |
| - name: Exit pre-release mode and clean up | |
| run: | | |
| echo "🔄 Ensuring we're not in pre-release mode for main branch..." | |
| # Exit pre-release mode if we're in it | |
| npx changeset pre exit || echo "Not in pre-release mode" | |
| # Remove pre.json file if it exists (belt and suspenders approach) | |
| if [ -f .changeset/pre.json ]; then | |
| echo "🧹 Removing pre.json file..." | |
| rm -f .changeset/pre.json | |
| fi | |
| # Verify the file is gone | |
| if [ ! -f .changeset/pre.json ]; then | |
| echo "✅ pre.json successfully removed" | |
| else | |
| echo "❌ Failed to remove pre.json" | |
| exit 1 | |
| fi |
🧰 Tools
🪛 YAMLlint (1.37.1)
[error] 44-44: trailing spaces
(trailing-spaces)
[error] 47-47: trailing spaces
(trailing-spaces)
[error] 53-53: trailing spaces
(trailing-spaces)
🤖 Prompt for AI Agents
In .github/workflows/release.yml between lines 41 and 60, there are trailing
spaces causing YAML lint errors. Remove all trailing spaces at the end of each
line in this block to ensure the workflow passes linting and runs correctly.
| /* shadcn/ui CSS variables */ | ||
| @theme { | ||
| /* VS Code CSS variables will be injected here */ | ||
| /* color-scheme: var(--vscode-theme-kind, light); */ |
There was a problem hiding this comment.
🛠️ Refactor suggestion
Enable color-scheme property for better OS integration
The color-scheme property helps browsers render form controls and scrollbars with appropriate colors.
- /* color-scheme: var(--vscode-theme-kind, light); */
+ color-scheme: light dark;📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| /* color-scheme: var(--vscode-theme-kind, light); */ | |
| color-scheme: light dark; |
🤖 Prompt for AI Agents
In apps/extension/src/webview/index.css at line 6, the color-scheme property is
commented out, which prevents browsers from using it to render form controls and
scrollbars appropriately. Uncomment the line so that the color-scheme property
is active, enabling better OS integration and consistent theming.
| @layer components { | ||
| .kanban-container { | ||
| scrollbar-gutter: stable; | ||
| } | ||
|
|
||
| /* Smooth scrolling for better UX */ | ||
| .kanban-container { | ||
| scroll-behavior: smooth; | ||
| } | ||
|
|
||
| /* Ensure proper touch scrolling on mobile */ | ||
| .kanban-container { | ||
| -webkit-overflow-scrolling: touch; | ||
| } | ||
|
|
There was a problem hiding this comment.
Remove duplicate CSS rules and deprecated property
Multiple issues in the Kanban container styles:
.kanban-containeris defined three times (lines 154-156, 159-161, 164-166)-webkit-overflow-scrolling: touchis deprecated and no longer needed
.kanban-container {
scrollbar-gutter: stable;
-}
-
-/* Smooth scrolling for better UX */
-.kanban-container {
scroll-behavior: smooth;
}
-
-/* Ensure proper touch scrolling on mobile */
-.kanban-container {
- -webkit-overflow-scrolling: touch;
-}📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| @layer components { | |
| .kanban-container { | |
| scrollbar-gutter: stable; | |
| } | |
| /* Smooth scrolling for better UX */ | |
| .kanban-container { | |
| scroll-behavior: smooth; | |
| } | |
| /* Ensure proper touch scrolling on mobile */ | |
| .kanban-container { | |
| -webkit-overflow-scrolling: touch; | |
| } | |
| @layer components { | |
| .kanban-container { | |
| scrollbar-gutter: stable; | |
| scroll-behavior: smooth; | |
| } | |
| } |
🤖 Prompt for AI Agents
In apps/extension/src/webview/index.css between lines 153 and 167, the
.kanban-container CSS rules are duplicated across three separate blocks.
Consolidate these into a single .kanban-container rule containing
scrollbar-gutter: stable and scroll-behavior: smooth properties. Remove the
-webkit-overflow-scrolling: touch property entirely as it is deprecated and no
longer necessary.
| @layer utilities { | ||
| .line-clamp-2 { | ||
| overflow: hidden; | ||
| display: -webkit-box; | ||
| -webkit-box-orient: vertical; | ||
| -webkit-line-clamp: 2; | ||
| } | ||
|
|
||
| .line-clamp-3 { | ||
| overflow: hidden; | ||
| display: -webkit-box; | ||
| -webkit-box-orient: vertical; | ||
| -webkit-line-clamp: 3; | ||
| } |
There was a problem hiding this comment.
💡 Verification agent
🧩 Analysis chain
Consider using Tailwind's built-in line-clamp utilities
Tailwind CSS v3.3+ includes built-in line-clamp utilities. If using a recent version, these custom utilities may be redundant.
🏁 Script executed:
#!/bin/bash
# Check Tailwind CSS version in the extension
cd apps/extension && cat package.json | jq -r '.dependencies["tailwindcss"] // .devDependencies["tailwindcss"]'Length of output: 119
Switch to Tailwind’s native line-clamp utilities
We’re on tailwindcss@4.1.11, which ships with built-in .line-clamp-{n} classes. You can remove your custom definitions in apps/extension/src/webview/index.css (lines 200–213) and replace them with Tailwind’s core utilities:
• File to update:
– apps/extension/src/webview/index.css (remove .line-clamp-2 and .line-clamp-3)
• Usage example:
<p class="line-clamp-2">…</p>• If you haven’t already, ensure lineClamp is enabled in your tailwind.config.js (corePlugins) or install/register @tailwindcss/line-clamp per the docs:
https://tailwindcss.com/docs/line-clamp
🤖 Prompt for AI Agents
In apps/extension/src/webview/index.css between lines 200 and 213, remove the
custom CSS definitions for .line-clamp-2 and .line-clamp-3 since Tailwind CSS
version 4.1.11 includes native line-clamp utilities. Replace any usage of these
classes in your HTML with Tailwind's built-in .line-clamp-{n} classes. Also,
verify that the lineClamp plugin is enabled in tailwind.config.js or install and
register @tailwindcss/line-clamp as per the Tailwind documentation.
| let toastIdCounter = 0; | ||
|
|
||
| export const createToast = ( | ||
| type: ToastNotification['type'], | ||
| title: string, | ||
| message: string, | ||
| duration?: number | ||
| ): ToastNotification => ({ | ||
| id: `toast-${++toastIdCounter}`, | ||
| type, | ||
| title, | ||
| message, | ||
| duration | ||
| }); |
There was a problem hiding this comment.
🧹 Nitpick (assertive)
Consider using more robust ID generation.
The current incremental counter approach works but could have issues if the module is reloaded or in concurrent scenarios.
Consider using a more robust ID generation approach:
-let toastIdCounter = 0;
+const generateToastId = () => `toast-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
export const createToast = (
type: ToastNotification['type'],
title: string,
message: string,
duration?: number
): ToastNotification => ({
- id: `toast-${++toastIdCounter}`,
+ id: generateToastId(),
type,
title,
message,
duration
});This approach combines timestamp and random string for better uniqueness guarantees.
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| let toastIdCounter = 0; | |
| export const createToast = ( | |
| type: ToastNotification['type'], | |
| title: string, | |
| message: string, | |
| duration?: number | |
| ): ToastNotification => ({ | |
| id: `toast-${++toastIdCounter}`, | |
| type, | |
| title, | |
| message, | |
| duration | |
| }); | |
| const generateToastId = () => `toast-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`; | |
| export const createToast = ( | |
| type: ToastNotification['type'], | |
| title: string, | |
| message: string, | |
| duration?: number | |
| ): ToastNotification => ({ | |
| id: generateToastId(), | |
| type, | |
| title, | |
| message, | |
| duration | |
| }); |
🤖 Prompt for AI Agents
In apps/extension/src/webview/utils/toast.ts around lines 7 to 20, the current
toast ID generation uses a simple incremental counter which may cause collisions
if the module reloads or in concurrent environments. Replace the incremental
counter with a more robust ID generation method that combines the current
timestamp and a random string to ensure better uniqueness and avoid potential ID
conflicts.
| export const showSuccessToast = | ||
| (dispatch: React.Dispatch<AppAction>) => | ||
| (title: string, message: string, duration?: number) => { | ||
| dispatch({ | ||
| type: 'ADD_TOAST', | ||
| payload: createToast('success', title, message, duration) | ||
| }); | ||
| }; | ||
|
|
||
| export const showInfoToast = | ||
| (dispatch: React.Dispatch<AppAction>) => | ||
| (title: string, message: string, duration?: number) => { | ||
| dispatch({ | ||
| type: 'ADD_TOAST', | ||
| payload: createToast('info', title, message, duration) | ||
| }); | ||
| }; | ||
|
|
||
| export const showWarningToast = | ||
| (dispatch: React.Dispatch<AppAction>) => | ||
| (title: string, message: string, duration?: number) => { | ||
| dispatch({ | ||
| type: 'ADD_TOAST', | ||
| payload: createToast('warning', title, message, duration) | ||
| }); | ||
| }; | ||
|
|
||
| export const showErrorToast = | ||
| (dispatch: React.Dispatch<AppAction>) => | ||
| (title: string, message: string, duration?: number) => { | ||
| dispatch({ | ||
| type: 'ADD_TOAST', | ||
| payload: createToast('error', title, message, duration) | ||
| }); | ||
| }; |
There was a problem hiding this comment.
🧹 Nitpick (assertive)
Consider reducing code duplication.
The four toast utility functions follow identical patterns, which creates maintainable code duplication.
Consider creating a generic factory function to reduce duplication:
+const createToastDispatcher = (type: ToastNotification['type']) =>
+ (dispatch: React.Dispatch<AppAction>) =>
+ (title: string, message: string, duration?: number) => {
+ dispatch({
+ type: 'ADD_TOAST',
+ payload: createToast(type, title, message, duration)
+ });
+ };
+
-export const showSuccessToast =
- (dispatch: React.Dispatch<AppAction>) =>
- (title: string, message: string, duration?: number) => {
- dispatch({
- type: 'ADD_TOAST',
- payload: createToast('success', title, message, duration)
- });
- };
-
-export const showInfoToast =
- (dispatch: React.Dispatch<AppAction>) =>
- (title: string, message: string, duration?: number) => {
- dispatch({
- type: 'ADD_TOAST',
- payload: createToast('info', title, message, duration)
- });
- };
-
-export const showWarningToast =
- (dispatch: React.Dispatch<AppAction>) =>
- (title: string, message: string, duration?: number) => {
- dispatch({
- type: 'ADD_TOAST',
- payload: createToast('warning', title, message, duration)
- });
- };
-
-export const showErrorToast =
- (dispatch: React.Dispatch<AppAction>) =>
- (title: string, message: string, duration?: number) => {
- dispatch({
- type: 'ADD_TOAST',
- payload: createToast('error', title, message, duration)
- });
- };
+export const showSuccessToast = createToastDispatcher('success');
+export const showInfoToast = createToastDispatcher('info');
+export const showWarningToast = createToastDispatcher('warning');
+export const showErrorToast = createToastDispatcher('error');This reduces duplication while maintaining the same API and functionality.
🤖 Prompt for AI Agents
In apps/extension/src/webview/utils/toast.ts between lines 22 and 56, the four
toast functions (showSuccessToast, showInfoToast, showWarningToast,
showErrorToast) have duplicated code with only the toast type differing.
Refactor by creating a single generic factory function that takes the toast type
as a parameter and returns the corresponding toast function. Replace the four
existing functions with calls to this generic factory to reduce duplication
while preserving the current API and behavior.
| # From project root | ||
| npx changeset add | ||
| ``` | ||
| 3. **Select the extension package**: Choose `taskr-kanban` when prompted |
There was a problem hiding this comment.
💡 Verification agent
🧩 Analysis chain
Correct the package name in changeset instructions.
The instructions mention selecting taskr-kanban as the package name, but based on the learnings and the three-file packaging system, this should likely be task-master-hamster or the development package name.
🏁 Script executed:
#!/bin/bash
# Description: Verify the correct package name for changesets
# Check package.json files for the actual package names
echo "=== Checking package names in extension directory ==="
fd -t f "package.*json" apps/extension -x cat {} \; | jq -r '.name' | sort -u
# Check existing changesets for package name patterns
echo -e "\n=== Checking existing changeset files for package names ==="
fd -t f ".md" .changeset -x grep -h "^---" -A 5 {} \; | grep -E "^['\"].*['\"]:" | sort -uLength of output: 503
🏁 Script executed:
#!/bin/bash
echo "=== Displaying lines 1-100 of extension-CI-setup.md ==="
sed -n '1,100p' apps/extension/docs/extension-CI-setup.mdLength of output: 3658
Update the changeset step to select the correct package
The CI docs currently instruct choosing taskr-kanban, but the actual extension package name is extension.
• apps/extension/docs/extension-CI-setup.md (around line 49)
- 3. **Select the extension package**: Choose `taskr-kanban` when prompted
+ 3. **Select the extension package**: Choose `extension` when prompted📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| 3. **Select the extension package**: Choose `taskr-kanban` when prompted | |
| 3. **Select the extension package**: Choose `extension` when prompted |
🧰 Tools
🪛 LanguageTool
[grammar] ~49-~49: There might be a mistake here.
Context: ...n package**: Choose taskr-kanban when prompted 4. Select version bump type: - patch...
(QB_NEW_EN_OTHER)
🤖 Prompt for AI Agents
In apps/extension/docs/extension-CI-setup.md at line 49, the instructions
incorrectly state to select the package `taskr-kanban`. Update this step to
instruct selecting the correct extension package named `extension` to ensure the
documentation matches the actual package name.
| ```json | ||
| { | ||
| "version": "1.0.2", // ✅ AUTO-SYNCED | ||
| "publisher": "Hamster", // ⚠️ MUST MATCH MANUALLY |
There was a problem hiding this comment.
🛠️ Refactor suggestion
Clarify publisher field requirements.
The documentation shows "Hamster" as the publisher, but it's important to note that this must match the actual VS Code publisher ID registered with the marketplace.
- "publisher": "Hamster", // ⚠️ MUST MATCH MANUALLY
+ "publisher": "Hamster", // ⚠️ MUST MATCH YOUR REGISTERED PUBLISHER ID📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| "publisher": "Hamster", // ⚠️ MUST MATCH MANUALLY | |
| "publisher": "Hamster", // ⚠️ MUST MATCH YOUR REGISTERED PUBLISHER ID |
🧰 Tools
🪛 markdownlint-cli2 (0.17.2)
112-112: Fenced code blocks should be surrounded by blank lines
(MD031, blanks-around-fences)
🤖 Prompt for AI Agents
In apps/extension/docs/extension-CI-setup.md at line 112, clarify that the
"publisher" field value "Hamster" is a placeholder and must be replaced with the
actual VS Code publisher ID registered in the marketplace. Update the comment or
add a note to explicitly state this requirement to avoid confusion.
| - **Contains**: | ||
| - **No devDependencies** (avoids dependency conflicts) | ||
| - Publishing metadata (`keywords`, `repository`, `categories`) | ||
| - Marketplace package name: `"taskr-kanban"` |
There was a problem hiding this comment.
Fix package name inconsistency
The documentation states the marketplace package name is "taskr-kanban", but according to the PR summary and learnings, the extension name should be "task-master-hamster".
Verify and update the correct package name throughout the documentation.
🤖 Prompt for AI Agents
In apps/extension/docs/extension-development-guide.md at line 31, the
marketplace package name is incorrectly stated as "taskr-kanban". Update this
package name to "task-master-hamster" to match the PR summary and ensure
consistency throughout the documentation.
| # From project root | ||
| npx changeset add | ||
| ``` | ||
| 3. **Select the extension package**: Choose `taskr-kanban` when prompted |
There was a problem hiding this comment.
Clarify package selection in changeset process
The instruction says to "Choose taskr-kanban when prompted", but this should match the actual package name in package.publish.json.
-3. **Select the extension package**: Choose `taskr-kanban` when prompted
+3. **Select the extension package**: Choose the package name from `package.publish.json` when prompted📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| 3. **Select the extension package**: Choose `taskr-kanban` when prompted | |
| 3. **Select the extension package**: Choose the package name from `package.publish.json` when prompted |
🧰 Tools
🪛 LanguageTool
[grammar] ~155-~155: There might be a mistake here.
Context: ...n package**: Choose taskr-kanban when prompted 4. Select version bump type: - patch...
(QB_NEW_EN_OTHER)
🤖 Prompt for AI Agents
In apps/extension/docs/extension-development-guide.md at line 155, the
instruction to "Choose `taskr-kanban` when prompted" should be updated to
reflect the actual package name found in the `package.publish.json` file. Verify
the correct package name in `package.publish.json` and replace `taskr-kanban`
with that exact name to ensure accuracy in the changeset process instructions.
| "taskmaster.mcp.requestTimeoutMs": { | ||
| "type": "number", | ||
| "default": 300000, | ||
| "minimum": 30000, | ||
| "maximum": 600000, | ||
| "description": "MCP request timeout in milliseconds (default: 5 minutes)" |
There was a problem hiding this comment.
Duplicate timeout configuration settings.
There are two different requestTimeoutMs settings that could confuse users:
taskmaster.mcp.requestTimeoutMs(line 144) - Default: 5 minutestaskmaster.performance.requestTimeoutMs(line 198) - Default: 30 seconds
Consider consolidating these or clearly differentiating their purposes:
"taskmaster.mcp.requestTimeoutMs": {
"type": "number",
"default": 300000,
"minimum": 30000,
"maximum": 600000,
- "description": "MCP request timeout in milliseconds (default: 5 minutes)"
+ "description": "MCP server communication timeout in milliseconds (default: 5 minutes)"
},
// ... later in the file ...
"taskmaster.performance.requestTimeoutMs": {
"type": "number",
"default": 30000,
"minimum": 1000,
"maximum": 300000,
- "description": "Request timeout in milliseconds"
+ "description": "API request timeout in milliseconds for task operations"
},Also applies to: 198-203
🤖 Prompt for AI Agents
In apps/extension/package.publish.json around lines 144 to 149 and 198 to 203,
there are two separate requestTimeoutMs settings with different defaults that
may confuse users. Review both timeout configurations, determine if they can be
consolidated into a single setting or if their purposes should be explicitly
differentiated in the descriptions. Update the JSON schema accordingly to either
merge the settings or clarify their distinct roles and default values to avoid
ambiguity.
| undefined, | ||
| `subtask testStrategy for parent ${parentTaskId}` | ||
| ), | ||
| dependencies: subtask.dependencies || [] |
There was a problem hiding this comment.
Handle subtask dependencies transformation.
The subtask dependencies are passed through without validation or transformation, unlike the parent task dependencies which go through proper validation.
- dependencies: subtask.dependencies || []
+ dependencies: this.transformDependencies(
+ subtask.dependencies,
+ `${parentTaskId}.${transformedSubtask.id}`
+ )📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| dependencies: subtask.dependencies || [] | |
| // Handle subtask dependencies with proper validation/transformation | |
| - dependencies: subtask.dependencies || [] | |
| + dependencies: this.transformDependencies( | |
| + subtask.dependencies, | |
| + `${parentTaskId}.${transformedSubtask.id}` | |
| + ) |
🤖 Prompt for AI Agents
In apps/extension/src/utils/task-master-api/transformers/task-transformer.ts at
line 383, the subtask dependencies are assigned directly without validation or
transformation, unlike the parent task dependencies. Update the code to apply
the same validation or transformation logic used for parent task dependencies to
the subtask dependencies before assigning them, ensuring consistency and
correctness.
| console.log('🔍 Fetching tasks with options:', options); | ||
| const response = await sendMessage({ | ||
| type: 'getTasks', | ||
| data: { | ||
| tag: options?.tag, | ||
| withSubtasks: true | ||
| } | ||
| }); | ||
| console.log('📋 Tasks fetched:', response); |
There was a problem hiding this comment.
🛠️ Refactor suggestion
Consider error handling for API responses
The response is cast to TaskMasterTask[] without validation. Consider adding runtime validation to ensure the response matches the expected type.
console.log('📋 Tasks fetched:', response);
-return response as TaskMasterTask[];
+if (!Array.isArray(response)) {
+ throw new Error('Invalid response format: expected array of tasks');
+}
+return response as TaskMasterTask[];📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| console.log('🔍 Fetching tasks with options:', options); | |
| const response = await sendMessage({ | |
| type: 'getTasks', | |
| data: { | |
| tag: options?.tag, | |
| withSubtasks: true | |
| } | |
| }); | |
| console.log('📋 Tasks fetched:', response); | |
| console.log('🔍 Fetching tasks with options:', options); | |
| const response = await sendMessage({ | |
| type: 'getTasks', | |
| data: { | |
| tag: options?.tag, | |
| withSubtasks: true | |
| } | |
| }); | |
| console.log('📋 Tasks fetched:', response); | |
| if (!Array.isArray(response)) { | |
| throw new Error('Invalid response format: expected array of tasks'); | |
| } | |
| return response as TaskMasterTask[]; |
🤖 Prompt for AI Agents
In apps/extension/src/webview/hooks/useTaskQueries.ts around lines 22 to 30, the
API response is cast directly to TaskMasterTask[] without validation, which
risks runtime errors if the data shape is unexpected. Add runtime validation to
check that the response matches the expected TaskMasterTask[] structure before
casting. Use type guards or a validation library to verify the response format
and handle errors gracefully if validation fails.
| let fullTaskData = null; | ||
| if (response?.data?.content?.[0]?.text) { | ||
| try { | ||
| const parsed = JSON.parse(response.data.content[0].text); | ||
| fullTaskData = parsed.data; | ||
| } catch (e) { | ||
| console.error('Failed to parse MCP response:', e); | ||
| } | ||
| } else if (response?.data?.data) { | ||
| fullTaskData = response.data.data; | ||
| } | ||
|
|
There was a problem hiding this comment.
🛠️ Refactor suggestion
Improve error handling in response parsing
The current implementation silently returns null if parsing fails. Consider throwing an error or returning a more descriptive result.
// Parse the MCP response
let fullTaskData = null;
if (response?.data?.content?.[0]?.text) {
try {
const parsed = JSON.parse(response.data.content[0].text);
fullTaskData = parsed.data;
} catch (e) {
console.error('Failed to parse MCP response:', e);
+ throw new Error('Failed to parse task details from MCP response');
}
} else if (response?.data?.data) {
fullTaskData = response.data.data;
}
+
+if (!fullTaskData) {
+ throw new Error('No task data found in response');
+}
return fullTaskData as TaskMasterTask;🤖 Prompt for AI Agents
In apps/extension/src/webview/hooks/useTaskQueries.ts around lines 53 to 64, the
code catches JSON parsing errors but only logs them and returns null, which can
obscure issues. Modify the error handling to either throw the error after
logging or return a descriptive error object or message instead of null, so
calling code can handle parsing failures explicitly.
| queryClient.setQueriesData({ queryKey: taskKeys.all }, (old: any) => { | ||
| if (!old) return old; | ||
|
|
||
| // Handle both array and object responses | ||
| if (Array.isArray(old)) { | ||
| return old.map((task: TaskMasterTask) => | ||
| task.id === taskId ? { ...task, status: newStatus } : task | ||
| ); | ||
| } | ||
|
|
||
| return old; | ||
| }); |
There was a problem hiding this comment.
Handle object responses in optimistic updates
The optimistic update only modifies array responses but doesn't handle object responses. This could lead to inconsistent UI state if some queries return objects.
// Handle both array and object responses
if (Array.isArray(old)) {
return old.map((task: TaskMasterTask) =>
task.id === taskId ? { ...task, status: newStatus } : task
);
}
-
-return old;
+// Handle object responses (e.g., paginated results)
+if (old && typeof old === 'object' && 'data' in old && Array.isArray(old.data)) {
+ return {
+ ...old,
+ data: old.data.map((task: TaskMasterTask) =>
+ task.id === taskId ? { ...task, status: newStatus } : task
+ )
+ };
+}
+return old;📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| queryClient.setQueriesData({ queryKey: taskKeys.all }, (old: any) => { | |
| if (!old) return old; | |
| // Handle both array and object responses | |
| if (Array.isArray(old)) { | |
| return old.map((task: TaskMasterTask) => | |
| task.id === taskId ? { ...task, status: newStatus } : task | |
| ); | |
| } | |
| return old; | |
| }); | |
| queryClient.setQueriesData({ queryKey: taskKeys.all }, (old: any) => { | |
| if (!old) return old; | |
| // Handle both array and object responses | |
| if (Array.isArray(old)) { | |
| return old.map((task: TaskMasterTask) => | |
| task.id === taskId ? { ...task, status: newStatus } : task | |
| ); | |
| } | |
| // Handle object responses (e.g., paginated results) | |
| if (old && typeof old === 'object' && 'data' in old && Array.isArray(old.data)) { | |
| return { | |
| ...old, | |
| data: old.data.map((task: TaskMasterTask) => | |
| task.id === taskId ? { ...task, status: newStatus } : task | |
| ) | |
| }; | |
| } | |
| return old; | |
| }); |
🤖 Prompt for AI Agents
In apps/extension/src/webview/hooks/useTaskQueries.ts around lines 101 to 112,
the optimistic update logic only updates the task status when the cached data is
an array, ignoring cases where the cached data might be an object. To fix this,
add handling for object responses by checking if the cached data is an object
and updating the task status accordingly before returning the updated object.
This ensures consistent UI state regardless of the data structure returned by
queries.
| console.log('🔄 Updating task:', taskId, updates, options); | ||
|
|
||
| const response = await sendMessage({ | ||
| type: 'updateTask', | ||
| data: { taskId, updates, options } | ||
| }); | ||
|
|
||
| console.log('📥 Update task response:', response); | ||
|
|
||
| // Check for error in response | ||
| if (response && typeof response === 'object' && 'error' in response) { | ||
| throw new Error(response.error || 'Failed to update task'); | ||
| } | ||
|
|
||
| return response; | ||
| }, | ||
| onSuccess: async (data, variables) => { | ||
| console.log('✅ Task update successful, invalidating all task queries'); | ||
| console.log('Response data:', data); | ||
| console.log('Task ID:', variables.taskId); | ||
|
|
||
| // Invalidate ALL task-related queries (same as handleRefresh) | ||
| await queryClient.invalidateQueries({ | ||
| queryKey: taskKeys.all | ||
| }); | ||
|
|
||
| console.log( | ||
| '🔄 All task queries invalidated for task:', | ||
| variables.taskId | ||
| ); | ||
| } |
There was a problem hiding this comment.
🧹 Nitpick (assertive)
Make debug logging conditional on environment
The extensive console logging should only run in development to avoid cluttering production logs.
+const isDev = process.env.NODE_ENV === 'development';
+
mutationFn: async ({
taskId,
updates,
options = {}
}: {
taskId: string;
updates: TaskUpdates | { description: string };
options?: { append?: boolean; research?: boolean };
}) => {
- console.log('🔄 Updating task:', taskId, updates, options);
+ if (isDev) console.log('🔄 Updating task:', taskId, updates, options);
const response = await sendMessage({
type: 'updateTask',
data: { taskId, updates, options }
});
- console.log('📥 Update task response:', response);
+ if (isDev) console.log('📥 Update task response:', response);📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| console.log('🔄 Updating task:', taskId, updates, options); | |
| const response = await sendMessage({ | |
| type: 'updateTask', | |
| data: { taskId, updates, options } | |
| }); | |
| console.log('📥 Update task response:', response); | |
| // Check for error in response | |
| if (response && typeof response === 'object' && 'error' in response) { | |
| throw new Error(response.error || 'Failed to update task'); | |
| } | |
| return response; | |
| }, | |
| onSuccess: async (data, variables) => { | |
| console.log('✅ Task update successful, invalidating all task queries'); | |
| console.log('Response data:', data); | |
| console.log('Task ID:', variables.taskId); | |
| // Invalidate ALL task-related queries (same as handleRefresh) | |
| await queryClient.invalidateQueries({ | |
| queryKey: taskKeys.all | |
| }); | |
| console.log( | |
| '🔄 All task queries invalidated for task:', | |
| variables.taskId | |
| ); | |
| } | |
| // apps/extension/src/webview/hooks/useTaskQueries.ts | |
| // Add at the top of this hook (in the same scope as `mutationFn`) | |
| const isDev = process.env.NODE_ENV === 'development'; | |
| // … within your existing useMutation / useTaskQueries setup … | |
| mutationFn: async ({ | |
| taskId, | |
| updates, | |
| options = {} | |
| }: { | |
| taskId: string | |
| updates: TaskUpdates | { description: string } | |
| options?: { append?: boolean; research?: boolean } | |
| }) => { | |
| if (isDev) console.log('🔄 Updating task:', taskId, updates, options) | |
| const response = await sendMessage({ | |
| type: 'updateTask', | |
| data: { taskId, updates, options } | |
| }) | |
| if (isDev) console.log('📥 Update task response:', response) | |
| // Check for error in response | |
| if (response && typeof response === 'object' && 'error' in response) { | |
| throw new Error(response.error || 'Failed to update task') | |
| } | |
| return response | |
| }, | |
| onSuccess: async (data, variables) => { | |
| console.log('✅ Task update successful, invalidating all task queries') | |
| console.log('Response data:', data) | |
| console.log('Task ID:', variables.taskId) | |
| // Invalidate ALL task-related queries (same as handleRefresh) | |
| await queryClient.invalidateQueries({ | |
| queryKey: taskKeys.all | |
| }) | |
| console.log( | |
| '🔄 All task queries invalidated for task:', | |
| variables.taskId | |
| ) | |
| } | |
| // … |
🤖 Prompt for AI Agents
In apps/extension/src/webview/hooks/useTaskQueries.ts around lines 147 to 177,
the console.log statements for debugging are always executed, which can clutter
production logs. Wrap all console.log calls within a condition that checks if
the environment is development (e.g., process.env.NODE_ENV === 'development') so
that these logs only appear during development and are suppressed in production.
| "taskmaster.mcp.requestTimeoutMs": { | ||
| "type": "number", | ||
| "default": 300000, | ||
| "minimum": 30000, | ||
| "maximum": 600000, | ||
| "description": "MCP request timeout in milliseconds (default: 5 minutes)" | ||
| }, |
There was a problem hiding this comment.
🧹 Nitpick (assertive)
Consider reducing default request timeout
The default MCP request timeout of 5 minutes (300000ms) seems excessive. Most operations should complete much faster, and a long timeout can lead to poor user experience when issues occur.
Consider reducing the default to 60000ms (1 minute):
"taskmaster.mcp.requestTimeoutMs": {
"type": "number",
- "default": 300000,
+ "default": 60000,
"minimum": 30000,
"maximum": 600000,
- "description": "MCP request timeout in milliseconds (default: 5 minutes)"
+ "description": "MCP request timeout in milliseconds (default: 1 minute)"
},📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| "taskmaster.mcp.requestTimeoutMs": { | |
| "type": "number", | |
| "default": 300000, | |
| "minimum": 30000, | |
| "maximum": 600000, | |
| "description": "MCP request timeout in milliseconds (default: 5 minutes)" | |
| }, | |
| "taskmaster.mcp.requestTimeoutMs": { | |
| "type": "number", | |
| "default": 60000, | |
| "minimum": 30000, | |
| "maximum": 600000, | |
| "description": "MCP request timeout in milliseconds (default: 1 minute)" | |
| }, |
🤖 Prompt for AI Agents
In apps/extension/package.json around lines 121 to 127, the default value for
"taskmaster.mcp.requestTimeoutMs" is set to 300000ms (5 minutes), which is too
long and may degrade user experience. Change the "default" value from 300000 to
60000 to reduce the timeout to 1 minute, while keeping the minimum and maximum
values unchanged.
| async connect(): Promise<void> { | ||
| try { | ||
| if (!this.mcpClient) { | ||
| throw new Error('MCP client not initialized'); | ||
| } | ||
|
|
||
| this.logEvent({ type: 'reconnecting', timestamp: new Date() }); | ||
|
|
||
| await this.mcpClient.connect(); | ||
|
|
||
| this.reconnectAttempts = 0; | ||
| this.reconnectBackoffMs = 1000; | ||
| this.isReconnecting = false; | ||
| this.startTime = new Date(); | ||
|
|
||
| this.updateHealth(); | ||
| this.startHealthMonitoring(); | ||
|
|
||
| this.logEvent({ type: 'connected', timestamp: new Date() }); | ||
|
|
||
| logger.log('Connection manager: Successfully connected'); | ||
| } catch (error) { | ||
| this.logEvent({ | ||
| type: 'error', | ||
| timestamp: new Date(), | ||
| data: { | ||
| error: error instanceof Error ? error.message : 'Unknown error' | ||
| } | ||
| }); | ||
|
|
||
| await this.handleConnectionFailure(error); | ||
| throw error; | ||
| } | ||
| } |
There was a problem hiding this comment.
Misleading connection event logging.
The method logs a 'reconnecting' event even on the initial connection attempt, which is inaccurate.
async connect(): Promise<void> {
try {
if (!this.mcpClient) {
throw new Error('MCP client not initialized');
}
- this.logEvent({ type: 'reconnecting', timestamp: new Date() });
+ if (this.reconnectAttempts > 0) {
+ this.logEvent({ type: 'reconnecting', timestamp: new Date() });
+ }
await this.mcpClient.connect();📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| async connect(): Promise<void> { | |
| try { | |
| if (!this.mcpClient) { | |
| throw new Error('MCP client not initialized'); | |
| } | |
| this.logEvent({ type: 'reconnecting', timestamp: new Date() }); | |
| await this.mcpClient.connect(); | |
| this.reconnectAttempts = 0; | |
| this.reconnectBackoffMs = 1000; | |
| this.isReconnecting = false; | |
| this.startTime = new Date(); | |
| this.updateHealth(); | |
| this.startHealthMonitoring(); | |
| this.logEvent({ type: 'connected', timestamp: new Date() }); | |
| logger.log('Connection manager: Successfully connected'); | |
| } catch (error) { | |
| this.logEvent({ | |
| type: 'error', | |
| timestamp: new Date(), | |
| data: { | |
| error: error instanceof Error ? error.message : 'Unknown error' | |
| } | |
| }); | |
| await this.handleConnectionFailure(error); | |
| throw error; | |
| } | |
| } | |
| async connect(): Promise<void> { | |
| try { | |
| if (!this.mcpClient) { | |
| throw new Error('MCP client not initialized'); | |
| } | |
| if (this.reconnectAttempts > 0) { | |
| this.logEvent({ type: 'reconnecting', timestamp: new Date() }); | |
| } | |
| await this.mcpClient.connect(); | |
| this.reconnectAttempts = 0; | |
| this.reconnectBackoffMs = 1000; | |
| this.isReconnecting = false; | |
| this.startTime = new Date(); | |
| this.updateHealth(); | |
| this.startHealthMonitoring(); | |
| this.logEvent({ type: 'connected', timestamp: new Date() }); | |
| logger.log('Connection manager: Successfully connected'); | |
| } catch (error) { | |
| this.logEvent({ | |
| type: 'error', | |
| timestamp: new Date(), | |
| data: { | |
| error: error instanceof Error ? error.message : 'Unknown error' | |
| } | |
| }); | |
| await this.handleConnectionFailure(error); | |
| throw error; | |
| } | |
| } |
🤖 Prompt for AI Agents
In apps/extension/src/utils/connectionManager.ts between lines 70 and 103, the
connect method incorrectly logs a 'reconnecting' event even during the initial
connection attempt. Modify the code to log 'reconnecting' only if this is an
actual reconnection attempt after a previous connection, otherwise log a
different event such as 'connecting' for the initial connection. This will
ensure event logs accurately reflect the connection state.
| export enum ErrorCategory { | ||
| MCP_CONNECTION = 'mcp_connection', | ||
| CONFIGURATION = 'configuration', | ||
| TASK_LOADING = 'task_loading', | ||
| UI_RENDERING = 'ui_rendering', | ||
| VALIDATION = 'validation', | ||
| NETWORK = 'network', | ||
| INTERNAL = 'internal', | ||
| TASK_MASTER_API = 'TASK_MASTER_API', | ||
| DATA_VALIDATION = 'DATA_VALIDATION', | ||
| DATA_PARSING = 'DATA_PARSING', | ||
| TASK_DATA_CORRUPTION = 'TASK_DATA_CORRUPTION', | ||
| VSCODE_API = 'VSCODE_API', | ||
| WEBVIEW = 'WEBVIEW', | ||
| EXTENSION_HOST = 'EXTENSION_HOST', | ||
| USER_INTERACTION = 'USER_INTERACTION', | ||
| DRAG_DROP = 'DRAG_DROP', | ||
| COMPONENT_RENDER = 'COMPONENT_RENDER', | ||
| PERMISSION = 'PERMISSION', | ||
| FILE_SYSTEM = 'FILE_SYSTEM', | ||
| UNKNOWN = 'UNKNOWN' | ||
| } |
There was a problem hiding this comment.
🧹 Nitpick (assertive)
Consolidate duplicate error categories
The ErrorCategory enum contains duplicate concepts that should be consolidated for clarity:
VALIDATIONandDATA_VALIDATIONserve similar purposesINTERNALandUNKNOWNcould be merged
Consider consolidating:
export enum ErrorCategory {
MCP_CONNECTION = 'mcp_connection',
CONFIGURATION = 'configuration',
TASK_LOADING = 'task_loading',
UI_RENDERING = 'ui_rendering',
- VALIDATION = 'validation',
NETWORK = 'network',
- INTERNAL = 'internal',
+ INTERNAL = 'internal', // Covers both internal and unknown errors
TASK_MASTER_API = 'TASK_MASTER_API',
DATA_VALIDATION = 'DATA_VALIDATION',
DATA_PARSING = 'DATA_PARSING',
TASK_DATA_CORRUPTION = 'TASK_DATA_CORRUPTION',
VSCODE_API = 'VSCODE_API',
WEBVIEW = 'WEBVIEW',
EXTENSION_HOST = 'EXTENSION_HOST',
USER_INTERACTION = 'USER_INTERACTION',
DRAG_DROP = 'DRAG_DROP',
COMPONENT_RENDER = 'COMPONENT_RENDER',
PERMISSION = 'PERMISSION',
FILE_SYSTEM = 'FILE_SYSTEM',
- UNKNOWN = 'UNKNOWN'
}📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| export enum ErrorCategory { | |
| MCP_CONNECTION = 'mcp_connection', | |
| CONFIGURATION = 'configuration', | |
| TASK_LOADING = 'task_loading', | |
| UI_RENDERING = 'ui_rendering', | |
| VALIDATION = 'validation', | |
| NETWORK = 'network', | |
| INTERNAL = 'internal', | |
| TASK_MASTER_API = 'TASK_MASTER_API', | |
| DATA_VALIDATION = 'DATA_VALIDATION', | |
| DATA_PARSING = 'DATA_PARSING', | |
| TASK_DATA_CORRUPTION = 'TASK_DATA_CORRUPTION', | |
| VSCODE_API = 'VSCODE_API', | |
| WEBVIEW = 'WEBVIEW', | |
| EXTENSION_HOST = 'EXTENSION_HOST', | |
| USER_INTERACTION = 'USER_INTERACTION', | |
| DRAG_DROP = 'DRAG_DROP', | |
| COMPONENT_RENDER = 'COMPONENT_RENDER', | |
| PERMISSION = 'PERMISSION', | |
| FILE_SYSTEM = 'FILE_SYSTEM', | |
| UNKNOWN = 'UNKNOWN' | |
| } | |
| export enum ErrorCategory { | |
| MCP_CONNECTION = 'mcp_connection', | |
| CONFIGURATION = 'configuration', | |
| TASK_LOADING = 'task_loading', | |
| UI_RENDERING = 'ui_rendering', | |
| NETWORK = 'network', | |
| INTERNAL = 'internal', // Covers both internal and unknown errors | |
| TASK_MASTER_API = 'TASK_MASTER_API', | |
| DATA_VALIDATION = 'DATA_VALIDATION', | |
| DATA_PARSING = 'DATA_PARSING', | |
| TASK_DATA_CORRUPTION = 'TASK_DATA_CORRUPTION', | |
| VSCODE_API = 'VSCODE_API', | |
| WEBVIEW = 'WEBVIEW', | |
| EXTENSION_HOST = 'EXTENSION_HOST', | |
| USER_INTERACTION = 'USER_INTERACTION', | |
| DRAG_DROP = 'DRAG_DROP', | |
| COMPONENT_RENDER = 'COMPONENT_RENDER', | |
| PERMISSION = 'PERMISSION', | |
| FILE_SYSTEM = 'FILE_SYSTEM', | |
| } |
🤖 Prompt for AI Agents
In apps/extension/src/utils/errorHandler.ts between lines 16 and 37, the
ErrorCategory enum has overlapping categories such as VALIDATION and
DATA_VALIDATION, as well as INTERNAL and UNKNOWN. To fix this, consolidate these
duplicates by merging VALIDATION and DATA_VALIDATION into a single category, and
similarly combine INTERNAL and UNKNOWN into one unified category to improve
clarity and reduce redundancy.
| * Setup global error handlers | ||
| */ | ||
| private setupGlobalErrorHandlers(): void { | ||
| // Handle unhandled promise rejections | ||
| process.on('unhandledRejection', (reason, promise) => { | ||
| // Create a concrete error class for internal errors | ||
| class InternalError extends TaskMasterError { | ||
| constructor( | ||
| message: string, | ||
| code: string, | ||
| severity: ErrorSeverity, | ||
| context?: Record<string, any> | ||
| ) { | ||
| super(message, code, ErrorCategory.INTERNAL, severity, context); | ||
| } | ||
| } | ||
|
|
||
| const error = new InternalError( | ||
| 'Unhandled Promise Rejection', | ||
| 'UNHANDLED_REJECTION', | ||
| ErrorSeverity.HIGH, | ||
| { reason: String(reason), promise: String(promise) } | ||
| ); | ||
| this.handleError(error); | ||
| }); | ||
|
|
||
| // Handle uncaught exceptions | ||
| process.on('uncaughtException', (error) => { | ||
| // Create a concrete error class for internal errors | ||
| class InternalError extends TaskMasterError { | ||
| constructor( | ||
| message: string, | ||
| code: string, | ||
| severity: ErrorSeverity, | ||
| context?: Record<string, any> | ||
| ) { | ||
| super(message, code, ErrorCategory.INTERNAL, severity, context); | ||
| } | ||
| } | ||
|
|
||
| const taskMasterError = new InternalError( | ||
| 'Uncaught Exception', | ||
| 'UNCAUGHT_EXCEPTION', | ||
| ErrorSeverity.CRITICAL, | ||
| { originalError: error.message, stack: error.stack } | ||
| ); | ||
| this.handleCriticalError(taskMasterError); | ||
| }); | ||
| } |
There was a problem hiding this comment.
🛠️ Refactor suggestion
Eliminate duplicate InternalError class definitions
The InternalError class is defined twice within the global error handlers. Define it once outside the handlers to avoid duplication.
private setupGlobalErrorHandlers(): void {
+ // Define InternalError class once
+ class InternalError extends TaskMasterError {
+ constructor(
+ message: string,
+ code: string,
+ severity: ErrorSeverity,
+ context?: Record<string, any>
+ ) {
+ super(message, code, ErrorCategory.INTERNAL, severity, context);
+ }
+ }
+
// Handle unhandled promise rejections
process.on('unhandledRejection', (reason, promise) => {
- // Create a concrete error class for internal errors
- class InternalError extends TaskMasterError {
- constructor(
- message: string,
- code: string,
- severity: ErrorSeverity,
- context?: Record<string, any>
- ) {
- super(message, code, ErrorCategory.INTERNAL, severity, context);
- }
- }
-
const error = new InternalError(
'Unhandled Promise Rejection',
'UNHANDLED_REJECTION',
ErrorSeverity.HIGH,
{ reason: String(reason), promise: String(promise) }
);
this.handleError(error);
});
// Handle uncaught exceptions
process.on('uncaughtException', (error) => {
- // Create a concrete error class for internal errors
- class InternalError extends TaskMasterError {
- constructor(
- message: string,
- code: string,
- severity: ErrorSeverity,
- context?: Record<string, any>
- ) {
- super(message, code, ErrorCategory.INTERNAL, severity, context);
- }
- }
-
const taskMasterError = new InternalError(
'Uncaught Exception',
'UNCAUGHT_EXCEPTION',
ErrorSeverity.CRITICAL,
{ originalError: error.message, stack: error.stack }
);
this.handleCriticalError(taskMasterError);
});
}📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| * Setup global error handlers | |
| */ | |
| private setupGlobalErrorHandlers(): void { | |
| // Handle unhandled promise rejections | |
| process.on('unhandledRejection', (reason, promise) => { | |
| // Create a concrete error class for internal errors | |
| class InternalError extends TaskMasterError { | |
| constructor( | |
| message: string, | |
| code: string, | |
| severity: ErrorSeverity, | |
| context?: Record<string, any> | |
| ) { | |
| super(message, code, ErrorCategory.INTERNAL, severity, context); | |
| } | |
| } | |
| const error = new InternalError( | |
| 'Unhandled Promise Rejection', | |
| 'UNHANDLED_REJECTION', | |
| ErrorSeverity.HIGH, | |
| { reason: String(reason), promise: String(promise) } | |
| ); | |
| this.handleError(error); | |
| }); | |
| // Handle uncaught exceptions | |
| process.on('uncaughtException', (error) => { | |
| // Create a concrete error class for internal errors | |
| class InternalError extends TaskMasterError { | |
| constructor( | |
| message: string, | |
| code: string, | |
| severity: ErrorSeverity, | |
| context?: Record<string, any> | |
| ) { | |
| super(message, code, ErrorCategory.INTERNAL, severity, context); | |
| } | |
| } | |
| const taskMasterError = new InternalError( | |
| 'Uncaught Exception', | |
| 'UNCAUGHT_EXCEPTION', | |
| ErrorSeverity.CRITICAL, | |
| { originalError: error.message, stack: error.stack } | |
| ); | |
| this.handleCriticalError(taskMasterError); | |
| }); | |
| } | |
| /* | |
| * Setup global error handlers | |
| */ | |
| private setupGlobalErrorHandlers(): void { | |
| // Define InternalError class once | |
| class InternalError extends TaskMasterError { | |
| constructor( | |
| message: string, | |
| code: string, | |
| severity: ErrorSeverity, | |
| context?: Record<string, any> | |
| ) { | |
| super(message, code, ErrorCategory.INTERNAL, severity, context); | |
| } | |
| } | |
| // Handle unhandled promise rejections | |
| process.on('unhandledRejection', (reason, promise) => { | |
| const error = new InternalError( | |
| 'Unhandled Promise Rejection', | |
| 'UNHANDLED_REJECTION', | |
| ErrorSeverity.HIGH, | |
| { reason: String(reason), promise: String(promise) } | |
| ); | |
| this.handleError(error); | |
| }); | |
| // Handle uncaught exceptions | |
| process.on('uncaughtException', (error) => { | |
| const taskMasterError = new InternalError( | |
| 'Uncaught Exception', | |
| 'UNCAUGHT_EXCEPTION', | |
| ErrorSeverity.CRITICAL, | |
| { originalError: error.message, stack: error.stack } | |
| ); | |
| this.handleCriticalError(taskMasterError); | |
| }); | |
| } |
🤖 Prompt for AI Agents
In apps/extension/src/utils/errorHandler.ts between lines 644 and 692, the
InternalError class is redundantly defined twice inside the unhandledRejection
and uncaughtException handlers. To fix this, move the InternalError class
definition outside of both handlers so it is declared only once, then
instantiate and use it inside each handler as needed.
| const mergedCache: CacheConfig = { | ||
| maxSize: config?.cache?.maxSize ?? this.defaultCacheConfig.maxSize, | ||
| enableBackgroundRefresh: | ||
| config?.cache?.enableBackgroundRefresh ?? | ||
| this.defaultCacheConfig.enableBackgroundRefresh, | ||
| refreshInterval: | ||
| config?.cache?.refreshInterval ?? | ||
| this.defaultCacheConfig.refreshInterval, | ||
| enableAnalytics: | ||
| config?.cache?.enableAnalytics ?? | ||
| this.defaultCacheConfig.enableAnalytics, | ||
| enablePrefetch: | ||
| config?.cache?.enablePrefetch ?? this.defaultCacheConfig.enablePrefetch, | ||
| compressionEnabled: | ||
| config?.cache?.compressionEnabled ?? | ||
| this.defaultCacheConfig.compressionEnabled, | ||
| persistToDisk: | ||
| config?.cache?.persistToDisk ?? this.defaultCacheConfig.persistToDisk | ||
| }; |
There was a problem hiding this comment.
🧹 Nitpick (assertive)
Simplify cache configuration merging
The cache configuration merging is verbose. Consider using object spread with proper defaults:
- const mergedCache: CacheConfig = {
- maxSize: config?.cache?.maxSize ?? this.defaultCacheConfig.maxSize,
- enableBackgroundRefresh:
- config?.cache?.enableBackgroundRefresh ??
- this.defaultCacheConfig.enableBackgroundRefresh,
- refreshInterval:
- config?.cache?.refreshInterval ??
- this.defaultCacheConfig.refreshInterval,
- enableAnalytics:
- config?.cache?.enableAnalytics ??
- this.defaultCacheConfig.enableAnalytics,
- enablePrefetch:
- config?.cache?.enablePrefetch ?? this.defaultCacheConfig.enablePrefetch,
- compressionEnabled:
- config?.cache?.compressionEnabled ??
- this.defaultCacheConfig.compressionEnabled,
- persistToDisk:
- config?.cache?.persistToDisk ?? this.defaultCacheConfig.persistToDisk
- };
+ const mergedCache: CacheConfig = {
+ ...this.defaultCacheConfig,
+ ...config?.cache
+ };Committable suggestion skipped: line range outside the PR's diff.
🤖 Prompt for AI Agents
In apps/extension/src/utils/task-master-api/index.ts around lines 60 to 78, the
cache configuration merging is verbose by manually assigning each property with
nullish coalescing. Simplify this by using object spread syntax to merge
config.cache over this.defaultCacheConfig, ensuring that config.cache properties
override defaults while preserving defaults for missing values.
| */ | ||
| private startBackgroundRefresh(): void { | ||
| const interval = this.config.cache?.refreshInterval || 5 * 60 * 1000; | ||
| setInterval(() => { | ||
| this.performBackgroundRefresh(); | ||
| }, interval); | ||
| } |
There was a problem hiding this comment.
Memory leak: Store and clear the background refresh interval
The setInterval call creates a timer that's never cleared, causing a memory leak when the API instance is destroyed.
Add an instance property to store the interval ID and clear it in the destroy method:
export class TaskMasterApi {
private mcpWrapper: MCPClient;
private cache: CacheManager;
private transformer: TaskTransformer;
private config: TaskMasterApiConfig;
private logger: ExtensionLogger;
+ private backgroundRefreshInterval?: NodeJS.Timeout;
// ... other code ...
private startBackgroundRefresh(): void {
const interval = this.config.cache?.refreshInterval || 5 * 60 * 1000;
- setInterval(() => {
+ this.backgroundRefreshInterval = setInterval(() => {
this.performBackgroundRefresh();
}, interval);
}
destroy(): void {
+ if (this.backgroundRefreshInterval) {
+ clearInterval(this.backgroundRefreshInterval);
+ this.backgroundRefreshInterval = undefined;
+ }
this.cache.destroy();
this.logger.log('TaskMasterApi: Destroyed and cleaned up resources');
}📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| */ | |
| private startBackgroundRefresh(): void { | |
| const interval = this.config.cache?.refreshInterval || 5 * 60 * 1000; | |
| setInterval(() => { | |
| this.performBackgroundRefresh(); | |
| }, interval); | |
| } | |
| export class TaskMasterApi { | |
| private mcpWrapper: MCPClient; | |
| private cache: CacheManager; | |
| private transformer: TaskTransformer; | |
| private config: TaskMasterApiConfig; | |
| private logger: ExtensionLogger; | |
| private backgroundRefreshInterval?: NodeJS.Timeout; | |
| // ... other code ... | |
| private startBackgroundRefresh(): void { | |
| const interval = this.config.cache?.refreshInterval || 5 * 60 * 1000; | |
| this.backgroundRefreshInterval = setInterval(() => { | |
| this.performBackgroundRefresh(); | |
| }, interval); | |
| } | |
| destroy(): void { | |
| if (this.backgroundRefreshInterval) { | |
| clearInterval(this.backgroundRefreshInterval); | |
| this.backgroundRefreshInterval = undefined; | |
| } | |
| this.cache.destroy(); | |
| this.logger.log('TaskMasterApi: Destroyed and cleaned up resources'); | |
| } | |
| } |
🤖 Prompt for AI Agents
In apps/extension/src/utils/task-master-api/index.ts around lines 426 to 432,
the setInterval call in startBackgroundRefresh creates a timer that is never
cleared, causing a memory leak. Fix this by adding an instance property to store
the interval ID returned by setInterval, and then clear this interval using
clearInterval in the class's destroy method to properly clean up the timer when
the API instance is destroyed.
| export interface SubtaskData { | ||
| title: string; | ||
| description?: string; | ||
| dependencies?: string[]; | ||
| status?: string; | ||
| } |
There was a problem hiding this comment.
🧹 Nitpick (assertive)
Consider adding priority field to SubtaskData.
The SubtaskData interface is missing the priority field that exists in the main task structure. For consistency, subtasks should support the same priority levels.
export interface SubtaskData {
title: string;
description?: string;
dependencies?: string[];
status?: string;
+ priority?: 'high' | 'medium' | 'low';
}📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| export interface SubtaskData { | |
| title: string; | |
| description?: string; | |
| dependencies?: string[]; | |
| status?: string; | |
| } | |
| export interface SubtaskData { | |
| title: string; | |
| description?: string; | |
| dependencies?: string[]; | |
| status?: string; | |
| priority?: 'high' | 'medium' | 'low'; | |
| } |
🤖 Prompt for AI Agents
In apps/extension/src/utils/task-master-api/types/index.ts between lines 152 and
157, the SubtaskData interface lacks a priority field that is present in the
main task structure. Add an optional priority field to the SubtaskData interface
with the same type as used in the main task to maintain consistency across task
and subtask data models.
…mic Task Complexity Adjustment (#1069) * feat(task-104): Complete task 104 - Implement scope-up and scope-down CLI Commands - Added new CLI commands 'scope-up' and 'scope-down' with comma-separated ID support - Implemented strength levels (light/regular/heavy) and custom prompt functionality - Created core complexity adjustment logic with AI integration - Added MCP tool equivalents for integrated environments - Comprehensive error handling and task validation - Full test coverage with TDD approach - Updated task manager core and UI components Task 104: Implement 'scope-up' and 'scope-down' CLI Commands for Dynamic Task Complexity Adjustment - Complete implementation with CLI, MCP integration, and testing * chore: Add changeset for scope-up and scope-down features - Comprehensive user-facing description with usage examples - Key features and benefits explanation - CLI and MCP integration details - Real-world use cases for agile workflows * feat(extension): Add scope-up and scope-down to VS Code extension task details - Added useScopeUpTask and useScopeDownTask hooks in useTaskQueries.ts - Enhanced AIActionsSection with Task Complexity Adjustment section - Added strength selection (light/regular/heavy) and custom prompt support - Integrated scope buttons with proper loading states and error handling - Uses existing mcpRequest handler for scope_up_task and scope_down_task tools - Maintains consistent UI patterns with existing AI actions Extension now supports dynamic task complexity adjustment directly from task details view.
There was a problem hiding this comment.
Actionable comments posted: 14
♻️ Duplicate comments (9)
.changeset/pre.json (1)
1-15: Version mismatch will cause Changesets to fail.The
initialVersionsmust match the current package.json versions exactly. The task-master-ai package is at 0.22.1-rc.1, not 0.22.0.Update line 5:
- "task-master-ai": "0.22.0", + "task-master-ai": "0.22.1-rc.1",Also confirm if you intend to stay in pre-release mode for a 0.23.0 release - if not, run
changeset pre exitbefore merging.apps/extension/src/webview/hooks/useTaskQueries.ts (4)
22-31: Add runtime validation for API response.The response is cast directly to
TaskMasterTask[]without validation, risking runtime errors if the data doesn't match the expected shape.console.log('📋 Tasks fetched:', response); -return response as TaskMasterTask[]; +if (!Array.isArray(response)) { + throw new Error('Invalid response format: expected array of tasks'); +} +// Consider adding more detailed validation for each task object +return response as TaskMasterTask[];
53-65: Improve error handling in MCP response parsing.Parsing errors are only logged but the function continues and returns null, which can cause issues downstream.
let fullTaskData = null; if (response?.data?.content?.[0]?.text) { try { const parsed = JSON.parse(response.data.content[0].text); fullTaskData = parsed.data; } catch (e) { console.error('Failed to parse MCP response:', e); + throw new Error(`Failed to parse task details: ${e.message}`); } } else if (response?.data?.data) { fullTaskData = response.data.data; } + +if (!fullTaskData) { + throw new Error('No task data found in MCP response'); +} return fullTaskData as TaskMasterTask;
101-112: Handle object responses in optimistic updates.The optimistic update only handles array responses but not object responses (e.g., paginated results), potentially causing UI inconsistencies.
// Handle both array and object responses if (Array.isArray(old)) { return old.map((task: TaskMasterTask) => task.id === taskId ? { ...task, status: newStatus } : task ); } -return old; +// Handle object responses with nested data array +if (old && typeof old === 'object' && 'data' in old && Array.isArray(old.data)) { + return { + ...old, + data: old.data.map((task: TaskMasterTask) => + task.id === taskId ? { ...task, status: newStatus } : task + ) + }; +} + +return old;
147-177: Wrap debug logging in development check.Console logs should only run in development to avoid cluttering production logs and potentially exposing sensitive data.
+const isDev = process.env.NODE_ENV === 'development'; + mutationFn: async ({ taskId, updates, options = {} }: { taskId: string; updates: TaskUpdates | { description: string }; options?: { append?: boolean; research?: boolean }; }) => { - console.log('🔄 Updating task:', taskId, updates, options); + if (isDev) console.log('🔄 Updating task:', taskId, updates, options); const response = await sendMessage({ type: 'updateTask', data: { taskId, updates, options } }); - console.log('📥 Update task response:', response); + if (isDev) console.log('📥 Update task response:', response);package.json (2)
3-3: Version doesn't match PR title "Release 0.23.0".The package version is set to 0.22.1-rc.1 but the PR aims to release 0.23.0.
Run
npx changeset versionto properly bump to 0.23.0-rc.0 or update the PR title to match the intended version.
12-15: Remove redundant root entry from workspaces.The "." entry is unnecessary as the root package is implicitly included in the workspace.
"workspaces": [ - "apps/*", - "." + "apps/*" ],CHANGELOG.md (1)
3-4: Version header still not aligned with 0.23.0 release targetHeader shows
## 0.22.1-rc.1, yet the PR is titled “Release 0.23.0”. Previous feedback about the mismatch (for0.22.1-rc.0) remains unresolved.
Please update the heading (and any accompanying tooling/version files) to0.23.0or retitle the PR accordingly.-## 0.22.1-rc.1 +## 0.23.0apps/extension/package.json (1)
131-136: Default MCP request timeout still 5 min (duplicate of earlier feedback)
See previous review – the 300 000 ms default is excessive; consider 60 000 ms instead.
| description: | ||
| globs: |
There was a problem hiding this comment.
Missing required fields in frontmatter
The frontmatter is missing values for description and globs fields, which are required according to the Cursor rules structure guidelines.
---
-description:
-globs:
+description: Testing workflow guidelines and Jest configuration for TaskMaster
+globs: ['**/*.test.js', '**/*.test.ts', 'jest.config.js', 'tests/**/*']
alwaysApply: true
---📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| description: | |
| globs: | |
| --- | |
| description: Testing workflow guidelines and Jest configuration for TaskMaster | |
| globs: ['**/*.test.js', '**/*.test.ts', 'jest.config.js', 'tests/**/*'] | |
| alwaysApply: true | |
| --- |
🤖 Prompt for AI Agents
In .cursor/rules/test_workflow.mdc at lines 2 to 3, the frontmatter is missing
required values for the fields `description` and `globs`. Add appropriate
descriptive text for `description` and specify the relevant file patterns or
paths for `globs` to comply with the Cursor rules structure guidelines.
| "testStrategy": "Testing should verify both the protocol design and implementation:\n\n1. Unit tests for the adapter pattern, ensuring it correctly translates between Taskmaster's internal models and the MCP protocol.\n2. Integration tests with a mock MCP tool or server to validate the full request/response cycle.\n3. Specific tests for the reference implementation (e.g., GitHub-MCP or Postgres-MCP), including authentication flows.\n4. Error handling tests that simulate network failures, timeouts, and malformed responses.\n5. Performance tests to ensure the communication does not introduce significant latency.\n6. Security tests to verify that authentication and encryption mechanisms are functioning correctly.\n7. End-to-end tests demonstrating Taskmaster's ability to programmatically interact with external MCP tools and execute tasks.\n8. Compatibility tests with different versions of the protocol to ensure backward compatibility.\n9. Tests for mode switching:\n - Validate that Taskmaster correctly operates in solo/local mode using the `tasks.json` file.\n - Validate that Taskmaster correctly operates in multiplayer/remote mode with external MCP integrations (e.g., GitHub-MCP or Postgres-MCP).\n - Ensure seamless switching between modes without data loss or corruption.\n10. A test harness should be created to simulate an MCP tool or server for testing purposes without relying on external dependencies. Test cases should be documented thoroughly to serve as examples for other implementations.", | ||
| "subtasks": [ | ||
| { | ||
| "id": "42-1", | ||
| "id": 42, | ||
| "title": "Define MCP-to-MCP communication protocol", | ||
| "status": "pending" | ||
| }, | ||
| { | ||
| "id": "42-2", | ||
| "id": 42, | ||
| "title": "Implement adapter pattern for MCP integration", | ||
| "status": "pending" | ||
| }, | ||
| { | ||
| "id": "42-3", | ||
| "id": 42, | ||
| "title": "Develop client module for MCP tool discovery and interaction", | ||
| "status": "pending" | ||
| }, | ||
| { | ||
| "id": "42-4", | ||
| "id": 42, | ||
| "title": "Provide reference implementation for GitHub-MCP integration", | ||
| "status": "pending" | ||
| }, | ||
| { | ||
| "id": "42-5", | ||
| "id": 42, | ||
| "title": "Add support for solo/local and multiplayer/remote modes", | ||
| "status": "pending" | ||
| }, | ||
| { | ||
| "id": "42-6", | ||
| "id": 42, | ||
| "title": "Update core modules to support dynamic mode-based operations", | ||
| "status": "pending" | ||
| }, | ||
| { | ||
| "id": "42-7", | ||
| "id": 42, | ||
| "title": "Document protocol and mode-switching functionality", | ||
| "status": "pending" | ||
| }, | ||
| { | ||
| "id": "42-8", | ||
| "id": 42, | ||
| "title": "Update terminology to reflect MCP server-based communication", | ||
| "status": "pending" | ||
| } |
There was a problem hiding this comment.
Duplicate subtask IDs violate Taskmaster schema
Every subtask in a subtasks array must have a unique numeric id (see tasks.mdc).
Lines 2574-2612 repeat id": 42 eight times, which will break dependency resolution, status propagation, and CLI commands that target subtasks by ID.
Re-generate or renumber these subtasks via the appropriate task-master command (e.g. task-master update-subtask --id=<parent> --auto-fix-ids) rather than editing the JSON directly.
🤖 Prompt for AI Agents
In .taskmaster/tasks/tasks.json between lines 2571 and 2612, there are multiple
subtasks with the duplicate id "42", which violates the Taskmaster schema
requiring unique numeric ids for each subtask. To fix this, do not manually edit
the JSON; instead, run the appropriate task-master CLI command such as
`task-master update-subtask --id=<parent> --auto-fix-ids` to automatically
regenerate or renumber the subtask ids uniquely and ensure proper dependency
resolution and status propagation.
| "id": 92, | ||
| "title": "Implement Project Root Environment Variable Support in MCP Configuration", | ||
| "description": "Add support for a 'TASK_MASTER_PROJECT_ROOT' environment variable in MCP configuration, allowing it to be set in both mcp.json and .env, with precedence over other methods. This will define the root directory for the MCP server and take precedence over all other project root resolution methods. The implementation should be backward compatible with existing workflows that don't use this variable.", | ||
| "status": "review", | ||
| "status": "done", | ||
| "dependencies": [ |
There was a problem hiding this comment.
Do not hand-edit .taskmaster/tasks/tasks.json
This file is generated and managed exclusively by Taskmaster tooling. Manual edits—even simple status flips like the one on Line 5406—risk corrupting internal state, bypassing migration hooks, and producing inconsistent tag metadata.
Revert these changes and apply them through the CLI (task-master set-status …, task-master edit-task …) or the corresponding MCP tools instead.
🤖 Prompt for AI Agents
In .taskmaster/tasks/tasks.json around lines 5403 to 5407, manual edits were
made directly to the generated JSON file, which is managed exclusively by
Taskmaster tooling. Revert these manual changes and instead use the Taskmaster
CLI commands such as `task-master set-status` or `task-master edit-task` or the
appropriate MCP tools to apply any modifications safely and maintain internal
consistency.
| "categories": [ | ||
| "AI", | ||
| "Visualization", | ||
| "Education", | ||
| "Other" | ||
| ], |
There was a problem hiding this comment.
Unrecognised category values will break Marketplace validation
VS Code only accepts a fixed list of category identifiers (e.g. Programming Languages, Linters, Themes, Visualization, Other, …).
"AI" is not on that list and will cause vsce package / vsce publish to fail.
"categories": [
- "AI",
"Visualization",
"Education",
"Other"
],📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| "categories": [ | |
| "AI", | |
| "Visualization", | |
| "Education", | |
| "Other" | |
| ], | |
| "categories": [ | |
| "Visualization", | |
| "Education", | |
| "Other" | |
| ], |
🤖 Prompt for AI Agents
In apps/extension/package.json between lines 12 and 17, the category "AI" is not
recognized by VS Code Marketplace and will cause validation errors. Replace "AI"
with a valid category from the official VS Code list, such as "Programming
Languages" or another appropriate existing category, to ensure the package
passes validation during publishing.
| "activationEvents": [ | ||
| "onStartupFinished", | ||
| "workspaceContains:.taskmaster/**" | ||
| ], |
There was a problem hiding this comment.
workspaceContains glob syntax is invalid
The activation event value must be a single path (optionally starting with **/).
workspaceContains:.taskmaster/** is rejected by VS Code – the glob segment after the colon is not allowed.
- "workspaceContains:.taskmaster/**"
+ "workspaceContains:.taskmaster"📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| "activationEvents": [ | |
| "onStartupFinished", | |
| "workspaceContains:.taskmaster/**" | |
| ], | |
| "activationEvents": [ | |
| "onStartupFinished", | |
| "workspaceContains:.taskmaster" | |
| ], |
🤖 Prompt for AI Agents
In apps/extension/package.json around lines 19 to 22, the activation event
"workspaceContains:.taskmaster/**" uses an invalid glob syntax after the colon.
Replace the value with a single valid path pattern without the glob segment, for
example "workspaceContains:.taskmaster" or "workspaceContains:**/.taskmaster" to
comply with VS Code's requirements.
* fix: fix mcp tool call in extension - fix console.log directly being used in scope-adjutment.js breaking mcp * chore: run format and fix tests * chore: format
There was a problem hiding this comment.
Actionable comments posted: 9
🔭 Outside diff range comments (1)
.taskmaster/state.json (1)
1-9: Ignore Taskmaster runtime state fileThe file
.taskmaster/state.jsonis auto-generated runtime metadata (tracking tags and migration status) and should not be committed. It’s currently tracked and not listed in.gitignore, leading to noisy diffs and merge conflicts.• Remove the file from version control index:
git rm --cached .taskmaster/state.json• Add it to
.gitignore:+# Ignore Taskmaster runtime state +.taskmaster/state.json
♻️ Duplicate comments (16)
package.json (2)
3-3: Version still in pre-release while PR claims “Release 0.23.0”
0.23.0-rc.2conflicts with the stable release wording in the PR title. Either:
- Exit pre-release mode (
changeset pre exit) and bump to0.23.0, or- Rename the PR to “Release 0.23.0-rc.2”.
This was flagged before and remains unresolved.
12-15: Nit: root"."entry in workspaces is redundant
The root package is implicitly part of the workspace; removing"."keeps the list minimal without affecting functionality."workspaces": [ "apps/*", - "." ].changeset/pre.json (1)
1-7:initialVersionsout of sync & pre-mode likely unintended
task-master-aiis at0.23.0-rc.2but the file pins0.22.0. Changeset will error.
If you want a final 0.23.0 release, delete this file or runchangeset pre exit.
Otherwise, update the version to matchpackage.json."initialVersions": { - "task-master-ai": "0.22.0", + "task-master-ai": "0.23.0-rc.2", "extension": "0.20.0" },CHANGELOG.md (1)
3-3: Release header still mismatches PR goal (should be0.23.0)Header shows
## 0.23.0-rc.2, yet the PR is “Release 0.23.0”.
Ship either the final tag (0.23.0) or rename the PR / milestone accordingly to avoid publishing the wrong version.apps/extension/src/components/TaskDetails/AIActionsSection.tsx (2)
79-80: Consider adding user-facing error notifications.The error handlers only log to console, which users won't see. Consider showing error messages in the UI using a toast notification or error state.
Also applies to: 113-113, 143-143, 172-172
313-313: Consider using theme-aware colors for scope buttons.The scope up/down buttons use hard-coded colors (green-600/blue-600) which might not align well with all VS Code themes.
Also applies to: 332-332
apps/extension/src/webview/hooks/useTaskQueries.ts (4)
31-31: Consider error handling for API responses.The response is cast to
TaskMasterTask[]without validation. Consider adding runtime validation to ensure the response matches the expected type.
53-65: Improve error handling in response parsing.The current implementation silently returns null if parsing fails. Consider throwing an error or returning a more descriptive result.
101-112: Handle object responses in optimistic updates.The optimistic update only modifies array responses but doesn't handle object responses. This could lead to inconsistent UI state if some queries return objects.
248-248: Make debug logging conditional on environment.The extensive console logging should only run in development to avoid cluttering production logs.
Also applies to: 261-261, 271-271, 281-281, 304-304, 317-317, 329-329, 339-339
scripts/modules/task-manager/scope-adjustment.js (1)
821-832: Missing displayAiUsageSummary call for CLI outputSimilar to scopeUpTask, this function also needs to call displayAiUsageSummary when handling CLI output with available telemetry data.
Add the missing call to displayAiUsageSummary:
// Write updated data writeJSON(tasksPath, data, projectRoot, tag); if (outputFormat === 'text') { log('info', `Successfully scoped down ${updatedTasks.length} task(s)`); + if (combinedTelemetryData) { + displayAiUsageSummary(combinedTelemetryData, 'cli'); + } } return { updatedTasks, telemetryData: combinedTelemetryData };apps/extension/package.json (5)
12-17: Invalid VS Code marketplace categoryThe "AI" category is not recognized by VS Code Marketplace and will cause validation errors during publishing.
Replace "AI" with a valid category:
"categories": [ - "AI", + "Programming Languages", "Visualization", "Education", "Other" ],
19-22: Invalid workspaceContains glob syntaxThe activation event uses invalid glob syntax that will be rejected by VS Code.
Fix the glob pattern:
"activationEvents": [ "onStartupFinished", - "workspaceContains:.taskmaster/**" + "workspaceContains:.taskmaster" ],
96-102: Ambiguous timeout settingsHaving two different timeout settings with similar purposes creates confusion for users.
Consider consolidating these settings or clearly differentiating their purposes in the descriptions to help users understand when to use each one.
Also applies to: 189-195
131-137: Excessive default timeout valueThe 5-minute default timeout is too long and may degrade user experience when issues occur.
Reduce the default timeout:
"taskmaster.mcp.requestTimeoutMs": { "type": "number", - "default": 300000, + "default": 60000, "minimum": 30000, "maximum": 600000, - "description": "MCP request timeout in milliseconds (default: 5 minutes)" + "description": "MCP request timeout in milliseconds (default: 1 minute)" },
255-257: Script not compatible with WindowsThe watch script uses shell backgrounding (&) which fails on Windows CMD.
Use the cross-platform npm-run-all package:
-"watch": "npm run watch:js & npm run watch:css", +"watch": "run-p watch:js watch:css",
| "task-master-ai": minor | ||
| --- | ||
|
|
||
| Add new `scope-up` and `scope-down` commands for dynamic task complexity adjustment |
There was a problem hiding this comment.
🧹 Nitpick (assertive)
Remove trailing space.
Line 5 has a trailing space that should be removed.
-Add new `scope-up` and `scope-down` commands for dynamic task complexity adjustment
+Add new `scope-up` and `scope-down` commands for dynamic task complexity adjustment📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| Add new `scope-up` and `scope-down` commands for dynamic task complexity adjustment | |
| Add new `scope-up` and `scope-down` commands for dynamic task complexity adjustment |
🧰 Tools
🪛 LanguageTool
[grammar] ~5-~5: There might be a mistake here.
Context: ...n` commands for dynamic task complexity adjustment This release introduces two powerful new...
(QB_NEW_EN_OTHER)
🪛 markdownlint-cli2 (0.17.2)
5-5: Trailing spaces
Expected: 0 or 2; Actual: 1
(MD009, no-trailing-spaces)
5-5: First line in a file should be a top-level heading
(MD041, first-line-heading, first-line-h1)
🤖 Prompt for AI Agents
In .changeset/floppy-news-buy-1.md at line 5, remove the trailing space at the
end of the line to ensure clean formatting and avoid unnecessary whitespace.
| This release introduces two powerful new commands that allow you to dynamically adjust the complexity of your tasks and subtasks without recreating them from scratch. | ||
|
|
||
| **New CLI Commands:** | ||
| - `task-master scope-up` - Increase task complexity (add more detail, requirements, or implementation steps) | ||
| - `task-master scope-down` - Decrease task complexity (simplify, remove unnecessary details, or streamline) | ||
|
|
||
| **Key Features:** | ||
| - **Multiple tasks**: Support comma-separated IDs to adjust multiple tasks at once (`--id=5,7,12`) | ||
| - **Strength levels**: Choose adjustment intensity with `--strength=light|regular|heavy` (defaults to regular) | ||
| - **Custom prompts**: Use `--prompt` flag to specify exactly how you want tasks adjusted | ||
| - **MCP integration**: Available as `scope_up_task` and `scope_down_task` tools in Cursor and other MCP environments | ||
| - **Smart context**: AI considers your project context and task dependencies when making adjustments | ||
|
|
||
| **Usage Examples:** | ||
| ```bash | ||
| # Make a task more detailed | ||
| task-master scope-up --id=5 | ||
|
|
||
| # Simplify multiple tasks with light touch | ||
| task-master scope-down --id=10,11,12 --strength=light | ||
|
|
||
| # Custom adjustment with specific instructions | ||
| task-master scope-up --id=7 --prompt="Add more error handling and edge cases" | ||
| ``` | ||
|
|
||
| **Why use this?** | ||
| - **Iterative refinement**: Adjust task complexity as your understanding evolves | ||
| - **Project phase adaptation**: Scale tasks up for implementation, down for planning | ||
| - **Team coordination**: Adjust complexity based on team member experience levels | ||
| - **Milestone alignment**: Fine-tune tasks to match project phase requirements | ||
|
|
||
| Perfect for agile workflows where task requirements change as you learn more about the problem space. No newline at end of file |
There was a problem hiding this comment.
🧹 Nitpick (assertive)
Fix markdown formatting issues.
The static analysis tools flagged several formatting issues that should be addressed for consistency:
- Add blank lines around headings
- Ensure lists are surrounded by blank lines
Example fixes:
simplifying or removing unnecessary details
+
**Key Features:**
+
- **Multiple tasks**: Support comma-separated IDs...And similar fixes for other sections. This will improve readability and comply with markdown best practices.
Committable suggestion skipped: line range outside the PR's diff.
🧰 Tools
🪛 LanguageTool
[grammar] ~7-~7: Use correct spacing
Context: ...d subtasks without recreating them from scratch. New CLI Commands: - `task-master scope...
(QB_NEW_EN_OTHER_ERROR_IDS_5)
[grammar] ~9-~9: Use correct spacing
Context: ...ecreating them from scratch. New CLI Commands: - task-master scope-up - Increase task complexity (add more deta...
(QB_NEW_EN_OTHER_ERROR_IDS_5)
[grammar] ~10-~10: There might be a mistake here.
Context: ...detail, requirements, or implementation steps) - task-master scope-down - Decrease task complexity (simplify, rem...
(QB_NEW_EN_OTHER)
[grammar] ~11-~11: There might be a mistake here.
Context: ...implify, remove unnecessary details, or streamline) Key Features: - Multiple tasks: Su...
(QB_NEW_EN_OTHER)
[grammar] ~14-~14: There might be a mistake here.
Context: ...ed IDs to adjust multiple tasks at once (--id=5,7,12) - Strength levels: Choose adjustment int...
(QB_NEW_EN_OTHER)
[grammar] ~15-~15: There might be a mistake here.
Context: ...ength=light|regular|heavy(defaults to regular) - **Custom prompts**: Use--prompt` flag to...
(QB_NEW_EN_OTHER)
[grammar] ~16-~16: Use articles correctly
Context: ...aults to regular) - Custom prompts: Use --prompt flag to specify exactly how ...
(QB_NEW_EN_OTHER_ERROR_IDS_11)
[grammar] ~16-~16: There might be a mistake here.
Context: ...g to specify exactly how you want tasks adjusted - MCP integration: Available as `scope_u...
(QB_NEW_EN_OTHER)
[grammar] ~17-~17: There might be a mistake here.
Context: ...own_task` tools in Cursor and other MCP environments - Smart context: AI considers your proje...
(QB_NEW_EN_OTHER)
[grammar] ~18-~18: There might be a mistake here.
Context: ...ntext and task dependencies when making adjustments Usage Examples: ```bash # Make a task ...
(QB_NEW_EN_OTHER)
[grammar] ~20-~20: Use correct spacing
Context: ...encies when making adjustments Usage Examples: bash # Make a task more detailed task-master scope-up --id=5 # Simplify multiple tasks with light touch task-master scope-down --id=10,11,12 --strength=light # Custom adjustment with specific instructions task-master scope-up --id=7 --prompt="Add more error handling and edge cases" Why use this? - **Iterative refinement...
(QB_NEW_EN_OTHER_ERROR_IDS_5)
[grammar] ~33-~33: There might be a mistake here.
Context: ...t task complexity as your understanding evolves - Project phase adaptation: Scale tasks ...
(QB_NEW_EN_OTHER)
[grammar] ~34-~34: There might be a mistake here.
Context: ... phase adaptation**: Scale tasks up for implementation, down for planning - **Team coordination...
(QB_NEW_EN_OTHER)
[grammar] ~34-~34: There might be a mistake here.
Context: ...e tasks up for implementation, down for planning - Team coordination: Adjust complexity b...
(QB_NEW_EN_OTHER)
[grammar] ~35-~35: There might be a mistake here.
Context: ...plexity based on team member experience levels - Milestone alignment: Fine-tune tasks t...
(QB_NEW_EN_OTHER)
[grammar] ~36-~36: There might be a mistake here.
Context: ... Fine-tune tasks to match project phase requirements Perfect for agile workflows where task r...
(QB_NEW_EN_OTHER)
🪛 markdownlint-cli2 (0.17.2)
11-11: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below
(MD022, blanks-around-headings)
12-12: Lists should be surrounded by blank lines
(MD032, blanks-around-lists)
16-16: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below
(MD022, blanks-around-headings)
17-17: Lists should be surrounded by blank lines
(MD032, blanks-around-lists)
20-20: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below
(MD022, blanks-around-headings)
21-21: Lists should be surrounded by blank lines
(MD032, blanks-around-lists)
24-24: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below
(MD022, blanks-around-headings)
25-25: Lists should be surrounded by blank lines
(MD032, blanks-around-lists)
29-29: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below
(MD022, blanks-around-headings)
30-30: Lists should be surrounded by blank lines
(MD032, blanks-around-lists)
33-33: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below
(MD022, blanks-around-headings)
34-34: Lists should be surrounded by blank lines
(MD032, blanks-around-lists)
🤖 Prompt for AI Agents
In .changeset/floppy-news-buy-1.md between lines 7 and 38, fix markdown
formatting by adding blank lines before and after all headings and lists to
improve readability and comply with markdown best practices. Ensure each heading
is preceded and followed by a blank line, and that lists have blank lines above
and below them throughout the entire section.
| --- | ||
| "extension": minor | ||
| --- | ||
|
|
||
| 🎉 **Introducing TaskMaster Extension!** | ||
|
|
There was a problem hiding this comment.
🧹 Nitpick (assertive)
Markdown linting: add a top-level heading to silence CI warnings
Missing an # Heading as first line violates MD041 and may fail markdown-lint in CI.
+# TaskMaster Extension – initial release
---
"extension": minor
---📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| --- | |
| "extension": minor | |
| --- | |
| 🎉 **Introducing TaskMaster Extension!** | |
| # TaskMaster Extension – initial release | |
| --- | |
| "extension": minor | |
| --- | |
| 🎉 **Introducing TaskMaster Extension!** |
🧰 Tools
🪛 LanguageTool
[grammar] ~5-~5: Use correct spacing
Context: ... minor --- 🎉 Introducing TaskMaster Extension! We're thrilled to launch the first versi...
(QB_NEW_EN_OTHER_ERROR_IDS_5)
🪛 markdownlint-cli2 (0.17.2)
5-5: Trailing spaces
Expected: 0 or 2; Actual: 1
(MD009, no-trailing-spaces)
5-5: First line in a file should be a top-level heading
(MD041, first-line-heading, first-line-h1)
🤖 Prompt for AI Agents
In .changeset/sour-pans-beam-1.md at lines 1 to 6, the markdown file is missing
a top-level heading which causes markdown-lint CI warnings for rule MD041. Add a
first line with a top-level heading starting with a single '#' followed by a
descriptive title to fix the linting issue.
| "meta": { | ||
| "generatedAt": "2025-05-27T16:34:53.088Z", | ||
| "generatedAt": "2025-08-02T14:28:59.851Z", | ||
| "tasksAnalyzed": 1, | ||
| "totalTasks": 84, | ||
| "analysisCount": 45, | ||
| "totalTasks": 93, | ||
| "analysisCount": 1, | ||
| "thresholdScore": 5, | ||
| "projectName": "Taskmaster", | ||
| "usedResearch": true | ||
| "usedResearch": false | ||
| }, |
There was a problem hiding this comment.
💡 Verification agent
❓ Verification inconclusive
Generated report appears to be edited manually – please regenerate via CLI
.taskmaster/reports/task-complexity-report.json is a generated artefact (see coding-guidelines). Committing hand-edited content risks desynchronising future commands such as task-master analyze-complexity and expand-task.
Run:
task-master analyze-complexity --writeand commit the freshly generated file instead (or omit it from the PR).
Regenerate task complexity report rather than editing manually
.taskmaster/reports/task-complexity-report.json is an auto-generated artifact and must not be hand-edited. To update it correctly, run:
task-master analyze-complexity --writethen commit the freshly generated file (or remove it from the PR).
🤖 Prompt for AI Agents
In .taskmaster/reports/task-complexity-report.json around lines 2 to 10, this
file is auto-generated and should not be manually edited. To fix the issue,
discard any manual changes and regenerate the report by running the command
"task-master analyze-complexity --write" in the terminal, then commit the
updated generated file or remove it from the PR.
| # Change Log | ||
|
|
||
| ## 0.23.0-rc.1 | ||
|
|
There was a problem hiding this comment.
🧹 Nitpick (assertive)
Duplicate “Introducing TaskMaster Extension!” entries – consider squashing
Both 0.23.0-rc.1 and 0.23.0-rc.0 repeat identical prose. Unless there are material differences, this bloats the changelog; consider a single entry or a terse delta for rc.1.
🧰 Tools
🪛 LanguageTool
[grammar] ~1-~1: Use correct spacing
Context: # Change Log ## 0.23.0-rc.1 ### Minor Changes - [#1064...
(QB_NEW_EN_OTHER_ERROR_IDS_5)
🤖 Prompt for AI Agents
In apps/extension/CHANGELOG.md at lines 1 to 4, the changelog entries for
versions 0.23.0-rc.1 and 0.23.0-rc.0 contain duplicate "Introducing TaskMaster
Extension!" text. To fix this, consolidate these entries by either removing the
duplicate or merging them into a single entry that highlights only the
differences for rc.1, reducing redundancy and keeping the changelog concise.
| - [#1064](https://github.com/eyaltoledano/claude-task-master/pull/1064) [`53903f1`](https://github.com/eyaltoledano/claude-task-master/commit/53903f1e8eee23ac512eb13a6d81d8cbcfe658cb) Thanks [@Crunchyman-ralph](https://github.com/Crunchyman-ralph)! - Add new `scope-up` and `scope-down` commands for dynamic task complexity adjustment | ||
|
|
||
| This release introduces two powerful new commands that allow you to dynamically adjust the complexity of your tasks and subtasks without recreating them from scratch. | ||
|
|
||
| **New CLI Commands:** | ||
| - `task-master scope-up` - Increase task complexity (add more detail, requirements, or implementation steps) | ||
| - `task-master scope-down` - Decrease task complexity (simplify, remove unnecessary details, or streamline) | ||
|
|
||
| **Key Features:** | ||
| - **Multiple tasks**: Support comma-separated IDs to adjust multiple tasks at once (`--id=5,7,12`) | ||
| - **Strength levels**: Choose adjustment intensity with `--strength=light|regular|heavy` (defaults to regular) | ||
| - **Custom prompts**: Use `--prompt` flag to specify exactly how you want tasks adjusted | ||
| - **MCP integration**: Available as `scope_up_task` and `scope_down_task` tools in Cursor and other MCP environments | ||
| - **Smart context**: AI considers your project context and task dependencies when making adjustments | ||
|
|
||
| **Usage Examples:** | ||
|
|
||
| ```bash | ||
| # Make a task more detailed | ||
| task-master scope-up --id=5 | ||
|
|
||
| # Simplify multiple tasks with light touch | ||
| task-master scope-down --id=10,11,12 --strength=light | ||
|
|
||
| # Custom adjustment with specific instructions | ||
| task-master scope-up --id=7 --prompt="Add more error handling and edge cases" | ||
| ``` | ||
|
|
||
| **Why use this?** | ||
| - **Iterative refinement**: Adjust task complexity as your understanding evolves | ||
| - **Project phase adaptation**: Scale tasks up for implementation, down for planning | ||
| - **Team coordination**: Adjust complexity based on team member experience levels | ||
| - **Milestone alignment**: Fine-tune tasks to match project phase requirements | ||
|
|
||
| Perfect for agile workflows where task requirements change as you learn more about the problem space. |
There was a problem hiding this comment.
Duplicate changelog block & version-history bloat
The entire 0.23.0-rc.2 section (Lines 7-41) is a verbatim copy of the text that already exists under 0.22.1-rc.1 (Lines 47-81). Maintaining two identical entries under different versions will:
- Confuse users & automated release notes.
- Break semver inference for changelog parsers.
- Inflate the file unnecessarily.
Action:
-## 0.23.0-rc.2
-### Minor Changes
-… (lines 7-41) …
-
-## 0.22.1-rc.1 ← keep this (or promote to 0.23.0)
+## 0.23.0
+### Minor Changes
+… (single, deduplicated block) …Make sure only one authoritative section remains and bump the header to the final version you intend to publish.
Also applies to: 43-81
🤖 Prompt for AI Agents
In CHANGELOG.md between lines 7 and 41, there is a duplicate changelog entry
identical to the one in lines 47 to 81. Remove one of these duplicate sections
entirely to avoid confusion and file bloat. Keep only the authoritative
changelog entry with the correct version header you intend to publish, and
ensure the header reflects the final version number accurately.
| log( | ||
| 'debug', | ||
| `Complexity-aware subtask calculation${complexityInfo}: ${currentPendingCount} pending -> target ${targetSubtaskCount} total` | ||
| ); | ||
| log( | ||
| 'debug', | ||
| `Complexity-aware calculation${complexityInfo}: ${currentPendingCount} pending -> ${targetSubtaskCount} total subtasks (${strength} ${direction})` | ||
| ); |
There was a problem hiding this comment.
🧹 Nitpick (assertive)
Remove duplicate log statement
There are two consecutive log statements with nearly identical content. Remove one of them to avoid redundant logging.
-log(
- 'debug',
- `Complexity-aware subtask calculation${complexityInfo}: ${currentPendingCount} pending -> target ${targetSubtaskCount} total`
-);
log(
'debug',
`Complexity-aware calculation${complexityInfo}: ${currentPendingCount} pending -> ${targetSubtaskCount} total subtasks (${strength} ${direction})`
);📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| log( | |
| 'debug', | |
| `Complexity-aware subtask calculation${complexityInfo}: ${currentPendingCount} pending -> target ${targetSubtaskCount} total` | |
| ); | |
| log( | |
| 'debug', | |
| `Complexity-aware calculation${complexityInfo}: ${currentPendingCount} pending -> ${targetSubtaskCount} total subtasks (${strength} ${direction})` | |
| ); | |
| log( | |
| 'debug', | |
| `Complexity-aware calculation${complexityInfo}: ${currentPendingCount} pending -> ${targetSubtaskCount} total subtasks (${strength} ${direction})` | |
| ); |
🤖 Prompt for AI Agents
In scripts/modules/task-manager/scope-adjustment.js around lines 278 to 285,
there are two consecutive log statements with nearly identical messages. Remove
one of these duplicate log statements to prevent redundant logging and keep the
output concise.
|
|
||
| // Write updated data | ||
| writeJSON(tasksPath, data, projectRoot, tag); | ||
|
|
||
| if (outputFormat === 'text') { | ||
| log('info', `Successfully scoped up ${updatedTasks.length} task(s)`); | ||
| } | ||
|
|
||
| return { | ||
| updatedTasks, | ||
| telemetryData: combinedTelemetryData | ||
| }; | ||
| } |
There was a problem hiding this comment.
Missing displayAiUsageSummary call for CLI output
According to the coding guidelines, when handling CLI output (outputFormat === 'text' or 'cli') and aiServiceResponse.telemetryData is available, the function must call displayAiUsageSummary(aiServiceResponse.telemetryData, 'cli') from scripts/modules/ui.js.
Add the missing call to displayAiUsageSummary:
+import { displayAiUsageSummary } from '../ui.js';
// ... existing code ...
// Write updated data
writeJSON(tasksPath, data, projectRoot, tag);
if (outputFormat === 'text') {
log('info', `Successfully scoped up ${updatedTasks.length} task(s)`);
+ if (combinedTelemetryData) {
+ displayAiUsageSummary(combinedTelemetryData, 'cli');
+ }
}
return {
updatedTasks,
telemetryData: combinedTelemetryData
};📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| // Write updated data | |
| writeJSON(tasksPath, data, projectRoot, tag); | |
| if (outputFormat === 'text') { | |
| log('info', `Successfully scoped up ${updatedTasks.length} task(s)`); | |
| } | |
| return { | |
| updatedTasks, | |
| telemetryData: combinedTelemetryData | |
| }; | |
| } | |
| // At the top of scripts/modules/task-manager/scope-adjustment.js | |
| import { displayAiUsageSummary } from '../ui.js'; | |
| // ... existing imports ... | |
| // … inside the scopeUpTask function, around lines 669–681: | |
| // Write updated data | |
| writeJSON(tasksPath, data, projectRoot, tag); | |
| if (outputFormat === 'text') { | |
| log('info', `Successfully scoped up ${updatedTasks.length} task(s)`); | |
| if (combinedTelemetryData) { | |
| displayAiUsageSummary(combinedTelemetryData, 'cli'); | |
| } | |
| } | |
| return { | |
| updatedTasks, | |
| telemetryData: combinedTelemetryData | |
| }; | |
| } |
🤖 Prompt for AI Agents
In scripts/modules/task-manager/scope-adjustment.js around lines 669 to 681, the
function lacks a call to displayAiUsageSummary when outputFormat is 'text' or
'cli' and aiServiceResponse.telemetryData exists. To fix this, import
displayAiUsageSummary from scripts/modules/ui.js if not already imported, then
add a conditional check for outputFormat being 'text' or 'cli' and
aiServiceResponse.telemetryData presence, and call
displayAiUsageSummary(aiServiceResponse.telemetryData, 'cli') before returning
the result.
| describe('scopeDownTask', () => { | ||
| it('should decrease task complexity with regular strength', async () => { | ||
| const mockTasksData = { | ||
| tasks: [ | ||
| { | ||
| id: 1, | ||
| title: 'Complex Task with Many Features', | ||
| description: 'Comprehensive description with multiple requirements', | ||
| details: | ||
| 'Detailed implementation with advanced features, error handling, validation', | ||
| status: 'pending' | ||
| } | ||
| ] | ||
| }; | ||
|
|
||
| const mockTask = { | ||
| id: 1, | ||
| title: 'Complex Task with Many Features', | ||
| description: 'Comprehensive description with multiple requirements', | ||
| details: | ||
| 'Detailed implementation with advanced features, error handling, validation', | ||
| status: 'pending' | ||
| }; | ||
|
|
||
| readJSON.mockReturnValue(mockTasksData); | ||
| taskExists.mockReturnValue(true); | ||
| findTaskById.mockReturnValue({ task: mockTask }); | ||
| generateObjectService.mockResolvedValue({ | ||
| mainResult: { | ||
| title: 'Simple Task', | ||
| description: 'Basic description', | ||
| details: 'Basic implementation focusing on core functionality', | ||
| testStrategy: 'Simple unit tests for core functionality' | ||
| }, | ||
| telemetryData: { tokens: 80, cost: 0.008 } | ||
| }); | ||
|
|
||
| const context = { | ||
| projectRoot: '/test/project', | ||
| tag: 'master', | ||
| commandName: 'scope-down', | ||
| outputType: 'cli' | ||
| }; | ||
|
|
||
| const result = await scopeDownTask( | ||
| '/test/tasks.json', | ||
| [1], | ||
| 'regular', | ||
| null, | ||
| context, | ||
| 'text' | ||
| ); | ||
|
|
||
| expect(result).toBeDefined(); | ||
| expect(result.updatedTasks).toHaveLength(1); | ||
| expect(writeJSON).toHaveBeenCalled(); | ||
| }); | ||
| }); |
There was a problem hiding this comment.
🧹 Nitpick (assertive)
Consider adding more test coverage for scopeDownTask.
The current test only covers the basic case with regular strength. Consider adding tests for:
- Different strength levels (light, heavy)
- Custom prompts
- Error scenarios
Example additional test case:
it('should handle errors when decreasing task complexity', async () => {
readJSON.mockReturnValue({ tasks: [] });
taskExists.mockReturnValue(false);
const context = {
projectRoot: '/test/project',
tag: 'master',
commandName: 'scope-down',
outputType: 'cli'
};
await expect(
scopeDownTask('/test/tasks.json', [999], 'regular', null, context, 'text')
).rejects.toThrow();
});🤖 Prompt for AI Agents
In tests/unit/scripts/modules/task-manager/scope-adjustment.test.js between
lines 202 and 259, the scopeDownTask test only covers the regular strength case.
Add more tests to cover different strength levels like light and heavy, include
cases with custom prompts, and add error scenario tests such as when tasks do
not exist or invalid inputs are provided. Use mocks to simulate these conditions
and verify that scopeDownTask handles them correctly, including throwing errors
when appropriate.
What type of PR is this?
Description
Related Issues
How to Test This
# Example commands or stepsExpected result:
Contributor Checklist
npm run changesetnpm testnpm run format-check(ornpm run formatto fix)Changelog Entry
For Maintainers
Summary by CodeRabbit
New Features
scope-upandscope-down, to dynamically adjust task complexity with AI assistance, supporting batch operations, strength levels, and custom prompts.Bug Fixes
Documentation
Tests
Chores
Style
Refactor