diff --git a/.cursor/rules/dev_workflow.mdc b/.cursor/rules/dev_workflow.mdc index 229a7c9d..e5175c32 100644 --- a/.cursor/rules/dev_workflow.mdc +++ b/.cursor/rules/dev_workflow.mdc @@ -11,6 +11,7 @@ alwaysApply: true - Select tasks based on dependencies (all marked 'done'), priority level, and ID order - Clarify tasks by checking task files in tasks/ directory or asking for user input - Break down complex tasks using `node scripts/dev.js expand --id=` with appropriate flags + - Clear existing subtasks if needed using `node scripts/dev.js clear-subtasks --id=` before regenerating - Implement code following task details, dependencies, and project standards - Verify tasks according to test strategies before marking as complete - Mark completed tasks with `node scripts/dev.js set-status --id= --status=done` @@ -33,6 +34,7 @@ alwaysApply: true - Use `--prompt=""` to provide additional context when needed - Review and adjust generated subtasks as necessary - Use `--all` flag to expand multiple pending tasks at once + - If subtasks need regeneration, clear them first with `clear-subtasks` command - **Implementation Drift Handling** - When implementation differs significantly from planned approach @@ -126,6 +128,21 @@ alwaysApply: true - Example: `node scripts/dev.js analyze-complexity --research` - Notes: Report includes complexity scores, recommended subtasks, and tailored prompts. +- **Command Reference: clear-subtasks** + - Syntax: `node scripts/dev.js clear-subtasks --id=` + - Description: Removes subtasks from specified tasks to allow regeneration + - Parameters: + - `--id=`: ID or comma-separated IDs of tasks to clear subtasks from + - `--all`: Clear subtasks from all tasks + - Examples: + - `node scripts/dev.js clear-subtasks --id=3` + - `node scripts/dev.js clear-subtasks --id=1,2,3` + - `node scripts/dev.js clear-subtasks --all` + - Notes: + - Task files are automatically regenerated after clearing subtasks + - Can be combined with expand command to immediately generate new subtasks + - Works with both parent tasks and individual subtasks + - **Task Structure Fields** - **id**: Unique identifier for the task (Example: `1`) - **title**: Brief, descriptive title (Example: `"Initialize Repo"`) diff --git a/README-task-master.md b/README-task-master.md index 3ca327bf..2df22a78 100644 --- a/README-task-master.md +++ b/README-task-master.md @@ -300,6 +300,18 @@ or npm run dev -- expand --all --research ``` +### Clear Subtasks +```bash +# Clear subtasks from a specific task +npm run dev -- clear-subtasks --id= + +# Clear subtasks from multiple tasks +npm run dev -- clear-subtasks --id=1,2,3 + +# Clear subtasks from all tasks +npm run dev -- clear-subtasks --all +``` + ## Task Structure Tasks in tasks.json have the following structure: @@ -348,6 +360,11 @@ What's the next task I should work on? Please consider dependencies and prioriti I'd like to implement task 4. Can you help me understand what needs to be done and how to approach it? ``` +### Managing subtasks +``` +I need to regenerate the subtasks for task 3 with a different approach. Can you help me clear and regenerate them? +``` + ### Handling changes ``` We've decided to use MongoDB instead of PostgreSQL. Can you update all future tasks to reflect this change? diff --git a/scripts/README.md b/scripts/README.md index ebd8041e..08efa586 100644 --- a/scripts/README.md +++ b/scripts/README.md @@ -13,6 +13,7 @@ In an AI-driven development process—particularly with tools like [Cursor](http 5. **Set task status**—mark tasks as `done`, `pending`, or `deferred` based on progress. 6. **Expand** tasks with subtasks—break down complex tasks into smaller, more manageable subtasks. 7. **Research-backed subtask generation**—use Perplexity AI to generate more informed and contextually relevant subtasks. +8. **Clear subtasks**—remove subtasks from specified tasks to allow regeneration or restructuring. ## Configuration @@ -56,6 +57,7 @@ The script can be configured through environment variables in a `.env` file at t - `generate`: Create individual task files - `set-status`: Change a task's status - `expand`: Add subtasks to a task or all tasks + - `clear-subtasks`: Remove subtasks from specified tasks Run `node scripts/dev.js` without arguments to see detailed usage information. @@ -148,12 +150,26 @@ node scripts/dev.js expand --id=3 --research node scripts/dev.js expand --all --research ``` +## Clearing Subtasks + +The `clear-subtasks` command allows you to remove subtasks from specified tasks: + +```bash +# Clear subtasks from a specific task +node scripts/dev.js clear-subtasks --id=3 + +# Clear subtasks from multiple tasks +node scripts/dev.js clear-subtasks --id=1,2,3 + +# Clear subtasks from all tasks +node scripts/dev.js clear-subtasks --all +``` + Notes: -- Tasks marked as 'done' or 'completed' are always skipped -- By default, tasks that already have subtasks are skipped unless `--force` is used -- Subtasks include title, description, dependencies, and acceptance criteria -- The `--research` flag uses Perplexity AI to generate more informed and contextually relevant subtasks -- If Perplexity API is unavailable, the script will fall back to using Anthropic's Claude +- After clearing subtasks, task files are automatically regenerated +- This is useful when you want to regenerate subtasks with a different approach +- Can be combined with the `expand` command to immediately generate new subtasks +- Works with both parent tasks and individual subtasks ## AI Integration diff --git a/templates/README-task-master.md b/templates/README-task-master.md index 3ca327bf..2df22a78 100644 --- a/templates/README-task-master.md +++ b/templates/README-task-master.md @@ -300,6 +300,18 @@ or npm run dev -- expand --all --research ``` +### Clear Subtasks +```bash +# Clear subtasks from a specific task +npm run dev -- clear-subtasks --id= + +# Clear subtasks from multiple tasks +npm run dev -- clear-subtasks --id=1,2,3 + +# Clear subtasks from all tasks +npm run dev -- clear-subtasks --all +``` + ## Task Structure Tasks in tasks.json have the following structure: @@ -348,6 +360,11 @@ What's the next task I should work on? Please consider dependencies and prioriti I'd like to implement task 4. Can you help me understand what needs to be done and how to approach it? ``` +### Managing subtasks +``` +I need to regenerate the subtasks for task 3 with a different approach. Can you help me clear and regenerate them? +``` + ### Handling changes ``` We've decided to use MongoDB instead of PostgreSQL. Can you update all future tasks to reflect this change? diff --git a/templates/dev.js b/templates/dev.js index 8a64d91b..a3f4d7c9 100755 --- a/templates/dev.js +++ b/templates/dev.js @@ -19,7 +19,7 @@ * 4) set-status --id=4 --status=done * -> Updates a single task's status to done (or pending, deferred, in-progress, etc.). * -> Supports comma-separated IDs for updating multiple tasks: --id=1,2,3,1.1,1.2 - * + * -> If you set the status of a parent task to done, all its subtasks will be set to done. * 5) list * -> Lists tasks in a brief console view (ID, title, status). * @@ -52,6 +52,11 @@ * --file, -f : Use alternative tasks.json file instead of default * --research, -r: Use Perplexity AI for research-backed complexity analysis * + * 8) clear-subtasks + * -> Clears subtasks from specified tasks + * -> Supports comma-separated IDs for clearing multiple tasks: --id=1,2,3,1.1,1.2 + * -> Use --all to clear subtasks from all tasks + * * Usage examples: * node dev.js parse-prd --input=sample-prd.txt * node dev.js parse-prd --input=sample-prd.txt --tasks=10 @@ -67,6 +72,7 @@ * node dev.js analyze-complexity --output=custom-report.json * node dev.js analyze-complexity --threshold=6 --model=claude-3.7-sonnet * node dev.js analyze-complexity --research + * node dev.js clear-subtasks --id=1,2,3 --all */ import fs from 'fs'; @@ -527,6 +533,11 @@ async function updateTasks(tasksPath, fromId, prompt) { writeJSON(tasksPath, data); log('info', "Tasks updated successfully."); + + // Add call to generate task files + log('info', "Regenerating task files..."); + await generateTaskFiles(tasksPath, path.dirname(tasksPath)); + } catch (parseError) { log('error', "Failed to parse Claude's response as JSON:", parseError); log('debug', "Response content:", fullResponse); @@ -665,6 +676,10 @@ function setTaskStatus(tasksPath, taskIdInput, newStatus) { writeJSON(tasksPath, data); log('info', `Updated subtask ${parentId}.${subtaskId} status from '${oldStatus}' to '${newStatus}'`); + // Add call to generate task files + log('info', "Regenerating task files..."); + generateTaskFiles(tasksPath, path.dirname(tasksPath)); + return; } @@ -700,6 +715,10 @@ function setTaskStatus(tasksPath, taskIdInput, newStatus) { // Save the changes writeJSON(tasksPath, data); log('info', `Updated task ${taskId} status from '${oldStatus}' to '${newStatus}'`); + + // Add call to generate task files + log('info', "Regenerating task files..."); + generateTaskFiles(tasksPath, path.dirname(tasksPath)); } // @@ -1711,6 +1730,36 @@ async function main() { await analyzeTaskComplexity(options); }); + program + .command('clear-subtasks') + .description('Clear subtasks from specified tasks') + .option('-f, --file ', 'Path to the tasks file', 'tasks/tasks.json') + .option('-i, --id ', 'Task IDs (comma-separated) to clear subtasks from') + .option('--all', 'Clear subtasks from all tasks') + .action(async (options) => { + const tasksPath = options.file; + const taskIds = options.id; + const all = options.all; + + if (!taskIds && !all) { + console.error(chalk.red('Error: Please specify task IDs with --id= or use --all to clear all tasks')); + process.exit(1); + } + + if (all) { + // If --all is specified, get all task IDs + const data = readJSON(tasksPath); + if (!data || !data.tasks) { + console.error(chalk.red('Error: No valid tasks found')); + process.exit(1); + } + const allIds = data.tasks.map(t => t.id).join(','); + clearSubtasks(tasksPath, allIds); + } else { + clearSubtasks(tasksPath, taskIds); + } + }); + await program.parseAsync(process.argv); } @@ -2321,6 +2370,57 @@ function findTaskInComplexityReport(report, taskId) { return report.complexityAnalysis.find(task => task.taskId === taskId); } +// +// Clear subtasks from tasks +// +function clearSubtasks(tasksPath, taskIds) { + log('info', `Reading tasks from ${tasksPath}...`); + const data = readJSON(tasksPath); + if (!data || !data.tasks) { + log('error', "No valid tasks found."); + process.exit(1); + } + + // Handle multiple task IDs (comma-separated) + const taskIdArray = taskIds.split(',').map(id => id.trim()); + let clearedCount = 0; + + taskIdArray.forEach(taskId => { + const id = parseInt(taskId, 10); + if (isNaN(id)) { + log('error', `Invalid task ID: ${taskId}`); + return; + } + + const task = data.tasks.find(t => t.id === id); + if (!task) { + log('error', `Task ${id} not found`); + return; + } + + if (!task.subtasks || task.subtasks.length === 0) { + log('info', `Task ${id} has no subtasks to clear`); + return; + } + + const subtaskCount = task.subtasks.length; + task.subtasks = []; + clearedCount++; + log('info', `Cleared ${subtaskCount} subtasks from task ${id}`); + }); + + if (clearedCount > 0) { + writeJSON(tasksPath, data); + log('info', `Successfully cleared subtasks from ${clearedCount} task(s)`); + + // Regenerate task files to reflect changes + log('info', "Regenerating task files..."); + generateTaskFiles(tasksPath, path.dirname(tasksPath)); + } else { + log('info', "No subtasks were cleared"); + } +} + main().catch(err => { log('error', err); process.exit(1); diff --git a/templates/dev_workflow.mdc b/templates/dev_workflow.mdc index 229a7c9d..e5175c32 100644 --- a/templates/dev_workflow.mdc +++ b/templates/dev_workflow.mdc @@ -11,6 +11,7 @@ alwaysApply: true - Select tasks based on dependencies (all marked 'done'), priority level, and ID order - Clarify tasks by checking task files in tasks/ directory or asking for user input - Break down complex tasks using `node scripts/dev.js expand --id=` with appropriate flags + - Clear existing subtasks if needed using `node scripts/dev.js clear-subtasks --id=` before regenerating - Implement code following task details, dependencies, and project standards - Verify tasks according to test strategies before marking as complete - Mark completed tasks with `node scripts/dev.js set-status --id= --status=done` @@ -33,6 +34,7 @@ alwaysApply: true - Use `--prompt=""` to provide additional context when needed - Review and adjust generated subtasks as necessary - Use `--all` flag to expand multiple pending tasks at once + - If subtasks need regeneration, clear them first with `clear-subtasks` command - **Implementation Drift Handling** - When implementation differs significantly from planned approach @@ -126,6 +128,21 @@ alwaysApply: true - Example: `node scripts/dev.js analyze-complexity --research` - Notes: Report includes complexity scores, recommended subtasks, and tailored prompts. +- **Command Reference: clear-subtasks** + - Syntax: `node scripts/dev.js clear-subtasks --id=` + - Description: Removes subtasks from specified tasks to allow regeneration + - Parameters: + - `--id=`: ID or comma-separated IDs of tasks to clear subtasks from + - `--all`: Clear subtasks from all tasks + - Examples: + - `node scripts/dev.js clear-subtasks --id=3` + - `node scripts/dev.js clear-subtasks --id=1,2,3` + - `node scripts/dev.js clear-subtasks --all` + - Notes: + - Task files are automatically regenerated after clearing subtasks + - Can be combined with expand command to immediately generate new subtasks + - Works with both parent tasks and individual subtasks + - **Task Structure Fields** - **id**: Unique identifier for the task (Example: `1`) - **title**: Brief, descriptive title (Example: `"Initialize Repo"`) diff --git a/templates/scripts_README.md b/templates/scripts_README.md index ebd8041e..08efa586 100644 --- a/templates/scripts_README.md +++ b/templates/scripts_README.md @@ -13,6 +13,7 @@ In an AI-driven development process—particularly with tools like [Cursor](http 5. **Set task status**—mark tasks as `done`, `pending`, or `deferred` based on progress. 6. **Expand** tasks with subtasks—break down complex tasks into smaller, more manageable subtasks. 7. **Research-backed subtask generation**—use Perplexity AI to generate more informed and contextually relevant subtasks. +8. **Clear subtasks**—remove subtasks from specified tasks to allow regeneration or restructuring. ## Configuration @@ -56,6 +57,7 @@ The script can be configured through environment variables in a `.env` file at t - `generate`: Create individual task files - `set-status`: Change a task's status - `expand`: Add subtasks to a task or all tasks + - `clear-subtasks`: Remove subtasks from specified tasks Run `node scripts/dev.js` without arguments to see detailed usage information. @@ -148,12 +150,26 @@ node scripts/dev.js expand --id=3 --research node scripts/dev.js expand --all --research ``` +## Clearing Subtasks + +The `clear-subtasks` command allows you to remove subtasks from specified tasks: + +```bash +# Clear subtasks from a specific task +node scripts/dev.js clear-subtasks --id=3 + +# Clear subtasks from multiple tasks +node scripts/dev.js clear-subtasks --id=1,2,3 + +# Clear subtasks from all tasks +node scripts/dev.js clear-subtasks --all +``` + Notes: -- Tasks marked as 'done' or 'completed' are always skipped -- By default, tasks that already have subtasks are skipped unless `--force` is used -- Subtasks include title, description, dependencies, and acceptance criteria -- The `--research` flag uses Perplexity AI to generate more informed and contextually relevant subtasks -- If Perplexity API is unavailable, the script will fall back to using Anthropic's Claude +- After clearing subtasks, task files are automatically regenerated +- This is useful when you want to regenerate subtasks with a different approach +- Can be combined with the `expand` command to immediately generate new subtasks +- Works with both parent tasks and individual subtasks ## AI Integration