Skip to content

Release 0.23.0#1064

Merged
Crunchyman-ralph merged 12 commits intomainfrom
next
Aug 2, 2025
Merged

Release 0.23.0#1064
Crunchyman-ralph merged 12 commits intomainfrom
next

Conversation

@Crunchyman-ralph
Copy link
Collaborator

@Crunchyman-ralph Crunchyman-ralph commented Jul 31, 2025

What type of PR is this?

  • 🐛 Bug fix
  • ✨ Feature
  • 🔌 Integration
  • 📝 Docs
  • 🧹 Refactor
  • Other:

Description

Related Issues

How to Test This

# Example commands or steps

Expected result:

Contributor Checklist

  • Created changeset: npm run changeset
  • Tests pass: npm test
  • Format check passes: npm run format-check (or npm run format to fix)
  • Addressed CodeRabbit comments (if any)
  • Linked related issues (if any)
  • Manually tested the changes

Changelog Entry


For Maintainers

  • PR title follows conventional commits
  • Target branch correct
  • Labels added
  • Milestone assigned (if applicable)

Summary by CodeRabbit

New Features

  • Introduced two CLI commands, scope-up and scope-down, to dynamically adjust task complexity with AI assistance, supporting batch operations, strength levels, and custom prompts.
  • Released the TaskMaster VS Code extension, featuring a Kanban board with drag-and-drop, real-time updates, multi-context support, AI-powered task updates, visual config editor, and quick actions.
  • Added comprehensive configuration management, error handling, notification preferences, and logging utilities to the extension.
  • Implemented detailed polling strategies, caching, and robust task management in the extension.

Bug Fixes

  • Resolved issues with task ID handling and complexity report file detection, ensuring correct file usage in tag-specific contexts.

Documentation

  • Added extensive user and developer documentation for the extension, testing workflows, and research notes.
  • Provided changelogs for both CLI and extension releases.

Tests

  • Introduced new unit and integration tests for task complexity adjustment features and webview components.

Chores

  • Updated configuration files, ignore rules, and workflow automation for CI/CD, release, and packaging processes.
  • Added scripts for automated releases and extension publishing.

Style

  • Integrated Tailwind CSS and consistent theming for UI components and webview styling.

Refactor

  • Enhanced internal logic for suggested actions, task grouping, and modularized core extension services.

ben-vargas and others added 2 commits July 26, 2025 15:26
…-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-bot
Copy link

changeset-bot bot commented Jul 31, 2025

🦋 Changeset detected

Latest 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

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Jul 31, 2025

Walkthrough

This update introduces new CLI commands (scope-up and scope-down) for dynamic task complexity adjustment, implements their core logic, integrates them into the MCP server as tools, and adds comprehensive VS Code extension support for Kanban-based task management. The changes span CLI, server, extension, and test code, with significant additions to documentation and configuration.

Changes

