feat(extension): complete VS Code extension with kanban board interface#997
Conversation
* fix: prevent CLAUDE.md overwrite by using imports - Copy Task Master instructions to .taskmaster/CLAUDE.md - Add import section to user's CLAUDE.md instead of overwriting - Preserve existing user content - Clean removal of Task Master content on uninstall Closes eyaltoledano#929 * chore: add changeset for Claude import fix
…edano#968) * feat: add task master (tm) custom slash commands Add comprehensive task management system integration via custom slash commands. Includes commands for: - Project initialization and setup - Task parsing from PRD documents - Task creation, update, and removal - Subtask management - Dependency tracking and validation - Complexity analysis and task expansion - Project status and reporting - Workflow automation This provides a complete task management workflow directly within Claude Code. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com> * chore: add changeset --------- Co-authored-by: neno-is-ooo <204701868+neno-is-ooo@users.noreply.github.com> Co-authored-by: Claude <noreply@anthropic.com>
* chore: create extension scaffolding * chore: fix workspace for changeset * chore: fix package-lock
…ano#980) * add .mcp.json with claude profile * add changeset * update changeset * update test
…toledano#979) Co-authored-by: Ben Vargas <ben@example.com>
…oledano#978) * feat: complete Groq provider integration and add Kimi K2 model - Add missing getRequiredApiKeyName() method to GroqProvider class - Register GroqProvider in ai-services-unified.js PROVIDERS object - Add Groq API key handling to config-manager.js (isApiKeySet and getMcpApiKeyStatus) - Add GROQ_API_KEY to env.example with format hint - Add moonshotai/kimi-k2-instruct model to Groq provider ($1/$3 per 1M tokens, 16k max) - Fix import sorting for linting compliance - Add GroqProvider mock to ai-services-unified tests Fixes missing implementation pieces that prevented Groq provider from working. * chore: improve changeset --------- Co-authored-by: Ben Vargas <ben@example.com> Co-authored-by: Ralph Khreish <35776126+Crunchyman-ralph@users.noreply.github.com>
…#973) * Amp profile + tests * generatlize to Agent instead of Claude Code to support any agent * add changeset * unnecessary tab formatting * fix exports * fix formatting
…altoledano#974) * zed profile * add changeset * update changeset
…#972) * add OLLAMA_API_KEY * add missing API keys * add changeset * update keys and fix OpenAI comment * chore: create extension scaffolding (eyaltoledano#989) * chore: create extension scaffolding * chore: fix workspace for changeset * chore: fix package-lock * feat(profiles): Add MCP configuration to Claude Code rules (eyaltoledano#980) * add .mcp.json with claude profile * add changeset * update changeset * update test * fix: show command no longer requires complexity report to exist (eyaltoledano#979) Co-authored-by: Ben Vargas <ben@example.com> * feat: complete Groq provider integration and add Kimi K2 model (eyaltoledano#978) * feat: complete Groq provider integration and add Kimi K2 model - Add missing getRequiredApiKeyName() method to GroqProvider class - Register GroqProvider in ai-services-unified.js PROVIDERS object - Add Groq API key handling to config-manager.js (isApiKeySet and getMcpApiKeyStatus) - Add GROQ_API_KEY to env.example with format hint - Add moonshotai/kimi-k2-instruct model to Groq provider ($1/$3 per 1M tokens, 16k max) - Fix import sorting for linting compliance - Add GroqProvider mock to ai-services-unified tests Fixes missing implementation pieces that prevented Groq provider from working. * chore: improve changeset --------- Co-authored-by: Ben Vargas <ben@example.com> Co-authored-by: Ralph Khreish <35776126+Crunchyman-ralph@users.noreply.github.com> * docs: Auto-update and format models.md * feat: Add Amp rule profile with AGENT.md and MCP config (eyaltoledano#973) * Amp profile + tests * generatlize to Agent instead of Claude Code to support any agent * add changeset * unnecessary tab formatting * fix exports * fix formatting * feat: Add Zed editor rule profile with agent rules and MCP config (eyaltoledano#974) * zed profile * add changeset * update changeset --------- Co-authored-by: Ralph Khreish <35776126+Crunchyman-ralph@users.noreply.github.com> Co-authored-by: Ben Vargas <ben@vargas.com> Co-authored-by: Ben Vargas <ben@example.com> Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
…ledano#970) * add opencode to profile lists * add opencode profile / modify mcp config after add * add changeset * not necessary; main config being updated * add issue link * add/fix tests * fix url and docsUrl * update test for new urls * fix formatting * update/fix tests
* chore: add coderabbit configuration * chore: fix coderabbit config * chore: improve coderabbit config * chore: more coderabbit reviews * chore: remove all defaults
- Complete VS Code extension with React-based kanban board UI - MCP integration for real-time Task Master synchronization - Professional CI/CD workflows for marketplace publishing - Comprehensive configuration system with user preferences - ShadCN UI components with VS Code theme integration - Drag-and-drop task management with status transitions - AI-powered task features via MCP protocol - Robust error handling and connection management - Multi-registry publishing (VS Code Marketplace + Open VSX) - Security audit completed with hardcoded paths removed BREAKING CHANGE: Extension requires publisher setup and marketplace keys Publisher and extension naming decisions required: - Update publisher field from placeholder 'DavidMaliglowka' - Choose unique extension name (currently 'taskr-kanban') - Select appropriate extension icon - Configure CI secrets (VSCE_PAT, OVSX_PAT) for publishing See apps/extension/docs/ for detailed setup instructions
- Format all extension files according to project standards - Add changeset for VS Code extension implementation - Update package-lock.json dependencies
WalkthroughThis change introduces a comprehensive VS Code extension for TaskMaster AI, including its core logic, UI components, webview application, configuration, error handling, caching, and supporting infrastructure. The update adds the entire extension source, build scripts, packaging, CI/CD workflows, documentation, and related configuration files. All code, assets, and documentation necessary for building, testing, and releasing the extension are included. Changes
Sequence Diagram(s)sequenceDiagram
participant VSCode as VS Code Host
participant Extension as TaskMaster Extension
participant Webview as Kanban Webview
participant MCP as MCP Server
VSCode->>Extension: Activate extension
Extension->>MCP: Connect to MCP server
MCP-->>Extension: Connection status
Extension->>VSCode: Register commands, webview, sidebar
VSCode->>Webview: Open Kanban webview
Webview->>Extension: Post "ready" message
Extension->>MCP: Fetch tasks
MCP-->>Extension: Tasks data
Extension-->>Webview: Send tasks data
Webview->>User: Display Kanban board
User->>Webview: Drag task to new status
Webview->>Extension: Update task status
Extension->>MCP: Update task
MCP-->>Extension: Update result
Extension-->>Webview: Confirm update
Webview->>User: Update UI
Note over Extension,Webview: Similar flows for config, AI actions, subtasks, etc.
Estimated code review effort🎯 5 (Critical) | ⏱️ ~90+ minutes
✨ Finishing Touches
🧪 Generate unit tests
🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
SupportNeed help? Create a ticket on our support page for assistance with any issues or questions. Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. CodeRabbit Commands (Invoked using PR comments)
Other keywords and placeholders
Documentation and Community
|
🦋 Changeset detectedLatest commit: 0345d5a The changes in this PR will be included in the next version bump. This PR includes changesets to release 1 package
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 |
There was a problem hiding this comment.
Actionable comments posted: 95
🔭 Outside diff range comments (1)
apps/extension/docs/extension-CI-setup.md (1)
194-195: Update marketplace URL placeholdersThe VS Code Marketplace and Open VSX Registry URLs contain
[TBD]placeholders that need to be replaced with the actual extension identifier.
.changeset/upset-places-take.md
Outdated
| --- | ||
| "task-master-ai": patch | ||
| --- | ||
| Complete VS Code extension with React-based kanban board UI. MCP integration for real-time Task Master synchronization. Professional CI/CD workflows for marketplace publishing No newline at end of file |
There was a problem hiding this comment.
💡 Verification agent
❓ Verification inconclusive
Changeset version bump may be too low & summary a bit long
- Rolling out a brand-new feature usually warrants at least a minor bump, not a patch.
- Changeset summaries should be a single, imperative sentence. Example:
-"task-master-ai": patch
+ "task-master-ai": minor
...
-Complete VS Code extension with React-based kanban board UI. MCP integration for real-time Task Master synchronization. Professional CI/CD workflows for marketplace publishing
+Add VS Code extension with React kanban UI, real-time MCP sync, and CI/CD publishingPlease verify the semantic versioning impact before merge.
Update changeset to a minor bump and concise summary
The .changeset/upset-places-take.md file should be updated as follows:
- Bump the version to minor for this new feature.
- Replace the multi-sentence summary with a single, imperative sentence.
---
-"task-master-ai": patch
+"task-master-ai": minor
---
-Complete VS Code extension with React-based kanban board UI. MCP integration for real-time Task Master synchronization. Professional CI/CD workflows for marketplace publishing
+Add VS Code extension with React-based kanban board UI, real-time MCP sync, and CI/CD publishing workflows📝 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.
| --- | |
| "task-master-ai": patch | |
| --- | |
| Complete VS Code extension with React-based kanban board UI. MCP integration for real-time Task Master synchronization. Professional CI/CD workflows for marketplace publishing | |
| --- | |
| "task-master-ai": minor | |
| --- | |
| Add VS Code extension with React-based kanban board UI, real-time MCP sync, and CI/CD publishing workflows |
🤖 Prompt for AI Agents
In the .changeset/upset-places-take.md file at lines 1 to 4, change the version
bump from "patch" to "minor" to reflect the new feature addition. Also, replace
the current multi-sentence summary with a concise, single imperative sentence
that clearly describes the update.
| export function cn(...inputs: ClassValue[]) { | ||
| return twMerge(clsx(inputs)); | ||
| } |
There was a problem hiding this comment.
🧹 Nitpick (assertive)
Pass arguments with spread for marginal perf & clarity
clsx expects variadic params; passing the array still works but adds an unnecessary wrapper.
-export function cn(...inputs: ClassValue[]) {
- return twMerge(clsx(inputs));
+export function cn(...inputs: ClassValue[]) {
+ return twMerge(clsx(...inputs));
}📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| export function cn(...inputs: ClassValue[]) { | |
| return twMerge(clsx(inputs)); | |
| } | |
| export function cn(...inputs: ClassValue[]) { | |
| return twMerge(clsx(...inputs)); | |
| } |
🤖 Prompt for AI Agents
In apps/extension/src/lib/utils.ts around lines 4 to 6, the function cn passes
the inputs array directly to clsx, but clsx expects variadic arguments. Fix this
by spreading the inputs array when calling clsx, changing clsx(inputs) to
clsx(...inputs) for better performance and clarity.
| import { type ClassValue, clsx } from 'clsx'; | ||
| import { twMerge } from 'tailwind-merge'; |
There was a problem hiding this comment.
🧹 Nitpick (assertive)
Import style may break on older clsx versions
clsx ≤1.x exposes a default export; named import works only in v2+. If consumers might still be on v1, fall back to default import to avoid TS/esbuild interop edge-cases.
-import { type ClassValue, clsx } from 'clsx';
+import clsx, { type ClassValue } from 'clsx';🤖 Prompt for AI Agents
In apps/extension/src/lib/utils.ts at lines 1 to 2, the import of `clsx` uses
named imports which only work in clsx version 2 and above. To maintain
compatibility with older clsx versions (1.x) that use a default export, change
the import to use a default import for `clsx` instead of named imports. Adjust
the import statement to import `clsx` as the default export to avoid TypeScript
and esbuild interop issues.
| suite('Extension Test Suite', () => { | ||
| vscode.window.showInformationMessage('Start all tests.'); | ||
|
|
||
| test('Sample test', () => { | ||
| assert.strictEqual(-1, [1, 2, 3].indexOf(5)); | ||
| assert.strictEqual(-1, [1, 2, 3].indexOf(0)); | ||
| }); | ||
| }); |
There was a problem hiding this comment.
🛠️ Refactor suggestion
Expand test coverage to include actual extension functionality.
This test suite only contains a placeholder test that doesn't verify any extension functionality. For a comprehensive extension with Kanban board interface, MCP integration, and complex UI components, you should add tests for:
- Extension activation/deactivation
- Webview creation and communication
- MCP client functionality
- Configuration management
- Task operations
Consider adding tests like:
test('Extension activates successfully', async () => {
// Test extension activation
});
test('Webview panel creation', async () => {
// Test webview panel creation and communication
});
test('MCP client connection', async () => {
// Test MCP client functionality
});🤖 Prompt for AI Agents
In apps/extension/src/test/extension.test.ts around lines 8 to 15, the current
test suite only contains a placeholder test and does not cover any real
extension functionality. To fix this, expand the test coverage by adding tests
for extension activation and deactivation, webview panel creation and
communication, MCP client functionality, configuration management, and task
operations. Implement specific test cases such as verifying successful extension
activation, ensuring webview panels are created and communicate correctly, and
validating MCP client connections.
| const fs = require('fs'); | ||
| const path = require('path'); |
There was a problem hiding this comment.
Replace dynamic require with ES module imports
Using require() in TypeScript/ES modules is not recommended. Import these modules at the top of the file.
Add at the top of the file:
import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
import * as vscode from 'vscode';
+import * as fs from 'fs';
+import * as path from 'path';Remove lines 65-66:
- const fs = require('fs');
- const path = require('path');🤖 Prompt for AI Agents
In apps/extension/src/utils/mcpClient.ts at lines 65-66, replace the dynamic
require calls for 'fs' and 'path' with static ES module imports by adding import
statements for these modules at the top of the file and then remove the require
statements from lines 65-66.
| */ | ||
| export async function readTaskFileData( | ||
| taskId: string, | ||
| tagName: string = 'master' |
There was a problem hiding this comment.
🧹 Nitpick (assertive)
Remove redundant type annotation
The type annotation for the default parameter is redundant.
- tagName: string = 'master'
+ tagName = 'master'🧰 Tools
🪛 Biome (1.9.4)
[error] 39-39: This type annotation is trivially inferred from its initialization.
Safe fix: Remove the type annotation.
(lint/style/noInferrableTypes)
🤖 Prompt for AI Agents
In apps/extension/src/utils/taskFileReader.ts at line 39, remove the redundant
type annotation for the default parameter 'tagName'. Since the default value
'master' is a string, TypeScript can infer the type automatically, so just keep
the assignment without explicitly specifying ': string'.
| if (typeof window !== 'undefined' && (window as any).vscode) { | ||
| // Use VS Code API to read the file | ||
| const vscode = (window as any).vscode; |
There was a problem hiding this comment.
🛠️ Refactor suggestion
Define proper types for VS Code API
Replace any with a proper interface for the VS Code API.
+interface VSCodeAPI {
+ postMessage: (message: any) => void;
+}
+
+declare global {
+ interface Window {
+ vscode?: VSCodeAPI;
+ }
+}
+
// Check if we're in a VS Code webview context
- if (typeof window !== 'undefined' && (window as any).vscode) {
+ if (typeof window !== 'undefined' && window.vscode) {
// Use VS Code API to read the file
- const vscode = (window as any).vscode;
+ const vscode = window.vscode;🧰 Tools
🪛 Biome (1.9.4)
[error] 43-43: Unexpected any. Specify a different type.
any disables many type checking rules. Its use should be avoided.
(lint/suspicious/noExplicitAny)
[error] 45-45: Unexpected any. Specify a different type.
any disables many type checking rules. Its use should be avoided.
(lint/suspicious/noExplicitAny)
🤖 Prompt for AI Agents
In apps/extension/src/utils/taskFileReader.ts around lines 43 to 45, the VS Code
API is currently typed as 'any', which lacks type safety. Define a proper
TypeScript interface representing the VS Code API methods and properties you
use, then replace the 'any' type with this interface to ensure better type
checking and code clarity.
| @@ -0,0 +1,382 @@ | |||
| import * as vscode from 'vscode'; | |||
| import { MCPClientManager, MCPConfig, MCPServerStatus } from './mcpClient'; | |||
There was a problem hiding this comment.
🧹 Nitpick (assertive)
Use import type for type-only imports
Some imports are only used as types and should use import type.
-import { MCPClientManager, MCPConfig, MCPServerStatus } from './mcpClient';
+import { MCPClientManager } from './mcpClient';
+import type { MCPConfig, MCPServerStatus } from './mcpClient';📝 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.
| import { MCPClientManager, MCPConfig, MCPServerStatus } from './mcpClient'; | |
| import { MCPClientManager } from './mcpClient'; | |
| import type { MCPConfig, MCPServerStatus } from './mcpClient'; |
🧰 Tools
🪛 Biome (1.9.4)
[error] 2-2: Some named imports are only used as types.
This import is only used as a type.
This import is only used as a type.
Importing the types with import type ensures that they are removed by the compilers and avoids loading unnecessary modules.
Safe fix: Add inline type keywords.
(lint/style/useImportType)
🤖 Prompt for AI Agents
In apps/extension/src/utils/connectionManager.ts at line 2, the imports
MCPConfig and MCPServerStatus are used only as types. Change their import
statements to use `import type` to optimize the code by clearly indicating these
are type-only imports, while keeping MCPClientManager as a regular import if it
is used as a value.
| const backoffMs = Math.min( | ||
| this.reconnectBackoffMs * Math.pow(2, this.reconnectAttempts - 1), | ||
| this.maxBackoffMs | ||
| ); |
There was a problem hiding this comment.
🧹 Nitpick (assertive)
Use ** operator instead of Math.pow
Use the modern exponentiation operator for cleaner code.
const backoffMs = Math.min(
- this.reconnectBackoffMs * Math.pow(2, this.reconnectAttempts - 1),
+ this.reconnectBackoffMs * (2 ** (this.reconnectAttempts - 1)),
this.maxBackoffMs
);📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| const backoffMs = Math.min( | |
| this.reconnectBackoffMs * Math.pow(2, this.reconnectAttempts - 1), | |
| this.maxBackoffMs | |
| ); | |
| const backoffMs = Math.min( | |
| this.reconnectBackoffMs * (2 ** (this.reconnectAttempts - 1)), | |
| this.maxBackoffMs | |
| ); |
🧰 Tools
🪛 Biome (1.9.4)
[error] 302-302: Use the '**' operator instead of 'Math.pow'.
Unsafe fix: Use the '**' operator instead of 'Math.pow'.
(lint/style/useExponentiationOperator)
🤖 Prompt for AI Agents
In apps/extension/src/utils/connectionManager.ts around lines 301 to 304,
replace the use of Math.pow for exponentiation with the modern ** operator to
simplify and clean up the code. Specifically, change Math.pow(2,
this.reconnectAttempts - 1) to 2 ** (this.reconnectAttempts - 1).
| export interface ConnectionEvent { | ||
| type: 'connected' | 'disconnected' | 'error' | 'reconnecting'; | ||
| timestamp: Date; | ||
| data?: any; | ||
| } |
There was a problem hiding this comment.
🛠️ Refactor suggestion
Replace 'any' with proper types
Define specific types for the event data instead of using any.
export interface ConnectionEvent {
type: 'connected' | 'disconnected' | 'error' | 'reconnecting';
timestamp: Date;
- data?: any;
+ data?: {
+ error?: string;
+ [key: string]: unknown;
+ };
}📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| export interface ConnectionEvent { | |
| type: 'connected' | 'disconnected' | 'error' | 'reconnecting'; | |
| timestamp: Date; | |
| data?: any; | |
| } | |
| export interface ConnectionEvent { | |
| type: 'connected' | 'disconnected' | 'error' | 'reconnecting'; | |
| timestamp: Date; | |
| data?: { | |
| error?: string; | |
| [key: string]: unknown; | |
| }; | |
| } |
🧰 Tools
🪛 Biome (1.9.4)
[error] 7-7: Unexpected any. Specify a different type.
any disables many type checking rules. Its use should be avoided.
(lint/suspicious/noExplicitAny)
🤖 Prompt for AI Agents
In apps/extension/src/utils/connectionManager.ts around lines 4 to 8, the
ConnectionEvent interface uses 'any' for the data property, which reduces type
safety. Replace 'any' with specific types that correspond to each event type,
for example, define a union type or separate interfaces for the data property
based on the event type to ensure proper typing and better code clarity.
| /> | ||
| </div> |
There was a problem hiding this comment.
🧹 Nitpick (assertive)
Remove autoFocus for better accessibility
The autoFocus attribute can be disruptive for screen reader users and keyboard navigation.
- disabled={isSubmittingSubtask}
- autoFocus
+ disabled={isSubmittingSubtask}Consider using useEffect with a ref to focus the input after mount if needed:
const titleInputRef = useRef<HTMLInputElement>(null);
useEffect(() => {
if (isAddingSubtask) {
titleInputRef.current?.focus();
}
}, [isAddingSubtask]);🧰 Tools
🪛 Biome (1.9.4)
[error] 1041-1042: Avoid the autoFocus attribute.
Unsafe fix: Remove the autoFocus attribute.
(lint/a11y/noAutofocus)
🤖 Prompt for AI Agents
In apps/extension/src/components/TaskDetailsView.tsx around lines 1041 to 1042,
remove the autoFocus attribute from the input element to improve accessibility
for screen reader users and keyboard navigation. Instead, create a ref for the
input using useRef, then use useEffect to focus the input programmatically when
the isAddingSubtask state changes, ensuring focus is set only after the
component mounts and when needed.
| key={subtask.id} | ||
| className="flex items-center gap-3 p-3 rounded-md border border-textSeparator-foreground hover:border-vscode-border/70 transition-colors cursor-pointer" | ||
| onClick={() => onNavigateToTask(subtaskId)} | ||
| > | ||
| <div | ||
| className="w-4 h-4 rounded-full flex items-center justify-center" |
There was a problem hiding this comment.
Add keyboard support for clickable elements
The subtask div has onClick but no keyboard event handler, making it inaccessible for keyboard users.
<div
key={subtask.id}
className="flex items-center gap-3 p-3 rounded-md border border-textSeparator-foreground hover:border-vscode-border/70 transition-colors cursor-pointer"
onClick={() => onNavigateToTask(subtaskId)}
+ onKeyDown={(e) => {
+ if (e.key === 'Enter' || e.key === ' ') {
+ e.preventDefault();
+ onNavigateToTask(subtaskId);
+ }
+ }}
+ role="button"
+ tabIndex={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.
| key={subtask.id} | |
| className="flex items-center gap-3 p-3 rounded-md border border-textSeparator-foreground hover:border-vscode-border/70 transition-colors cursor-pointer" | |
| onClick={() => onNavigateToTask(subtaskId)} | |
| > | |
| <div | |
| className="w-4 h-4 rounded-full flex items-center justify-center" | |
| <div | |
| key={subtask.id} | |
| className="flex items-center gap-3 p-3 rounded-md border border-textSeparator-foreground hover:border-vscode-border/70 transition-colors cursor-pointer" | |
| onClick={() => onNavigateToTask(subtaskId)} | |
| onKeyDown={(e) => { | |
| if (e.key === 'Enter' || e.key === ' ') { | |
| e.preventDefault(); | |
| onNavigateToTask(subtaskId); | |
| } | |
| }} | |
| role="button" | |
| tabIndex={0} | |
| > | |
| <div | |
| className="w-4 h-4 rounded-full flex items-center justify-center" | |
| > | |
| {/* …rest of subtask item… */} |
🧰 Tools
🪛 Biome (1.9.4)
[error] 1158-1163: Enforce to have the onClick mouse event with the onKeyUp, the onKeyDown, or the onKeyPress keyboard event.
Actions triggered using mouse events should have corresponding keyboard events to account for keyboard-only navigation.
(lint/a11y/useKeyWithClickEvents)
🤖 Prompt for AI Agents
In apps/extension/src/components/TaskDetailsView.tsx around lines 1158 to 1163,
the div representing a subtask has an onClick handler but lacks keyboard event
handlers, making it inaccessible to keyboard users. Add keyboard event support
by handling keyDown events for Enter and Space keys to trigger the same
onNavigateToTask function. Also, ensure the div has a tabIndex of 0 to make it
focusable via keyboard navigation.
| export interface TaskMasterApiResponse<T = any> { | ||
| success: boolean; | ||
| data?: T; | ||
| error?: string; | ||
| requestDuration?: number; | ||
| } |
There was a problem hiding this comment.
🛠️ Refactor suggestion
Replace any type with a generic type parameter
Using any disables TypeScript's type checking. Consider making the interface generic instead.
-export interface TaskMasterApiResponse<T = any> {
+export interface TaskMasterApiResponse<T = unknown> {
success: boolean;
data?: T;
error?: string;
requestDuration?: number;
}📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| export interface TaskMasterApiResponse<T = any> { | |
| success: boolean; | |
| data?: T; | |
| error?: string; | |
| requestDuration?: number; | |
| } | |
| export interface TaskMasterApiResponse<T = unknown> { | |
| success: boolean; | |
| data?: T; | |
| error?: string; | |
| requestDuration?: number; | |
| } |
🧰 Tools
🪛 Biome (1.9.4)
[error] 66-66: Unexpected any. Specify a different type.
any disables many type checking rules. Its use should be avoided.
(lint/suspicious/noExplicitAny)
🤖 Prompt for AI Agents
In apps/extension/src/utils/taskMasterApi.ts around lines 66 to 71, the
TaskMasterApiResponse interface uses the `any` type for its generic parameter,
which disables type checking. Replace the `any` type with a generic type
parameter `T` by declaring the interface as `TaskMasterApiResponse<T>`, and use
`T` for the `data` property type to enable proper type checking and flexibility.
| private validateAndNormalizeString( | ||
| value: any, | ||
| defaultValue: string | undefined, | ||
| fieldName: string | ||
| ): string | undefined { | ||
| if (value === null || value === undefined) { | ||
| return defaultValue; | ||
| } | ||
|
|
||
| if (typeof value !== 'string') { | ||
| console.warn( | ||
| `TaskMasterApi: ${fieldName} is not a string, converting:`, | ||
| value | ||
| ); | ||
| return String(value).trim() || defaultValue; | ||
| } | ||
|
|
||
| const trimmed = value.trim(); | ||
| if (trimmed === '' && defaultValue !== undefined) { | ||
| return defaultValue; | ||
| } | ||
|
|
||
| return trimmed || defaultValue; | ||
| } |
There was a problem hiding this comment.
🛠️ Refactor suggestion
Replace any type in validateAndNormalizeString method
private validateAndNormalizeString(
- value: any,
+ value: unknown,
defaultValue: string | undefined,
fieldName: string
): string | undefined {📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| private validateAndNormalizeString( | |
| value: any, | |
| defaultValue: string | undefined, | |
| fieldName: string | |
| ): string | undefined { | |
| if (value === null || value === undefined) { | |
| return defaultValue; | |
| } | |
| if (typeof value !== 'string') { | |
| console.warn( | |
| `TaskMasterApi: ${fieldName} is not a string, converting:`, | |
| value | |
| ); | |
| return String(value).trim() || defaultValue; | |
| } | |
| const trimmed = value.trim(); | |
| if (trimmed === '' && defaultValue !== undefined) { | |
| return defaultValue; | |
| } | |
| return trimmed || defaultValue; | |
| } | |
| private validateAndNormalizeString( | |
| - value: any, | |
| + value: unknown, | |
| defaultValue: string | undefined, | |
| fieldName: string | |
| ): string | undefined { | |
| if (value === null || value === undefined) { | |
| return defaultValue; | |
| } | |
| if (typeof value !== 'string') { | |
| console.warn( | |
| `TaskMasterApi: ${fieldName} is not a string, converting:`, | |
| value | |
| ); | |
| return String(value).trim() || defaultValue; | |
| } | |
| const trimmed = value.trim(); | |
| if (trimmed === '' && defaultValue !== undefined) { | |
| return defaultValue; | |
| } | |
| return trimmed || defaultValue; | |
| } |
🧰 Tools
🪛 Biome (1.9.4)
[error] 1097-1098: Unexpected any. Specify a different type.
any disables many type checking rules. Its use should be avoided.
(lint/suspicious/noExplicitAny)
🤖 Prompt for AI Agents
In apps/extension/src/utils/taskMasterApi.ts around lines 1096 to 1119, the
validateAndNormalizeString method uses the `any` type for the `value` parameter,
which reduces type safety. Replace the `any` type with a more specific union
type such as `string | number | null | undefined` to better reflect the expected
input types and improve type checking while preserving the existing logic.
| private scheduleRelatedDataPrefetch(key: string, data: any): void { | ||
| // This is a simple implementation - in a more sophisticated system, | ||
| // we might prefetch related tasks, subtasks, or dependency data | ||
| if (key.includes('get_tasks') && Array.isArray(data)) { | ||
| console.log( | ||
| `TaskMasterApi: Scheduled prefetch for ${data.length} tasks related to ${key}` | ||
| ); | ||
| // Future enhancement: prefetch individual task details, related dependencies, etc. | ||
| } | ||
| } |
There was a problem hiding this comment.
🛠️ Refactor suggestion
Replace any type in scheduleRelatedDataPrefetch method
-private scheduleRelatedDataPrefetch(key: string, data: any): void {
+private scheduleRelatedDataPrefetch(key: string, data: unknown): void {📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| private scheduleRelatedDataPrefetch(key: string, data: any): void { | |
| // This is a simple implementation - in a more sophisticated system, | |
| // we might prefetch related tasks, subtasks, or dependency data | |
| if (key.includes('get_tasks') && Array.isArray(data)) { | |
| console.log( | |
| `TaskMasterApi: Scheduled prefetch for ${data.length} tasks related to ${key}` | |
| ); | |
| // Future enhancement: prefetch individual task details, related dependencies, etc. | |
| } | |
| } | |
| private scheduleRelatedDataPrefetch(key: string, data: unknown): void { | |
| // This is a simple implementation - in a more sophisticated system, | |
| // we might prefetch related tasks, subtasks, or dependency data | |
| if (key.includes('get_tasks') && Array.isArray(data)) { | |
| console.log( | |
| `TaskMasterApi: Scheduled prefetch for ${data.length} tasks related to ${key}` | |
| ); | |
| // Future enhancement: prefetch individual task details, related dependencies, etc. | |
| } | |
| } |
🧰 Tools
🪛 Biome (1.9.4)
[error] 754-754: Unexpected any. Specify a different type.
any disables many type checking rules. Its use should be avoided.
(lint/suspicious/noExplicitAny)
🤖 Prompt for AI Agents
In apps/extension/src/utils/taskMasterApi.ts around lines 754 to 763, the
scheduleRelatedDataPrefetch method uses the `any` type for the data parameter,
which reduces type safety. Replace the `any` type with a more specific type that
accurately represents the expected structure of the data, such as an array of
task objects or a defined interface representing task data. Update the method
signature accordingly to improve type checking and code clarity.
| private setCache( | ||
| key: string, | ||
| data: any, | ||
| options?: { ttl?: number; tags?: string[] } | ||
| ): void { | ||
| const now = Date.now(); | ||
| const dataSize = this.estimateDataSize(data); | ||
|
|
||
| // Create cache entry | ||
| const entry: CacheEntry = { | ||
| data, | ||
| timestamp: now, | ||
| accessCount: 1, | ||
| lastAccessed: now, | ||
| size: dataSize, | ||
| ttl: options?.ttl, | ||
| tags: options?.tags || [key.split('_')[0]] // Default tag based on key prefix | ||
| }; | ||
|
|
||
| // Check if we need to evict entries (LRU strategy) | ||
| const maxSize = this.config.cache?.maxSize || 100; | ||
| if (this.cache.size >= maxSize) { | ||
| this.evictLRUEntries(Math.max(1, Math.floor(maxSize * 0.1))); // Evict 10% of max size | ||
| } | ||
|
|
||
| this.cache.set(key, entry); | ||
| console.log( | ||
| `TaskMasterApi: Cached data for ${key} (size: ${dataSize} bytes, TTL: ${entry.ttl || this.config.cacheDuration}ms)` | ||
| ); | ||
|
|
||
| // Trigger prefetch if enabled | ||
| if (this.config.cache?.enablePrefetch) { | ||
| this.scheduleRelatedDataPrefetch(key, data); | ||
| } | ||
| } |
There was a problem hiding this comment.
🛠️ Refactor suggestion
Replace any type in setCache method
The data parameter should have a proper type instead of any.
private setCache(
key: string,
- data: any,
+ data: unknown,
options?: { ttl?: number; tags?: string[] }
): void {📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| private setCache( | |
| key: string, | |
| data: any, | |
| options?: { ttl?: number; tags?: string[] } | |
| ): void { | |
| const now = Date.now(); | |
| const dataSize = this.estimateDataSize(data); | |
| // Create cache entry | |
| const entry: CacheEntry = { | |
| data, | |
| timestamp: now, | |
| accessCount: 1, | |
| lastAccessed: now, | |
| size: dataSize, | |
| ttl: options?.ttl, | |
| tags: options?.tags || [key.split('_')[0]] // Default tag based on key prefix | |
| }; | |
| // Check if we need to evict entries (LRU strategy) | |
| const maxSize = this.config.cache?.maxSize || 100; | |
| if (this.cache.size >= maxSize) { | |
| this.evictLRUEntries(Math.max(1, Math.floor(maxSize * 0.1))); // Evict 10% of max size | |
| } | |
| this.cache.set(key, entry); | |
| console.log( | |
| `TaskMasterApi: Cached data for ${key} (size: ${dataSize} bytes, TTL: ${entry.ttl || this.config.cacheDuration}ms)` | |
| ); | |
| // Trigger prefetch if enabled | |
| if (this.config.cache?.enablePrefetch) { | |
| this.scheduleRelatedDataPrefetch(key, data); | |
| } | |
| } | |
| private setCache( | |
| key: string, | |
| data: unknown, | |
| options?: { ttl?: number; tags?: string[] } | |
| ): void { | |
| const now = Date.now(); | |
| const dataSize = this.estimateDataSize(data); | |
| // Create cache entry | |
| const entry: CacheEntry = { | |
| data, | |
| timestamp: now, | |
| accessCount: 1, | |
| lastAccessed: now, | |
| size: dataSize, | |
| ttl: options?.ttl, | |
| tags: options?.tags || [key.split('_')[0]] // Default tag based on key prefix | |
| }; | |
| // Check if we need to evict entries (LRU strategy) | |
| const maxSize = this.config.cache?.maxSize || 100; | |
| if (this.cache.size >= maxSize) { | |
| this.evictLRUEntries(Math.max(1, Math.floor(maxSize * 0.1))); // Evict 10% of max size | |
| } | |
| this.cache.set(key, entry); | |
| console.log( | |
| `TaskMasterApi: Cached data for ${key} (size: ${dataSize} bytes, TTL: ${entry.ttl || this.config.cacheDuration}ms)` | |
| ); | |
| // Trigger prefetch if enabled | |
| if (this.config.cache?.enablePrefetch) { | |
| this.scheduleRelatedDataPrefetch(key, data); | |
| } | |
| } |
🧰 Tools
🪛 Biome (1.9.4)
[error] 688-688: Unexpected any. Specify a different type.
any disables many type checking rules. Its use should be avoided.
(lint/suspicious/noExplicitAny)
🤖 Prompt for AI Agents
In apps/extension/src/utils/taskMasterApi.ts between lines 686 and 720, the
setCache method uses the `any` type for the `data` parameter, which reduces type
safety. Replace `any` with a more specific type that accurately represents the
expected data structure or use a generic type parameter to allow flexibility
while maintaining type safety. Update the method signature and related code
accordingly to reflect this change.
| export class UIRenderingError extends TaskMasterError { | ||
| constructor( | ||
| message: string, | ||
| code: string = 'UI_RENDERING_FAILED', | ||
| context?: Record<string, any> | ||
| ) { | ||
| super( | ||
| message, | ||
| code, | ||
| ErrorCategory.UI_RENDERING, | ||
| ErrorSeverity.LOW, | ||
| context, | ||
| 'Try closing and reopening the Kanban board.' | ||
| ); | ||
| } | ||
| } |
There was a problem hiding this comment.
🧹 Nitpick (assertive)
Remove unnecessary type annotations and replace any types
constructor(
message: string,
- code: string = 'UI_RENDERING_FAILED',
- context?: Record<string, any>
+ code = 'UI_RENDERING_FAILED',
+ context?: Record<string, unknown>
) {📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| export class UIRenderingError extends TaskMasterError { | |
| constructor( | |
| message: string, | |
| code: string = 'UI_RENDERING_FAILED', | |
| context?: Record<string, any> | |
| ) { | |
| super( | |
| message, | |
| code, | |
| ErrorCategory.UI_RENDERING, | |
| ErrorSeverity.LOW, | |
| context, | |
| 'Try closing and reopening the Kanban board.' | |
| ); | |
| } | |
| } | |
| export class UIRenderingError extends TaskMasterError { | |
| constructor( | |
| message: string, | |
| code = 'UI_RENDERING_FAILED', | |
| context?: Record<string, unknown> | |
| ) { | |
| super( | |
| message, | |
| code, | |
| ErrorCategory.UI_RENDERING, | |
| ErrorSeverity.LOW, | |
| context, | |
| 'Try closing and reopening the Kanban board.' | |
| ); | |
| } | |
| } |
🧰 Tools
🪛 Biome (1.9.4)
[error] 243-243: This type annotation is trivially inferred from its initialization.
Safe fix: Remove the type annotation.
(lint/style/noInferrableTypes)
[error] 244-244: Unexpected any. Specify a different type.
any disables many type checking rules. Its use should be avoided.
(lint/suspicious/noExplicitAny)
🤖 Prompt for AI Agents
In apps/extension/src/utils/errorHandler.ts between lines 240 and 255, remove
the explicit type annotation on the constructor parameters where it is
unnecessary, and replace the use of 'any' in the context parameter with a more
specific or safer type such as 'unknown' or a defined interface to improve type
safety and clarity.
| async handleError( | ||
| error: Error | TaskMasterError, | ||
| context?: Record<string, any> | ||
| ): Promise<void> { | ||
| const errorDetails = this.createErrorDetails(error, context); | ||
| const logEntry = this.logError(errorDetails); | ||
|
|
||
| // Notify listeners | ||
| this.notifyErrorListeners(errorDetails); | ||
|
|
||
| // Show user notification based on severity | ||
| await this.showUserNotification(errorDetails); | ||
|
|
||
| // Attempt recovery if available | ||
| if (errorDetails.recovery?.automatic && errorDetails.recovery.action) { | ||
| try { | ||
| await errorDetails.recovery.action(); | ||
| this.markErrorResolved(logEntry.id); | ||
| } catch (recoveryError) { | ||
| console.error('Error recovery failed:', recoveryError); | ||
| logEntry.attempts++; | ||
| logEntry.lastAttempt = new Date(); | ||
| } | ||
| } | ||
|
|
||
| // Log to console with appropriate level | ||
| this.logToConsole(errorDetails); | ||
| } |
There was a problem hiding this comment.
🛠️ Refactor suggestion
Replace any type in handleError method
async handleError(
error: Error | TaskMasterError,
- context?: Record<string, any>
+ context?: Record<string, unknown>
): Promise<void> {🧰 Tools
🪛 Biome (1.9.4)
[error] 308-308: Unexpected any. Specify a different type.
any disables many type checking rules. Its use should be avoided.
(lint/suspicious/noExplicitAny)
🤖 Prompt for AI Agents
In apps/extension/src/utils/errorHandler.ts around lines 306 to 333, the
handleError method uses the generic type 'any' for the context parameter, which
reduces type safety. Replace 'any' with a more specific type that accurately
represents the expected shape of the context object, such as a defined interface
or Record<string, unknown>, to improve type checking and maintainability.
| */ | ||
| async handleCriticalError( | ||
| error: Error | TaskMasterError, | ||
| context?: Record<string, any> | ||
| ): Promise<void> { | ||
| const errorDetails = this.createErrorDetails(error, context); | ||
| errorDetails.severity = ErrorSeverity.CRITICAL; | ||
|
|
||
| await this.handleError(error, context); | ||
|
|
||
| // Show critical error dialog | ||
| const action = await vscode.window.showErrorMessage( | ||
| `Critical Error in Task Master: ${errorDetails.message}`, | ||
| 'View Details', | ||
| 'Report Issue', | ||
| 'Restart Extension' | ||
| ); | ||
|
|
||
| switch (action) { | ||
| case 'View Details': | ||
| await this.showErrorDetails(errorDetails); | ||
| break; | ||
| case 'Report Issue': | ||
| await this.openIssueReport(errorDetails); | ||
| break; | ||
| case 'Restart Extension': | ||
| await vscode.commands.executeCommand('workbench.action.reloadWindow'); | ||
| break; | ||
| } | ||
| } |
There was a problem hiding this comment.
🛠️ Refactor suggestion
Replace any type in handleCriticalError method
async handleCriticalError(
error: Error | TaskMasterError,
- context?: Record<string, any>
+ context?: Record<string, unknown>
): Promise<void> {🧰 Tools
🪛 Biome (1.9.4)
[error] 340-340: Unexpected any. Specify a different type.
any disables many type checking rules. Its use should be avoided.
(lint/suspicious/noExplicitAny)
🤖 Prompt for AI Agents
In apps/extension/src/utils/errorHandler.ts between lines 337 and 366, the
handleCriticalError method uses the generic 'any' type for the context
parameter. Replace 'any' with a more specific type that accurately represents
the expected shape of the context object, such as a defined interface or
Record<string, unknown>, to improve type safety and clarity.
| constructor( | ||
| message: string, | ||
| code: string = 'MCP_CONNECTION_FAILED', | ||
| context?: Record<string, any>, | ||
| recovery?: { | ||
| automatic: boolean; | ||
| action?: () => Promise<void>; | ||
| description?: string; | ||
| } | ||
| ) { | ||
| super( | ||
| message, | ||
| code, | ||
| ErrorCategory.MCP_CONNECTION, | ||
| ErrorSeverity.HIGH, | ||
| context, | ||
| 'Check your Task Master configuration and ensure the MCP server is accessible.', | ||
| recovery | ||
| ); | ||
| } | ||
| } |
There was a problem hiding this comment.
🧹 Nitpick (assertive)
Remove unnecessary type annotations and replace any types
Type annotations for default string values are unnecessary, and any should be replaced.
constructor(
message: string,
- code: string = 'MCP_CONNECTION_FAILED',
- context?: Record<string, any>,
+ code = 'MCP_CONNECTION_FAILED',
+ context?: Record<string, unknown>,
recovery?: {
automatic: boolean;
action?: () => Promise<void>;
description?: string;
}
) {📝 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.
| constructor( | |
| message: string, | |
| code: string = 'MCP_CONNECTION_FAILED', | |
| context?: Record<string, any>, | |
| recovery?: { | |
| automatic: boolean; | |
| action?: () => Promise<void>; | |
| description?: string; | |
| } | |
| ) { | |
| super( | |
| message, | |
| code, | |
| ErrorCategory.MCP_CONNECTION, | |
| ErrorSeverity.HIGH, | |
| context, | |
| 'Check your Task Master configuration and ensure the MCP server is accessible.', | |
| recovery | |
| ); | |
| } | |
| } | |
| constructor( | |
| message: string, | |
| code = 'MCP_CONNECTION_FAILED', | |
| context?: Record<string, unknown>, | |
| recovery?: { | |
| automatic: boolean; | |
| action?: () => Promise<void>; | |
| description?: string; | |
| } | |
| ) { | |
| super( | |
| message, | |
| code, | |
| ErrorCategory.MCP_CONNECTION, | |
| ErrorSeverity.HIGH, | |
| context, | |
| 'Check your Task Master configuration and ensure the MCP server is accessible.', | |
| recovery | |
| ); | |
| } | |
| } |
🧰 Tools
🪛 Biome (1.9.4)
[error] 171-171: This type annotation is trivially inferred from its initialization.
Safe fix: Remove the type annotation.
(lint/style/noInferrableTypes)
[error] 172-172: Unexpected any. Specify a different type.
any disables many type checking rules. Its use should be avoided.
(lint/suspicious/noExplicitAny)
🤖 Prompt for AI Agents
In apps/extension/src/utils/errorHandler.ts around lines 169 to 189, remove the
explicit type annotation for the default string parameter 'code' since
TypeScript can infer it, and replace the 'any' type in the 'context' parameter
with a more specific type or a generic placeholder to avoid using 'any'. Adjust
the constructor signature accordingly to improve type safety and clarity.
| private createErrorDetails( | ||
| error: Error | TaskMasterError, | ||
| context?: Record<string, any> | ||
| ): ErrorDetails { | ||
| if (error instanceof TaskMasterError) { | ||
| const details = error.toErrorDetails(); | ||
| if (context) { | ||
| details.context = { ...details.context, ...context }; | ||
| } | ||
| return details; | ||
| } | ||
|
|
||
| // Handle standard Error objects | ||
| return { | ||
| code: 'UNKNOWN_ERROR', | ||
| message: error.message || 'An unknown error occurred', | ||
| category: ErrorCategory.INTERNAL, | ||
| severity: ErrorSeverity.MEDIUM, | ||
| timestamp: new Date(), | ||
| context: { ...context, errorName: error.name }, | ||
| stack: error.stack | ||
| }; | ||
| } |
There was a problem hiding this comment.
🛠️ Refactor suggestion
Replace any type in createErrorDetails method
private createErrorDetails(
error: Error | TaskMasterError,
- context?: Record<string, any>
+ context?: Record<string, unknown>
): ErrorDetails {📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| private createErrorDetails( | |
| error: Error | TaskMasterError, | |
| context?: Record<string, any> | |
| ): ErrorDetails { | |
| if (error instanceof TaskMasterError) { | |
| const details = error.toErrorDetails(); | |
| if (context) { | |
| details.context = { ...details.context, ...context }; | |
| } | |
| return details; | |
| } | |
| // Handle standard Error objects | |
| return { | |
| code: 'UNKNOWN_ERROR', | |
| message: error.message || 'An unknown error occurred', | |
| category: ErrorCategory.INTERNAL, | |
| severity: ErrorSeverity.MEDIUM, | |
| timestamp: new Date(), | |
| context: { ...context, errorName: error.name }, | |
| stack: error.stack | |
| }; | |
| } | |
| private createErrorDetails( | |
| error: Error | TaskMasterError, | |
| context?: Record<string, unknown> | |
| ): ErrorDetails { | |
| if (error instanceof TaskMasterError) { | |
| const details = error.toErrorDetails(); | |
| if (context) { | |
| details.context = { ...details.context, ...context }; | |
| } | |
| return details; | |
| } | |
| // Handle standard Error objects | |
| return { | |
| code: 'UNKNOWN_ERROR', | |
| message: error.message || 'An unknown error occurred', | |
| category: ErrorCategory.INTERNAL, | |
| severity: ErrorSeverity.MEDIUM, | |
| timestamp: new Date(), | |
| context: { ...context, errorName: error.name }, | |
| stack: error.stack | |
| }; | |
| } |
🧰 Tools
🪛 Biome (1.9.4)
[error] 428-428: Unexpected any. Specify a different type.
any disables many type checking rules. Its use should be avoided.
(lint/suspicious/noExplicitAny)
🤖 Prompt for AI Agents
In apps/extension/src/utils/errorHandler.ts around lines 426 to 448, the
createErrorDetails method uses the type 'any' for the context parameter. Replace
'any' with a more specific type such as Record<string, unknown> or a defined
interface that accurately represents the expected shape of the context object to
improve type safety and clarity.
| constructor( | ||
| message: string, | ||
| code: string, | ||
| category: ErrorCategory, | ||
| severity: ErrorSeverity = ErrorSeverity.MEDIUM, | ||
| context?: Record<string, any>, | ||
| userAction?: string, | ||
| recovery?: { | ||
| automatic: boolean; | ||
| action?: () => Promise<void>; | ||
| description?: string; | ||
| } | ||
| ) { | ||
| super(message); | ||
| this.name = this.constructor.name; | ||
| this.code = code; | ||
| this.category = category; | ||
| this.severity = severity; | ||
| this.timestamp = new Date(); | ||
| this.context = context; | ||
| this.userAction = userAction; | ||
| this.recovery = recovery; | ||
|
|
There was a problem hiding this comment.
🛠️ Refactor suggestion
Replace any type in TaskMasterError constructor
constructor(
message: string,
code: string,
category: ErrorCategory,
severity: ErrorSeverity = ErrorSeverity.MEDIUM,
- context?: Record<string, any>,
+ context?: Record<string, unknown>,
userAction?: string,
recovery?: {
automatic: boolean;
action?: () => Promise<void>;
description?: string;
}
) {📝 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.
| constructor( | |
| message: string, | |
| code: string, | |
| category: ErrorCategory, | |
| severity: ErrorSeverity = ErrorSeverity.MEDIUM, | |
| context?: Record<string, any>, | |
| userAction?: string, | |
| recovery?: { | |
| automatic: boolean; | |
| action?: () => Promise<void>; | |
| description?: string; | |
| } | |
| ) { | |
| super(message); | |
| this.name = this.constructor.name; | |
| this.code = code; | |
| this.category = category; | |
| this.severity = severity; | |
| this.timestamp = new Date(); | |
| this.context = context; | |
| this.userAction = userAction; | |
| this.recovery = recovery; | |
| constructor( | |
| message: string, | |
| code: string, | |
| category: ErrorCategory, | |
| severity: ErrorSeverity = ErrorSeverity.MEDIUM, | |
| - context?: Record<string, any>, | |
| + context?: Record<string, unknown>, | |
| userAction?: string, | |
| recovery?: { | |
| automatic: boolean; | |
| action?: () => Promise<void>; | |
| description?: string; | |
| } | |
| ) { | |
| super(message); | |
| this.name = this.constructor.name; | |
| this.code = code; | |
| this.category = category; | |
| this.severity = severity; | |
| this.timestamp = new Date(); | |
| this.context = context; | |
| this.userAction = userAction; | |
| this.recovery = recovery; |
🧰 Tools
🪛 Biome (1.9.4)
[error] 126-126: Unexpected any. Specify a different type.
any disables many type checking rules. Its use should be avoided.
(lint/suspicious/noExplicitAny)
🤖 Prompt for AI Agents
In apps/extension/src/utils/errorHandler.ts around lines 121 to 143, the
constructor uses the type `any` for the `context` parameter, which reduces type
safety. Replace `Record<string, any>` with a more specific or generic type
parameter to improve type safety, such as `Record<string, unknown>`, or define a
proper interface for the context object if possible.
| private setupGlobalErrorHandlers(): void { | ||
| // Handle unhandled promise rejections | ||
| process.on('unhandledRejection', (reason, promise) => { | ||
| // Create a concrete error class for internal errors | ||
| class InternalError extends TaskMasterError { | ||
| constructor( | ||
| message: string, | ||
| code: string, | ||
| severity: ErrorSeverity, | ||
| context?: Record<string, any> | ||
| ) { | ||
| super(message, code, ErrorCategory.INTERNAL, severity, context); | ||
| } | ||
| } | ||
|
|
||
| const error = new InternalError( | ||
| 'Unhandled Promise Rejection', | ||
| 'UNHANDLED_REJECTION', | ||
| ErrorSeverity.HIGH, | ||
| { reason: String(reason), promise: String(promise) } | ||
| ); | ||
| this.handleError(error); | ||
| }); | ||
|
|
||
| // Handle uncaught exceptions | ||
| process.on('uncaughtException', (error) => { | ||
| // Create a concrete error class for internal errors | ||
| class InternalError extends TaskMasterError { | ||
| constructor( | ||
| message: string, | ||
| code: string, | ||
| severity: ErrorSeverity, | ||
| context?: Record<string, any> | ||
| ) { | ||
| super(message, code, ErrorCategory.INTERNAL, severity, context); | ||
| } | ||
| } | ||
|
|
||
| const taskMasterError = new InternalError( | ||
| 'Uncaught Exception', | ||
| 'UNCAUGHT_EXCEPTION', | ||
| ErrorSeverity.CRITICAL, | ||
| { originalError: error.message, stack: error.stack } | ||
| ); | ||
| this.handleCriticalError(taskMasterError); | ||
| }); | ||
| } |
There was a problem hiding this comment.
🛠️ Refactor suggestion
Refactor to avoid nested class definitions and replace any types
Creating classes inside methods is unusual and can impact performance. Consider defining them at the module level.
+// Define at module level
+class InternalError extends TaskMasterError {
+ constructor(
+ message: string,
+ code: string,
+ severity: ErrorSeverity,
+ context?: Record<string, unknown>
+ ) {
+ super(message, code, ErrorCategory.INTERNAL, severity, context);
+ }
+}
+
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);
});
}📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| private 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); | |
| }); | |
| } | |
| // Define at module level | |
| class InternalError extends TaskMasterError { | |
| constructor( | |
| message: string, | |
| code: string, | |
| severity: ErrorSeverity, | |
| context?: Record<string, unknown> | |
| ) { | |
| super(message, code, ErrorCategory.INTERNAL, severity, context); | |
| } | |
| } | |
| private setupGlobalErrorHandlers(): void { | |
| // 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); | |
| }); | |
| } |
🧰 Tools
🪛 Biome (1.9.4)
[error] 654-654: Unexpected any. Specify a different type.
any disables many type checking rules. Its use should be avoided.
(lint/suspicious/noExplicitAny)
[error] 677-677: Unexpected any. Specify a different type.
any disables many type checking rules. Its use should be avoided.
(lint/suspicious/noExplicitAny)
🤖 Prompt for AI Agents
In apps/extension/src/utils/errorHandler.ts between lines 645 and 691, the
InternalError class is defined inside the setupGlobalErrorHandlers method twice,
which is inefficient and unusual. Refactor by moving the InternalError class
definition outside the method to the module level, so it is defined once and
reused. Also, ensure to replace any usage of 'any' types with more specific
types if present in the class or method signatures.
|
For reference, need an automated CI for this: |
- Fixed InternalError class definition in errorHandler.ts - Updated extension configuration and CI workflows - Improved error handling and type safety - Enhanced build and release automation - Updated documentation and changelogs Addresses review feedback on PR eyaltoledano#997
Just added |
Resolved conflicts: - Added kiro profile to all relevant files - Updated package.json version to 0.22.0-rc.0 - Integrated extension functionality with latest codebase - Resolved CHANGELOG.md and documentation conflicts - Fixed profile exports and test files This merge brings the VS Code extension up to date with the latest Task Master features including Kiro IDE integration.
* Version Packages * chore: fix release 0.22 todo: fix CI * chore: run format --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Ralph Khreish <35776126+Crunchyman-ralph@users.noreply.github.com>
…-specific detection (eyaltoledano#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>
There was a problem hiding this comment.
Actionable comments posted: 1
🔭 Outside diff range comments (1)
.changeset/sour-pans-beam.md (1)
1-43: Replace verbose marketing copy with a concise, imperative changeset summaryA changeset should include a single, user-facing sentence in imperative mood—no full feature list or marketing paragraphs—to keep the generated CHANGELOG.md clean.
Example fix in .changeset/sour-pans-beam.md:
@@ .changeset/sour-pans-beam.md --- "extension": minor --- -🎉 **Introducing TaskMaster Extension!** - -We’re thrilled to launch the first version of our Code extension… (full feature list) +Introduce TaskMaster VS Code extension with Kanban board and drag-and-drop task management• Keep the front-matter key as
"extension"to match its package.json in the monorepo (the VS Code marketplace manifest in package.publish.json uses a different name and isn’t targeted by Changesets).
• Write the summary in imperative mood, one line, user-facing.
♻️ Duplicate comments (1)
.changeset/fix-tag-complexity-detection.md (1)
4-5: Remove leading blank line & keep summary on same line as required by Changesets front-matterThe summary must immediately follow the second
---without an intervening blank line.
Same issue was raised previously. Please trim the blank line and keep the one-line summary.--- "task-master-ai": patch --- - -Fix tag-specific complexity report detection in expand command +Fix tag-specific complexity-report detection in `expand` command
📜 Review details
Configuration used: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro
📒 Files selected for processing (2)
.changeset/fix-tag-complexity-detection.md(1 hunks).changeset/sour-pans-beam.md(1 hunks)
🧰 Additional context used
📓 Path-based instructions (2)
.changeset/*.md
📄 CodeRabbit Inference Engine (.cursor/rules/changeset.mdc)
.changeset/*.md: When runningnpm run changesetornpx changeset add, provide a concise summary of the changes for theCHANGELOG.mdin imperative mood, typically a single line, and not a detailed Git commit message.
The changeset summary should be user-facing, describing what changed in the released version that is relevant to users or consumers of the package.
Do not use your detailed Git commit message body as the changeset summary.
Files:
.changeset/fix-tag-complexity-detection.md.changeset/sour-pans-beam.md
.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/fix-tag-complexity-detection.md.changeset/sour-pans-beam.md
🧠 Learnings (33)
📓 Common learnings
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: Monitor code review comments for continuous improvement
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: 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.
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: assets/.windsurfrules:0-0
Timestamp: 2025-07-18T17:19:27.365Z
Learning: Monitor code review comments, track common development questions, update rules after major refactors, add links to relevant documentation, and cross-reference related rules.
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.
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).
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.
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.
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: 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.
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: assets/.windsurfrules:0-0
Timestamp: 2025-07-18T17:19:27.365Z
Learning: Generate task files with `task-master generate` after updating tasks.json.
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).
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.
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.
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/glossary.mdc:0-0
Timestamp: 2025-07-18T17:10:53.657Z
Learning: Guide for using Task Master to manage task-driven development workflows with tagged task lists support (dev_workflow.mdc).
📚 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:
.changeset/fix-tag-complexity-detection.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:
.changeset/fix-tag-complexity-detection.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:
.changeset/fix-tag-complexity-detection.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:
.changeset/fix-tag-complexity-detection.md
📚 Learning: for tasks with complexity analysis, use `node scripts/dev.js expand --id=`. otherwise, use `node...
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: assets/.windsurfrules:0-0
Timestamp: 2025-07-18T17:19:27.365Z
Learning: For tasks with complexity analysis, use `node scripts/dev.js expand --id=<id>`. Otherwise, use `node scripts/dev.js expand --id=<id> --subtasks=<number>`.
Applied to files:
.changeset/fix-tag-complexity-detection.md
📚 Learning: applies to scripts/modules/*.js : default to current tag when not specified, support explicit tag se...
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 : Default to current tag when not specified, support explicit tag selection in advanced features, validate tag existence before operations, and provide clear messaging about tag context.
Applied to files:
.changeset/fix-tag-complexity-detection.md
📚 Learning: applies to scripts/modules/task-manager.js : generate task files from the current tag context, inclu...
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 : Generate task files from the current tag context, include tag information in generated files, and do not mix tasks from different tags in file generation.
Applied to files:
.changeset/fix-tag-complexity-detection.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/fix-tag-complexity-detection.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:
.changeset/fix-tag-complexity-detection.md
📚 Learning: applies to scripts/modules/task-manager.js : use tag resolution functions to maintain backward compa...
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 tag resolution functions to maintain backward compatibility, returning legacy format to core functions and not exposing the tagged structure to existing core logic.
Applied to files:
.changeset/fix-tag-complexity-detection.md
📚 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/fix-tag-complexity-detection.md
📚 Learning: for changeset files (.changeset/*.md), avoid suggesting punctuation for bullet points as the project...
Learnt from: Crunchyman-ralph
PR: eyaltoledano/claude-task-master#1035
File: .changeset/quiet-rabbits-bathe.md:5-10
Timestamp: 2025-07-23T16:03:42.784Z
Learning: For changeset files (.changeset/*.md), avoid suggesting punctuation for bullet points as the project intentionally omits punctuation to make the generated changelog feel more natural.
Applied to files:
.changeset/fix-tag-complexity-detection.md
📚 Learning: do not add a changeset for trivial chores such as very minor code cleanup, adding comments that don'...
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 trivial chores such as very minor code cleanup, adding comments that don't clarify behavior, or typo fixes in non-user-facing code or internal docs.
Applied to files:
.changeset/fix-tag-complexity-detection.md
📚 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/fix-tag-complexity-detection.md.changeset/sour-pans-beam.md
📚 Learning: applies to .changeset/*.md : do not use your detailed git commit message body as the changeset summa...
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 : Do not use your detailed Git commit message body as the changeset summary.
Applied to files:
.changeset/fix-tag-complexity-detection.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/fix-tag-complexity-detection.md
📚 Learning: test commits should be separated and use the format: test(task-x): add comprehensive tests for [feat...
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: Test commits should be separated and use the format: test(task-X): Add comprehensive tests for [feature], with a detailed body
Applied to files:
.changeset/fix-tag-complexity-detection.md
📚 Learning: pull request descriptions must use the provided template, including task overview, subtasks complete...
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
Applied to files:
.changeset/fix-tag-complexity-detection.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:
.changeset/fix-tag-complexity-detection.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:
.changeset/fix-tag-complexity-detection.md.changeset/sour-pans-beam.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:
.changeset/fix-tag-complexity-detection.md
📚 Learning: when breaking down complex tasks in taskmaster, use the `expand_task` command with appropriate flags...
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: When breaking down complex tasks in Taskmaster, use the `expand_task` command with appropriate flags (`--num`, `--research`, `--force`, `--prompt`) and review generated subtasks for accuracy.
Applied to files:
.changeset/fix-tag-complexity-detection.md
📚 Learning: guide for using task master to manage task-driven development workflows with tagged task lists suppo...
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/glossary.mdc:0-0
Timestamp: 2025-07-18T17:10:53.657Z
Learning: Guide for using Task Master to manage task-driven development workflows with tagged task lists support (dev_workflow.mdc).
Applied to files:
.changeset/sour-pans-beam.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:
.changeset/sour-pans-beam.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/sour-pans-beam.md
📚 Learning: applies to tasks.json : use the `tasks.json` file (generated by taskmaster) to store the project's t...
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 tasks.json : Use the `tasks.json` file (generated by Taskmaster) to store the project's task list, including tags and task structures.
Applied to files:
.changeset/sour-pans-beam.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:
.changeset/sour-pans-beam.md
📚 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:
.changeset/sour-pans-beam.md
📚 Learning: organize tasks into tags (contexts) such as 'master', 'feature-branch', or 'v2.0' in taskmaster to i...
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: Organize tasks into tags (contexts) such as 'master', 'feature-branch', or 'v2.0' in Taskmaster to isolate workstreams and prevent conflicts.
Applied to files:
.changeset/sour-pans-beam.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/sour-pans-beam.md
📚 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:
.changeset/sour-pans-beam.md
📚 Learning: use `task-master list` to view current tasks, their status, and ids at the start of coding sessions....
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 list` to view current tasks, their status, and IDs at the start of coding sessions.
Applied to files:
.changeset/sour-pans-beam.md
🪛 LanguageTool
.changeset/fix-tag-complexity-detection.md
[grammar] ~5-~5: There might be a mistake here.
Context: ...c complexity report detection in expand command The expand command now correctly finds a...
(QB_NEW_EN_OTHER)
[style] ~7-~7: Consider a different adverb to strengthen your wording.
Context: ... in a tag context. Previously, it would always look for the generic `task-complexity-r...
(ALWAYS_CONSTANTLY)
.changeset/sour-pans-beam.md
[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)
[grammar] ~9-~9: Use correct spacing
Context: ...ge your development workflow. ## ✨ Key Features ### 📋 Visual Task Management - **Kanban Boa...
(QB_NEW_EN_OTHER_ERROR_IDS_5)
[grammar] ~17-~17: There might be a mistake here.
Context: ...lessly switch between different project contexts/tags - Isolated Workflows: Keep differen...
(QB_NEW_EN_OTHER)
[grammar] ~18-~18: There might be a mistake here.
Context: ...erent features or experiments organized separately ### 🤖 AI-Powered Task Updates - **Smart Upd...
(QB_NEW_EN_OTHER)
[style] ~42-~42: Using many exclamation marks might seem excessive (in this case: 3 exclamation marks for a text that’s 1994 characters long)
Context: ...y. Your workflow has never looked better! 🚀
(EN_EXCESSIVE_EXCLAMATION)
🪛 markdownlint-cli2 (0.17.2)
.changeset/fix-tag-complexity-detection.md
5-5: First line in a file should be a top-level heading
(MD041, first-line-heading, first-line-h1)
7-7: Files should end with a single newline character
(MD047, single-trailing-newline)
.changeset/sour-pans-beam.md
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)
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)
|
|
||
| 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. No newline at end of file |
There was a problem hiding this comment.
🧹 Nitpick (assertive)
Ensure file ends with a single newline
Markdown-lint (MD047) flags missing trailing newline. Append exactly one newline character at EOF.
🧰 Tools
🪛 LanguageTool
[style] ~7-~7: Consider a different adverb to strengthen your wording.
Context: ... in a tag context. Previously, it would always look for the generic `task-complexity-r...
(ALWAYS_CONSTANTLY)
🪛 markdownlint-cli2 (0.17.2)
7-7: Files should end with a single newline character
(MD047, single-trailing-newline)
🤖 Prompt for AI Agents
In the file .changeset/fix-tag-complexity-detection.md at line 7, the file is
missing a trailing newline at the end. Add exactly one newline character at the
end of the file to comply with markdown-lint rule MD047.
…ity report if it is missing, instead of showing an error. (eyaltoledano#1043) * feat: fix CLI UI error when trying to display non-existent complexity report * chore: fix git issue * chore: run format * Update .changeset/thick-squids-attend.md Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * Update .changeset/thick-squids-attend.md Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * Update .changeset/thick-squids-attend.md Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --------- Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
* Version Packages * chore: fix release 0.22 todo: fix CI * chore: run format --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Ralph Khreish <35776126+Crunchyman-ralph@users.noreply.github.com>
There was a problem hiding this comment.
Actionable comments posted: 1
🔭 Outside diff range comments (1)
.github/workflows/extension-ci.yml (1)
140-144: Remove superfluous blank line at EOFYAMLlint warns about the extra empty line (Line 144). Drop it to keep the workflow tidy.
retention-days: 30 -
♻️ Duplicate comments (8)
.github/workflows/version.yml (1)
52-62: Trim trailing space & add newline-at-EOFLine 62 ends with a stray space and the file misses the customary newline, both flagged by YAMLlint.
VSCE_PAT: ${{ secrets.VSCE_PAT }} - OVSX_PAT: ${{ secrets.OVSX_PAT }}␠ + OVSX_PAT: ${{ secrets.OVSX_PAT }} +.github/workflows/extension-release.yml (3)
20-20: Use structuredconcurrencyobject
Same advice as earlier – raw${{ github.ref }}contains slashes and risks group collisions.
165-195:steps.create_releaseis undefined – add anidThe upload-asset step still references
steps.create_release, but the “Create GitHub Release” step has noid. Addid: create_release(or change the reference).
181-183: Replace[TBD]marketplace URLs before shippingPlace-holders will fail marketplace validation and mislead users.
apps/extension/package.json (4)
1-9: Missinglicenseand questionable"private": trueflagThese points were raised previously and remain unresolved.
12-13: Invalid marketplace categories
"AI","Visualization"and"Education"are not accepted byvsce.
13-14:activationEventsblock is still absent
vsce packagewill reject the extension without it.
235-236:watchscript not Windows-safeUsing
&breaks on Windows shells; switch tonpm-run-all --parallel.
📜 Review details
Configuration used: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro
⛔ Files ignored due to path filters (1)
package-lock.jsonis excluded by!**/package-lock.json
📒 Files selected for processing (5)
.github/workflows/extension-ci.yml(1 hunks).github/workflows/extension-release.yml(1 hunks).github/workflows/version.yml(1 hunks).gitignore(1 hunks)apps/extension/package.json(1 hunks)
🧰 Additional context used
🧠 Learnings (65)
📓 Common learnings
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: Monitor code review comments for continuous improvement
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: 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.
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: assets/.windsurfrules:0-0
Timestamp: 2025-07-18T17:19:27.365Z
Learning: Monitor code review comments, track common development questions, update rules after major refactors, add links to relevant documentation, and cross-reference related rules.
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.
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).
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.
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.
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/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.
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).
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/glossary.mdc:0-0
Timestamp: 2025-07-18T17:10:53.657Z
Learning: Guide for using Task Master to manage task-driven development workflows with tagged task lists support (dev_workflow.mdc).
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).
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: 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.
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.
📚 Learning: applies to .cursor/rules/** : do not add a changeset for changes only to files within `.cursor/rules...
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 .cursor/rules/** : Do not add a changeset for changes only to files within `.cursor/rules/` that solely guide internal development practices for this specific repository.
Applied to files:
.gitignore.github/workflows/extension-ci.yml
📚 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:
.gitignoreapps/extension/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:
.gitignore
📚 Learning: applies to **/*.test.js : do not use real ai client initialization logic in tests; create test-speci...
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 use real AI client initialization logic in tests; create test-specific paths that bypass client initialization.
Applied to files:
.gitignore
📚 Learning: applies to **/*.test.js : do not import real ai service clients in tests; create fully mocked versio...
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 import real AI service clients in tests; create fully mocked versions that return predictable responses.
Applied to files:
.gitignore
📚 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:
.gitignore.github/workflows/version.yml.github/workflows/extension-release.yml.github/workflows/extension-ci.ymlapps/extension/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:
.gitignore
📚 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:
.gitignore
📚 Learning: applies to **/*.{test,spec}.{js,ts,jsx,tsx} : create a test file if needed and ensure all tests pass...
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: Applies to **/*.{test,spec}.{js,ts,jsx,tsx} : Create a test file if needed and ensure all tests pass before completing a task
Applied to files:
.gitignore.github/workflows/extension-release.yml.github/workflows/extension-ci.ymlapps/extension/package.json
📚 Learning: applies to **/*.test.js : use different file paths for each test to avoid test interdependence....
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 different file paths for each test to avoid test interdependence.
Applied to files:
.gitignore
📚 Learning: applies to **/*.test.js : verify file operations use the correct paths in expect statements....
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 : Verify file operations use the correct paths in expect statements.
Applied to files:
.gitignore.github/workflows/extension-release.yml.github/workflows/extension-ci.yml
📚 Learning: applies to **/*.test.js : maintain test fixtures separate from test logic....
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 : Maintain test fixtures separate from test logic.
Applied to files:
.gitignore.github/workflows/extension-ci.yml
📚 Learning: applies to tests/unit/*.js : each module should have a corresponding unit test file in tests/unit/ t...
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/*.js : Each module should have a corresponding unit test file in tests/unit/ that reflects the module structure (one test file per module).
Applied to files:
.gitignore
📚 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:
.gitignore.github/workflows/extension-release.ymlapps/extension/package.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:
.github/workflows/version.yml.github/workflows/extension-release.yml
📚 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:
.github/workflows/version.yml
📚 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:
.github/workflows/version.yml.github/workflows/extension-release.yml.github/workflows/extension-ci.yml
📚 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:
.github/workflows/version.ymlapps/extension/package.json
📚 Learning: for changeset files (.changeset/*.md), avoid suggesting punctuation for bullet points as the project...
Learnt from: Crunchyman-ralph
PR: eyaltoledano/claude-task-master#1035
File: .changeset/quiet-rabbits-bathe.md:5-10
Timestamp: 2025-07-23T16:03:42.784Z
Learning: For changeset files (.changeset/*.md), avoid suggesting punctuation for bullet points as the project intentionally omits punctuation to make the generated changelog feel more natural.
Applied to files:
.github/workflows/version.yml.github/workflows/extension-release.yml
📚 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:
.github/workflows/version.yml
📚 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:
.github/workflows/version.yml
📚 Learning: pull request titles must follow the format: task : ...
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>
Applied to files:
.github/workflows/version.yml
📚 Learning: do not add a changeset for trivial chores such as very minor code cleanup, adding comments that don'...
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 trivial chores such as very minor code cleanup, adding comments that don't clarify behavior, or typo fixes in non-user-facing code or internal docs.
Applied to files:
.github/workflows/version.yml
📚 Learning: pull request descriptions must use the provided template, including task overview, subtasks complete...
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
Applied to files:
.github/workflows/version.yml
📚 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:
.github/workflows/extension-release.yml.github/workflows/extension-ci.ymlapps/extension/package.json
📚 Learning: applies to scripts/modules/commands.js : use path.join() to construct file paths, follow established...
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/commands.mdc:0-0
Timestamp: 2025-07-18T17:08:48.695Z
Learning: Applies to scripts/modules/commands.js : Use path.join() to construct file paths, follow established naming conventions (like task_001.txt), check file existence before deletion, and handle file deletion errors gracefully.
Applied to files:
.github/workflows/extension-release.ymlapps/extension/package.json
📚 Learning: update references to external docs...
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: Update references to external docs
Applied to files:
.github/workflows/extension-release.yml
📚 Learning: applies to mcp-server/src/core/direct-functions/*.js : use path.join() instead of string concatenati...
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/mcp.mdc:0-0
Timestamp: 2025-07-18T17:11:36.732Z
Learning: Applies to mcp-server/src/core/direct-functions/*.js : Use path.join() instead of string concatenation for file paths, and follow established file naming conventions (e.g., 'task_001.txt') in direct functions.
Applied to files:
.github/workflows/extension-release.ymlapps/extension/package.json
📚 Learning: applies to scripts/modules/commands.js : use consistent patterns for option naming and help text in ...
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/commands.js : Use consistent patterns for option naming and help text in CLI commands.
Applied to files:
.github/workflows/extension-release.ymlapps/extension/package.json
📚 Learning: when resolving code conflicts, use standard git conflict resolution commands and ensure all conflict...
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: When resolving code conflicts, use standard Git conflict resolution commands and ensure all conflicts are resolved before continuing
Applied to files:
.github/workflows/extension-release.yml
📚 Learning: test commits should be separated and use the format: test(task-x): add comprehensive tests for [feat...
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: Test commits should be separated and use the format: test(task-X): Add comprehensive tests for [feature], with a detailed body
Applied to files:
.github/workflows/extension-ci.yml
📚 Learning: applies to tests/{unit,integration,e2e}/**/*.test.js : mock console output and verify correct format...
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 : Mock console output and verify correct formatting in UI function tests. Use flexible assertions like toContain() or toMatch() for formatted output.
Applied to files:
.github/workflows/extension-ci.yml
📚 Learning: when tests are added or modified, commit them separately with a descriptive message...
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: When tests are added or modified, commit them separately with a descriptive message
Applied to files:
.github/workflows/extension-ci.yml
📚 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:
.github/workflows/extension-ci.yml
📚 Learning: guidelines for implementing and maintaining tests for task master cli (tests.mdc)....
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 implementing and maintaining tests for Task Master CLI (tests.mdc).
Applied to files:
.github/workflows/extension-ci.yml
📚 Learning: applies to tests/{unit,integration,e2e}/**/*.test.js : explicitly handle all options, including defa...
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 : Explicitly handle all options, including defaults and shorthand flags (e.g., -p for --prompt), and include null/undefined checks in test implementations for parameters that might be optional.
Applied to files:
.github/workflows/extension-ci.ymlapps/extension/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:
apps/extension/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:
apps/extension/package.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:
apps/extension/package.json
📚 Learning: applies to tasks.json : use the `tasks.json` file (generated by taskmaster) to store the project's t...
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 tasks.json : Use the `tasks.json` file (generated by Taskmaster) to store the project's task list, including tags and task structures.
Applied to files:
apps/extension/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:
apps/extension/package.json
📚 Learning: generate task files with `task-master generate` after updating tasks.json....
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: assets/.windsurfrules:0-0
Timestamp: 2025-07-18T17:19:27.365Z
Learning: Generate task files with `task-master generate` after updating tasks.json.
Applied to files:
apps/extension/package.json
📚 Learning: applies to .taskmaster/config.json : do not manually edit `.taskmaster/config.json` unless you are c...
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/config.json : Do not manually edit `.taskmaster/config.json` unless you are certain of the changes; use the `task-master models` command or `models` MCP tool for configuration.
Applied to files:
apps/extension/package.json
📚 Learning: applies to scripts/modules/dependency-manager.js : remove references to non-existent tasks during va...
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 : Remove references to non-existent tasks during validation
Applied to files:
apps/extension/package.json
📚 Learning: applies to scripts/modules/* : every command that reads or writes tasks.json must be tag-aware...
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/tags.mdc:0-0
Timestamp: 2025-07-18T17:13:30.188Z
Learning: Applies to scripts/modules/* : Every command that reads or writes tasks.json must be tag-aware
Applied to files:
apps/extension/package.json
📚 Learning: applies to scripts/modules/task-manager/*.js : files in scripts/modules/task-manager/ should each ha...
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/task-manager/*.js : Files in scripts/modules/task-manager/ should each handle a specific action related to task management (e.g., add-task.js, expand-task.js), supporting the tagged task lists system and backward compatibility.
Applied to files:
apps/extension/package.json
📚 Learning: applies to scripts/modules/task-manager.js : each task object must include all required properties (...
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 : Each task object must include all required properties (id, title, description, status, dependencies, priority, details, testStrategy, subtasks) and provide default values for optional properties. Extra properties not in the standard schema must not be added.
Applied to files:
apps/extension/package.json
📚 Learning: applies to scripts/modules/commands.js : suggest non-destructive alternatives when appropriate, expl...
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/commands.mdc:0-0
Timestamp: 2025-07-18T17:08:48.695Z
Learning: Applies to scripts/modules/commands.js : Suggest non-destructive alternatives when appropriate, explain the difference between deletion and status changes, and include examples of alternative commands.
Applied to files:
apps/extension/package.json
📚 Learning: applies to scripts/modules/commands.js : suggest non-destructive alternatives when appropriate, expl...
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/commands.mdc:0-0
Timestamp: 2025-07-31T22:07:49.701Z
Learning: Applies to scripts/modules/commands.js : Suggest non-destructive alternatives when appropriate, explaining the difference between deletion and status changes, and include examples of alternative commands.
Applied to files:
apps/extension/package.json
📚 Learning: applies to scripts/modules/ai-services.js : features that use ai models belong in 'scripts/modules/a...
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/ai-services.js : Features that use AI models belong in 'scripts/modules/ai-services.js'.
Applied to files:
apps/extension/package.json
📚 Learning: applies to scripts/modules/commands.js : follow established naming conventions for task files, such ...
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/commands.mdc:0-0
Timestamp: 2025-07-31T22:07:49.701Z
Learning: Applies to scripts/modules/commands.js : Follow established naming conventions for task files, such as task_001.txt.
Applied to files:
apps/extension/package.json
📚 Learning: applies to mcp-server/src/tools/*.js : use camelcase with tool suffix for tool registration function...
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/mcp.mdc:0-0
Timestamp: 2025-07-18T17:11:36.732Z
Learning: Applies to mcp-server/src/tools/*.js : Use camelCase with Tool suffix for tool registration functions in mcp-server/src/tools/.
Applied to files:
apps/extension/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:
apps/extension/package.json
📚 Learning: applies to scripts/modules/task-manager/**/*.js : do not call ai-specific getters (like `getmainmode...
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/task-manager/**/*.js : Do not call AI-specific getters (like `getMainModelId`, `getMainMaxTokens`) from core logic functions in `scripts/modules/task-manager/*`; instead, pass the `role` to the unified AI service.
Applied to files:
apps/extension/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:
apps/extension/package.json
📚 Learning: applies to scripts/modules/task-manager.js : subtasks must use consistent properties, maintain simpl...
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.
Applied to files:
apps/extension/package.json
📚 Learning: use `task-master fix-dependencies` to find and fix all invalid dependencies in tasks.json and task f...
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 fix-dependencies` to find and fix all invalid dependencies in tasks.json and task files.
Applied to files:
apps/extension/package.json
📚 Learning: monitor code review comments, track common development questions, update rules after major refactors...
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: assets/.windsurfrules:0-0
Timestamp: 2025-07-18T17:19:27.365Z
Learning: Monitor code review comments, track common development questions, update rules after major refactors, add links to relevant documentation, and cross-reference related rules.
Applied to files:
apps/extension/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:
apps/extension/package.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:
apps/extension/package.json
📚 Learning: in the claude task master system, core task-manager functions are designed with fallback mechanisms ...
Learnt from: Crunchyman-ralph
PR: eyaltoledano/claude-task-master#943
File: scripts/modules/task-manager/move-task.js:24-24
Timestamp: 2025-07-18T05:38:17.352Z
Learning: In the Claude Task Master system, core task-manager functions are designed with fallback mechanisms for missing projectRoot parameters using the pattern `const projectRoot = providedProjectRoot || findProjectRoot();`. The readJSON and writeJSON functions have default parameters (projectRoot = null, tag = null) and handle missing parameters gracefully. Adding strict validation to these core functions would break the established flexible architecture pattern.
Applied to files:
apps/extension/package.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:
apps/extension/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:
apps/extension/package.json
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: assets/.windsurfrules:0-0
Timestamp: 2025-07-18T17:19:27.365Z
Learning: Start new projects by running `task-master init` or `node scripts/dev.js parse-prd --input=<prd-file.txt>` to generate the initial tasks.json.
apps/extension/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:
apps/extension/package.json
🪛 YAMLlint (1.37.1)
.github/workflows/version.yml
[warning] 3-3: truthy value should be one of [false, true]
(truthy)
[error] 62-62: no new line character at the end of file
(new-line-at-end-of-file)
[error] 62-62: trailing spaces
(trailing-spaces)
.github/workflows/extension-ci.yml
[warning] 3-3: truthy value should be one of [false, true]
(truthy)
[error] 143-143: too many blank lines (1 > 0)
(empty-lines)
🪛 actionlint (1.7.7)
.github/workflows/extension-release.yml
192-192: property "create_release" is not defined in object type {vsix-info: {conclusion: string; outcome: string; outputs: {string => string}}}
(expression)
|
|
||
| # VS Code extension test files | ||
| .vscode-test/ | ||
| apps/extension/.vscode-test/ | ||
|
|
||
| # apps/extension | ||
| apps/extension/vsix-build/ No newline at end of file |
There was a problem hiding this comment.
🧹 Nitpick (assertive)
Add terminal newline & avoid overlapping ignore patterns
The added ignore block lacks a terminating newline and duplicates the existing .vscode-test/ rule at Line 92.
Keeping a final newline and collapsing identical patterns avoids spurious diff noise.
# VS Code extension test files
.vscode-test/
-apps/extension/.vscode-test/
-
-# apps/extension
-apps/extension/vsix-build/
+apps/extension/.vscode-test/
+
+# apps/extension
+apps/extension/vsix-build/
+Committable suggestion skipped: line range outside the PR's diff.
🤖 Prompt for AI Agents
In the .gitignore file around lines 90 to 96, remove the duplicate .vscode-test/
ignore pattern to avoid redundancy and add a newline at the end of the file to
ensure proper formatting and prevent spurious diff noise.
There was a problem hiding this comment.
Actionable comments posted: 1
♻️ Duplicate comments (7)
.github/workflows/extension-release.yml (3)
11-11: Use explicit concurrency object for better clarity.The simple concurrency string works but an explicit object format is clearer and safer.
-concurrency: extension-release-${{ github.ref }} +concurrency: + group: extension-release-${{ github.ref }} + cancel-in-progress: true
137-137: Fix trailing spaces and add newline at end of file.The file has formatting issues including trailing spaces and missing newline at the end.
Apply these formatting fixes:
- Remove trailing spaces from line 101
- Add a newline at the end of the file
92-116: Fix missing step ID for create-release action.The
upload-release-assetstep referencessteps.create_release.outputs.upload_urlbut thecreate-releasestep lacks anid, causing the reference to be undefined and the workflow to fail.- name: Create GitHub Release + id: create_release uses: actions/create-release@v1.github/workflows/extension-ci.yml (1)
143-143: Remove extra blank line at end of file.There's an unnecessary blank line at the end of the file that should be removed for consistency.
retention-days: 30 -apps/extension/package.publish.json (3)
6-6: Placeholder publisher ID still present.
Same issue previously flagged – replace"Hamster"with your registered publisher handle.
11-43: Keyword list remains excessively broad – prune to avoid marketplace rejection.
131-137: Duplicate timeout properties create ambiguity (taskmaster.mcp.requestTimeoutMsvstaskmaster.performance.requestTimeoutMs).Also applies to: 185-191
📜 Review details
Configuration used: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro
⛔ Files ignored due to path filters (1)
apps/extension/assets/icon.pngis excluded by!**/*.png
📒 Files selected for processing (6)
.github/scripts/release.sh(1 hunks).github/scripts/tag-extension.mjs(1 hunks).github/workflows/extension-ci.yml(1 hunks).github/workflows/extension-release.yml(1 hunks).github/workflows/release.yml(2 hunks)apps/extension/package.publish.json(1 hunks)
🧰 Additional context used
🧠 Learnings (71)
📓 Common learnings
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: Monitor code review comments for continuous improvement
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: 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.
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: assets/.windsurfrules:0-0
Timestamp: 2025-07-18T17:19:27.365Z
Learning: Monitor code review comments, track common development questions, update rules after major refactors, add links to relevant documentation, and cross-reference related rules.
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.
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).
Learnt from: Crunchyman-ralph
PR: eyaltoledano/claude-task-master#997
File: apps/extension/package.publish.json:2-8
Timestamp: 2025-07-31T20:49:04.638Z
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.
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.
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: 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.
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/glossary.mdc:0-0
Timestamp: 2025-07-18T17:10:53.657Z
Learning: Guidelines for integrating AI usage telemetry across Task Master (telemetry.mdc).
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: assets/.windsurfrules:0-0
Timestamp: 2025-07-18T17:19:27.365Z
Learning: Generate task files with `task-master generate` after updating tasks.json.
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).
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.
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.
📚 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:
.github/workflows/release.yml.github/scripts/release.sh.github/workflows/extension-release.yml
📚 Learning: applies to scripts/modules/*.js : default to current tag when not specified, support explicit tag se...
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 : Default to current tag when not specified, support explicit tag selection in advanced features, validate tag existence before operations, and provide clear messaging about tag context.
Applied to files:
.github/scripts/release.sh.github/scripts/tag-extension.mjs
📚 Learning: applies to scripts/modules/*.js : ensure new features work with existing projects seamlessly, suppor...
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 : Ensure new features work with existing projects seamlessly, supporting both legacy and tagged task data formats, and support silent migration during feature usage.
Applied to files:
.github/scripts/release.sh.github/scripts/tag-extension.mjs
📚 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:
.github/scripts/release.sh
📚 Learning: applies to scripts/modules/* : every command that reads or writes tasks.json must be tag-aware...
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/tags.mdc:0-0
Timestamp: 2025-07-18T17:13:30.188Z
Learning: Applies to scripts/modules/* : Every command that reads or writes tasks.json must be tag-aware
Applied to files:
.github/scripts/release.sh.github/scripts/tag-extension.mjs
📚 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:
.github/scripts/release.sh
📚 Learning: applies to scripts/modules/commands.js : implement version checking to notify users of available upd...
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/commands.mdc:0-0
Timestamp: 2025-07-31T22:07:49.716Z
Learning: Applies to scripts/modules/commands.js : Implement version checking to notify users of available updates, use non-blocking version checks, and display update notifications after command completion.
Applied to files:
.github/scripts/release.sh.github/workflows/extension-release.yml
📚 Learning: applies to scripts/modules/commands.js : all new user-facing commands should be added to 'scripts/mo...
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/commands.js : All new user-facing commands should be added to 'scripts/modules/commands.js'.
Applied to files:
.github/scripts/release.sh
📚 Learning: applies to scripts/modules/*.js : ensure new features trigger migration when needed, handle migratio...
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 : Ensure new features trigger migration when needed, handle migration errors gracefully, test feature behavior with pre-migration projects, and do not assume projects are already migrated.
Applied to files:
.github/scripts/release.sh
📚 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.638Z
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:
.github/scripts/release.sh.github/scripts/tag-extension.mjs.github/workflows/extension-ci.yml.github/workflows/extension-release.ymlapps/extension/package.publish.json
📚 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:
.github/scripts/tag-extension.mjs
📚 Learning: applies to scripts/modules/task-manager.js : use tag resolution functions to maintain backward compa...
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 tag resolution functions to maintain backward compatibility, returning legacy format to core functions and not exposing the tagged structure to existing core logic.
Applied to files:
.github/scripts/tag-extension.mjs
📚 Learning: applies to scripts/modules/task-manager.js : generate task files from the current tag context, inclu...
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 : Generate task files from the current tag context, include tag information in generated files, and do not mix tasks from different tags in file generation.
Applied to files:
.github/scripts/tag-extension.mjs
📚 Learning: applies to scripts/modules/*.js : when implementing core logic for new features, do so in 'scripts/m...
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 : When implementing core logic for new features, do so in 'scripts/modules/' before CLI or MCP interfaces, and design functions to work with both legacy and tagged data formats using tag resolution functions.
Applied to files:
.github/scripts/tag-extension.mjs
📚 Learning: applies to scripts/modules/* : do not hard-code tag resolution (e.g., const tag = options.tag || 'ma...
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/tags.mdc:0-0
Timestamp: 2025-07-18T17:13:30.188Z
Learning: Applies to scripts/modules/* : Do not hard-code tag resolution (e.g., const tag = options.tag || 'master';); always use getCurrentTag
Applied to files:
.github/scripts/tag-extension.mjs
📚 Learning: applies to scripts/modules/* : all command files must import getcurrenttag from utils.js...
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/tags.mdc:0-0
Timestamp: 2025-07-18T17:13:30.188Z
Learning: Applies to scripts/modules/* : All command files must import getCurrentTag from utils.js
Applied to files:
.github/scripts/tag-extension.mjs
📚 Learning: applies to **/*.{test,spec}.{js,ts,jsx,tsx} : create a test file if needed and ensure all tests pass...
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: Applies to **/*.{test,spec}.{js,ts,jsx,tsx} : Create a test file if needed and ensure all tests pass before completing a task
Applied to files:
.github/scripts/tag-extension.mjs.github/workflows/extension-ci.yml.github/workflows/extension-release.yml
📚 Learning: applies to scripts/modules/**/*.test.js : test core logic independently with both data formats, mock...
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 core logic independently with both data formats, mock file system operations, test tag resolution behavior, and verify migration compatibility in unit tests.
Applied to files:
.github/scripts/tag-extension.mjs
📚 Learning: applies to scripts/modules/* : all commands must resolve the tag using the pattern: options.tag || g...
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/tags.mdc:0-0
Timestamp: 2025-07-18T17:13:30.188Z
Learning: Applies to scripts/modules/* : All commands must resolve the tag using the pattern: options.tag || getCurrentTag(projectRoot) || 'master'
Applied to files:
.github/scripts/tag-extension.mjs
📚 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:
.github/workflows/extension-ci.yml
📚 Learning: applies to .cursor/rules/** : do not add a changeset for changes only to files within `.cursor/rules...
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 .cursor/rules/** : Do not add a changeset for changes only to files within `.cursor/rules/` that solely guide internal development practices for this specific repository.
Applied to files:
.github/workflows/extension-ci.yml
📚 Learning: test commits should be separated and use the format: test(task-x): add comprehensive tests for [feat...
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: Test commits should be separated and use the format: test(task-X): Add comprehensive tests for [feature], with a detailed body
Applied to files:
.github/workflows/extension-ci.yml
📚 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:
.github/workflows/extension-ci.yml.github/workflows/extension-release.ymlapps/extension/package.publish.json
📚 Learning: applies to tests/{unit,integration,e2e}/**/*.test.js : mock console output and verify correct format...
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 : Mock console output and verify correct formatting in UI function tests. Use flexible assertions like toContain() or toMatch() for formatted output.
Applied to files:
.github/workflows/extension-ci.yml
📚 Learning: when tests are added or modified, commit them separately with a descriptive message...
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: When tests are added or modified, commit them separately with a descriptive message
Applied to files:
.github/workflows/extension-ci.yml
📚 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:
.github/workflows/extension-ci.yml
📚 Learning: applies to **/*.test.js : maintain test fixtures separate from test logic....
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 : Maintain test fixtures separate from test logic.
Applied to files:
.github/workflows/extension-ci.yml
📚 Learning: guidelines for implementing and maintaining tests for task master cli (tests.mdc)....
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 implementing and maintaining tests for Task Master CLI (tests.mdc).
Applied to files:
.github/workflows/extension-ci.yml
📚 Learning: applies to tests/{unit,integration,e2e}/**/*.test.js : explicitly handle all options, including defa...
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 : Explicitly handle all options, including defaults and shorthand flags (e.g., -p for --prompt), and include null/undefined checks in test implementations for parameters that might be optional.
Applied to files:
.github/workflows/extension-ci.yml
📚 Learning: applies to **/*.test.js : verify file operations use the correct paths in expect statements....
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 : Verify file operations use the correct paths in expect statements.
Applied to files:
.github/workflows/extension-ci.yml.github/workflows/extension-release.yml
📚 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:
.github/workflows/extension-release.ymlapps/extension/package.publish.json
📚 Learning: applies to scripts/modules/commands.js : use path.join() to construct file paths, follow established...
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/commands.mdc:0-0
Timestamp: 2025-07-18T17:08:48.695Z
Learning: Applies to scripts/modules/commands.js : Use path.join() to construct file paths, follow established naming conventions (like task_001.txt), check file existence before deletion, and handle file deletion errors gracefully.
Applied to files:
.github/workflows/extension-release.yml
📚 Learning: for changeset files (.changeset/*.md), avoid suggesting punctuation for bullet points as the project...
Learnt from: Crunchyman-ralph
PR: eyaltoledano/claude-task-master#1035
File: .changeset/quiet-rabbits-bathe.md:5-10
Timestamp: 2025-07-23T16:03:42.784Z
Learning: For changeset files (.changeset/*.md), avoid suggesting punctuation for bullet points as the project intentionally omits punctuation to make the generated changelog feel more natural.
Applied to files:
.github/workflows/extension-release.yml
📚 Learning: update references to external docs...
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: Update references to external docs
Applied to files:
.github/workflows/extension-release.yml
📚 Learning: applies to mcp-server/src/core/direct-functions/*.js : use path.join() instead of string concatenati...
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/mcp.mdc:0-0
Timestamp: 2025-07-18T17:11:36.732Z
Learning: Applies to mcp-server/src/core/direct-functions/*.js : Use path.join() instead of string concatenation for file paths, and follow established file naming conventions (e.g., 'task_001.txt') in direct functions.
Applied to files:
.github/workflows/extension-release.yml
📚 Learning: applies to scripts/modules/commands.js : use consistent patterns for option naming and help text in ...
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/commands.js : Use consistent patterns for option naming and help text in CLI commands.
Applied to files:
.github/workflows/extension-release.yml
📚 Learning: when resolving code conflicts, use standard git conflict resolution commands and ensure all conflict...
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: When resolving code conflicts, use standard Git conflict resolution commands and ensure all conflicts are resolved before continuing
Applied to files:
.github/workflows/extension-release.yml
📚 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:
apps/extension/package.publish.json
📚 Learning: applies to tasks.json : use the `tasks.json` file (generated by taskmaster) to store the project's t...
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 tasks.json : Use the `tasks.json` file (generated by Taskmaster) to store the project's task list, including tags and task structures.
Applied to files:
apps/extension/package.publish.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:
apps/extension/package.publish.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:
apps/extension/package.publish.json
📚 Learning: generate task files with `task-master generate` after updating tasks.json....
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: assets/.windsurfrules:0-0
Timestamp: 2025-07-18T17:19:27.365Z
Learning: Generate task files with `task-master generate` after updating tasks.json.
Applied to files:
apps/extension/package.publish.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:12.881Z
Learning: Applies to .taskmaster/config.json : Store Taskmaster configuration settings (AI model selections, parameters, logging level, default subtasks/priority, project name, etc.) in the `.taskmaster/config.json` file located in the project root directory. Do not configure non-API key settings via environment variables.
Applied to files:
apps/extension/package.publish.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:
apps/extension/package.publish.json
📚 Learning: applies to .taskmaster/config.json : do not manually edit `.taskmaster/config.json` unless you are c...
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/config.json : Do not manually edit `.taskmaster/config.json` unless you are certain of the changes; use the `task-master models` command or `models` MCP tool for configuration.
Applied to files:
apps/extension/package.publish.json
📚 Learning: applies to .cursor/mcp.json.example : add the new provider_api_key with its placeholder to the env s...
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/ai_providers.mdc:0-0
Timestamp: 2025-07-18T17:06:04.909Z
Learning: Applies to .cursor/mcp.json.example : Add the new PROVIDER_API_KEY with its placeholder to the env section for taskmaster-ai in .cursor/mcp.json.example.
Applied to files:
apps/extension/package.publish.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:
apps/extension/package.publish.json
📚 Learning: applies to scripts/modules/task-manager.js : subtasks must use consistent properties, maintain simpl...
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.
Applied to files:
apps/extension/package.publish.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:
apps/extension/package.publish.json
📚 Learning: applies to scripts/modules/task-manager/**/*.js : do not call ai-specific getters (like `getmainmode...
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/task-manager/**/*.js : Do not call AI-specific getters (like `getMainModelId`, `getMainMaxTokens`) from core logic functions in `scripts/modules/task-manager/*`; instead, pass the `role` to the unified AI service.
Applied to files:
apps/extension/package.publish.json
📚 Learning: use `task-master fix-dependencies` to find and fix all invalid dependencies in tasks.json and task f...
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 fix-dependencies` to find and fix all invalid dependencies in tasks.json and task files.
Applied to files:
apps/extension/package.publish.json
📚 Learning: use `task-master validate-dependencies` to check for and identify invalid dependencies in tasks.json...
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 validate-dependencies` to check for and identify invalid dependencies in tasks.json and task files.
Applied to files:
apps/extension/package.publish.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:
apps/extension/package.publish.json
📚 Learning: monitor code review comments, track common development questions, update rules after major refactors...
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: assets/.windsurfrules:0-0
Timestamp: 2025-07-18T17:19:27.365Z
Learning: Monitor code review comments, track common development questions, update rules after major refactors, add links to relevant documentation, and cross-reference related rules.
Applied to files:
apps/extension/package.publish.json
📚 Learning: monitor code review comments for continuous improvement...
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: Monitor code review comments for continuous improvement
Applied to files:
apps/extension/package.publish.json
📚 Learning: add new rules when code reviews repeatedly mention the same feedback...
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: Add new rules when code reviews repeatedly mention the same feedback
Applied to files:
apps/extension/package.publish.json
📚 Learning: pull request descriptions must use the provided template, including task overview, subtasks complete...
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
Applied to files:
apps/extension/package.publish.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:
apps/extension/package.publish.json
📚 Learning: add new rules when a new technology or pattern is used in 3+ files, common bugs could be prevented, ...
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: assets/.windsurfrules:0-0
Timestamp: 2025-07-18T17:19:27.365Z
Learning: Add new rules when a new technology or pattern is used in 3+ files, common bugs could be prevented, code reviews repeatedly mention the same feedback, or new security/performance patterns emerge.
Applied to files:
apps/extension/package.publish.json
📚 Learning: track common development questions for continuous improvement...
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: Track common development questions for continuous improvement
Applied to files:
apps/extension/package.publish.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:
apps/extension/package.publish.json
📚 Learning: applies to .taskmaster/config.json : do not manually edit the .taskmaster/config.json file; always u...
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/taskmaster.mdc:0-0
Timestamp: 2025-07-31T22:08:16.039Z
Learning: Applies to .taskmaster/config.json : Do not manually edit the .taskmaster/config.json file; always use the provided CLI or MCP tools for configuration changes.
Applied to files:
apps/extension/package.publish.json
📚 Learning: applies to .taskmaster/config.json : do not manually edit the .taskmaster/config.json file. use the ...
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/taskmaster.mdc:0-0
Timestamp: 2025-07-31T22:08:16.039Z
Learning: Applies to .taskmaster/config.json : Do not manually edit the .taskmaster/config.json file. Use the included commands either in the MCP or CLI format as needed. Always prioritize MCP tools when available and use the CLI as a fallback.
Applied to files:
apps/extension/package.publish.json
📚 Learning: applies to scripts/modules/task-manager/*.js : do not fetch ai-specific parameters (model id, max to...
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/ai_services.mdc:0-0
Timestamp: 2025-07-18T17:06:57.833Z
Learning: Applies to scripts/modules/task-manager/*.js : Do not fetch AI-specific parameters (model ID, max tokens, temp) using `config-manager.js` getters for the AI call. Pass the `role` instead.
Applied to files:
apps/extension/package.publish.json
📚 Learning: applies to .taskmaster/config.json : all other taskmaster settings (model choice, max tokens, temper...
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/taskmaster.mdc:0-0
Timestamp: 2025-07-31T22:08:16.039Z
Learning: Applies to .taskmaster/config.json : All other Taskmaster settings (model choice, max tokens, temperature, log level, custom endpoints) are managed in .taskmaster/config.json via the task-master models command or models MCP tool.
Applied to files:
apps/extension/package.publish.json
📚 Learning: applies to scripts/modules/task-manager/*.js : do not initialize ai clients (anthropic, perplexity, ...
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/ai_services.mdc:0-0
Timestamp: 2025-07-18T17:06:57.833Z
Learning: Applies to scripts/modules/task-manager/*.js : Do not initialize AI clients (Anthropic, Perplexity, etc.) directly within core logic (`task-manager/`) or MCP direct functions.
Applied to files:
apps/extension/package.publish.json
📚 Learning: applies to scripts/modules/task-manager/*.js : do not implement fallback or retry logic outside `ai-...
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: .cursor/rules/ai_services.mdc:0-0
Timestamp: 2025-07-18T17:06:57.833Z
Learning: Applies to scripts/modules/task-manager/*.js : Do not implement fallback or retry logic outside `ai-services-unified.js`.
Applied to files:
apps/extension/package.publish.json
📚 Learning: pull request titles must follow the format: task : ...
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>
Applied to files:
apps/extension/package.publish.json
📚 Learning: import task master's development workflow commands and guidelines, treat as if import is in the main...
Learnt from: CR
PR: eyaltoledano/claude-task-master#0
File: CLAUDE.md:0-0
Timestamp: 2025-07-31T22:07:14.034Z
Learning: Import Task Master's development workflow commands and guidelines, treat as if import is in the main CLAUDE.md file.
Applied to files:
apps/extension/package.publish.json
📚 Learning: applies to scripts/modules/task-manager.js : each task object must include all required properties (...
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 : Each task object must include all required properties (id, title, description, status, dependencies, priority, details, testStrategy, subtasks) and provide default values for optional properties. Extra properties not in the standard schema must not be added.
Applied to files:
apps/extension/package.publish.json
🪛 YAMLlint (1.37.1)
.github/workflows/extension-ci.yml
[warning] 3-3: truthy value should be one of [false, true]
(truthy)
[error] 143-143: too many blank lines (1 > 0)
(empty-lines)
.github/workflows/extension-release.yml
[warning] 3-3: truthy value should be one of [false, true]
(truthy)
[error] 101-101: trailing spaces
(trailing-spaces)
[error] 137-137: no new line character at the end of file
(new-line-at-end-of-file)
🪛 actionlint (1.7.7)
.github/workflows/extension-release.yml
113-113: property "create_release" is not defined in object type {vsix-info: {conclusion: string; outcome: string; outputs: {string => string}}}
(expression)
🔇 Additional comments (7)
.github/workflows/release.yml (2)
9-12: LGTM - Appropriate permissions for release workflow.The explicit permissions configuration is well-defined and follows security best practices by granting only the necessary permissions for the release workflow operations.
47-47: LGTM - Custom release script provides better control.The change from
npm run releaseto a custom shell script enables more sophisticated release automation, particularly for coordinating extension tagging with changeset publishing..github/scripts/release.sh (1)
1-15: LGTM - Well-structured release automation script.The script follows good practices with proper error handling, clear documentation, and a logical flow that prevents changeset from attempting to publish the private extension package by tagging it first.
.github/scripts/tag-extension.mjs (3)
1-10: LGTM - Clean ES modules setup.The imports use the recommended
node:prefix for built-in modules and properly handle the ES modules equivalent of__dirname.
11-33: LGTM - Robust file reading with proper error handling.The file reading logic properly handles both extension and root package.json files with clear error messages and appropriate failure handling.
35-77: LGTM - Comprehensive tag management with proper validation.The script effectively validates required fields, checks for existing tags, and handles Git operations with appropriate error handling. The tag format
${pkg.name}@${pkg.version}is consistent with standard versioning practices..github/workflows/extension-ci.yml (1)
1-142: LGTM - Well-structured CI workflow with efficient design.The workflow demonstrates good practices with:
- Path-based filtering for efficient triggers
- Proper job dependencies and caching strategy
- Separation of concerns across setup, typecheck, and build jobs
- Comprehensive build verification and artifact upload
There was a problem hiding this comment.
Actionable comments posted: 1
♻️ Duplicate comments (14)
apps/extension/src/components/TaskDetails/DetailsSection.tsx (2)
9-149: Replace custom markdown parser with standard library to eliminate duplication.This custom markdown parsing implementation duplicates similar logic found elsewhere in the codebase and should be replaced with a proper markdown library like
react-markdownfor better maintainability, security, and feature completeness.
168-168: Improve CSS class name generation for robustness.The current string manipulation for generating CSS class names is fragile and doesn't handle special characters or edge cases properly. Consider using a utility function for safe class name generation.
apps/extension/src/components/ConfigView.tsx (1)
69-85: Consider moving static configuration outside component.The
modelLabelsobject is static and could be moved outside the component to avoid recreation on every render.+const modelLabels = { + main: { + label: 'Main Model', + icon: '🤖', + description: 'Primary model for task generation' + }, + research: { + label: 'Research Model', + icon: '🔍', + description: 'Model for research-backed operations' + }, + fallback: { + label: 'Fallback Model', + icon: '🔄', + description: 'Backup model if primary fails' + } +}; export const ConfigView: React.FC<ConfigViewProps> = ({ sendMessage, onNavigateBack }) => { - const modelLabels = { - main: { - label: 'Main Model', - icon: '🤖', - description: 'Primary model for task generation' - }, - research: { - label: 'Research Model', - icon: '🔍', - description: 'Model for research-backed operations' - }, - fallback: { - label: 'Fallback Model', - icon: '🔄', - description: 'Backup model if primary fails' - } - };apps/extension/esbuild.js (1)
32-63: Consider optimizing file system operations in alias plugin.The alias plugin correctly handles path resolution for @/ imports, but uses synchronous file system operations which could potentially slow down builds.
Consider caching extension checks or using a more efficient approach:
const aliasPlugin = { name: 'alias', setup(build) { + const fs = require('fs'); + const extensions = ['.tsx', '.ts', '.jsx', '.js']; + build.onResolve({ filter: /^@\// }, (args) => { const resolvedPath = path.resolve(__dirname, 'src', args.path.slice(2)); - - // Try to resolve with common TypeScript extensions - const fs = require('fs'); - const extensions = ['.tsx', '.ts', '.jsx', '.js'];Moving the imports outside the resolver function improves performance by avoiding repeated require() calls.
apps/extension/src/webview/reducers/appReducer.ts (1)
32-49: Consider adding defensive checks for task existence.The task update actions are well-implemented with proper immutability patterns. However, consider adding defensive checks to handle cases where the task ID might not exist.
case 'UPDATE_TASK_STATUS': { const { taskId, newStatus } = action.payload; + const taskExists = state.tasks.some(task => task.id === taskId); + if (!taskExists) { + logger.warn('UPDATE_TASK_STATUS: Task not found:', taskId); + return state; + } return { ...state, tasks: state.tasks.map((task) => task.id === taskId ? { ...task, status: newStatus } : task ) }; }apps/extension/src/services/task-repository.ts (2)
59-112: Consider refactoring duplicated search logic.The method properly handles both main tasks and subtasks with multiple ID formats, but the search logic is duplicated between cache and fresh data sections.
+ private findTaskInList(tasks: Task[], taskId: string): Task | null { + for (const task of tasks) { + if (task.id === taskId) { + return task; + } + // Check subtasks + if (task.subtasks) { + for (const subtask of task.subtasks) { + if ( + subtask.id.toString() === taskId || + `${task.id}.${subtask.id}` === taskId + ) { + return { + ...subtask, + id: subtask.id.toString(), + description: subtask.description || '', + status: (subtask.status || 'pending') as TaskMasterTask['status'], + priority: 'medium' as const, + dependencies: subtask.dependencies?.map(d => d.toString()) || [] + }; + } + } + } + } + return null; + } async getById(taskId: string): Promise<Task | null> { // First check cache if (this.cache) { - // Handle both main tasks and subtasks - for (const task of this.cache) { - if (task.id === taskId) { - return task; - } - // Check subtasks - if (task.subtasks) { - for (const subtask of task.subtasks) { - if ( - subtask.id.toString() === taskId || - `${task.id}.${subtask.id}` === taskId - ) { - return { - ...subtask, - id: subtask.id.toString(), - description: subtask.description || '', - status: (subtask.status || 'pending') as TaskMasterTask['status'], - priority: 'medium' as const, - dependencies: subtask.dependencies?.map(d => d.toString()) || [] - }; - } - } - } - } + const found = this.findTaskInList(this.cache, taskId); + if (found) return found; } // If not in cache, fetch all and search const tasks = await this.getAll(); - for (const task of tasks) { - if (task.id === taskId) { - return task; - } - // Check subtasks - if (task.subtasks) { - for (const subtask of task.subtasks) { - if (subtask.id.toString() === taskId || `${task.id}.${subtask.id}` === taskId) { - return { - ...subtask, - id: subtask.id.toString(), - description: subtask.description || '', - status: (subtask.status || 'pending') as TaskMasterTask['status'], - priority: 'medium' as const, - dependencies: subtask.dependencies?.map(d => d.toString()) || [] - }; - } - } - } - } - - return null; + return this.findTaskInList(tasks, taskId); }
133-133: Improve type safety for updateContent method.The
updatesparameter usesanytype, which reduces type safety.Consider using a more specific type:
- async updateContent(taskId: string, updates: any): Promise<void> { + async updateContent(taskId: string, updates: Partial<Task>): Promise<void> {apps/extension/src/services/error-handler.ts (3)
35-39: Consider implementing singleton pattern for ErrorHandler.Based on the usage patterns and the AI summary mentioning this should be a singleton, the ErrorHandler should implement the singleton pattern to ensure consistent error tracking across the extension.
export class ErrorHandler { + private static instance: ErrorHandler | null = null; private errorLog: Map<string, ErrorContext> = new Map(); private errorId = 0; - constructor(private logger: ExtensionLogger) {} + private constructor(private logger: ExtensionLogger) {} + + static getInstance(logger?: ExtensionLogger): ErrorHandler { + if (!ErrorHandler.instance) { + if (!logger) { + throw new Error('Logger must be provided when creating ErrorHandler instance'); + } + ErrorHandler.instance = new ErrorHandler(logger); + } + return ErrorHandler.instance; + }
44-55: Automatically trigger error log cleanup.The
clearOldErrorsmethod is never called automatically. Consider calling it periodically or after each error is added.handleError(context: ErrorContext): string { const errorId = `error_${++this.errorId}`; this.errorLog.set(errorId, context); + // Clean up old errors if log is getting large + if (this.errorLog.size > 150) { + this.clearOldErrors(); + } + // Log to extension logger this.logError(context);
298-298: Correct extension ID in getExtension callThe published extension's manifest (
apps/extension/package.publish.json) uses"publisher": "Hamster", "name": "task-master-hamster"so the full VS Code extension ID is
Hamster.task-master-hamster, notHamster.taskmaster. Update the hardcoded call and consider deriving it from package.json at build time.Suggested diff:
- `- Extension Version: ${vscode.extensions.getExtension('Hamster.taskmaster')?.packageJSON.version || 'Unknown'}`, + `- Extension Version: ${vscode.extensions.getExtension('Hamster.task-master-hamster')?.packageJSON.version || 'Unknown'}`,For better maintainability, you can import the fields directly:
import pkg from '../../package.publish.json'; const EXTENSION_ID = `${pkg.publisher}.${pkg.name}`; // … `- Extension Version: ${vscode.extensions.getExtension(EXTENSION_ID)?.packageJSON.version || 'Unknown'}`,apps/extension/package.json (4)
13-15: Add mandatoryactivationEventsto passvscevalidation
vsce packagerejects manifests without anactivationEventsarray.
Insert a top-level field with the commands or other events that trigger activation."main": "./dist/extension.js", + "activationEvents": [ + "onCommand:tm.showKanbanBoard", + "onCommand:tm.checkConnection", + "onCommand:tm.reconnect", + "onCommand:tm.openSettings" + ], "contributes": {
12-12: Replace unsupported marketplace categories
"AI","Visualization"and"Education"are not in the official list accepted by the VS Code Marketplace. Keep valid ones only (e.g."Other"or a suitable allowed value).- "categories": ["AI", "Visualization", "Education", "Other"], + "categories": ["Other"],
3-8: Publish-blocking metadata: placeholderpublisher, missinglicenseMarketplace upload will fail until a real publisher ID is supplied and a
licenseis declared."version": "0.0.0", - "publisher": "Hamster", + "publisher": "your-publisher-id", + "license": "MIT",(Adjust the license identifier to match your actual project license.)
"private": trueis fine for monorepo safety, but remember to override it inpackage.publish.jsonif you plan to publish via npm later.
235-236:watchscript is not Windows-safeUsing
&runs only on POSIX shells. You already depend onnpm-run-all; switch to it for cross-platform parallelism.- "watch": "npm run watch:js & npm run watch:css", + "watch": "npm-run-all --parallel watch:js watch:css",
| /** | ||
| * Priority Badge Component | ||
| */ | ||
|
|
||
| import React from 'react'; | ||
| import { Badge } from '@/components/ui/badge'; | ||
| import type { TaskMasterTask } from '../types'; | ||
|
|
||
| interface PriorityBadgeProps { | ||
| priority: TaskMasterTask['priority']; | ||
| } | ||
|
|
||
| export const PriorityBadge: React.FC<PriorityBadgeProps> = ({ priority }) => { | ||
| if (!priority) return null; | ||
|
|
||
| const variants = { | ||
| high: 'destructive' as const, | ||
| medium: 'default' as const, | ||
| low: 'secondary' as const | ||
| }; | ||
|
|
||
| return ( | ||
| <Badge | ||
| variant={variants[priority] || 'secondary'} | ||
| className="text-xs font-normal px-2 py-0.5" | ||
| > | ||
| {priority} | ||
| </Badge> | ||
| ); | ||
| }; |
There was a problem hiding this comment.
💡 Verification agent
🧩 Analysis chain
Resolve code duplication with existing PriorityBadge component.
There's already a PriorityBadge component at apps/extension/src/components/TaskDetails/PriorityBadge.tsx that serves the same purpose but uses inline styles. Having two components with identical functionality creates maintenance overhead and potential inconsistencies.
Consider consolidating these into a single, reusable component. The current implementation using the Badge component with variants is cleaner and more maintainable than the inline styles approach.
🏁 Script executed:
#!/bin/bash
# Search for all PriorityBadge component usages to understand the impact
rg -A 3 "PriorityBadge" --type tsx --type tsLength of output: 72
🏁 Script executed:
#!/bin/bash
# Search for all PriorityBadge definitions and usages in .tsx and .ts files
rg -n "PriorityBadge" --glob '*.tsx' --glob '*.ts'Length of output: 827
🏁 Script executed:
#!/bin/bash
# Display the existing PriorityBadge implementation for comparison
sed -n '1,200p' apps/extension/src/components/TaskDetails/PriorityBadge.tsxLength of output: 1438
Consolidate duplicate PriorityBadge implementations
There are two separate PriorityBadge components with identical intent but differing implementations—one using the shared Badge variants and one with inline styles—leading to maintenance overhead and inconsistent UI. Please unify these into a single component that both contexts consume.
• Files to reconcile:
apps/extension/src/components/TaskDetails/PriorityBadge.tsx(inline‐style version)apps/extension/src/webview/components/PriorityBadge.tsx(usesBadgevariants)
Recommended approach:
- Extract a single
PriorityBadgeinto a shared location (e.g.@/components/ui/PriorityBadge.tsx). - Port the preferred styling approach (variant-based or theme-adaptive) into that file.
- Update both import sites (
TaskMetadataSidebar.tsx,TaskCard.tsx, etc.) to use the unified component. - Remove the duplicate file.
This will ensure a consistent look and simplify future updates.
🤖 Prompt for AI Agents
In apps/extension/src/webview/components/PriorityBadge.tsx lines 1 to 30, there
are two separate PriorityBadge components with duplicate functionality but
different styles causing maintenance issues. To fix this, create a single
PriorityBadge component in a shared location like
@/components/ui/PriorityBadge.tsx using the preferred variant-based styling from
the current webview version. Then update all import statements in files such as
TaskMetadataSidebar.tsx and TaskCard.tsx to import this unified component.
Finally, delete the duplicate PriorityBadge file in
apps/extension/src/components/TaskDetails to ensure consistent UI and easier
maintenance.
There was a problem hiding this comment.
Actionable comments posted: 2
🔭 Outside diff range comments (1)
apps/extension/CHANGELOG.md (1)
1-2: Remove redundant CHANGELOG.md file.Since your project uses the changeset package for version management and changelog generation, this manual CHANGELOG.md file is redundant and could cause confusion. The changeset system will automatically generate the changelog during releases.
Delete this file to avoid conflicts with the automated changeset workflow.
♻️ Duplicate comments (13)
apps/extension/src/webview/reducers/appReducer.ts (1)
36-53: Consider adding defensive checks for task existence.The task update actions are well-implemented with proper immutability patterns. However, consider adding defensive checks to handle cases where the task ID might not exist.
case 'UPDATE_TASK_STATUS': { const { taskId, newStatus } = action.payload; + const taskExists = state.tasks.some(task => task.id === taskId); + if (!taskExists) { + logger.warn('UPDATE_TASK_STATUS: Task not found:', taskId); + return state; + } return { ...state, tasks: state.tasks.map((task) => task.id === taskId ? { ...task, status: newStatus } : task ) }; } case 'UPDATE_TASK_CONTENT': { const { taskId, updates } = action.payload; + const taskExists = state.tasks.some(task => task.id === taskId); + if (!taskExists) { + logger.warn('UPDATE_TASK_CONTENT: Task not found:', taskId); + return state; + } return { ...state, tasks: state.tasks.map((task) => task.id === taskId ? { ...task, ...updates } : task ) }; }apps/extension/src/components/TaskDetails/DetailsSection.tsx (2)
9-170: Duplicate markdown parsing logic - consolidate and use proper library.This markdown parser is very similar to the one in
TaskDetailsView.original.tsx, creating code duplication. Both should be replaced with a proper markdown library likereact-markdownfor better maintainability and feature completeness.Consider creating a shared
MarkdownRenderercomponent:// components/shared/MarkdownRenderer.tsx import ReactMarkdown from 'react-markdown'; export const MarkdownRenderer: React.FC<{content: string}> = ({ content }) => ( <ReactMarkdown components={{ // VS Code theme-compatible components pre: ({ children }) => ( <pre className="bg-vscode-editor-background rounded-md p-4 overflow-x-auto mb-4 border border-vscode-editor-lineHighlightBorder"> {children} </pre> ), code: ({ children }) => ( <code className="text-sm text-vscode-editor-foreground font-mono"> {children} </code> ), // Add other custom components as needed }} > {content} </ReactMarkdown> );
189-189: Improve CSS class name generation for robustness.The CSS class name generation using string manipulation may not handle all edge cases properly.
-<div className={title.toLowerCase().replace(/\s+/g, '-') + '-content'}> +<div className={`${title.toLowerCase().replace(/[^a-z0-9]+/g, '-')}-content`}>Or better yet, use a utility function for consistent class name generation:
// utils/css.ts export const generateClassName = (text: string): string => { return text .toLowerCase() .replace(/[^a-z0-9]+/g, '-') .replace(/^-+|-+$/g, ''); // Remove leading/trailing hyphens }; // Then use it: <div className={`${generateClassName(title)}-content`}>apps/extension/src/services/task-repository.ts (2)
59-117: Consider refactoring duplicated search logic.The method properly handles both main tasks and subtasks with multiple ID formats, but the search logic is duplicated between cache and fresh data sections.
+ private findTaskInList(tasks: Task[], taskId: string): Task | null { + for (const task of tasks) { + if (task.id === taskId) { + return task; + } + // Check subtasks + if (task.subtasks) { + for (const subtask of task.subtasks) { + if ( + subtask.id.toString() === taskId || + `${task.id}.${subtask.id}` === taskId + ) { + return { + ...subtask, + id: subtask.id.toString(), + description: subtask.description || '', + status: (subtask.status || 'pending') as TaskMasterTask['status'], + priority: 'medium' as const, + dependencies: subtask.dependencies?.map((d) => d.toString()) || [] + }; + } + } + } + } + return null; + } async getById(taskId: string): Promise<Task | null> { // First check cache if (this.cache) { - // Handle both main tasks and subtasks - for (const task of this.cache) { - if (task.id === taskId) { - return task; - } - // Check subtasks - if (task.subtasks) { - for (const subtask of task.subtasks) { - if ( - subtask.id.toString() === taskId || - `${task.id}.${subtask.id}` === taskId - ) { - return { - ...subtask, - id: subtask.id.toString(), - description: subtask.description || '', - status: (subtask.status || - 'pending') as TaskMasterTask['status'], - priority: 'medium' as const, - dependencies: - subtask.dependencies?.map((d) => d.toString()) || [] - }; - } - } - } - } + const found = this.findTaskInList(this.cache, taskId); + if (found) return found; } // If not in cache, fetch all and search const tasks = await this.getAll(); - for (const task of tasks) { - if (task.id === taskId) { - return task; - } - // Check subtasks - if (task.subtasks) { - for (const subtask of task.subtasks) { - if ( - subtask.id.toString() === taskId || - `${task.id}.${subtask.id}` === taskId - ) { - return { - ...subtask, - id: subtask.id.toString(), - description: subtask.description || '', - status: (subtask.status || 'pending') as TaskMasterTask['status'], - priority: 'medium' as const, - dependencies: subtask.dependencies?.map((d) => d.toString()) || [] - }; - } - } - } - } - - return null; + return this.findTaskInList(tasks, taskId); }
138-138: Improve type safety for updateContent method.The
updatesparameter usesanytype, which reduces type safety.Consider using a more specific type:
- async updateContent(taskId: string, updates: any): Promise<void> { + async updateContent(taskId: string, updates: Partial<Task>): Promise<void> {apps/extension/README.md (2)
55-59: Code-block fence is still malformedThis is the same issue previously reported: the fenced block is missing the required blank line before it, and the closing back-ticks are indented. VS Code renders it as plain text.
-If you don't have a Taskmaster project yet: -```bash -cd your-project -npm i -g task-master-ai - task-master init - ``` +If you don't have a Taskmaster project yet: + +```bash +cd your-project +npm i -g task-master-ai +task-master init +```
204-204: File still missing trailing newlineAdd a blank line after Line 204 to satisfy MD047.
apps/extension/package.publish.json (2)
12-44: Keyword list is excessively broad— risks Marketplace rejectionVS Code guidelines recommend a concise, relevant set of keywords. Listing generic terms such as
"php","python","intellicode"and vendor names provides no ranking benefit and has triggered rejections in past submissions.Trim the list to 8-12 highly relevant terms (e.g.
"kanban","task management","ai","taskmaster","mcp").
144-150: Conflicting timeout settings—clarify or deduplicate
taskmaster.mcp.requestTimeoutMs(Line 146 = 300 000 ms) andtaskmaster.performance.requestTimeoutMs(Line 200 = 30 000 ms) describe timeouts for “requests”, but with an order-of-magnitude difference.
This will confuse users and complicate support.Suggested options:
- "taskmaster.performance.requestTimeoutMs": { ... } + "taskmaster.performance.apiRequestTimeoutMs": { // renamed + "type": "number", + "default": 30000, + ... + "description": "Request timeout for Kanban API calls in milliseconds" + }or remove one property if they are truly the same.
Also applies to: 198-204
apps/extension/package.json (4)
7-9: Placeholderpublisherand missinglicensestill block marketplace submission
"publisher": "Hamster"is clearly a stub and thelicensefield is still absent, sovsce/Open VSX will reject the package."version": "0.22.3", - "publisher": "Hamster", + "publisher": "<your-publisher-id>", + "license": "MIT",
12-13: Invalid marketplace categories remain
"AI","Visualization"and"Education"are not in the official VS Code category list, causing validation failure.- "categories": ["AI", "Visualization", "Education", "Other"], + "categories": ["Other"],
236-238:watchscript is still POSIX-onlyThe
&operator breaks on Windows despitenpm-run-allbeing listed in devDeps.- "watch": "npm run watch:js & npm run watch:css", + "watch": "npm-run-all --parallel watch:js watch:css",
3-3: Re-evaluate"private": trueflagKeeping the package private prevents accidental
npm publish, but it also blocks any future plan to ship the dev manifest to an internal registry. Ensure this is intentional or add an explanatory comment.
| ### 📊 **Interactive Kanban Board** | ||
| - **Drag & Drop Interface** - Effortlessly move tasks between status columns | ||
| - **Real-time Sync** - Changes instantly reflect in your Taskmaster project files | ||
| - **Multiple Views** - Board view and detailed task sidebar | ||
| - **Smart Columns** - Pending, In Progress, Review, Done, Deferred, and Cancelled | ||
|
|
||
|  | ||
|
|
There was a problem hiding this comment.
🧹 Nitpick (assertive)
Add blank lines around heading and list for Markdown compliance
markdownlint flags MD022/MD032 because the list that starts at Line 17 is not separated from the heading on Line 16 and the image on Line 22 is jammed against the list.
Insert blank lines before the list and after the image.
-### 📊 **Interactive Kanban Board**
-- **Drag & Drop Interface** ...
-...
-
+### 📊 **Interactive Kanban Board**
+
+- **Drag & Drop Interface** ...
+...
+
+📝 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.
| ### 📊 **Interactive Kanban Board** | |
| - **Drag & Drop Interface** - Effortlessly move tasks between status columns | |
| - **Real-time Sync** - Changes instantly reflect in your Taskmaster project files | |
| - **Multiple Views** - Board view and detailed task sidebar | |
| - **Smart Columns** - Pending, In Progress, Review, Done, Deferred, and Cancelled | |
|  | |
| ### 📊 **Interactive Kanban Board** | |
| - **Drag & Drop Interface** - Effortlessly move tasks between status columns | |
| - **Real-time Sync** - Changes instantly reflect in your Taskmaster project files | |
| - **Multiple Views** - Board view and detailed task sidebar | |
| - **Smart Columns** - Pending, In Progress, Review, Done, Deferred, and Cancelled | |
|  |
🧰 Tools
🪛 markdownlint-cli2 (0.17.2)
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)
🤖 Prompt for AI Agents
In apps/extension/README.md around lines 16 to 23, add a blank line after the
heading on line 16 and before the list starting on line 17, and also add a blank
line after the image on line 22 to separate it from the list. This will fix
markdownlint errors MD022 and MD032 by ensuring proper spacing around the
heading, list, and image.
| ### **Getting Help** | ||
| - 📖 **Documentation**: [Taskmaster AI Docs](https://github.com/eyaltoledano/claude-task-master) | ||
| - 🐛 **Report Issues**: [GitHub Issues](https://github.com/eyaltoledano/claude-task-master/issues) | ||
| - 💬 **Discussions**: [GitHub Discussions](https://github.com/eyaltoledano/claude-task-master/discussions) | ||
| - 🐛 **Report Issues**: [GitHub Issues](https://github.com/eyaltoledano/claude-task-master/issues) | ||
|
|
There was a problem hiding this comment.
🧹 Nitpick (assertive)
Remove duplicate “Report Issues” bullet
Lines 155 and 157 repeat the same link.
- - 🐛 **Report Issues**: <link>
- - 💬 **Discussions**: <link>
- - 🐛 **Report Issues**: <link> ← duplicate
+ - 🐛 **Report Issues**: <link>
+ - 💬 **Discussions**: <link>📝 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.
| ### **Getting Help** | |
| - 📖 **Documentation**: [Taskmaster AI Docs](https://github.com/eyaltoledano/claude-task-master) | |
| - 🐛 **Report Issues**: [GitHub Issues](https://github.com/eyaltoledano/claude-task-master/issues) | |
| - 💬 **Discussions**: [GitHub Discussions](https://github.com/eyaltoledano/claude-task-master/discussions) | |
| - 🐛 **Report Issues**: [GitHub Issues](https://github.com/eyaltoledano/claude-task-master/issues) | |
| ### **Getting Help** | |
| - 📖 **Documentation**: [Taskmaster AI Docs](https://github.com/eyaltoledano/claude-task-master) | |
| - 🐛 **Report Issues**: [GitHub Issues](https://github.com/eyaltoledano/claude-task-master/issues) | |
| - 💬 **Discussions**: [GitHub Discussions](https://github.com/eyaltoledano/claude-task-master/discussions) |
🧰 Tools
🪛 markdownlint-cli2 (0.17.2)
153-153: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below
(MD022, blanks-around-headings)
154-154: Lists should be surrounded by blank lines
(MD032, blanks-around-lists)
🤖 Prompt for AI Agents
In apps/extension/README.md around lines 153 to 158, there is a duplicate bullet
for "Report Issues" with the same GitHub Issues link on lines 155 and 157.
Remove one of these duplicate lines to keep the list concise and avoid
repetition.
There was a problem hiding this comment.
Actionable comments posted: 6
♻️ Duplicate comments (6)
apps/extension/package.mjs (2)
22-41: LGTM! Well-designed selective file copying.The approach of copying only specific files while excluding source maps is excellent for creating clean production packages. The file existence checks and logging provide good visibility.
116-118: Consider using fs.sync() instead of arbitrary delay.The 100ms delay appears to be a workaround for file system operations. Consider using
fs.fsyncSync()on file descriptors or removing the delay entirely sincefs-extraoperations are synchronous.apps/extension/package.json (4)
2-9: License still missing &"private": trueunchanged
Prior feedback requested adding a"license"field and reconsidering the"private": trueflag. Both items remain unaddressed.
7-7:publisherplaceholder persists
"publisher": "Hamster"is still a placeholder that will block marketplace publication.
12-12: Invalid marketplace categories
"AI","Visualization", and"Education"are not accepted byvsce. Please use only official categories.
236-238:watchscript remains non-portable
Using&breaks on Windows shells; switch tonpm-run-all --parallel watch:js watch:css.
| #!/bin/bash | ||
| set -e | ||
|
|
There was a problem hiding this comment.
🧹 Nitpick (assertive)
Harden the shell script
Use stricter bash flags to abort on unset vars and broken pipes:
-#!/bin/bash
-set -e
+#!/usr/bin/env bash
+set -euo pipefailThis prevents silent failures if, for example, NPM_TOKEN is missing.
📝 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.
| #!/bin/bash | |
| set -e | |
| #!/usr/bin/env bash | |
| set -euo pipefail |
🤖 Prompt for AI Agents
In .github/scripts/release.sh at lines 1 to 3, enhance the script's robustness
by adding stricter bash flags. Modify the set command to include -u and -o
pipefail, so it reads 'set -euo pipefail'. This change will cause the script to
abort on unset variables and on errors in any part of a pipeline, preventing
silent failures such as missing environment variables like NPM_TOKEN.
| if [ -f .changeset/pre.json ]; then | ||
| echo "⚠️ Warning: pre.json still exists. Removing it..." | ||
| rm -f .changeset/pre.json | ||
| fi |
There was a problem hiding this comment.
🛠️ Refactor suggestion
Redundant pre.json removal
The workflow step already deletes .changeset/pre.json.
Doing it again here adds maintenance overhead and masks drift between the two locations.
Prefer a single authoritative clean-up (either here or in the workflow, not both).
🤖 Prompt for AI Agents
In .github/scripts/release.sh around lines 7 to 10, the script redundantly
removes the .changeset/pre.json file, which is already deleted in the workflow
step. To fix this, remove the conditional block that checks for and deletes
.changeset/pre.json from this script, ensuring only one location handles the
cleanup to avoid maintenance overhead and potential drift.
| permissions: | ||
| contents: write | ||
| pull-requests: write | ||
| id-token: write | ||
|
|
There was a problem hiding this comment.
🧹 Nitpick (assertive)
Consider least-privilege permissions
id-token: write is only needed when the job later requests OIDC tokens (e.g. actions/upload-artifact, npm publish to private registry with OIDC, etc.).
Nothing in this workflow currently relies on OIDC, so we could drop this line and follow GitHub’s least-privilege guidance.
🤖 Prompt for AI Agents
In .github/workflows/release.yml around lines 9 to 13, the permissions section
includes 'id-token: write' which is unnecessary since the workflow does not use
OIDC tokens. Remove the 'id-token: write' line to adhere to the principle of
least privilege and reduce potential security risks.
| - name: Exit pre-release mode and clean up | ||
| run: | | ||
| echo "🔄 Ensuring we're not in pre-release mode for main branch..." | ||
|
|
||
| # Exit pre-release mode if we're in it | ||
| npx changeset pre exit || echo "Not in pre-release mode" | ||
|
|
||
| # Remove pre.json file if it exists (belt and suspenders approach) | ||
| if [ -f .changeset/pre.json ]; then | ||
| echo "🧹 Removing pre.json file..." | ||
| rm -f .changeset/pre.json | ||
| fi | ||
|
|
||
| # Verify the file is gone | ||
| if [ ! -f .changeset/pre.json ]; then | ||
| echo "✅ pre.json successfully removed" | ||
| else | ||
| echo "❌ Failed to remove pre.json" | ||
| exit 1 | ||
| fi |
There was a problem hiding this comment.
🛠️ Refactor suggestion
Duplicate “exit pre-release” logic – keep it in one place
The same clean-up (removing .changeset/pre.json) is executed here and again in ./.github/scripts/release.sh.
Maintaining the same logic in two places invites drift.
A simpler, single-source variant:
- - name: Exit pre-release mode and clean up
- run: |
- npx changeset pre exit || echo "Not in pre-release mode"
- rm -f .changeset/pre.json || true
+ - name: Exit pre-release mode
+ run: npx changeset pre exit || true…and delete the identical block inside release.sh (or vice-versa).
Committable suggestion skipped: line range outside the PR's diff.
🧰 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 lines 41 to 60, the logic to exit pre-release
mode and remove the .changeset/pre.json file is duplicated in the release.sh
script. To fix this, remove this entire block from the workflow file and keep
the cleanup logic only in release.sh, or alternatively keep it here and delete
it from release.sh, ensuring the cleanup logic exists in only one place to avoid
maintenance drift.
| run: | | ||
| echo "🔄 Ensuring we're not in pre-release mode for main branch..." | ||
|
|
||
| # Exit pre-release mode if we're in it | ||
| npx changeset pre exit || echo "Not in pre-release mode" | ||
|
|
||
| # Remove pre.json file if it exists (belt and suspenders approach) | ||
| if [ -f .changeset/pre.json ]; then | ||
| echo "🧹 Removing pre.json file..." | ||
| rm -f .changeset/pre.json | ||
| fi | ||
|
|
||
| # Verify the file is gone | ||
| if [ ! -f .changeset/pre.json ]; then | ||
| echo "✅ pre.json successfully removed" | ||
| else | ||
| echo "❌ Failed to remove pre.json" | ||
| exit 1 | ||
| fi |
There was a problem hiding this comment.
🧹 Nitpick (assertive)
YAML-lint: trailing spaces
Lines 44, 47 and 53 contain trailing whitespace, flagged by YAML-lint.
Tiny, but they do break “failure-on-warning” linters in strict CI.
- echo "🔄 Ensuring we're not in pre-release mode for main branch..."␠
+ echo "🔄 Ensuring we're not in pre-release mode for main branch..."Apply the same trim to the other two lines.
📝 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.
| 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 | |
| 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 42 and 60, remove the trailing
whitespace on lines 44, 47, and 53 to comply with YAML-lint rules. Edit these
lines to ensure no spaces exist after the end of the text or commands,
maintaining proper indentation but eliminating any trailing spaces that cause
linter warnings.
| "activationEvents": ["onStartupFinished", "workspaceContains:.taskmaster/**"], | ||
| "contributes": { |
There was a problem hiding this comment.
💡 Verification agent
❓ Verification inconclusive
Over-eager activation may hurt performance & may fail validation
• onStartupFinished activates the extension for every VS Code session, even when no TaskMaster workspace is open – consider removing it to avoid unnecessary load.
• Verify that the glob in workspaceContains:.taskmaster/** passes vsce validation; if not, use workspaceContains:.taskmaster or a specific filename.
Streamline activation events to improve performance and VSCE compatibility
The extension currently activates on every startup and uses an unsupported glob, which can slow VS Code and fail packaging validation. Please update as follows:
• In apps/extension/package.json (Lines 14–15):
- Remove
"onStartupFinished"to avoid activating the extension when no TaskMaster workspace is open. - Replace
"workspaceContains:.taskmaster/**"with a literal path, for example"workspaceContains:.taskmaster"or a specific file (e.g.,"workspaceContains:.taskmaster/config.json"), to satisfy VSCE’s validation.
Suggested diff:
- "activationEvents": ["onStartupFinished", "workspaceContains:.taskmaster/**"],
+ "activationEvents": [
+ "workspaceContains:.taskmaster"
+ ],📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| "activationEvents": ["onStartupFinished", "workspaceContains:.taskmaster/**"], | |
| "contributes": { | |
| "activationEvents": [ | |
| "workspaceContains:.taskmaster" | |
| ], | |
| "contributes": { |
🤖 Prompt for AI Agents
In apps/extension/package.json around lines 14 to 15, remove the
"onStartupFinished" activation event to prevent the extension from activating
unnecessarily on every startup. Replace the unsupported glob pattern
"workspaceContains:.taskmaster/**" with a literal path such as
"workspaceContains:.taskmaster" or a specific file like
"workspaceContains:.taskmaster/config.json" to ensure compatibility with VSCE
packaging and improve performance.
…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>
…ce (eyaltoledano#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>
…ce (eyaltoledano#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>
…ce (eyaltoledano#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>
…ce (eyaltoledano#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>
…ce (eyaltoledano#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>
Description
This PR implements a complete VS Code extension that provides a visual Kanban board interface for Task Master projects. Building on the scaffolding from PR #989, this delivers a production-ready extension with React-based UI, MCP integration for real-time synchronization, and professional CI/CD workflows for marketplace publishing.
Type of Change
Testing
Changeset
Additional Notes
BREAKING CHANGE: Extension requires publisher setup and marketplace keys
Publisher and extension naming decisions required:
See apps/extension/docs/ for detailed setup instructions
Summary by CodeRabbit
New Features
Documentation
Style
Tests
Chores