rbin-task-flow 1.2.0 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.cursor/rules/task_estimate.mdc +10 -6
- package/.cursor/rules/task_execution.mdc +11 -5
- package/.cursor/rules/task_refactor.mdc +20 -9
- package/.cursor/rules/task_report.mdc +10 -5
- package/.cursor/rules/task_review.mdc +20 -7
- package/.cursor/rules/task_work.mdc +14 -8
- package/.task-flow/README.md +43 -21
- package/CLAUDE.md +13 -7
- package/GEMINI.md +13 -7
- package/README.md +22 -18
- package/bin/cli.js +10 -10
- package/lib/estimate.js +72 -47
- package/lib/report.js +41 -22
- package/lib/utils.js +16 -1
- package/package.json +1 -1
|
@@ -5,8 +5,10 @@ alwaysApply: true
|
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
- **Task Estimation - Time Estimation for Tasks:**
|
|
8
|
-
- **FAST FORMAT**: `task-flow: estimate
|
|
9
|
-
-
|
|
8
|
+
- **FAST FORMAT**: `task-flow: estimate X` → Estimate time for task X (simplified - no "task" needed)
|
|
9
|
+
- **MULTIPLE TASKS**: `task-flow: estimate X,Y` → Estimate multiple tasks
|
|
10
|
+
- **ALL TASKS**: `task-flow: estimate all` → Estimate all tasks
|
|
11
|
+
- When user says "task-flow: estimate X", "estimate X", "estimate X,Y", "estimate all", or "how long will task X take":
|
|
10
12
|
- **READ**: `.task-flow/.internal/tasks.json` to get task details
|
|
11
13
|
- **CALCULATE**: Time estimate based on number of subtasks and developer experience level
|
|
12
14
|
- **DISPLAY**: Show time estimate with intervals for 3 experience levels (junior, mid, senior)
|
|
@@ -57,16 +59,18 @@ alwaysApply: true
|
|
|
57
59
|
```
|
|
58
60
|
|
|
59
61
|
- **Natural Language Phrases:**
|
|
60
|
-
- **FAST FORMAT**: `task-flow: estimate
|
|
61
|
-
-
|
|
62
|
+
- **FAST FORMAT**: `task-flow: estimate X` or `task-flow estimate X` (simplified)
|
|
63
|
+
- **MULTIPLE**: `task-flow: estimate X,Y` or `task-flow: estimate all`
|
|
64
|
+
- "estimate task X" or "estimate X"
|
|
65
|
+
- "estimate tasks 10,11"
|
|
66
|
+
- "estimate all tasks"
|
|
62
67
|
- "how long will task X take"
|
|
63
68
|
- "time estimate for task X"
|
|
64
|
-
- "quanto tempo leva a task X"
|
|
65
69
|
- Any variation asking for time estimation
|
|
66
70
|
|
|
67
71
|
- **Example:**
|
|
68
72
|
```
|
|
69
|
-
User: "task-flow: estimate
|
|
73
|
+
User: "task-flow: estimate 1"
|
|
70
74
|
|
|
71
75
|
Task 1 has 5 subtasks:
|
|
72
76
|
|
|
@@ -21,12 +21,18 @@ alwaysApply: true
|
|
|
21
21
|
- `task-flow: sync` - Sync new tasks from tasks.input.txt
|
|
22
22
|
- `task-flow: think` - Analyze codebase and suggest new tasks
|
|
23
23
|
- `task-flow: run next X` - Work on next X subtasks sequentially
|
|
24
|
-
- `task-flow: run
|
|
24
|
+
- `task-flow: run X` - Work on all pending subtasks of task X (simplified - no "task" needed)
|
|
25
|
+
- `task-flow: run X,Y` - Work on multiple tasks (comma-separated)
|
|
26
|
+
- `task-flow: run all` - Work on all tasks
|
|
25
27
|
- `task-flow: status` - Show current task status
|
|
26
|
-
- `task-flow: review` - Review
|
|
27
|
-
- `task-flow: refactor` - Refactor
|
|
28
|
-
- `task-flow: estimate
|
|
29
|
-
- `task-flow:
|
|
28
|
+
- `task-flow: review X` - Review specific task(s) (comma-separated or "all")
|
|
29
|
+
- `task-flow: refactor X` - Refactor specific task(s) (comma-separated or "all")
|
|
30
|
+
- `task-flow: estimate X` - Estimate time for task X (simplified - no "task" needed)
|
|
31
|
+
- `task-flow: estimate X,Y` - Estimate multiple tasks (comma-separated)
|
|
32
|
+
- `task-flow: estimate all` - Estimate all tasks
|
|
33
|
+
- `task-flow: report X` - Generate implementation report for task X (simplified - no "task" needed)
|
|
34
|
+
- `task-flow: report X,Y` - Generate reports for multiple tasks (comma-separated)
|
|
35
|
+
- `task-flow: report all` - Generate reports for all tasks
|
|
30
36
|
|
|
31
37
|
- **Workflow Example:**
|
|
32
38
|
```markdown
|
|
@@ -5,8 +5,10 @@ alwaysApply: true
|
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
- **Task Refactor - Improve Code Quality:**
|
|
8
|
-
- **FAST FORMAT**: `task-flow: refactor` → Refactor
|
|
9
|
-
-
|
|
8
|
+
- **FAST FORMAT**: `task-flow: refactor X` or `task-flow: refactor X,Y` or `task-flow: refactor all` → Refactor specific task(s)
|
|
9
|
+
- **SIMPLIFIED SYNTAX**: No need to say "task" - just use the number: `task-flow: refactor 1` instead of `task-flow: refactor task 1`
|
|
10
|
+
- **REQUIRED**: Task ID is required - use `task-flow: refactor all` to refactor all tasks
|
|
11
|
+
- When user says "task-flow: refactor X", "task-flow: refactor X,Y", "task-flow: refactor all", or "refactor tasks":
|
|
10
12
|
- **IDENTIFY**: Files changed in current commit (or staged changes)
|
|
11
13
|
- **REFACTOR**: Improve code quality without changing functionality
|
|
12
14
|
- **REMOVE**: All explanatory comments (following code_comments.mdc rules)
|
|
@@ -51,20 +53,21 @@ alwaysApply: true
|
|
|
51
53
|
5. Show summary of changes
|
|
52
54
|
|
|
53
55
|
- **Natural Language Phrases:**
|
|
54
|
-
- **FAST FORMAT**: `task-flow: refactor` or `task-flow refactor`
|
|
55
|
-
- "refactor
|
|
56
|
-
- "refactor
|
|
56
|
+
- **FAST FORMAT**: `task-flow: refactor X` or `task-flow: refactor X,Y` or `task-flow: refactor all`
|
|
57
|
+
- "refactor task 1"
|
|
58
|
+
- "refactor tasks 10,11"
|
|
59
|
+
- "refactor all tasks"
|
|
57
60
|
- "improve code quality"
|
|
58
61
|
- "clean up code"
|
|
59
|
-
- Any variation asking to refactor/improve code
|
|
62
|
+
- Any variation asking to refactor/improve code (must include task ID or "all")
|
|
60
63
|
|
|
61
64
|
- **Example:**
|
|
62
65
|
```
|
|
63
|
-
User: "task-flow: refactor"
|
|
66
|
+
User: "task-flow: refactor 1"
|
|
64
67
|
|
|
65
68
|
AI Action:
|
|
66
|
-
1.
|
|
67
|
-
2.
|
|
69
|
+
1. Identify files related to task 1 (from git history or task implementation)
|
|
70
|
+
2. Read each file
|
|
68
71
|
3. For each file:
|
|
69
72
|
- Remove explanatory comments
|
|
70
73
|
- Improve code structure
|
|
@@ -73,6 +76,14 @@ alwaysApply: true
|
|
|
73
76
|
4. Preserve separation comments
|
|
74
77
|
5. Verify functionality unchanged
|
|
75
78
|
6. Show refactoring summary
|
|
79
|
+
|
|
80
|
+
User: "task-flow: refactor all"
|
|
81
|
+
|
|
82
|
+
AI Action:
|
|
83
|
+
1. Process all tasks
|
|
84
|
+
2. Identify files for each task
|
|
85
|
+
3. Refactor all files
|
|
86
|
+
4. Show summary
|
|
76
87
|
```
|
|
77
88
|
|
|
78
89
|
- **Integration:**
|
|
@@ -5,8 +5,10 @@ alwaysApply: true
|
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
- **Task Report - Generate Implementation Reports:**
|
|
8
|
-
- **FAST FORMAT**: `task-flow: report
|
|
9
|
-
-
|
|
8
|
+
- **FAST FORMAT**: `task-flow: report X` → Generate implementation report for task X (simplified - no "task" needed)
|
|
9
|
+
- **MULTIPLE TASKS**: `task-flow: report X,Y` → Generate reports for multiple tasks
|
|
10
|
+
- **ALL TASKS**: `task-flow: report all` → Generate reports for all tasks
|
|
11
|
+
- When user says "task-flow: report X", "report X", "report X,Y", "report all", "generate report for task X", or "create report task X":
|
|
10
12
|
- **READ**: `.task-flow/.internal/tasks.json` to get task details
|
|
11
13
|
- **READ**: `.task-flow/.internal/status.json` to verify task is completed
|
|
12
14
|
- **ANALYZE**: Codebase changes related to the task (git history, file changes)
|
|
@@ -73,8 +75,11 @@ alwaysApply: true
|
|
|
73
75
|
6. **Notes**: Additional considerations or follow-up items
|
|
74
76
|
|
|
75
77
|
- **Natural Language Phrases:**
|
|
76
|
-
- **FAST FORMAT**: `task-flow: report
|
|
77
|
-
-
|
|
78
|
+
- **FAST FORMAT**: `task-flow: report X` or `task-flow report X` (simplified)
|
|
79
|
+
- **MULTIPLE**: `task-flow: report X,Y` or `task-flow: report all`
|
|
80
|
+
- "generate report for task X" or "report X"
|
|
81
|
+
- "report tasks 10,11"
|
|
82
|
+
- "report all tasks"
|
|
78
83
|
- "create report task X"
|
|
79
84
|
- "document task X"
|
|
80
85
|
- "report for task X"
|
|
@@ -82,7 +87,7 @@ alwaysApply: true
|
|
|
82
87
|
|
|
83
88
|
- **Example:**
|
|
84
89
|
```
|
|
85
|
-
User: "task-flow: report
|
|
90
|
+
User: "task-flow: report 1"
|
|
86
91
|
|
|
87
92
|
AI Action:
|
|
88
93
|
1. Read tasks.json and status.json
|
|
@@ -5,8 +5,10 @@ alwaysApply: true
|
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
- **Task Review - Verify Completed Tasks:**
|
|
8
|
-
- **FAST FORMAT**: `task-flow: review` → Review
|
|
9
|
-
-
|
|
8
|
+
- **FAST FORMAT**: `task-flow: review X` or `task-flow: review X,Y` or `task-flow: review all` → Review specific task(s)
|
|
9
|
+
- **SIMPLIFIED SYNTAX**: No need to say "task" - just use the number: `task-flow: review 1` instead of `task-flow: review task 1`
|
|
10
|
+
- **REQUIRED**: Task ID is required - use `task-flow: review all` to review all tasks
|
|
11
|
+
- When user says "task-flow: review X", "task-flow: review X,Y", "task-flow: review all", or "review completed tasks":
|
|
10
12
|
- **READ**: `.task-flow/.internal/tasks.json` and `.task-flow/.internal/status.json`
|
|
11
13
|
- **IDENTIFY**: All tasks/subtasks marked as "done"
|
|
12
14
|
- **VERIFY**: Check if each completed task/subtask is actually implemented
|
|
@@ -44,20 +46,22 @@ alwaysApply: true
|
|
|
44
46
|
```
|
|
45
47
|
|
|
46
48
|
- **Natural Language Phrases:**
|
|
47
|
-
- **FAST FORMAT**: `task-flow: review` or `task-flow review`
|
|
48
|
-
- "review
|
|
49
|
+
- **FAST FORMAT**: `task-flow: review X` or `task-flow: review X,Y` or `task-flow: review all`
|
|
50
|
+
- "review task 1"
|
|
51
|
+
- "review tasks 10,11"
|
|
52
|
+
- "review all tasks"
|
|
49
53
|
- "verify done tasks"
|
|
50
54
|
- "check if tasks are really done"
|
|
51
55
|
- "review task status"
|
|
52
|
-
- Any variation asking to review/verify completed tasks
|
|
56
|
+
- Any variation asking to review/verify completed tasks (must include task ID or "all")
|
|
53
57
|
|
|
54
58
|
- **Example:**
|
|
55
59
|
```
|
|
56
|
-
User: "task-flow: review"
|
|
60
|
+
User: "task-flow: review 1"
|
|
57
61
|
|
|
58
62
|
AI Action:
|
|
59
63
|
1. Read tasks.json and status.json
|
|
60
|
-
2. Find
|
|
64
|
+
2. Find task 1 and its "done" subtasks
|
|
61
65
|
3. Verify each one:
|
|
62
66
|
- Check if files exist
|
|
63
67
|
- Check if code matches requirements
|
|
@@ -65,6 +69,15 @@ alwaysApply: true
|
|
|
65
69
|
4. Report findings
|
|
66
70
|
5. Ask if user wants to correct status
|
|
67
71
|
6. If confirmed, update status.json
|
|
72
|
+
|
|
73
|
+
User: "task-flow: review all"
|
|
74
|
+
|
|
75
|
+
AI Action:
|
|
76
|
+
1. Read tasks.json and status.json
|
|
77
|
+
2. Find all "done" tasks/subtasks
|
|
78
|
+
3. Verify each one
|
|
79
|
+
4. Report findings
|
|
80
|
+
5. Ask if user wants to correct status
|
|
68
81
|
```
|
|
69
82
|
|
|
70
83
|
- **Integration:**
|
|
@@ -6,14 +6,17 @@ alwaysApply: true
|
|
|
6
6
|
|
|
7
7
|
- **Task Work - Simplified Commands:**
|
|
8
8
|
- **FASTEST FORMAT**: `task-flow: run next X` (e.g., "task-flow: run next 4" → work on next 4 subtasks)
|
|
9
|
-
- **TASK SPECIFIC**: `task-flow: run task X` (e.g., "task-flow: run
|
|
9
|
+
- **TASK SPECIFIC**: `task-flow: run X` or `task-flow: run X,Y` or `task-flow: run all` (e.g., "task-flow: run 1" → work on all subtasks of task 1)
|
|
10
|
+
- **SIMPLIFIED SYNTAX**: No need to say "task" - just use the number: `task-flow: run 1` instead of `task-flow: run task 1`
|
|
10
11
|
- When user says "task-flow: run next X" or "work on next X subtasks":
|
|
11
12
|
- **INTERPRET**: User wants to work on the next X pending subtasks from RBIN Task Flow
|
|
12
13
|
- **AUTOMATIC**: Read tasks, find next X pending, implement them sequentially
|
|
13
14
|
- **UPDATE**: Mark each subtask as done after completion
|
|
14
15
|
- **NO NEED**: To specify "task flow" explicitly - it's implied
|
|
15
|
-
- When user says "task-flow: run task X" or "
|
|
16
|
-
- **INTERPRET**: User wants to work on all pending subtasks of
|
|
16
|
+
- When user says "task-flow: run X" or "task-flow: run X,Y" or "task-flow: run all":
|
|
17
|
+
- **INTERPRET**: User wants to work on all pending subtasks of specific task(s) or all tasks
|
|
18
|
+
- **MULTIPLE TASKS**: Comma-separated IDs (e.g., "10,11") processes multiple tasks sequentially
|
|
19
|
+
- **ALL TASKS**: "all" processes all tasks in order
|
|
17
20
|
- **DEPENDENCY CHECK**: Before executing, verify that all tasks before X (1, 2, ..., X-1) are completely done
|
|
18
21
|
- **CONFLICT PREVENTION**: Only execute subtasks of task X if no previous tasks have pending subtasks (allows parallel work by multiple AIs)
|
|
19
22
|
- **PARTIAL EXECUTION**: If previous tasks have pending subtasks, inform user that task X cannot be fully executed until previous tasks are complete
|
|
@@ -23,7 +26,7 @@ alwaysApply: true
|
|
|
23
26
|
|
|
24
27
|
- **Natural Language Phrases:**
|
|
25
28
|
- **FAST FORMAT**: `task-flow: run next X` or `task-flow run next X` (e.g., "task-flow: run next 4")
|
|
26
|
-
- **TASK FORMAT**: `task-flow: run task X` or `task-flow run
|
|
29
|
+
- **TASK FORMAT**: `task-flow: run X` or `task-flow: run X,Y` or `task-flow: run all` (e.g., "task-flow: run 1" or "task-flow: run 10,11" or "task-flow: run all")
|
|
27
30
|
- "work on next 3 subtasks"
|
|
28
31
|
- "work on next 5 subtasks"
|
|
29
32
|
- "next 2 subtasks"
|
|
@@ -39,14 +42,17 @@ alwaysApply: true
|
|
|
39
42
|
- `task-flow: run next X` → Work on next X subtasks sequentially (fastest way)
|
|
40
43
|
- `task-flow run next X` → Same as above (without colon)
|
|
41
44
|
- `task-flow: run next` → Work on next 1 subtask (default)
|
|
42
|
-
- `task-flow: run
|
|
43
|
-
- `task-flow run
|
|
45
|
+
- `task-flow: run X` → Work on all pending subtasks of task X (simplified - no "task" needed)
|
|
46
|
+
- `task-flow: run X,Y` → Work on all pending subtasks of tasks X and Y
|
|
47
|
+
- `task-flow: run all` → Work on all pending subtasks of all tasks
|
|
48
|
+
- `task-flow run X` → Same as above (without colon)
|
|
44
49
|
- Examples:
|
|
45
50
|
- "task-flow: run next 4" → Work on next 4 subtasks
|
|
46
51
|
- "task-flow run next 3" → Work on next 3 subtasks
|
|
47
52
|
- "task-flow: run next" → Work on next 1 subtask
|
|
48
|
-
- "task-flow: run
|
|
49
|
-
- "task-flow run
|
|
53
|
+
- "task-flow: run 1" → Work on all pending subtasks of task 1
|
|
54
|
+
- "task-flow: run 10,11" → Work on all pending subtasks of tasks 10 and 11
|
|
55
|
+
- "task-flow: run all" → Work on all pending subtasks of all tasks
|
|
50
56
|
|
|
51
57
|
- **Required Actions for `task-flow: run next X`:**
|
|
52
58
|
1. **Read task files**: `.task-flow/.internal/tasks.json` and `.task-flow/.internal/status.json`
|
package/.task-flow/README.md
CHANGED
|
@@ -6,13 +6,15 @@
|
|
|
6
6
|
|---------|-------------|
|
|
7
7
|
| `task-flow: sync` | Complete synchronization: adds new, removes deleted, updates modified, preserves status |
|
|
8
8
|
| `task-flow: think` | Analyzes code and suggests new tasks |
|
|
9
|
-
| `task-flow: run next X` | Works on next X subtasks (e.g., `task-flow: run next 4`) |
|
|
10
|
-
| `task-flow: run task X` | Executes all pending subtasks of task X (e.g., `task-flow: run task 1`) |
|
|
11
9
|
| `task-flow: status` | Shows current task status |
|
|
12
|
-
| `task-flow:
|
|
13
|
-
| `task-flow:
|
|
14
|
-
| `task-flow:
|
|
15
|
-
| `task-flow:
|
|
10
|
+
| `task-flow: run next X` | Works on next X subtasks (e.g., `task-flow: run next 4`) |
|
|
11
|
+
| `task-flow: run X` | Executes all pending subtasks of task X (e.g., `task-flow: run 1`) |
|
|
12
|
+
| `task-flow: run X,Y` | Executes multiple tasks (e.g., `task-flow: run 10,11`) |
|
|
13
|
+
| `task-flow: run all` | Executes all tasks |
|
|
14
|
+
| `task-flow: review X` | Reviews specific task(s) (e.g., `task-flow: review 1` or `task-flow: review 10,11` or `task-flow: review all`) |
|
|
15
|
+
| `task-flow: refactor X` | Refactors specific task(s) (e.g., `task-flow: refactor 1` or `task-flow: refactor 10,11` or `task-flow: refactor all`) |
|
|
16
|
+
| `task-flow: estimate X` | Estimates time for task X (e.g., `task-flow: estimate 1` or `task-flow: estimate 10,11`) |
|
|
17
|
+
| `task-flow: report X` | Generates implementation report for task X (e.g., `task-flow: report 1` or `task-flow: report 10,11`) |
|
|
16
18
|
|
|
17
19
|
**See complete details below ↓**
|
|
18
20
|
|
|
@@ -31,6 +33,13 @@ Complete synchronization between `tasks.input.txt` and the system:
|
|
|
31
33
|
### `task-flow: think`
|
|
32
34
|
Analyzes code and suggests new tasks. Asks before adding to `tasks.input.txt`.
|
|
33
35
|
|
|
36
|
+
### `task-flow: status`
|
|
37
|
+
Shows current status of tasks and subtasks from the `tasks.status.md` file.
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## Commands with Task ID
|
|
42
|
+
|
|
34
43
|
### `task-flow: run next X`
|
|
35
44
|
Works on next X pending subtasks in sequential order. Implements and marks as "done".
|
|
36
45
|
|
|
@@ -38,7 +47,7 @@ Works on next X pending subtasks in sequential order. Implements and marks as "d
|
|
|
38
47
|
- `task-flow: run next 4` → Next 4 subtasks
|
|
39
48
|
- `task-flow: run next` → Next 1 subtask
|
|
40
49
|
|
|
41
|
-
### `task-flow: run
|
|
50
|
+
### `task-flow: run X` (simplified syntax)
|
|
42
51
|
Executes all pending subtasks of a specific task. Implements and marks as "done".
|
|
43
52
|
|
|
44
53
|
**⚠️ Dependency Check:**
|
|
@@ -47,20 +56,29 @@ Executes all pending subtasks of a specific task. Implements and marks as "done"
|
|
|
47
56
|
- If there are pending previous tasks, warns which ones need to be completed first
|
|
48
57
|
|
|
49
58
|
**Examples:**
|
|
50
|
-
- `task-flow: run
|
|
51
|
-
- `task-flow: run
|
|
59
|
+
- `task-flow: run 1` → All pending subtasks of task 1 (can always execute)
|
|
60
|
+
- `task-flow: run 10,11` → All pending subtasks of tasks 10 and 11
|
|
61
|
+
- `task-flow: run all` → All pending subtasks of all tasks
|
|
62
|
+
- `task-flow: run 3` → Only executes if tasks 1 and 2 are complete
|
|
52
63
|
|
|
53
|
-
### `task-flow:
|
|
54
|
-
|
|
64
|
+
### `task-flow: review X`
|
|
65
|
+
Reviews specific task(s) marked as "done" to verify they are actually completed.
|
|
55
66
|
|
|
56
|
-
|
|
57
|
-
|
|
67
|
+
**Examples:**
|
|
68
|
+
- `task-flow: review 1` → Reviews task 1
|
|
69
|
+
- `task-flow: review 10,11` → Reviews tasks 10 and 11
|
|
70
|
+
- `task-flow: review all` → Reviews all tasks
|
|
71
|
+
|
|
72
|
+
### `task-flow: refactor X`
|
|
73
|
+
Refactors code from specific task(s). Removes explanatory comments, improves code without changing functionality.
|
|
58
74
|
|
|
59
|
-
|
|
60
|
-
|
|
75
|
+
**Examples:**
|
|
76
|
+
- `task-flow: refactor 1` → Refactors task 1
|
|
77
|
+
- `task-flow: refactor 10,11` → Refactors tasks 10 and 11
|
|
78
|
+
- `task-flow: refactor all` → Refactors all tasks
|
|
61
79
|
|
|
62
|
-
### `task-flow: estimate
|
|
63
|
-
Estimates time required to complete
|
|
80
|
+
### `task-flow: estimate X` (simplified syntax)
|
|
81
|
+
Estimates time required to complete task(s) based on the number of subtasks and developer experience level.
|
|
64
82
|
|
|
65
83
|
**Output includes:**
|
|
66
84
|
- Time estimates for Junior (0-2 years), Mid-level (3-5 years), and Senior (6+ years) developers
|
|
@@ -68,10 +86,12 @@ Estimates time required to complete a task based on the number of subtasks and d
|
|
|
68
86
|
- Recommendation for management with buffer
|
|
69
87
|
|
|
70
88
|
**Examples:**
|
|
71
|
-
- `task-flow: estimate
|
|
89
|
+
- `task-flow: estimate 1` → Shows time estimate for task 1
|
|
90
|
+
- `task-flow: estimate 10,11` → Shows time estimates for tasks 10 and 11
|
|
91
|
+
- `task-flow: estimate all` → Shows time estimates for all tasks
|
|
72
92
|
|
|
73
|
-
### `task-flow: report
|
|
74
|
-
Generates a detailed implementation report for
|
|
93
|
+
### `task-flow: report X` (simplified syntax)
|
|
94
|
+
Generates a detailed implementation report for completed task(s) in Markdown format.
|
|
75
95
|
|
|
76
96
|
**Report includes:**
|
|
77
97
|
- Task overview and completion status
|
|
@@ -83,7 +103,9 @@ Generates a detailed implementation report for a completed task in Markdown form
|
|
|
83
103
|
**Report location:** `.task-flow/docs/task-X-implementation.md`
|
|
84
104
|
|
|
85
105
|
**Examples:**
|
|
86
|
-
- `task-flow: report
|
|
106
|
+
- `task-flow: report 1` → Generates report for task 1
|
|
107
|
+
- `task-flow: report 10,11` → Generates reports for tasks 10 and 11
|
|
108
|
+
- `task-flow: report all` → Generates reports for all tasks
|
|
87
109
|
|
|
88
110
|
---
|
|
89
111
|
|
package/CLAUDE.md
CHANGED
|
@@ -16,14 +16,20 @@ This project uses RBIN Task Flow for task management:
|
|
|
16
16
|
- **Task Definition**: Edit `.task-flow/tasks.input.txt` using simple format: `- Task description`
|
|
17
17
|
- **AI Commands**: Use AI-powered commands for task management:
|
|
18
18
|
- `task-flow: sync` - Synchronize tasks from tasks.input.txt
|
|
19
|
-
- `task-flow: run next X` - Work on next X subtasks
|
|
20
|
-
- `task-flow: run task X` - Execute all pending subtasks of task X
|
|
21
|
-
- `task-flow: status` - View current task status
|
|
22
|
-
- `task-flow: review` - Review completed tasks
|
|
23
19
|
- `task-flow: think` - Analyze code and suggest new tasks
|
|
24
|
-
- `task-flow:
|
|
25
|
-
- `task-flow:
|
|
26
|
-
- `task-flow:
|
|
20
|
+
- `task-flow: status` - View current task status
|
|
21
|
+
- `task-flow: run next X` - Work on next X subtasks
|
|
22
|
+
- `task-flow: run X` - Execute all pending subtasks of task X (simplified - no "task" needed)
|
|
23
|
+
- `task-flow: run X,Y` - Execute multiple tasks (comma-separated)
|
|
24
|
+
- `task-flow: run all` - Execute all tasks
|
|
25
|
+
- `task-flow: review X` - Review specific task(s) (comma-separated or "all")
|
|
26
|
+
- `task-flow: refactor X` - Refactor specific task(s) (comma-separated or "all")
|
|
27
|
+
- `task-flow: estimate X` - Estimate time for task X (simplified - no "task" needed)
|
|
28
|
+
- `task-flow: estimate X,Y` - Estimate multiple tasks (comma-separated)
|
|
29
|
+
- `task-flow: estimate all` - Estimate all tasks
|
|
30
|
+
- `task-flow: report X` - Generate implementation report for task X (simplified - no "task" needed)
|
|
31
|
+
- `task-flow: report X,Y` - Generate reports for multiple tasks (comma-separated)
|
|
32
|
+
- `task-flow: report all` - Generate reports for all tasks
|
|
27
33
|
- **Files**:
|
|
28
34
|
- `.task-flow/tasks.input.txt` - Define your tasks here
|
|
29
35
|
- `.task-flow/tasks.status.md` - Auto-generated status (DO NOT EDIT manually)
|
package/GEMINI.md
CHANGED
|
@@ -16,14 +16,20 @@ This project uses RBIN Task Flow for task management:
|
|
|
16
16
|
- **Task Definition**: Edit `.task-flow/tasks.input.txt` using simple format: `- Task description`
|
|
17
17
|
- **AI Commands**: Use AI-powered commands for task management:
|
|
18
18
|
- `task-flow: sync` - Synchronize tasks from tasks.input.txt
|
|
19
|
-
- `task-flow: run next X` - Work on next X subtasks
|
|
20
|
-
- `task-flow: run task X` - Execute all pending subtasks of task X
|
|
21
|
-
- `task-flow: status` - View current task status
|
|
22
|
-
- `task-flow: review` - Review completed tasks
|
|
23
19
|
- `task-flow: think` - Analyze code and suggest new tasks
|
|
24
|
-
- `task-flow:
|
|
25
|
-
- `task-flow:
|
|
26
|
-
- `task-flow:
|
|
20
|
+
- `task-flow: status` - View current task status
|
|
21
|
+
- `task-flow: run next X` - Work on next X subtasks
|
|
22
|
+
- `task-flow: run X` - Execute all pending subtasks of task X (simplified - no "task" needed)
|
|
23
|
+
- `task-flow: run X,Y` - Execute multiple tasks (comma-separated)
|
|
24
|
+
- `task-flow: run all` - Execute all tasks
|
|
25
|
+
- `task-flow: review X` - Review specific task(s) (comma-separated or "all")
|
|
26
|
+
- `task-flow: refactor X` - Refactor specific task(s) (comma-separated or "all")
|
|
27
|
+
- `task-flow: estimate X` - Estimate time for task X (simplified - no "task" needed)
|
|
28
|
+
- `task-flow: estimate X,Y` - Estimate multiple tasks (comma-separated)
|
|
29
|
+
- `task-flow: estimate all` - Estimate all tasks
|
|
30
|
+
- `task-flow: report X` - Generate implementation report for task X (simplified - no "task" needed)
|
|
31
|
+
- `task-flow: report X,Y` - Generate reports for multiple tasks (comma-separated)
|
|
32
|
+
- `task-flow: report all` - Generate reports for all tasks
|
|
27
33
|
- **Files**:
|
|
28
34
|
- `.task-flow/tasks.input.txt` - Define your tasks here
|
|
29
35
|
- `.task-flow/tasks.status.md` - Auto-generated status (DO NOT EDIT manually)
|
package/README.md
CHANGED
|
@@ -60,7 +60,7 @@ rbin-task-flow init
|
|
|
60
60
|
# Edite .task-flow/tasks.input.txt e use:
|
|
61
61
|
# - task-flow: sync
|
|
62
62
|
# - task-flow: run next X
|
|
63
|
-
# - task-flow: run task X
|
|
63
|
+
# - task-flow: run X (ou task-flow: run X,Y ou task-flow: run all)
|
|
64
64
|
```
|
|
65
65
|
|
|
66
66
|
**Pronto!** RBIN Task Flow agora está disponível globalmente no seu sistema.
|
|
@@ -74,8 +74,8 @@ rbin-task-flow init # Inicializa no projeto atual
|
|
|
74
74
|
rbin-task-flow update # Atualiza configurações
|
|
75
75
|
rbin-task-flow version-check # Verifica atualizações de modelos
|
|
76
76
|
rbin-task-flow info # Mostra informações
|
|
77
|
-
rbin-task-flow estimate <
|
|
78
|
-
rbin-task-flow report <
|
|
77
|
+
rbin-task-flow estimate <ids> # Estima tempo (ex: "1" ou "1,2" ou "all")
|
|
78
|
+
rbin-task-flow report <ids> # Gera relatório (ex: "1" ou "1,2" ou "all")
|
|
79
79
|
```
|
|
80
80
|
|
|
81
81
|
### Comandos da IA - Por Que Usar?
|
|
@@ -86,13 +86,15 @@ Após inicializar, use estes comandos na IA (Cursor/Claude/Gemini) para gerencia
|
|
|
86
86
|
|---------|--------------|-------------------|
|
|
87
87
|
| `task-flow: sync` | **Sincroniza** tarefas do arquivo texto com o sistema | Mantém tudo sincronizado automaticamente - adiciona novas, remove deletadas, preserva seu progresso |
|
|
88
88
|
| `task-flow: think` | **Descobre** tarefas que você esqueceu | Analisa código e sugere tarefas que faltam (testes, refatoração, documentação) |
|
|
89
|
-
| `task-flow: run next X` | **Automatiza** o trabalho nas próximas subtarefas | A IA trabalha nas próximas X subtarefas sequencialmente, você só acompanha |
|
|
90
|
-
| `task-flow: run task X` | **Completa** uma tarefa inteira de uma vez | Executa todas as subtarefas de uma tarefa específica (permite trabalho paralelo) |
|
|
91
89
|
| `task-flow: status` | **Visualiza** o progresso rapidamente | Vê resumo com tasks completas, em andamento e quantas subtarefas faltam |
|
|
92
|
-
| `task-flow:
|
|
93
|
-
| `task-flow:
|
|
94
|
-
| `task-flow:
|
|
95
|
-
| `task-flow:
|
|
90
|
+
| `task-flow: run next X` | **Automatiza** o trabalho nas próximas subtarefas | A IA trabalha nas próximas X subtarefas sequencialmente, você só acompanha |
|
|
91
|
+
| `task-flow: run X` | **Completa** uma tarefa inteira de uma vez | Executa todas as subtarefas de uma tarefa específica (permite trabalho paralelo) |
|
|
92
|
+
| `task-flow: run X,Y` | **Completa** múltiplas tarefas | Executa tarefas separadas por vírgula (ex: `task-flow: run 10,11`) |
|
|
93
|
+
| `task-flow: run all` | **Completa** todas as tarefas | Executa todas as tarefas pendentes |
|
|
94
|
+
| `task-flow: review X` | **Garante** qualidade do trabalho | Verifica tarefas específicas (ex: `task-flow: review 1` ou `task-flow: review 10,11` ou `task-flow: review all`) |
|
|
95
|
+
| `task-flow: refactor X` | **Melhora** código sem quebrar | Refatora tarefas específicas (ex: `task-flow: refactor 1` ou `task-flow: refactor 10,11` ou `task-flow: refactor all`) |
|
|
96
|
+
| `task-flow: estimate X` | **Estima** tempo para gestão | Calcula estimativa de tempo (ex: `task-flow: estimate 1` ou `task-flow: estimate 10,11`) |
|
|
97
|
+
| `task-flow: report X` | **Documenta** implementação | Gera relatório detalhado (ex: `task-flow: report 1` ou `task-flow: report 10,11`) |
|
|
96
98
|
|
|
97
99
|
**Fluxo típico:**
|
|
98
100
|
|
|
@@ -423,7 +425,7 @@ rbin-task-flow init
|
|
|
423
425
|
# Edit .task-flow/tasks.input.txt and use:
|
|
424
426
|
# - task-flow: sync
|
|
425
427
|
# - task-flow: run next X
|
|
426
|
-
# - task-flow: run task X
|
|
428
|
+
# - task-flow: run X (or task-flow: run X,Y or task-flow: run all)
|
|
427
429
|
```
|
|
428
430
|
|
|
429
431
|
**That's it!** RBIN Task Flow is now available globally on your system.
|
|
@@ -437,8 +439,8 @@ rbin-task-flow init # Initialize in current project
|
|
|
437
439
|
rbin-task-flow update # Update configurations
|
|
438
440
|
rbin-task-flow version-check # Check for model updates
|
|
439
441
|
rbin-task-flow info # Show information
|
|
440
|
-
rbin-task-flow estimate <
|
|
441
|
-
rbin-task-flow report <
|
|
442
|
+
rbin-task-flow estimate <ids> # Estimate time (e.g., "1" or "1,2" or "all")
|
|
443
|
+
rbin-task-flow report <ids> # Generate report (e.g., "1" or "1,2" or "all")
|
|
442
444
|
```
|
|
443
445
|
|
|
444
446
|
### AI Commands - Why Use Them?
|
|
@@ -449,13 +451,15 @@ After initializing, use these commands in your AI (Cursor/Claude/Gemini) to auto
|
|
|
449
451
|
|---------|------------|-------------|
|
|
450
452
|
| `task-flow: sync` | **Sync** tasks from text file with system | Keeps everything synchronized automatically - adds new, removes deleted, preserves your progress |
|
|
451
453
|
| `task-flow: think` | **Discover** tasks you forgot | Analyzes code and suggests missing tasks (tests, refactoring, documentation) |
|
|
452
|
-
| `task-flow: run next X` | **Automate** work on next subtasks | AI works on next X subtasks sequentially, you just follow along |
|
|
453
|
-
| `task-flow: run task X` | **Complete** an entire task at once | Executes all subtasks of a specific task (allows parallel work) |
|
|
454
454
|
| `task-flow: status` | **Visualize** progress quickly | See summary with completed tasks, in progress, and remaining subtasks |
|
|
455
|
-
| `task-flow:
|
|
456
|
-
| `task-flow:
|
|
457
|
-
| `task-flow:
|
|
458
|
-
| `task-flow:
|
|
455
|
+
| `task-flow: run next X` | **Automate** work on next subtasks | AI works on next X subtasks sequentially, you just follow along |
|
|
456
|
+
| `task-flow: run X` | **Complete** an entire task at once | Executes all subtasks of a specific task (allows parallel work) |
|
|
457
|
+
| `task-flow: run X,Y` | **Complete** multiple tasks | Executes comma-separated tasks (e.g., `task-flow: run 10,11`) |
|
|
458
|
+
| `task-flow: run all` | **Complete** all tasks | Executes all pending tasks |
|
|
459
|
+
| `task-flow: review X` | **Ensure** work quality | Verifies specific tasks (e.g., `task-flow: review 1` or `task-flow: review 10,11` or `task-flow: review all`) |
|
|
460
|
+
| `task-flow: refactor X` | **Improve** code without breaking | Refactors specific tasks (e.g., `task-flow: refactor 1` or `task-flow: refactor 10,11` or `task-flow: refactor all`) |
|
|
461
|
+
| `task-flow: estimate X` | **Estimate** time for management | Calculates time estimate (e.g., `task-flow: estimate 1` or `task-flow: estimate 10,11`) |
|
|
462
|
+
| `task-flow: report X` | **Document** implementation | Generates detailed report (e.g., `task-flow: report 1` or `task-flow: report 10,11`) |
|
|
459
463
|
|
|
460
464
|
**Typical workflow:**
|
|
461
465
|
|
package/bin/cli.js
CHANGED
|
@@ -40,22 +40,22 @@ program
|
|
|
40
40
|
|
|
41
41
|
program
|
|
42
42
|
.command('estimate')
|
|
43
|
-
.description('Estimate time for
|
|
44
|
-
.argument('<
|
|
43
|
+
.description('Estimate time for task(s) based on subtasks and experience level')
|
|
44
|
+
.argument('<taskIds>', 'Task ID(s) to estimate (comma-separated or "all")')
|
|
45
45
|
.option('-p, --path <path>', 'Target directory (default: current directory)')
|
|
46
|
-
.action(async (
|
|
46
|
+
.action(async (taskIds, options) => {
|
|
47
47
|
const targetPath = options.path || process.cwd();
|
|
48
|
-
await estimateTask(
|
|
48
|
+
await estimateTask(taskIds, targetPath);
|
|
49
49
|
});
|
|
50
50
|
|
|
51
51
|
program
|
|
52
52
|
.command('report')
|
|
53
|
-
.description('Generate implementation report for
|
|
54
|
-
.argument('<
|
|
53
|
+
.description('Generate implementation report for completed task(s)')
|
|
54
|
+
.argument('<taskIds>', 'Task ID(s) to generate report for (comma-separated or "all")')
|
|
55
55
|
.option('-p, --path <path>', 'Target directory (default: current directory)')
|
|
56
|
-
.action(async (
|
|
56
|
+
.action(async (taskIds, options) => {
|
|
57
57
|
const targetPath = options.path || process.cwd();
|
|
58
|
-
await generateReport(
|
|
58
|
+
await generateReport(taskIds, targetPath);
|
|
59
59
|
});
|
|
60
60
|
|
|
61
61
|
program
|
|
@@ -72,8 +72,8 @@ program
|
|
|
72
72
|
console.log(chalk.cyan(' rbin-task-flow init') + ' - Initialize in current directory');
|
|
73
73
|
console.log(chalk.cyan(' rbin-task-flow update') + ' - Update configurations');
|
|
74
74
|
console.log(chalk.cyan(' rbin-task-flow version-check') + ' - Check for model updates');
|
|
75
|
-
console.log(chalk.cyan(' rbin-task-flow estimate <
|
|
76
|
-
console.log(chalk.cyan(' rbin-task-flow report <
|
|
75
|
+
console.log(chalk.cyan(' rbin-task-flow estimate <ids>') + ' - Estimate time (e.g., "1" or "1,2" or "all")');
|
|
76
|
+
console.log(chalk.cyan(' rbin-task-flow report <ids>') + ' - Generate report (e.g., "1" or "1,2" or "all")');
|
|
77
77
|
console.log(chalk.cyan(' rbin-task-flow info') + ' - Show this information\n');
|
|
78
78
|
});
|
|
79
79
|
|
package/lib/estimate.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
const fs = require('fs-extra');
|
|
2
2
|
const path = require('path');
|
|
3
3
|
const chalk = require('chalk');
|
|
4
|
+
const { parseTaskIds } = require('./utils');
|
|
4
5
|
|
|
5
|
-
async function estimateTask(
|
|
6
|
+
async function estimateTask(taskIdsInput, targetPath = process.cwd()) {
|
|
6
7
|
const tasksPath = path.join(targetPath, '.task-flow/.internal/tasks.json');
|
|
7
8
|
|
|
8
9
|
if (!fs.existsSync(tasksPath)) {
|
|
@@ -12,57 +13,81 @@ async function estimateTask(taskId, targetPath = process.cwd()) {
|
|
|
12
13
|
|
|
13
14
|
try {
|
|
14
15
|
const tasksData = await fs.readJSON(tasksPath);
|
|
15
|
-
const
|
|
16
|
-
|
|
17
|
-
if (
|
|
18
|
-
console.log(chalk.red(
|
|
16
|
+
const taskIds = parseTaskIds(taskIdsInput, tasksData.tasks);
|
|
17
|
+
|
|
18
|
+
if (taskIds.length === 0) {
|
|
19
|
+
console.log(chalk.red('❌ No valid task IDs provided.'));
|
|
19
20
|
return;
|
|
20
21
|
}
|
|
21
22
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
23
|
+
let successCount = 0;
|
|
24
|
+
let errorCount = 0;
|
|
25
|
+
|
|
26
|
+
for (const taskId of taskIds) {
|
|
27
|
+
const task = tasksData.tasks.find(t => t.id === taskId);
|
|
28
|
+
|
|
29
|
+
if (!task) {
|
|
30
|
+
console.log(chalk.red(`❌ Task ${taskId} not found.`));
|
|
31
|
+
errorCount++;
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const subtaskCount = task.subtasks ? task.subtasks.length : 0;
|
|
36
|
+
|
|
37
|
+
if (subtaskCount === 0) {
|
|
38
|
+
console.log(chalk.yellow(`⚠️ Task ${taskId} has no subtasks. Cannot estimate.`));
|
|
39
|
+
errorCount++;
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const estimates = calculateEstimates(subtaskCount);
|
|
44
|
+
|
|
45
|
+
if (taskIds.length > 1) {
|
|
46
|
+
console.log('\n' + chalk.cyan('═'.repeat(70)));
|
|
47
|
+
} else {
|
|
48
|
+
console.log('\n' + chalk.cyan('═'.repeat(70)));
|
|
49
|
+
}
|
|
50
|
+
console.log(chalk.magenta('📊 Task Estimation Report'));
|
|
51
|
+
console.log(chalk.cyan('═'.repeat(70)) + '\n');
|
|
52
|
+
|
|
53
|
+
console.log(chalk.blue.bold('Task:'), chalk.yellow(`#${taskId} - ${task.title}\n`));
|
|
54
|
+
console.log(chalk.blue(`Complexity: ${chalk.yellow(subtaskCount)} subtasks\n`));
|
|
55
|
+
|
|
56
|
+
console.log(chalk.cyan('─'.repeat(70)));
|
|
57
|
+
console.log(chalk.magenta.bold('Time Estimates by Experience Level:\n'));
|
|
58
|
+
|
|
59
|
+
const juniorDays = Math.ceil(estimates.junior.upper / 8);
|
|
60
|
+
const midDays = Math.ceil(estimates.mid.upper / 8);
|
|
61
|
+
const seniorDays = Math.ceil(estimates.senior.upper / 8);
|
|
62
|
+
|
|
63
|
+
console.log(chalk.gray('👶 Junior Developer (0-2 years):'));
|
|
64
|
+
console.log(chalk.white(' Hours:'), chalk.yellow(`${estimates.junior.lower}-${estimates.junior.upper} hours`));
|
|
65
|
+
console.log(chalk.white(' Days: '), chalk.yellow(`~${juniorDays} business day(s)`));
|
|
66
|
+
console.log('');
|
|
67
|
+
|
|
68
|
+
console.log(chalk.gray('👨💼 Mid-level Developer (3-5 years):'));
|
|
69
|
+
console.log(chalk.white(' Hours:'), chalk.yellow(`${estimates.mid.lower}-${estimates.mid.upper} hours`));
|
|
70
|
+
console.log(chalk.white(' Days: '), chalk.yellow(`~${midDays} business day(s)`));
|
|
71
|
+
console.log('');
|
|
72
|
+
|
|
73
|
+
console.log(chalk.gray('👴 Senior Developer (6+ years):'));
|
|
74
|
+
console.log(chalk.white(' Hours:'), chalk.yellow(`${estimates.senior.lower}-${estimates.senior.upper} hours`));
|
|
75
|
+
console.log(chalk.white(' Days: '), chalk.yellow(`~${seniorDays} business day(s)`));
|
|
76
|
+
console.log('');
|
|
77
|
+
|
|
78
|
+
console.log(chalk.cyan('─'.repeat(70)));
|
|
79
|
+
console.log(chalk.magenta.bold('Recommendation for Management:\n'));
|
|
80
|
+
console.log(chalk.white(' Recommended estimate:'), chalk.yellow(`${estimates.mid.lower}-${estimates.mid.upper} hours`), chalk.gray('(mid-level baseline)'));
|
|
81
|
+
console.log(chalk.white(' Buffer recommended:'), chalk.yellow(`+20%`), chalk.gray('for unexpected issues'));
|
|
82
|
+
console.log(chalk.white(' Total estimate:'), chalk.yellow(`${Math.round(estimates.mid.upper * 1.2)} hours`), chalk.gray(`(~${Math.ceil(estimates.mid.upper * 1.2 / 8)} business days)`));
|
|
83
|
+
console.log('');
|
|
84
|
+
|
|
85
|
+
successCount++;
|
|
27
86
|
}
|
|
28
87
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
console.log(chalk.magenta('📊 Task Estimation Report'));
|
|
33
|
-
console.log(chalk.cyan('═'.repeat(70)) + '\n');
|
|
34
|
-
|
|
35
|
-
console.log(chalk.blue.bold('Task:'), chalk.yellow(`#${taskId} - ${task.title}\n`));
|
|
36
|
-
console.log(chalk.blue(`Complexity: ${chalk.yellow(subtaskCount)} subtasks\n`));
|
|
37
|
-
|
|
38
|
-
console.log(chalk.cyan('─'.repeat(70)));
|
|
39
|
-
console.log(chalk.magenta.bold('Time Estimates by Experience Level:\n'));
|
|
40
|
-
|
|
41
|
-
const juniorDays = Math.ceil(estimates.junior.upper / 8);
|
|
42
|
-
const midDays = Math.ceil(estimates.mid.upper / 8);
|
|
43
|
-
const seniorDays = Math.ceil(estimates.senior.upper / 8);
|
|
44
|
-
|
|
45
|
-
console.log(chalk.gray('👶 Junior Developer (0-2 years):'));
|
|
46
|
-
console.log(chalk.white(' Hours:'), chalk.yellow(`${estimates.junior.lower}-${estimates.junior.upper} hours`));
|
|
47
|
-
console.log(chalk.white(' Days: '), chalk.yellow(`~${juniorDays} business day(s)`));
|
|
48
|
-
console.log('');
|
|
49
|
-
|
|
50
|
-
console.log(chalk.gray('👨💼 Mid-level Developer (3-5 years):'));
|
|
51
|
-
console.log(chalk.white(' Hours:'), chalk.yellow(`${estimates.mid.lower}-${estimates.mid.upper} hours`));
|
|
52
|
-
console.log(chalk.white(' Days: '), chalk.yellow(`~${midDays} business day(s)`));
|
|
53
|
-
console.log('');
|
|
54
|
-
|
|
55
|
-
console.log(chalk.gray('👴 Senior Developer (6+ years):'));
|
|
56
|
-
console.log(chalk.white(' Hours:'), chalk.yellow(`${estimates.senior.lower}-${estimates.senior.upper} hours`));
|
|
57
|
-
console.log(chalk.white(' Days: '), chalk.yellow(`~${seniorDays} business day(s)`));
|
|
58
|
-
console.log('');
|
|
59
|
-
|
|
60
|
-
console.log(chalk.cyan('─'.repeat(70)));
|
|
61
|
-
console.log(chalk.magenta.bold('Recommendation for Management:\n'));
|
|
62
|
-
console.log(chalk.white(' Recommended estimate:'), chalk.yellow(`${estimates.mid.lower}-${estimates.mid.upper} hours`), chalk.gray('(mid-level baseline)'));
|
|
63
|
-
console.log(chalk.white(' Buffer recommended:'), chalk.yellow(`+20%`), chalk.gray('for unexpected issues'));
|
|
64
|
-
console.log(chalk.white(' Total estimate:'), chalk.yellow(`${Math.round(estimates.mid.upper * 1.2)} hours`), chalk.gray(`(~${Math.ceil(estimates.mid.upper * 1.2 / 8)} business days)`));
|
|
65
|
-
console.log('');
|
|
88
|
+
if (taskIds.length > 1) {
|
|
89
|
+
console.log(chalk.cyan(`\n📊 Estimated ${successCount} task(s), ${errorCount} error(s)`));
|
|
90
|
+
}
|
|
66
91
|
|
|
67
92
|
} catch (error) {
|
|
68
93
|
console.error(chalk.red('Error reading tasks:'), error.message);
|
package/lib/report.js
CHANGED
|
@@ -2,8 +2,9 @@ const fs = require('fs-extra');
|
|
|
2
2
|
const path = require('path');
|
|
3
3
|
const chalk = require('chalk');
|
|
4
4
|
const { execSync } = require('child_process');
|
|
5
|
+
const { parseTaskIds } = require('./utils');
|
|
5
6
|
|
|
6
|
-
async function generateReport(
|
|
7
|
+
async function generateReport(taskIdsInput, targetPath = process.cwd()) {
|
|
7
8
|
const tasksPath = path.join(targetPath, '.task-flow/.internal/tasks.json');
|
|
8
9
|
const statusPath = path.join(targetPath, '.task-flow/.internal/status.json');
|
|
9
10
|
const docsDir = path.join(targetPath, '.task-flow/docs');
|
|
@@ -22,36 +23,54 @@ async function generateReport(taskId, targetPath = process.cwd()) {
|
|
|
22
23
|
const tasksData = await fs.readJSON(tasksPath);
|
|
23
24
|
const statusData = await fs.readJSON(statusPath);
|
|
24
25
|
|
|
25
|
-
const
|
|
26
|
-
|
|
27
|
-
if (
|
|
28
|
-
console.log(chalk.red(
|
|
26
|
+
const taskIds = parseTaskIds(taskIdsInput, tasksData.tasks);
|
|
27
|
+
|
|
28
|
+
if (taskIds.length === 0) {
|
|
29
|
+
console.log(chalk.red('❌ No valid task IDs provided.'));
|
|
29
30
|
return;
|
|
30
31
|
}
|
|
31
32
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
if (!taskStatus) {
|
|
35
|
-
console.log(chalk.yellow(`⚠️ Task ${taskId} has no status information.`));
|
|
36
|
-
}
|
|
33
|
+
await fs.ensureDir(docsDir);
|
|
37
34
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
? Object.values(taskStatus.subtasks).every(status => status === 'done')
|
|
41
|
-
: false;
|
|
35
|
+
let successCount = 0;
|
|
36
|
+
let errorCount = 0;
|
|
42
37
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
}
|
|
38
|
+
for (const taskId of taskIds) {
|
|
39
|
+
const task = tasksData.tasks.find(t => t.id === taskId);
|
|
46
40
|
|
|
47
|
-
|
|
41
|
+
if (!task) {
|
|
42
|
+
console.log(chalk.red(`❌ Task ${taskId} not found.`));
|
|
43
|
+
errorCount++;
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
48
46
|
|
|
49
|
-
|
|
50
|
-
|
|
47
|
+
const taskStatus = statusData.tasks[taskId.toString()];
|
|
48
|
+
|
|
49
|
+
if (!taskStatus) {
|
|
50
|
+
console.log(chalk.yellow(`⚠️ Task ${taskId} has no status information.`));
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const isCompleted = taskStatus && taskStatus.status === 'done';
|
|
54
|
+
const allSubtasksDone = taskStatus && taskStatus.subtasks
|
|
55
|
+
? Object.values(taskStatus.subtasks).every(status => status === 'done')
|
|
56
|
+
: false;
|
|
57
|
+
|
|
58
|
+
if (!isCompleted && !allSubtasksDone) {
|
|
59
|
+
console.log(chalk.yellow(`⚠️ Task ${taskId} is not completed. Generating partial report...`));
|
|
60
|
+
}
|
|
51
61
|
|
|
52
|
-
|
|
62
|
+
const reportContent = await buildReport(task, taskStatus, targetPath);
|
|
63
|
+
const reportPath = path.join(docsDir, `task-${taskId}-implementation.md`);
|
|
53
64
|
|
|
54
|
-
|
|
65
|
+
await fs.writeFile(reportPath, reportContent, 'utf8');
|
|
66
|
+
|
|
67
|
+
console.log(chalk.green(`✅ Report generated: ${reportPath}`));
|
|
68
|
+
successCount++;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
if (taskIds.length > 1) {
|
|
72
|
+
console.log(chalk.cyan(`\n📊 Generated ${successCount} report(s), ${errorCount} error(s)`));
|
|
73
|
+
}
|
|
55
74
|
|
|
56
75
|
} catch (error) {
|
|
57
76
|
console.error(chalk.red('Error generating report:'), error.message);
|
package/lib/utils.js
CHANGED
|
@@ -35,11 +35,26 @@ function showNextSteps(targetPath) {
|
|
|
35
35
|
console.log(chalk.blue('\n See'), chalk.yellow('.task-flow/README.md'), chalk.blue('for all available commands\n'));
|
|
36
36
|
}
|
|
37
37
|
|
|
38
|
+
function parseTaskIds(input, allTasks = []) {
|
|
39
|
+
if (!input || input.trim().toLowerCase() === 'all') {
|
|
40
|
+
return allTasks.map(t => t.id);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const ids = input.split(',')
|
|
44
|
+
.map(id => id.trim())
|
|
45
|
+
.filter(id => id.length > 0)
|
|
46
|
+
.map(id => parseInt(id))
|
|
47
|
+
.filter(id => !isNaN(id));
|
|
48
|
+
|
|
49
|
+
return ids;
|
|
50
|
+
}
|
|
51
|
+
|
|
38
52
|
module.exports = {
|
|
39
53
|
showHeader,
|
|
40
54
|
showSuccess,
|
|
41
55
|
showError,
|
|
42
56
|
showWarning,
|
|
43
57
|
showInfo,
|
|
44
|
-
showNextSteps
|
|
58
|
+
showNextSteps,
|
|
59
|
+
parseTaskIds
|
|
45
60
|
};
|