Cohort / File(s) Change Summary
CLI: New Scope Adjustment Commands & Options
scripts/modules/commands.js, scripts/modules/task-manager.js, scripts/modules/task-manager/scope-adjustment.js, .changeset/floppy-news-buy-1.md, .changeset/eleven-horses-shop.md, .changeset/fix-tag-complexity-detection.md
Adds scope-up and scope-down CLI commands with options for task IDs, strength, and custom prompts; integrates core logic for complexity adjustment; exports new functions; updates changesets.
MCP Server: Tool Registration & Direct Functions
mcp-server/src/core/direct-functions/scope-up.js, mcp-server/src/core/direct-functions/scope-down.js, mcp-server/src/core/task-master-core.js, mcp-server/src/tools/scope-up.js, mcp-server/src/tools/scope-down.js, mcp-server/src/tools/index.js
Implements direct functions and registers new MCP tools for scope adjustment; updates the core function registry and tool registration logic.
CLI: Complexity Report Handling & Path Resolution
src/utils/path-utils.js, scripts/modules/utils.js
Improves complexity report file detection for tag-specific contexts; normalizes task IDs for consistency.
VS Code Extension: Initial Release & Kanban Features
apps/extension/* (multiple new files: components, services, utils, webview, etc.), .changeset/sour-pans-beam-1.md, apps/extension/CHANGELOG.md, apps/extension/LICENSE, apps/extension/README.md, apps/extension/package.json, apps/extension/package.publish.json, apps/extension/package.mjs, apps/extension/tsconfig.json, apps/extension/esbuild.js, apps/extension/components.json, apps/extension/.vscodeignore, apps/extension/docs/extension-CI-setup.md, apps/extension/docs/extension-development-guide.md
Introduces the TaskMaster VS Code extension with a Kanban board, drag-and-drop, AI-powered task management, configuration management, and supporting documentation, build scripts, and configuration files.
VS Code Extension: Webview, State, and UI
apps/extension/src/webview/*, apps/extension/src/components/*, apps/extension/src/services/*, apps/extension/src/utils/*
Implements webview React app, state management, Kanban UI, task details, toast notifications, polling, error handling, connection management, and logging utilities.
VS Code Extension: Type Definitions & Testing
apps/extension/src/webview/types/index.ts, apps/extension/src/test/extension.test.ts
Adds comprehensive type definitions for tasks, state, and actions; introduces a basic extension test suite.
GitHub Actions & Release Automation
.github/scripts/release.sh, .github/scripts/tag-extension.mjs, .github/workflows/extension-ci.yml, .github/workflows/extension-release.yml, .github/workflows/release.yml
Adds CI/CD workflows for the extension, release automation scripts, and extension publishing to marketplaces.
Task Data & Reports
.taskmaster/tasks/tasks.json, .taskmaster/reports/task-complexity-report.json, .taskmaster/state.json
Updates task data: marks tasks as done, simplifies Git integration, updates complexity reports, and refreshes state timestamps.
Testing & Linting
tests/unit/scripts/modules/task-manager/scope-adjustment.test.js, tests/unit/task-finder.test.js, biome.json, .cursor/rules/test_workflow.mdc
Adds/updates tests for scope adjustment logic and task finding; updates linter config; adds a comprehensive test workflow guide.
Documentation & Research
.taskmaster/docs/research/2025-08-01_do-we-need-to-add-new-commands-or-can-we-just-weap.md
Adds research notes on git command automation and worktree management.
Changelog, Package, and Misc
CHANGELOG.md, package.json, .changeset/pre.json, .gitignore
Updates changelog, bumps package versions, adds pre-release config, and updates ignore rules.

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
Loading
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
Loading

Estimated code review effort

🎯 5 (Critical) | ⏱️ ~90+ minutes

  • Complexity: High. This PR introduces new CLI commands, core logic, MCP server integration, a full-featured VS Code extension (with Kanban UI, state, webview, error handling, connection management), extensive documentation, configuration, and test coverage. The changes span many files and components, requiring careful review for correctness, integration, and maintainability.

Possibly related issues

Possibly related PRs

Suggested reviewers

  • Crunchyman-ralph
  • eyaltoledano
✨ Finishing Touches
  • 📝 Generate Docstrings
🧪 Generate unit tests
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch next

🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Explain this complex logic.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai explain this code block.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and explain its main purpose.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Support

Need 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)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR.
  • @coderabbitai generate sequence diagram to generate a sequence diagram of the changes in this PR.
  • @coderabbitai generate unit tests to generate unit tests for this PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

📥 Commits

Reviewing files that changed from the base of the PR and between 2ae6e7e and 60c03c5.

📒 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.json
  • package.json
  • CHANGELOG.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.json
  • CHANGELOG.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.json
  • package.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.json
  • package.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.json
  • package.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.json
  • CHANGELOG.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.json
  • package.json
  • CHANGELOG.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.json
  • CHANGELOG.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.json
  • CHANGELOG.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
📚 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" / tag rc) and implies the next version is 0.22.1-rc.0.
• If you intend to publish a full 0.23.0 release, run changeset pre exit, delete this file, and bump versions accordingly.
• Otherwise, rename the PR to indicate an RC/pre-release.
Please verify before merging.

Comment on lines +3 to +12
## 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.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

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.0

If 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.

Suggested change
## 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.

Comment on lines +12 to +15
"workspaces": [
"apps/*",
"."
],
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 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.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

📜 Review details

Configuration used: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 2ae6e7e and 60c03c5.

📒 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.json
  • CHANGELOG.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.json
  • CHANGELOG.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.json
  • CHANGELOG.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
📚 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.json
  • CHANGELOG.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.json
  • CHANGELOG.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.json
  • CHANGELOG.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.json
  • CHANGELOG.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.json
  • CHANGELOG.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.json
  • CHANGELOG.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 good

Switching to multi-line JSON for the workspaces array improves diff readability; no functional change is introduced.

Comment on lines 1 to 12
{
"mode": "pre",
"tag": "rc",
"initialVersions": {
"task-master-ai": "0.22.0",
"extension": "0.20.0"
},
"changesets": [
"eleven-horses-shop",
"fix-tag-complexity-detection"
]
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 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")
fi

Length 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.

Suggested change
{
"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
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

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.

Comment on lines +7 to +11
- [#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.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 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.

Suggested change
- [#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",
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

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.

Suggested change
"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>
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 87

🔭 Outside diff range comments (5)
apps/extension/CHANGELOG.md (1)

1-2: Empty changelog entry – populate or drop until first release

Committing a virtually blank CHANGELOG.md clutters the repo and offers no value to users. Either:

  1. Add an initial “0.1.0 – first public release” entry following Keep-a-Changelog style, or
  2. 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:

  1. The magic number 100 for the setTimeout delay could be configurable
  2. Consider adding error boundaries for window object access
  3. 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 lines

Static 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 in workspaces (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 needed

This is the same issue identified in the previous review - the task-master-ai version in initialVersions doesn'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.

Comment on lines +40 to +77
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}`);
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ 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.

Suggested change
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.

Comment on lines +1 to +16
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
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ 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.

Suggested change
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.

Comment on lines +108 to +117
- 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

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ 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.

Comment on lines +127 to +137
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
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 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.

Comment on lines +41 to +60
- 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
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 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.

Suggested change
- 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); */
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ 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.

