Compare commits
8 Commits
extension@
...
claude/iss
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9b44d6a680 | ||
|
|
a0815ba50e | ||
|
|
7528399729 | ||
|
|
967335dfcf | ||
|
|
22bdee1892 | ||
|
|
ee822d9567 | ||
|
|
c0e856fdf0 | ||
|
|
cbbbae8ed6 |
8
.changeset/spotty-moments-trade.md
Normal file
8
.changeset/spotty-moments-trade.md
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
---
|
||||||
|
"task-master-ai": patch
|
||||||
|
---
|
||||||
|
|
||||||
|
Fix set-status for subtasks:
|
||||||
|
|
||||||
|
- Parent tasks are now set as `done` when subtasks are all `done`
|
||||||
|
- Parent tasks are now set as `in-progress` when at least one subtask is `in-progress` or `done`
|
||||||
15
CHANGELOG.md
15
CHANGELOG.md
@@ -1,20 +1,5 @@
|
|||||||
# task-master-ai
|
# task-master-ai
|
||||||
|
|
||||||
## 0.27.3
|
|
||||||
|
|
||||||
### Patch Changes
|
|
||||||
|
|
||||||
- [#1254](https://github.com/eyaltoledano/claude-task-master/pull/1254) [`af53525`](https://github.com/eyaltoledano/claude-task-master/commit/af53525cbc660a595b67d4bb90d906911c71f45d) Thanks [@Crunchyman-ralph](https://github.com/Crunchyman-ralph)! - Fixed issue where `tm show` command could not find subtasks using dotted notation IDs (e.g., '8.1').
|
|
||||||
- The command now properly searches within parent task subtasks and returns the correct subtask information.
|
|
||||||
|
|
||||||
## 0.27.2
|
|
||||||
|
|
||||||
### Patch Changes
|
|
||||||
|
|
||||||
- [#1248](https://github.com/eyaltoledano/claude-task-master/pull/1248) [`044a7bf`](https://github.com/eyaltoledano/claude-task-master/commit/044a7bfc98049298177bc655cf341d7a8b6a0011) Thanks [@Crunchyman-ralph](https://github.com/Crunchyman-ralph)! - Fix set-status for subtasks:
|
|
||||||
- Parent tasks are now set as `done` when subtasks are all `done`
|
|
||||||
- Parent tasks are now set as `in-progress` when at least one subtask is `in-progress` or `done`
|
|
||||||
|
|
||||||
## 0.27.1
|
## 0.27.1
|
||||||
|
|
||||||
### Patch Changes
|
### Patch Changes
|
||||||
|
|||||||
@@ -1,19 +1,5 @@
|
|||||||
# Change Log
|
# Change Log
|
||||||
|
|
||||||
## 0.25.4
|
|
||||||
|
|
||||||
### Patch Changes
|
|
||||||
|
|
||||||
- Updated dependencies [[`af53525`](https://github.com/eyaltoledano/claude-task-master/commit/af53525cbc660a595b67d4bb90d906911c71f45d)]:
|
|
||||||
- task-master-ai@0.27.3
|
|
||||||
|
|
||||||
## 0.25.3
|
|
||||||
|
|
||||||
### Patch Changes
|
|
||||||
|
|
||||||
- Updated dependencies [[`044a7bf`](https://github.com/eyaltoledano/claude-task-master/commit/044a7bfc98049298177bc655cf341d7a8b6a0011)]:
|
|
||||||
- task-master-ai@0.27.2
|
|
||||||
|
|
||||||
## 0.25.2
|
## 0.25.2
|
||||||
|
|
||||||
### Patch Changes
|
### Patch Changes
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
"private": true,
|
"private": true,
|
||||||
"displayName": "TaskMaster",
|
"displayName": "TaskMaster",
|
||||||
"description": "A visual Kanban board interface for TaskMaster projects in VS Code",
|
"description": "A visual Kanban board interface for TaskMaster projects in VS Code",
|
||||||
"version": "0.25.4",
|
"version": "0.25.2",
|
||||||
"publisher": "Hamster",
|
"publisher": "Hamster",
|
||||||
"icon": "assets/icon.png",
|
"icon": "assets/icon.png",
|
||||||
"engines": {
|
"engines": {
|
||||||
@@ -240,7 +240,7 @@
|
|||||||
"check-types": "tsc --noEmit"
|
"check-types": "tsc --noEmit"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"task-master-ai": "0.27.3"
|
"task-master-ai": "0.27.1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@dnd-kit/core": "^6.3.1",
|
"@dnd-kit/core": "^6.3.1",
|
||||||
|
|||||||
8
package-lock.json
generated
8
package-lock.json
generated
@@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "task-master-ai",
|
"name": "task-master-ai",
|
||||||
"version": "0.27.3",
|
"version": "0.27.1",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "task-master-ai",
|
"name": "task-master-ai",
|
||||||
"version": "0.27.3",
|
"version": "0.27.1",
|
||||||
"license": "MIT WITH Commons-Clause",
|
"license": "MIT WITH Commons-Clause",
|
||||||
"workspaces": [
|
"workspaces": [
|
||||||
"apps/*",
|
"apps/*",
|
||||||
@@ -357,9 +357,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"apps/extension": {
|
"apps/extension": {
|
||||||
"version": "0.25.4",
|
"version": "0.25.2",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"task-master-ai": "0.27.3"
|
"task-master-ai": "0.27.1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@dnd-kit/core": "^6.3.1",
|
"@dnd-kit/core": "^6.3.1",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "task-master-ai",
|
"name": "task-master-ai",
|
||||||
"version": "0.27.3",
|
"version": "0.27.1",
|
||||||
"description": "A task management system for ambitious AI-driven development that doesn't overwhelm and confuse Cursor.",
|
"description": "A task management system for ambitious AI-driven development that doesn't overwhelm and confuse Cursor.",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
|
|||||||
@@ -135,28 +135,15 @@ export class TaskService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get a single task by ID - delegates to storage layer
|
* Get a single task by ID
|
||||||
*/
|
*/
|
||||||
async getTask(taskId: string, tag?: string): Promise<Task | null> {
|
async getTask(taskId: string, tag?: string): Promise<Task | null> {
|
||||||
// Use provided tag or get active tag
|
const result = await this.getTaskList({
|
||||||
const activeTag = tag || this.getActiveTag();
|
tag,
|
||||||
|
includeSubtasks: true
|
||||||
|
});
|
||||||
|
|
||||||
try {
|
return result.tasks.find((t) => t.id === taskId) || null;
|
||||||
// Delegate to storage layer which handles the specific logic for tasks vs subtasks
|
|
||||||
return await this.storage.loadTask(String(taskId), activeTag);
|
|
||||||
} catch (error) {
|
|
||||||
throw new TaskMasterError(
|
|
||||||
`Failed to get task ${taskId}`,
|
|
||||||
ERROR_CODES.STORAGE_ERROR,
|
|
||||||
{
|
|
||||||
operation: 'getTask',
|
|
||||||
resource: 'task',
|
|
||||||
taskId: String(taskId),
|
|
||||||
tag: activeTag
|
|
||||||
},
|
|
||||||
error as Error
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -105,65 +105,9 @@ export class FileStorage implements IStorage {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Load a single task by ID from the tasks.json file
|
* Load a single task by ID from the tasks.json file
|
||||||
* Handles both regular tasks and subtasks (with dotted notation like "1.2")
|
|
||||||
*/
|
*/
|
||||||
async loadTask(taskId: string, tag?: string): Promise<Task | null> {
|
async loadTask(taskId: string, tag?: string): Promise<Task | null> {
|
||||||
const tasks = await this.loadTasks(tag);
|
const tasks = await this.loadTasks(tag);
|
||||||
|
|
||||||
// Check if this is a subtask (contains a dot)
|
|
||||||
if (taskId.includes('.')) {
|
|
||||||
const [parentId, subtaskId] = taskId.split('.');
|
|
||||||
const parentTask = tasks.find((t) => String(t.id) === parentId);
|
|
||||||
|
|
||||||
if (!parentTask || !parentTask.subtasks) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
const subtask = parentTask.subtasks.find(
|
|
||||||
(st) => String(st.id) === subtaskId
|
|
||||||
);
|
|
||||||
if (!subtask) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
const toFullSubId = (maybeDotId: string | number): string => {
|
|
||||||
const depId = String(maybeDotId);
|
|
||||||
return depId.includes('.') ? depId : `${parentTask.id}.${depId}`;
|
|
||||||
};
|
|
||||||
const resolvedDependencies =
|
|
||||||
subtask.dependencies?.map((dep) => toFullSubId(dep)) ?? [];
|
|
||||||
|
|
||||||
// Return a Task-like object for the subtask with the full dotted ID
|
|
||||||
// Following the same pattern as findTaskById in utils.js
|
|
||||||
const subtaskResult = {
|
|
||||||
...subtask,
|
|
||||||
id: taskId, // Use the full dotted ID
|
|
||||||
title: subtask.title || `Subtask ${subtaskId}`,
|
|
||||||
description: subtask.description || '',
|
|
||||||
status: subtask.status || 'pending',
|
|
||||||
priority: subtask.priority || parentTask.priority || 'medium',
|
|
||||||
dependencies: resolvedDependencies,
|
|
||||||
details: subtask.details || '',
|
|
||||||
testStrategy: subtask.testStrategy || '',
|
|
||||||
subtasks: [],
|
|
||||||
tags: parentTask.tags || [],
|
|
||||||
assignee: subtask.assignee || parentTask.assignee,
|
|
||||||
complexity: subtask.complexity || parentTask.complexity,
|
|
||||||
createdAt: subtask.createdAt || parentTask.createdAt,
|
|
||||||
updatedAt: subtask.updatedAt || parentTask.updatedAt,
|
|
||||||
// Add reference to parent task for context (like utils.js does)
|
|
||||||
parentTask: {
|
|
||||||
id: parentTask.id,
|
|
||||||
title: parentTask.title,
|
|
||||||
status: parentTask.status
|
|
||||||
},
|
|
||||||
isSubtask: true
|
|
||||||
};
|
|
||||||
|
|
||||||
return subtaskResult;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Handle regular task lookup
|
|
||||||
return tasks.find((task) => String(task.id) === String(taskId)) || null;
|
return tasks.find((task) => String(task.id) === String(taskId)) || null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user