rbin-task-flow 1.19.0 → 1.19.2
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/coding_standards.mdc +23 -0
- package/.cursor/rules/task_estimate.mdc +15 -15
- package/.cursor/rules/task_execution.mdc +1 -1
- package/.cursor/rules/task_generate_flow.mdc +55 -49
- package/.task-flow/README.md +1 -1
- package/CLAUDE.md +2 -2
- package/lib/estimate.js +2 -2
- package/lib/install.js +1 -1
- package/package.json +1 -1
|
@@ -85,6 +85,29 @@ In **front web** (Next.js, React) or **mobile** (Expo, React Native) projects, e
|
|
|
85
85
|
- **Validation**: Zod (not class-validator/class-transformer)
|
|
86
86
|
- **Structure**: `src/app/` (controllers), `src/features/` (use-cases, repositories), `src/shared/` (guards, pipes, gateways)
|
|
87
87
|
|
|
88
|
+
### ESLint — @rbinflow/eslint-config
|
|
89
|
+
|
|
90
|
+
When the project uses `@rbinflow/eslint-config`, **do not add any other ESLint plugins or configs** — `@rbinflow/eslint-config` already configures everything. The `.eslintrc.cjs` file must stay minimal:
|
|
91
|
+
|
|
92
|
+
**Available configurations:**
|
|
93
|
+
|
|
94
|
+
| Project type | extends |
|
|
95
|
+
|--------------|---------|
|
|
96
|
+
| Node.js (no semicolons) | `@rbinflow/eslint-config/node` |
|
|
97
|
+
| Node.js (with semicolons) | `@rbinflow/eslint-config/node-with-semi` |
|
|
98
|
+
| React | `@rbinflow/eslint-config/react` |
|
|
99
|
+
| Next.js | `@rbinflow/eslint-config/next` |
|
|
100
|
+
| Expo | `@rbinflow/eslint-config/expo` |
|
|
101
|
+
|
|
102
|
+
**Example (.eslintrc.cjs):**
|
|
103
|
+
```javascript
|
|
104
|
+
module.exports = {
|
|
105
|
+
extends: ['@rbinflow/eslint-config/next'],
|
|
106
|
+
}
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
**Node.js variants:** `node` uses `semi: false`; `node-with-semi` uses `semi: true`. All other settings are identical. No extra `plugins`, `rules`, or `extends` beyond this.
|
|
110
|
+
|
|
88
111
|
---
|
|
89
112
|
|
|
90
113
|
## app/ — Routes Only (Front-end & Mobile) / Controllers Only (Backend)
|
|
@@ -12,19 +12,19 @@ alwaysApply: true
|
|
|
12
12
|
- **READ**: `.task-flow/.internal/tasks.json` to get task details
|
|
13
13
|
- **CALCULATE**: Time estimate based on number of subtasks and developer experience level
|
|
14
14
|
- **DISPLAY**: Show time estimate with intervals for 3 experience levels (junior, mid, senior)
|
|
15
|
-
- **FORMAT**: Show estimates in hours with ranges (e.g., "10-14 hours" for
|
|
15
|
+
- **FORMAT**: Show estimates in hours with ranges (e.g., "10-14 hours" for intermediate)
|
|
16
16
|
|
|
17
17
|
- **Estimation Rules:**
|
|
18
18
|
1. **Base Calculation**: Count total number of subtasks in the task
|
|
19
|
-
2. **Experience Levels
|
|
19
|
+
2. **Experience Levels** (use internally; display "Intermediate" not "Mid-level" to user):
|
|
20
20
|
- **Junior** (0-2 years): Base time × 1.5 multiplier
|
|
21
|
-
- **
|
|
21
|
+
- **Intermediate** (3-5 years): Base time × 1.0 multiplier (baseline)
|
|
22
22
|
- **Senior** (6+ years): Base time × 0.7 multiplier
|
|
23
23
|
3. **Time per Subtask**:
|
|
24
|
-
- Simple subtask: 1-2 hours (
|
|
25
|
-
- Medium subtask: 2-4 hours (
|
|
26
|
-
- Complex subtask: 4-6 hours (
|
|
27
|
-
4. **Default Assumption**: Average 2-3 hours per subtask for
|
|
24
|
+
- Simple subtask: 1-2 hours (intermediate baseline)
|
|
25
|
+
- Medium subtask: 2-4 hours (intermediate baseline)
|
|
26
|
+
- Complex subtask: 4-6 hours (intermediate baseline)
|
|
27
|
+
4. **Default Assumption**: Average 2-3 hours per subtask for intermediate (baseline)
|
|
28
28
|
5. **Range Calculation**:
|
|
29
29
|
- Lower bound: (subtasks × 2) × multiplier
|
|
30
30
|
- Upper bound: (subtasks × 3) × multiplier
|
|
@@ -32,13 +32,13 @@ alwaysApply: true
|
|
|
32
32
|
|
|
33
33
|
- **Estimation Formula:**
|
|
34
34
|
```
|
|
35
|
-
Base hours per subtask: 2-3 hours (
|
|
35
|
+
Base hours per subtask: 2-3 hours (intermediate)
|
|
36
36
|
|
|
37
37
|
Junior (0-2 years):
|
|
38
38
|
Lower: (subtasks × 2) × 1.5
|
|
39
39
|
Upper: (subtasks × 3) × 1.5
|
|
40
40
|
|
|
41
|
-
|
|
41
|
+
Intermediate (3-5 years):
|
|
42
42
|
Lower: subtasks × 2
|
|
43
43
|
Upper: subtasks × 3
|
|
44
44
|
|
|
@@ -53,9 +53,9 @@ alwaysApply: true
|
|
|
53
53
|
|
|
54
54
|
Based on [N] subtasks:
|
|
55
55
|
|
|
56
|
-
👶 Junior (0-2 years):
|
|
57
|
-
👨💼
|
|
58
|
-
👴 Senior (6+ years):
|
|
56
|
+
👶 Junior (0-2 years): [X-Y] hours
|
|
57
|
+
👨💼 Intermediate (3-5 years): [X-Y] hours
|
|
58
|
+
👴 Senior (6+ years): [X-Y] hours
|
|
59
59
|
```
|
|
60
60
|
|
|
61
61
|
- **Natural Language Phrases:**
|
|
@@ -78,9 +78,9 @@ alwaysApply: true
|
|
|
78
78
|
|
|
79
79
|
Based on 5 subtasks:
|
|
80
80
|
|
|
81
|
-
👶 Junior (0-2 years):
|
|
82
|
-
👨💼
|
|
83
|
-
👴 Senior (6+ years):
|
|
81
|
+
👶 Junior (0-2 years): 15-23 hours
|
|
82
|
+
👨💼 Intermediate (3-5 years): 10-15 hours
|
|
83
|
+
👴 Senior (6+ years): 7-11 hours
|
|
84
84
|
```
|
|
85
85
|
|
|
86
86
|
- **Integration:**
|
|
@@ -37,7 +37,7 @@ alwaysApply: true
|
|
|
37
37
|
- `task-flow: report X` - Generate implementation report for task X (simplified - no "task" needed)
|
|
38
38
|
- `task-flow: report X,Y` - Generate reports for multiple tasks (comma-separated)
|
|
39
39
|
- `task-flow: report all` - Generate reports for all tasks
|
|
40
|
-
- `task-flow: generate flow` - Populate tasks.flow.md with dependencies, estimated hours
|
|
40
|
+
- `task-flow: generate flow` - Populate tasks.flow.md with dependencies, estimated hours, and AI model recommendations
|
|
41
41
|
|
|
42
42
|
- **Workflow Example:**
|
|
43
43
|
```markdown
|
|
@@ -1,73 +1,79 @@
|
|
|
1
1
|
---
|
|
2
|
-
description: Generate task flow with dependencies, estimated hours
|
|
2
|
+
description: Generate task flow with dependencies, estimated hours, and AI model recommendations
|
|
3
3
|
globs: **/*
|
|
4
4
|
alwaysApply: true
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
- **Task Flow Generation - Dependencies, Hours & Model Recommendations:**
|
|
8
|
-
- **FAST FORMAT**: `task-flow: generate flow` → Populate tasks.flow.md
|
|
8
|
+
- **FAST FORMAT**: `task-flow: generate flow` → Populate tasks.flow.md
|
|
9
9
|
- When user says "task-flow: generate flow", "generate flow", "gerar flow", or "flow":
|
|
10
|
-
- **READ**: `.task-flow/.internal/tasks.json`
|
|
11
|
-
- **
|
|
12
|
-
- **ANALYZE**: For each task, determine dependencies, estimated hours, and model recommendations
|
|
10
|
+
- **READ**: `.task-flow/.internal/tasks.json` and optionally `status.json`
|
|
11
|
+
- **SEARCH**: Current versions of Codex, Composer, Claude (Haiku, Sonnet) via web search
|
|
13
12
|
- **WRITE**: Populate `.task-flow/tasks.flow.md` with the generated flow
|
|
14
|
-
- **DO NOT**: Populate tasks.flow.md when running `task-flow: sync`
|
|
13
|
+
- **DO NOT**: Populate tasks.flow.md when running `task-flow: sync`
|
|
15
14
|
|
|
16
15
|
- **Generation Process:**
|
|
17
|
-
1. **Search for current model versions** (
|
|
18
|
-
2. Read
|
|
16
|
+
1. **Search for current model versions** (web search): Codex, Composer (Cursor), Claude Haiku, Claude Sonnet. Include version next to each model (e.g. "Claude Sonnet 4.6").
|
|
17
|
+
2. Read tasks from tasks.json
|
|
19
18
|
3. For each task, determine:
|
|
20
|
-
- **
|
|
21
|
-
- **
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
- Use "none" or "nenhuma" when no dependencies
|
|
26
|
-
- **Model recommendations** (in order, most to least indicated):
|
|
27
|
-
- **Codex** (variants): include current version from web search
|
|
28
|
-
- **Composer** (Cursor): include current version from web search
|
|
29
|
-
- **Claude**: Haiku, Sonnet, Opus — include current version from web search
|
|
30
|
-
- **Effort**: low, medium, or high (based on subtask count, complexity)
|
|
31
|
-
4. Output format per task (simple, one line):
|
|
32
|
-
- `task X - depende da task Y - X-Yh (dev mediano, cobrança) - model1 effort E, model2, model3 effort E`
|
|
33
|
-
- Or: `task X - nenhuma dependência - X-Yh (dev mediano, cobrança) - model1 effort E, model2, model3 effort E`
|
|
19
|
+
- **Dependencies**: Which tasks must be completed first (or "—" if none)
|
|
20
|
+
- **Estimated hours** (for billing): subtasks × 2 to subtasks × 3 hours. Do NOT show "dev mediano" or "mid-level".
|
|
21
|
+
- **3 model options** (in order of priority): one Codex, one Composer, one Claude — always these 3. Include version and effort for each.
|
|
22
|
+
- **Effort** per model: low (1-3 subtasks), medium (4-6), high (7+ or complex)
|
|
23
|
+
4. **Claude**: Use only Haiku or Sonnet — **never Opus**
|
|
34
24
|
|
|
35
|
-
- **Output Format
|
|
25
|
+
- **Output Format (direct blocks per task):**
|
|
36
26
|
```markdown
|
|
37
27
|
# Task Flow — Dependencies, Hours & Model Recommendations
|
|
38
28
|
|
|
39
29
|
<!-- Populated by task-flow: generate flow. Do not edit manually. -->
|
|
40
|
-
<!-- Horas:
|
|
30
|
+
<!-- Horas: uso para cobrança ao cliente -->
|
|
41
31
|
|
|
42
|
-
##
|
|
32
|
+
## Legenda
|
|
43
33
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
34
|
+
| Símbolo | Significado |
|
|
35
|
+
|---------|-------------|
|
|
36
|
+
| ✅ | Task concluída |
|
|
37
|
+
| ⚡ | Pode iniciar agora (deps satisfeitas) |
|
|
38
|
+
| 🔒 | Bloqueada por dependências |
|
|
39
|
+
|
|
40
|
+
**Esforço (Effort):** low (1-3 subtasks), medium (4-6), high (7+)
|
|
41
|
+
**Claude:** Haiku ou Sonnet — **não use Opus**
|
|
42
|
+
|
|
43
|
+
## Tasks (blocos diretos por task)
|
|
48
44
|
|
|
49
|
-
|
|
50
|
-
- **
|
|
51
|
-
- **
|
|
52
|
-
- **
|
|
53
|
-
|
|
54
|
-
|
|
45
|
+
### ✅ Task 1 — [Título]
|
|
46
|
+
- **Depende de:** —
|
|
47
|
+
- **Horas cobrança:** 10-15h
|
|
48
|
+
- **Modelos sugeridos** (ordem de prioridade):
|
|
49
|
+
1. Codex [versão] — effort medium
|
|
50
|
+
2. Composer [versão] — effort medium
|
|
51
|
+
3. Claude Sonnet [versão] — effort medium
|
|
55
52
|
|
|
56
|
-
|
|
57
|
-
-
|
|
58
|
-
-
|
|
59
|
-
-
|
|
53
|
+
### ⚡ Task 2 — [Título]
|
|
54
|
+
- **Depende de:** Task 1 ✅
|
|
55
|
+
- **Horas cobrança:** 10-15h
|
|
56
|
+
- **Modelos sugeridos** (ordem de prioridade):
|
|
57
|
+
1. Codex [versão] — effort medium
|
|
58
|
+
2. Composer [versão] — effort medium
|
|
59
|
+
3. Claude Sonnet [versão] — effort medium
|
|
60
|
+
|
|
61
|
+
### 🔒 Task 3 — [Título]
|
|
62
|
+
- **Depende de:** Task 2
|
|
63
|
+
- **Horas cobrança:** 8-12h
|
|
64
|
+
- **Modelos sugeridos** (ordem de prioridade):
|
|
65
|
+
1. Claude Haiku [versão] — effort low
|
|
66
|
+
2. Codex [versão] — effort low
|
|
67
|
+
3. Composer [versão] — effort low
|
|
68
|
+
```
|
|
60
69
|
|
|
61
|
-
- **
|
|
62
|
-
- **
|
|
63
|
-
-
|
|
64
|
-
-
|
|
70
|
+
- **Model Rules:**
|
|
71
|
+
- **3 models per task**: One Codex, one Composer, one Claude — always in order of priority
|
|
72
|
+
- **Version required**: Include current version next to each model name (from web search)
|
|
73
|
+
- **Effort required**: low, medium, or high for each model
|
|
74
|
+
- **No Opus**: Claude = Haiku or Sonnet only
|
|
65
75
|
|
|
66
|
-
- **
|
|
67
|
-
- Uses data from `.task-flow/.internal/tasks.json`
|
|
68
|
-
- Writes to `.task-flow/tasks.flow.md` (created by `rbin-task-flow init`)
|
|
69
|
-
- Does NOT run on `task-flow: sync` — only when user explicitly requests `task-flow: generate flow`
|
|
70
|
-
- Works with [task_execution.mdc](mdc:.cursor/rules/task_execution.mdc) workflow
|
|
76
|
+
- **Natural Language:** "generate flow", "gerar flow", "flow"
|
|
71
77
|
|
|
72
78
|
- **Principle:**
|
|
73
|
-
> **Populate tasks.flow.md with
|
|
79
|
+
> **Populate tasks.flow.md with direct blocks per task. Dependencies, hours, and 3 model options (Codex, Composer, Claude) with version and effort. Never use Opus.**
|
package/.task-flow/README.md
CHANGED
|
@@ -98,7 +98,7 @@ Refactors code from specific task(s). Removes explanatory comments, improves cod
|
|
|
98
98
|
Estimates time required to complete task(s) based on the number of subtasks and developer experience level.
|
|
99
99
|
|
|
100
100
|
**Output includes:**
|
|
101
|
-
- Time estimates for Junior (0-2 years),
|
|
101
|
+
- Time estimates for Junior (0-2 years), Intermediate (3-5 years), and Senior (6+ years) developers
|
|
102
102
|
- Estimates in hours and business days
|
|
103
103
|
- Recommendation for management with buffer
|
|
104
104
|
|
package/CLAUDE.md
CHANGED
|
@@ -37,11 +37,11 @@ This project uses RBIN Task Flow for task management:
|
|
|
37
37
|
- `task-flow: report X` - Generate implementation report for task X (simplified - no "task" needed)
|
|
38
38
|
- `task-flow: report X,Y` - Generate reports for multiple tasks (comma-separated)
|
|
39
39
|
- `task-flow: report all` - Generate reports for all tasks
|
|
40
|
-
- `task-flow: generate flow` - Populate tasks.flow.md with dependencies, estimated hours
|
|
40
|
+
- `task-flow: generate flow` - Populate tasks.flow.md with dependencies, estimated hours, and AI model recommendations
|
|
41
41
|
- **Files**:
|
|
42
42
|
- `.task-flow/tasks.input.txt` - Define your tasks here
|
|
43
43
|
- `.task-flow/tasks.status.md` - Auto-generated status (DO NOT EDIT manually)
|
|
44
|
-
- `.task-flow/tasks.flow.md` - Dependencies, estimated hours
|
|
44
|
+
- `.task-flow/tasks.flow.md` - Dependencies, estimated hours, and model recommendations (populated by `task-flow: generate flow`)
|
|
45
45
|
- `.task-flow/.internal/` - Internal system files (ignore)
|
|
46
46
|
|
|
47
47
|
Follow all rules defined in `.cursor/rules/` for consistent development practices.
|
package/lib/estimate.js
CHANGED
|
@@ -65,7 +65,7 @@ async function estimateTask(taskIdsInput, targetPath = process.cwd()) {
|
|
|
65
65
|
console.log(chalk.white(' Days: '), chalk.yellow(`~${juniorDays} business day(s)`));
|
|
66
66
|
console.log('');
|
|
67
67
|
|
|
68
|
-
console.log(chalk.gray('👨💼
|
|
68
|
+
console.log(chalk.gray('👨💼 Intermediate (3-5 years):'));
|
|
69
69
|
console.log(chalk.white(' Hours:'), chalk.yellow(`${estimates.mid.lower}-${estimates.mid.upper} hours`));
|
|
70
70
|
console.log(chalk.white(' Days: '), chalk.yellow(`~${midDays} business day(s)`));
|
|
71
71
|
console.log('');
|
|
@@ -77,7 +77,7 @@ async function estimateTask(taskIdsInput, targetPath = process.cwd()) {
|
|
|
77
77
|
|
|
78
78
|
console.log(chalk.cyan('─'.repeat(70)));
|
|
79
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('(
|
|
80
|
+
console.log(chalk.white(' Recommended estimate:'), chalk.yellow(`${estimates.mid.lower}-${estimates.mid.upper} hours`), chalk.gray('(3-5 years baseline)'));
|
|
81
81
|
console.log(chalk.white(' Buffer recommended:'), chalk.yellow(`+20%`), chalk.gray('for unexpected issues'));
|
|
82
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
83
|
console.log('');
|
package/lib/install.js
CHANGED
|
@@ -148,7 +148,7 @@ async function copyTaskFlow(targetPath) {
|
|
|
148
148
|
'# Task Flow — Dependencies, Hours & Model Recommendations',
|
|
149
149
|
'',
|
|
150
150
|
'<!-- Populated by task-flow: generate flow. Do not edit manually. -->',
|
|
151
|
-
'<!-- Horas:
|
|
151
|
+
'<!-- Horas: uso para cobrança ao cliente -->',
|
|
152
152
|
'',
|
|
153
153
|
].join('\n');
|
|
154
154
|
await fs.writeFile(flowPath, flowStub);
|