Suggested change
/* 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.

Comment on lines +153 to +167
@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;
}

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Remove duplicate CSS rules and deprecated property

Multiple issues in the Kanban container styles:

  1. .kanban-container is defined three times (lines 154-156, 159-161, 164-166)
  2. -webkit-overflow-scrolling: touch is 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.

Suggested change
@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.

Comment on lines +200 to +213
@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;
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 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.

Comment on lines +7 to +20
let toastIdCounter = 0;

export const createToast = (
type: ToastNotification['type'],
title: string,
message: string,
duration?: number
): ToastNotification => ({
id: `toast-${++toastIdCounter}`,
type,
title,
message,
duration
});
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 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.

Suggested change
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.

Comment on lines +22 to +56
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)
});
};
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 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.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review continued from previous batch...

# From project root
npx changeset add
```
3. **Select the extension package**: Choose `taskr-kanban` when prompted
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 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 -u

Length 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.md

Length 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.

Suggested change
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
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ 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.

Suggested change
"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"`
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

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
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

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.

Suggested change
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.

Comment on lines +144 to +149
"taskmaster.mcp.requestTimeoutMs": {
"type": "number",
"default": 300000,
"minimum": 30000,
"maximum": 600000,
"description": "MCP request timeout in milliseconds (default: 5 minutes)"
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Duplicate timeout configuration settings.

There are two different requestTimeoutMs settings that could confuse users:

  • taskmaster.mcp.requestTimeoutMs (line 144) - Default: 5 minutes
  • taskmaster.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 || []
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

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.

Suggested change
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.

Comment on lines +22 to +30
console.log('🔍 Fetching tasks with options:', options);
const response = await sendMessage({
type: 'getTasks',
data: {
tag: options?.tag,
withSubtasks: true
}
});
console.log('📋 Tasks fetched:', response);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ 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.

Suggested change
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.

Comment on lines +53 to +64
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;
}

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ 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.

Comment on lines +101 to +112
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;
});
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

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.

Suggested change
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.

Comment on lines +147 to +177
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
);
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 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.

Suggested change
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.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review continued from previous batch...

Comment on lines +121 to +127
"taskmaster.mcp.requestTimeoutMs": {
"type": "number",
"default": 300000,
"minimum": 30000,
"maximum": 600000,
"description": "MCP request timeout in milliseconds (default: 5 minutes)"
},
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 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.

Suggested change
"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.

Comment on lines +70 to +103
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;
}
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

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.

Suggested change
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.

Comment on lines +16 to +37
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'
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick (assertive)

Consolidate duplicate error categories

The ErrorCategory enum contains duplicate concepts that should be consolidated for clarity:

  • VALIDATION and DATA_VALIDATION serve similar purposes
  • INTERNAL and UNKNOWN could 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.

Suggested change
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.

Comment on lines +644 to +692
* 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);
});
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ 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.

Suggested change
* 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.

Comment on lines +60 to +78
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
};
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 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.

Comment on lines +426 to +432
*/
private startBackgroundRefresh(): void {
const interval = this.config.cache?.refreshInterval || 5 * 60 * 1000;
setInterval(() => {
this.performBackgroundRefresh();
}, interval);
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

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.

Suggested change
*/
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.

Comment on lines +152 to +157
export interface SubtaskData {
title: string;
description?: string;
dependencies?: string[];
status?: string;
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 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.

Suggested change
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.

eyaltoledano and others added 2 commits August 2, 2025 18:43
…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.
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 14

♻️ Duplicate comments (9)
.changeset/pre.json (1)

1-15: Version mismatch will cause Changesets to fail.

The initialVersions must 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 exit before 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 version to 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 target

Header shows ## 0.22.1-rc.1, yet the PR is titled “Release 0.23.0”. Previous feedback about the mismatch (for 0.22.1-rc.0) remains unresolved.
Please update the heading (and any accompanying tooling/version files) to 0.23.0 or retitle the PR accordingly.

-## 0.22.1-rc.1
+## 0.23.0
apps/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.

Comment on lines +2 to +3
description:
globs:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

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.

Suggested change
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.

Comment on lines 2571 to 2612
"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"
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

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.

Comment on lines 5403 to 5407
"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": [
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

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.

Comment on lines +12 to +17
"categories": [
"AI",
"Visualization",
"Education",
"Other"
],
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

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.

Suggested change
"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.

Comment on lines +19 to +22
"activationEvents": [
"onStartupFinished",
"workspaceContains:.taskmaster/**"
],
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

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.

Suggested change
"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.

Crunchyman-ralph and others added 6 commits August 2, 2025 21:59
* 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
@eyaltoledano eyaltoledano self-requested a review August 2, 2025 20:14
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 9

🔭 Outside diff range comments (1)
.taskmaster/state.json (1)

1-9: Ignore Taskmaster runtime state file

The file .taskmaster/state.json is 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.2 conflicts with the stable release wording in the PR title. Either:

  1. Exit pre-release mode (changeset pre exit) and bump to 0.23.0, or
  2. 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: initialVersions out of sync & pre-mode likely unintended
task-master-ai is at 0.23.0-rc.2 but the file pins 0.22.0. Changeset will error.
If you want a final 0.23.0 release, delete this file or run changeset pre exit.
Otherwise, update the version to match package.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 be 0.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 output

Similar 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 category

The "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 syntax

The 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 settings

Having 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 value

The 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 Windows

The 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
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 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.

Suggested change
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.

Comment on lines +7 to +38
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
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 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.

Comment on lines +1 to +6
---
"extension": minor
---

🎉 **Introducing TaskMaster Extension!**

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 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.

Suggested change
---
"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.

Comment on lines 2 to 10
"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
},
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 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 --write

and 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 --write

then 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.

Comment on lines +1 to +4
# Change Log

## 0.23.0-rc.1

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 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.

Comment on lines +7 to +41
- [#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.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

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:

  1. Confuse users & automated release notes.
  2. Break semver inference for changelog parsers.
  3. 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.

Comment on lines +278 to +285
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})`
);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 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.

Suggested change
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.

Comment on lines +669 to +681

// Write updated data
writeJSON(tasksPath, data, projectRoot, tag);

if (outputFormat === 'text') {
log('info', `Successfully scoped up ${updatedTasks.length} task(s)`);
}

return {
updatedTasks,
telemetryData: combinedTelemetryData
};
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

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.

Suggested change
// 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.

Comment on lines +202 to +259
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();
});
});
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 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.

@Crunchyman-ralph Crunchyman-ralph merged commit a4a172b into main Aug 2, 2025
1 check passed
@github-actions github-actions bot mentioned this pull request Aug 2, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants