rbin-task-flow 1.27.1 → 1.30.1

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.
@@ -7,9 +7,11 @@ paths: [".task-flow/**"]
7
7
 
8
8
  # Task Flow — Report
9
9
 
10
- 1. Verify task X is fully `done` in `status.json` (warn if partial).
10
+ 1. Verify task X is fully `done` in `status.json` — **no** `manual`, `pending`, or `in_progress` subtasks (warn and stop if any).
11
11
  2. Read `tasks.json`; analyze related code changes (read-only git ok).
12
12
  3. Write `.task-flow/guides/reports/task-X-implementation.md` using project template.
13
13
  4. Create `.task-flow/guides/reports/` if missing.
14
14
 
15
+ **Never** generate this report during `task-flow: run` — only when the user explicitly asks for `task-flow: report`.
16
+
15
17
  Reference: `.cursor/rules/task_report.mdc`
@@ -13,15 +13,21 @@ paths: [".task-flow/**"]
13
13
 
14
14
  ## Steps
15
15
 
16
- 1. Read `status.json` first; list **pending** task/subtask IDs only.
17
- 2. **tasks.json (token discipline):** Count subtasks across all tasks. If **>50**, do **not** load the full file — read only the JSON slice for each active task id (pending subtasks you will run). If ≤50, full read is OK.
18
- 3. Parse intent: `run next X` (default X=1) | `run X` | `run X,Y` | `run all`.
19
- 4. **`run X` / `run X,Y`:** If any task before X has pending subtasks, **stop** and list blocking tasks.
20
- 5. For each subtask: follow `instructions`; read `.task-flow/contexts/` files when referenced.
21
- 6. If `.task-flow/guides/graphify-out/graph.json` exists, prefer `graphify query "<module from subtask>" --graph .task-flow/guides/graphify-out/graph.json` before broad grep (summarized output only — see GRAPHIFY.md).
22
- 7. After each subtask: update `status.json` and `tasks.status.md` (regenerate 📊 Summary).
23
- 8. When parent task complete: mark task `done` in both files.
24
- 9. Invoke `/rbin-git` logic to **suggest** commit only — never `git add`/`commit`/`push`.
16
+ 1. Read `status.json`; resolve **`manual`** subtasks first via dev-logs + current conversation (see workflow).
17
+ 2. List **pending** task/subtask IDs (`done`, `manual` until resolved).
18
+ 3. **tasks.json:** partial read by task id if **>50** subtasks total.
19
+ 4. Parse intent: `run next X` (default X=1) | `run X` | `run X,Y` | `run all`.
20
+ 5. **`run X` / `run X,Y`:** Stop if earlier tasks/subtasks are not `done`.
21
+ 6. Per subtask: `instructions` + `contexts/`; optional `graphify query`.
22
+ 7. **Automatable** `done` + `tasks.status.md` Summary.
23
+ 8. **Manual intervention** `manual` + `.task-flow/dev-logs/task-X.Y-manual.md`; user reports progress **in chat**; AI appends **Conversation log** and marks `done` only when verified complete.
24
+ 9. Parent task all `done` mark task `done`.
25
+ 10. Suggest commit via `/rbin-git` — never git write.
26
+
27
+ ## Never during run
28
+
29
+ - Mark `done` when manual steps remain unverified
30
+ - Write `guides/reports/task-*-implementation.md`
25
31
 
26
32
  ## Full workflow
27
33
 
@@ -4,56 +4,116 @@
4
4
 
5
5
  | Input | Behavior |
6
6
  |-------|----------|
7
- | `task-flow: run next X` | Next X pending subtasks in order (task 1.1, 1.2, …, 2.1, ) |
7
+ | `task-flow: run next X` | Next X **pending** subtasks in order (skip `done`; resolve `manual` first — see below) |
8
8
  | `task-flow: run next` | X = 1 |
9
- | `task-flow: run X` | All pending subtasks of task X |
9
+ | `task-flow: run X` | All **pending** subtasks of task X |
10
10
  | `task-flow: run X,Y` | Tasks X then Y sequentially |
11
- | `task-flow: run all` | All pending subtasks |
11
+ | `task-flow: run all` | All **pending** subtasks |
12
+
13
+ Subtasks in `manual` block later subtasks in the same task until the dev-log shows they are complete.
14
+
15
+ ## Before picking pending subtasks — resolve `manual`
16
+
17
+ 1. List all `manual` subtasks in scope (same task or global for `run next`).
18
+ 2. Read `.task-flow/dev-logs/task-X.Y-manual.md` for each.
19
+ 3. Use the **current conversation** (and codebase checks) to assess completion — no separate confirm command.
20
+ 4. If the user reported progress in chat, append to the dev-log **Conversation log** (see format below).
21
+ 5. When the log + verification show all manual steps done → set `done`, refresh `tasks.status.md`, continue the run.
22
+ 6. If still incomplete → keep `manual`, tell the user what remains; do not skip marking done prematurely.
12
23
 
13
24
  ## Dependency check (`run X`)
14
25
 
15
26
  1. For tasks `1 .. X-1`, verify every subtask is `done`.
16
- 2. If any pending: stop with
17
- `⚠️ Cannot execute task X: complete tasks [list] first. Use task-flow: run Y.`
18
- 3. Do not execute any subtask of X until cleared.
27
+ 2. If any `pending`, `manual`, or `in_progress`: stop with
28
+ `⚠️ Cannot execute task X: complete tasks [list] first. Use task-flow: run Y or finish manual steps in dev-logs.`
29
+ 3. For task X: if any earlier subtask is still `manual` (dev-log incomplete), stop — resolve via conversation first.
19
30
 
20
31
  ## tasks.json — partial read (>50 subtasks)
21
32
 
22
- 1. From `status.json`, collect pending `(taskId, subtaskId)` for this run.
23
- 2. Count total subtasks in `tasks.json` (quick parse or `jq '[.tasks[].subtasks | length] | add'`).
24
- 3. If total **>50**: load **only** each `tasks[]` entry where `id` is in the pending set — not the full array.
25
- 4. If **≤50**: loading the full `tasks.json` is acceptable.
26
-
27
- ## Per subtask
28
-
29
- 1. Load subtask from `tasks.json` (title, description, instructions) — slice for that task id only when using partial read.
30
- 2. If instructions cite `.task-flow/contexts/...`, read those files.
31
- 3. Implement; verify (tests/build as appropriate).
32
- 4. Set subtask to `done` in `status.json`.
33
- 5. Update `tasks.status.md`: `- [x]` on subtask; regenerate Summary (✅ / ⏳ / 📝 counts).
34
- 6. If blocked: set `in_progress` and explain.
35
-
36
- ## status.json shape
37
-
38
- ```json
39
- {
40
- "tasks": {
41
- "1": {
42
- "status": "pending",
43
- "subtasks": { "1": "done", "2": "pending" }
44
- }
45
- }
46
- }
33
+ 1. From `status.json`, collect **pending** `(taskId, subtaskId)` for this run.
34
+ 2. Count total subtasks in `tasks.json`.
35
+ 3. If total **>50**: load only each `tasks[]` entry for pending/manual task ids.
36
+ 4. If **≤50**: full read is OK.
37
+
38
+ ## Per subtask — fully automatable
39
+
40
+ 1. Load subtask from `tasks.json`.
41
+ 2. Read `.task-flow/contexts/` when cited.
42
+ 3. Implement; verify (tests/build).
43
+ 4. `done` in `status.json` + update `tasks.status.md` Summary.
44
+ 5. Suggest commit via `@rbin-git` when appropriate.
45
+
46
+ ## Per subtask — manual intervention required
47
+
48
+ When the agent **cannot** finish alone (deploy, console, credentials, production, third-party dashboard, etc.):
49
+
50
+ 1. Implement everything possible in code/repo first.
51
+ 2. Set **`manual`** in `status.json` — never `done`.
52
+ 3. Create `.task-flow/dev-logs/task-X.Y-manual.md`:
53
+
54
+ ```markdown
55
+ # Task X.Y — Manual intervention required
56
+
57
+ **Subtask:** [title]
58
+ **Status:** manual
59
+ **Created:** [ISO 8601]
60
+
61
+ ## What the AI completed
62
+ - [automated work]
63
+
64
+ ## What you need to do manually
65
+ 1. [clear step]
66
+ 2. [clear step]
67
+
68
+ ## Conversation log
69
+ (AI appends as you report progress in chat — no separate command)
70
+
71
+ ### YYYY-MM-DDTHH:mm:ssZ
72
+ **User said:** [from conversation]
73
+ **Verified:** pending | complete
74
+ **Notes:** [what was checked; what remains]
47
75
  ```
48
76
 
77
+ 4. `tasks.status.md`: `- [~] [title] — manual: .task-flow/dev-logs/task-X.Y-manual.md`
78
+ 5. Stop further subtasks in that task.
79
+ 6. Tell the user the manual steps; they report back **in normal chat** when done.
80
+
81
+ ## Conversation-driven completion (any turn)
82
+
83
+ Applies during `run`, `status`, or whenever the user mentions manual work — **no `task-flow: confirm` command**.
84
+
85
+ 1. Read `status.json` for `manual` subtasks.
86
+ 2. Match user message to a dev-log (by task id, keywords, or open manual items).
87
+ 3. Append **Conversation log** entry with what the user said.
88
+ 4. Verify against checklist + codebase when possible.
89
+ 5. All steps satisfied → `done` + `tasks.status.md` + continue blocked work on next `run`.
90
+ 6. Partial → keep `manual`, update dev-log with remaining steps.
91
+
92
+ ## Never during run
93
+
94
+ - Mark `done` when manual steps remain unverified
95
+ - Write `.task-flow/guides/reports/task-*-implementation.md` (`task-flow: report` only)
96
+
97
+ ## Blocked (not manual)
98
+
99
+ Temporarily blocked without user action: `in_progress` + explain.
100
+
101
+ ## status.json
102
+
103
+ Subtask status: `pending` | `done` | `in_progress` | `manual`
104
+
49
105
  ## Completion summary
50
106
 
51
107
  ```
52
108
  ✅ Completed N subtasks:
53
109
  - Task 1.2: [title]
54
- 📝 Next pending: Task 1.3
110
+
111
+ 🖐️ Manual — waiting on you:
112
+ - Task 1.3: .task-flow/dev-logs/task-1.3-manual.md (report in chat when done)
113
+
114
+ 📝 Next pending: Task 1.4 (after 1.3 resolves)
55
115
  ```
56
116
 
57
- ## Related rules
117
+ ## Related
58
118
 
59
- Cursor fallback (short): `.cursor/rules/task_work.mdc` — prefer `@task-flow-run` / this file.
119
+ Cursor fallback: `.cursor/rules/task_work.mdc` — prefer `@task-flow-run` / this file.
@@ -7,7 +7,7 @@ disable-model-invocation: false
7
7
  # Task Flow — Status
8
8
 
9
9
  1. Read `.task-flow/tasks.status.md`.
10
- 2. Display summary (✅ completed, ⏳ in progress, 📝 remaining) and task/subtask checkboxes.
10
+ 2. Display summary (✅ completed, ⏳ in progress, 🖐️ manual, 📝 remaining) and task/subtask checkboxes (`[x]` `[ ]` `[~]`).
11
11
  3. If file missing, suggest `/task-flow-sync`.
12
12
 
13
13
  Reference: `.cursor/rules/task_status.mdc`
@@ -43,12 +43,12 @@ All subtasks `pending`; task `pending`.
43
43
  ## tasks.status.md
44
44
 
45
45
  - Auto-generated banner warning (do not edit manually).
46
- - Summary section with counts.
47
- - `- [ ]` / `- [x]` for tasks and indented subtasks.
46
+ - Summary section with counts (include 🖐️ manual when any).
47
+ - `- [ ]` / `- [x]` / `- [~]` for tasks and indented subtasks (`[~]` → link dev-log).
48
48
 
49
49
  ## Sync-only rules
50
50
 
51
- - Preserve status on modified tasks when subtasks still match.
51
+ - Preserve status on modified tasks when subtasks still match (`done`, `manual`, `pending`).
52
52
  - New subtasks after regen → `pending`; removed subtasks → drop from status.
53
53
  - Never explore codebase during pure sync unless user explicitly asks for codebase analysis in the same message.
54
54
 
@@ -14,6 +14,7 @@ alwaysApply: true
14
14
  | `.task-flow/.internal/tasks.json` | Definitions |
15
15
  | `.task-flow/.internal/status.json` | Status source of truth |
16
16
  | `.task-flow/contexts/` | Specs / mockups |
17
+ | `.task-flow/dev-logs/` | Manual steps + conversation log (`task-X.Y-manual.md`) |
17
18
  | `.task-flow/guides/` | Platform guides, Graphify, standards, reports |
18
19
 
19
20
  ## Prefer skills (`.cursor/skills/`)
@@ -34,6 +35,8 @@ alwaysApply: true
34
35
 
35
36
  Natural language (`work on next 3 subtasks`) = same as `task-flow: run next 3`.
36
37
 
38
+ **Manual subtasks:** user reports progress in chat; AI updates `.task-flow/dev-logs/` Conversation log and marks `done` when verified — no separate command.
39
+
37
40
  ## Git (always)
38
41
 
39
42
  Never write git — user runs all commits. Policy: [rbin-git-policy.mdc](mdc:.cursor/rules/rbin-git-policy.mdc). Suggest via `@rbin-git`.
@@ -20,7 +20,7 @@ alwaysApply: false
20
20
  |--------|--------|
21
21
  | **New** | Generate task + 3–8 subtasks; all `pending` |
22
22
  | **Removed** | Drop from `tasks.json`, `status.json`, `tasks.status.md` |
23
- | **Modified** | Update title/description; regen subtasks; **preserve** done/pending status where possible |
23
+ | **Modified** | Update title/description; regen subtasks; **preserve** done/pending/**manual** status where possible |
24
24
  | **Unchanged** | Leave task data and status as-is |
25
25
 
26
26
  Task IDs stay sequential (1, 2, 3…) matching `tasks.input.txt` order.
@@ -38,8 +38,8 @@ Task IDs stay sequential (1, 2, 3…) matching `tasks.input.txt` order.
38
38
  ## 4. Align status
39
39
 
40
40
  - `status.json` = source of truth
41
- - Rebuild `tasks.status.md` checkboxes to match; **regenerate 📊 Summary** (completed / in progress / remaining counts)
42
- - After regen: new subtasks → `pending`; keep `done` on matched subtasks when possible
41
+ - Rebuild `tasks.status.md` checkboxes to match (`[ ]` pending · `[x]` done · `[~]` manual); **regenerate 📊 Summary** (completed / in progress / 🖐️ manual / remaining counts)
42
+ - After regen: new subtasks → `pending`; keep `done` and `manual` on matched subtasks when possible
43
43
 
44
44
  ## 5. Principles
45
45
 
@@ -26,9 +26,9 @@ Use this rule for **subtask shape** when `task-flow-sync` creates or regenerates
26
26
 
27
27
  **tasks.json:** `id`, `title`, `description`, `originalRequest`, `createdAt`, `subtasks[]` with `id`, `title`, `description`, `instructions`.
28
28
 
29
- **status.json:** `tasks.{id}.status`, `tasks.{id}.subtasks.{subtaskId}` → `pending` | `done` | `in_progress`.
29
+ **status.json:** `tasks.{id}.status`, `tasks.{id}.subtasks.{subtaskId}` → `pending` | `done` | `in_progress` | `manual`.
30
30
 
31
- **tasks.status.md:** banner “do not edit”; 📊 Summary; tasks `- [ ]`/`- [x]`; subtasks indented with two spaces.
31
+ **tasks.status.md:** banner “do not edit”; 📊 Summary (include 🖐️ manual count); `- [ ]` pending · `- [x]` done · `- [~]` manual (link to `.task-flow/dev-logs/task-X.Y-manual.md`).
32
32
 
33
33
  ## Rules
34
34
 
@@ -9,11 +9,11 @@ alwaysApply: false
9
9
  - When user says "task-flow: status" or "task-flow status":
10
10
  - **READ**: `.task-flow/tasks.status.md`
11
11
  - **DISPLAY**: Show the current status of all tasks and subtasks
12
- - **FORMAT**: Display in a clear, readable format showing done/pending tasks
12
+ - **FORMAT**: Display done `[x]`, pending `[ ]`, manual `[~]` (see `.task-flow/dev-logs/`)
13
13
 
14
14
  - **Status Display:**
15
15
  - Read `.task-flow/tasks.status.md` file
16
- - Show tasks marked as `- [x]` (done) and `- [ ]` (pending)
16
+ - Show tasks marked as `- [x]` (done), `- [ ]` (pending), `- [~]` (manual — user action required)
17
17
  - Display subtasks with their status
18
18
  - Show progress summary if available
19
19
 
@@ -32,12 +32,13 @@ For each task/subtask in scope:
32
32
  | Status | Check |
33
33
  |--------|--------|
34
34
  | `done` | Implementation exists and matches requirements (files, tests, docs per instructions) |
35
+ | `manual` | Dev-log + conversation log; not `done` until IA verifies via chat history |
35
36
  | `pending` / `in_progress` | Whether code already partially or fully implements the subtask (status drift) |
36
37
 
37
38
  Record:
38
39
 
39
40
  - **Verified done** — correctly marked
40
- - **False done** — marked `done` but missing or incomplete
41
+ - **False done** — marked `done` but missing, incomplete, or should be `manual`
41
42
  - **Drift** — implemented in code but still `pending`
42
43
  - **Confirmed pending** — not implemented yet (expected)
43
44
 
@@ -51,7 +52,7 @@ Find work not covered by current tasks:
51
52
 
52
53
  ### 4. Apply fixes (no ask — user invoked validate)
53
54
 
54
- 1. **Status:** set false `done` → `pending` in `status.json`; optional drift `pending` keep or note in report (do not auto-mark `done` without user run)
55
+ 1. **Status:** set false `done` → `pending` or `manual` (with dev-log if user action required) in `status.json`
55
56
  2. **Input:** append new lacunas as `- Description` lines to `tasks.input.txt` (append only; never remove or edit existing lines)
56
57
  3. **Sync:** follow [task-flow-sync.mdc](mdc:.cursor/rules/task-flow-sync.mdc) — diff input, regen subtasks for new tasks, rebuild `tasks.status.md` Summary
57
58
  4. **Never** edit `.internal/` by hand except through sync-aligned updates to `status.json` for false-done fixes before sync
@@ -5,32 +5,14 @@ alwaysApply: false
5
5
 
6
6
  # Task Flow — Run (fallback)
7
7
 
8
- **Prefer:** `@task-flow-run` (Claude: `/task-flow-run`) full steps in `.claude/skills/task-flow-run/workflow.md` (same under `.cursor/skills/` after install).
8
+ **Prefer:** `@task-flow-run` — `.claude/skills/task-flow-run/workflow.md`
9
9
 
10
- **Task flow** = RBIN Task Flow. Do not edit `.task-flow/.internal/` by hand.
10
+ ## Critical flow
11
11
 
12
- ## Commands
12
+ 1. **Resolve `manual` first:** read dev-logs + conversation; append Conversation log; mark `done` only when verified.
13
+ 2. **`run next X`:** pending subtasks only; `manual` blocks until dev-log shows complete.
14
+ 3. **Automatable** → `done`; **user must act** → `manual` + dev-log; never `done` until log confirms.
15
+ 4. User reports manual progress **in normal chat** — no separate confirm command.
16
+ 5. Suggest commit via `@rbin-git` — never write git.
13
17
 
14
- | User says | Action |
15
- |-----------|--------|
16
- | `task-flow: run next X` / `run next` | Next X pending subtasks in order (default X=1) |
17
- | `task-flow: run X` | All pending subtasks of task X |
18
- | `task-flow: run X,Y` / `run all` | As labeled |
19
-
20
- Natural language (`work on next 3 subtasks`, `execute all subtasks of task 2`) = same as above.
21
-
22
- ## Critical flow (each subtask)
23
-
24
- 1. Read `status.json` first; load `tasks.json` by pending task ids only if **>50 subtasks** total (see `@task-flow-run` workflow).
25
- 2. **`run X`:** If tasks `1..X-1` have any pending subtask, **stop** and list blockers; do not run X.
26
- 3. Implement per `instructions`; read `.task-flow/contexts/` when referenced; optional `graphify query` if `.task-flow/guides/graphify-out/` exists ([graphify-task-flow.mdc](mdc:.cursor/rules/graphify-task-flow.mdc)).
27
- 4. After each subtask: `status.json` → `done`; `tasks.status.md` → `- [x]` + regenerate 📊 Summary.
28
- 5. Parent task all done → mark task `done` in both files.
29
- 6. Suggest commit via [rbin-git-policy.mdc](mdc:.cursor/rules/rbin-git-policy.mdc) / `@rbin-git` — never write git.
30
-
31
- If blocked: subtask `in_progress` + explain.
32
-
33
- ## More detail
34
-
35
- - Skill workflow: `.claude/skills/task-flow-run/workflow.md`
36
- - Command index: [task-flow-cursor.mdc](mdc:.cursor/rules/task-flow-cursor.mdc) · [task_execution.mdc](mdc:.cursor/rules/task_execution.mdc) (stub)
18
+ **Never during run:** `guides/reports/task-*-implementation.md`.
@@ -8,6 +8,7 @@
8
8
  ├── tasks.input.txt ← defina tasks (`- descrição`)
9
9
  ├── tasks.status.md ← progresso (auto; não editar)
10
10
  ├── contexts/ ← specs, mockups
11
+ ├── dev-logs/ ← passos manuais + log da conversa (IA atualiza)
11
12
  ├── .internal/ ← tasks.json, status.json (sistema)
12
13
  └── guides/ ← documentação e configs
13
14
  ├── AI-PLATFORMS.md
@@ -46,15 +47,23 @@ cd seu-projeto
46
47
  rbin-task-flow init --graphify
47
48
  ```
48
49
 
49
- ### Projeto que já usa Task Flow (atualizar pacote + migrar grafo)
50
+ ### Projeto que já usa Task Flow (subir versão + migrar grafo)
50
51
 
51
52
  ```bash
52
53
  npm install -g rbin-task-flow@latest
53
54
  cd seu-projeto
54
- rbin-task-flow update --graphify
55
+ rbin-task-flow reset --keep-tasks --graphify
55
56
  ```
56
57
 
57
- O `update --graphify` reaplica rules/skills, move `graphify-out/` legado da raiz para `guides/graphify-out/` (se existir) e roda o extract.
58
+ **Manter suas tasks** ao subir versão (não sobrescreve `tasks.input.txt`, `tasks.status.md` nem `.internal/`):
59
+
60
+ ```bash
61
+ npm install -g rbin-task-flow@latest
62
+ cd seu-projeto
63
+ rbin-task-flow reset --keep-tasks
64
+ ```
65
+
66
+ O `reset --keep-tasks --graphify` reaplica rules/skills, move `graphify-out/` legado da raiz para `guides/graphify-out/` (se existir) e roda o extract.
58
67
 
59
68
  ### Só regerar o grafo (sem reinstall do template)
60
69
 
@@ -80,7 +89,7 @@ Guia completo: [guides/GRAPHIFY.md](guides/GRAPHIFY.md).
80
89
  | `task-flow: sync` | — | Complete synchronization: adds new, removes deleted, updates modified, preserves status |
81
90
  | `task-flow: validate` | `all` (default) · `X` · `X,Y` | Deep audit vs codebase; revert false done; append gaps to `tasks.input.txt`; sync |
82
91
  | `task-flow: status` | — | Shows current task status |
83
- | `task-flow: run` | `next X` · `X` · `X,Y` · `all` | Execute pending subtasks: next N in order, one/many tasks, or everything |
92
+ | `task-flow: run` | `next X` · `X` · `X,Y` · `all` | Execute pending subtasks; manual `dev-logs/`, status `manual` |
84
93
  | `task-flow: split` | `:3` · `:2` · `:3 50-72` | Plan **N** parallel `run` lines — `:N` required |
85
94
  | `task-flow: estimate` | `X` · `X,Y` · `all` | Time estimate for average developer pace (hours + management buffer) |
86
95
  | `task-flow: report` | `X` · `X,Y` · `all` | Implementation report → `.task-flow/guides/reports/task-X-implementation.md` |
@@ -111,7 +120,7 @@ Complete synchronization between `tasks.input.txt` and the system:
111
120
  - ✅ Adds new tasks from `tasks.input.txt`
112
121
  - ✅ Removes tasks that were deleted from `tasks.input.txt`
113
122
  - ✅ Updates tasks that were modified in `tasks.input.txt`
114
- - ✅ Preserves status (done/pending) of existing tasks
123
+ - ✅ Preserves status (`done`, `pending`, `manual`) of existing tasks
115
124
  - ✅ Synchronizes status between `status.json` and `tasks.status.md` (ensures they are always aligned)
116
125
 
117
126
  ### `task-flow: validate`
@@ -137,14 +146,18 @@ Plans **parallel work across N IAs** (`split:3`, `split:2`, …). **`:N` is requ
137
146
  Output: N copy-paste lines `task-flow: run id,id,id` + coordination notes. Invoke: `@task-flow-split`.
138
147
 
139
148
  ### `task-flow: run next X`
140
- Works on next X pending subtasks in sequential order. Implements and marks as "done".
149
+ Works on next X **pending** subtasks. Resolves `manual` first by reading dev-logs and the current conversation.
150
+
151
+ - **Fully automatable** → `done`
152
+ - **Needs your action** → `manual` + `.task-flow/dev-logs/task-X.Y-manual.md`
153
+ - You report progress **in chat** (no extra command); the AI appends the **Conversation log** and marks `done` when verified
141
154
 
142
155
  **Examples:**
143
- - `task-flow: run next 4` → Next 4 subtasks
144
- - `task-flow: run next` → Next 1 subtask
156
+ - `task-flow: run next 4` → Next 4 pending subtasks
157
+ - `task-flow: run next` → Next 1 pending subtask
145
158
 
146
159
  ### `task-flow: run X` (simplified syntax)
147
- Executes all pending subtasks of a specific task. Implements and marks as "done".
160
+ Executes all **pending** subtasks of a specific task. Stops if a subtask requires manual intervention.
148
161
 
149
162
  **⚠️ Dependency Check:**
150
163
  - Only executes if all previous tasks (1, 2, ..., X-1) are completely finished
File without changes
@@ -53,7 +53,7 @@ Detalhes dos comandos: [README.md](../README.md).
53
53
  | `.task-flow/guides/CURSOR.md` | — | ✅ | — |
54
54
  | `.task-flow/guides/coding-standards-full.md` | on demand | on demand (sections only) | on demand |
55
55
  | [OPTIMIZATION-PLAN.md](OPTIMIZATION-PLAN.md) | — | token roadmap | — |
56
- | `.codex/config.toml` | — | — | ✅ (opcional, preservado no update) |
56
+ | `.codex/config.toml` | — | — | ✅ (opcional, preservado no reset --keep-tasks) |
57
57
  | `task-flow-cursor.mdc` | — | ✅ always-on | — |
58
58
  | `rbin-git-policy.mdc` | — | ✅ always-on | — |
59
59
  | `.claude/skills/` | ✅ (11 skills) | — | — |
@@ -46,11 +46,13 @@ Rule: `.cursor/rules/task_split.mdc`
46
46
 
47
47
  See AGENTS.md **Run** section. Prefer `.claude/skills/task-flow-run/workflow.md`; fallback: `.cursor/rules/task_work.mdc`.
48
48
 
49
- **Dependency:** `run N` only if tasks `1..N-1` fully done.
49
+ **Dependency:** `run N` only if tasks `1..N-1` fully `done` (no `manual` blocking).
50
50
 
51
- **Per subtask:** implement → `done` in `status.json` → refresh `tasks.status.md` → suggest commit.
51
+ **Per subtask (automatable):** implement → `done` → refresh `tasks.status.md` → suggest commit.
52
52
 
53
- **Blocked:** set `in_progress`, explain.
53
+ **Manual intervention:** implement what you can → `manual` → dev-log → user reports in chat → AI updates Conversation log → `done` when verified.
54
+
55
+ **Never during run:** `guides/reports/task-*-implementation.md`.
54
56
 
55
57
  ---
56
58
 
@@ -78,12 +78,12 @@ Only during `run` / `validate` when `.task-flow/guides/graphify-out/` exists. Do
78
78
 
79
79
  | Issue | Fix |
80
80
  |-------|-----|
81
- | Ignores task-flow | `rbin-task-flow update` |
81
+ | Ignores task-flow | `rbin-task-flow reset --keep-tasks` |
82
82
  | Run workflow wrong | **`@task-flow-run`** — avoid `@task_work` |
83
83
  | Rule not applied | `@task-flow-<command>` for that workflow |
84
84
  | Standards missing | File under `src/` or `@rbin-coding-standards` |
85
85
  | Context too large | Fewer `src/` files in chat; skills not full docs |
86
- | Wrong always-on count | `update`; don't set `graphify.mdc` always-on |
86
+ | Wrong always-on count | `reset --keep-tasks`; don't set `graphify.mdc` always-on |
87
87
 
88
88
  ---
89
89
 
@@ -31,7 +31,7 @@ Graphify ([graphifyy](https://pypi.org/project/graphifyyy/)) cria um **grafo de
31
31
  1. Copia **`.cursor/rules/graphify-task-flow.mdc`** — `alwaysApply: false` (não compete com `task_work`, etc.).
32
32
  2. Grafo em **`.task-flow/guides/graphify-out/`** (já coberto pelo `.task-flow/` no `.gitignore`; remove entrada legada `graphify-out/` na raiz).
33
33
  3. Se existir **`.cursor/rules/graphify.mdc`** do `graphify cursor install` (upstream com `alwaysApply: true`), o instalador **desativa** `alwaysApply` para economizar contexto.
34
- 4. Com **`--graphify`** em `init`, `update` ou **`reset`**, roda `graphify extract . --backend claude-cli --out .task-flow/guides` se o CLI estiver no PATH (usa assinatura Claude Code — sem API key separada).
34
+ 4. Com **`--graphify`** em `init` ou **`reset`**, roda `graphify extract . --backend claude-cli --out .task-flow/guides` se o CLI estiver no PATH (usa assinatura Claude Code — sem API key separada).
35
35
 
36
36
  **Não** rodamos `graphify claude install` / `graphify cursor install` automaticamente — o install upstream força `graphify.mdc` always-on e incham `CLAUDE.md` / `AGENTS.md`.
37
37
 
@@ -41,7 +41,7 @@ Graphify ([graphifyy](https://pypi.org/project/graphifyyy/)) cria um **grafo de
41
41
 
42
42
  ```bash
43
43
  cd seu-projeto
44
- rbin-task-flow reset --graphify # ou init/update --graphify; recria .task-flow + grafo
44
+ rbin-task-flow reset --keep-tasks --graphify # ou init --graphify; recria template + grafo
45
45
  task-flow: sync
46
46
  task-flow: run next 3 # IA usa grafo só ao implementar
47
47
  # você: git commit
@@ -89,7 +89,7 @@ task-flow: run next 2 — se .task-flow/guides/graphify-out/ existir, graphify q
89
89
  | Primeiro setup | `rbin-task-flow init --graphify` ou `graphify extract . --backend claude-cli --out .task-flow/guides` |
90
90
  | Reset completo (tasks + template + grafo) | `rbin-task-flow reset --graphify` |
91
91
  | Refactor grande após vários `run` | `graphify update .` ou `graphify extract . --backend claude-cli --out .task-flow/guides` |
92
- | `task-flow: update` | Reaplica `graphify-task-flow.mdc` e pode rebaixar `graphify.mdc` |
92
+ | `rbin-task-flow reset --keep-tasks` | Reaplica `graphify-task-flow.mdc` e pode rebaixar `graphify.mdc` |
93
93
 
94
94
  ---
95
95
 
@@ -36,7 +36,7 @@ projeto/
36
36
  └── .task-flow/
37
37
  ```
38
38
 
39
- Após `rbin-task-flow init` ou `update`, use **`/task-flow-sync`**, **`/task-flow-run`**, etc. Reinicie o Claude Code se `.claude/skills/` foi criado pela primeira vez na sessão.
39
+ Após `rbin-task-flow init` ou `reset --keep-tasks`, use **`/task-flow-sync`**, **`/task-flow-run`**, etc. Reinicie o Claude Code se `.claude/skills/` foi criado pela primeira vez na sessão.
40
40
 
41
41
  ---
42
42
 
@@ -33,8 +33,8 @@ Documentação: [Cursor Rules](https://cursor.com/docs/context/rules) · Referê
33
33
  | **minimal** | `rbin-task-flow init --profile minimal` | Só `task-flow-cursor.mdc` + `rbin-git-policy.mdc` + skills |
34
34
 
35
35
  - **minimal:** ≤2 always-on; workflows só via `@task-flow-*` (sem glob `coding_standards`, `task_work`, etc.).
36
- - **update** sem `--profile` reaplica o profile salvo em `.task-flow/install-meta.json`.
37
- - Migrar para regras completas: `rbin-task-flow update --profile standard`.
36
+ - **reset** sem `--profile` reaplica o profile salvo em `.task-flow/install-meta.json`.
37
+ - Migrar para regras completas: `rbin-task-flow reset --profile standard --keep-tasks`.
38
38
 
39
39
  ---
40
40
 
@@ -111,7 +111,7 @@ Cursor suporta o mesmo formato que Claude Code: `.cursor/skills/<nome>/SKILL.md`
111
111
 
112
112
  O `rbin-task-flow init` copia **11 skills** para `.cursor/skills/` (mesmo conteúdo que `.claude/skills/`). No Agent, use `@task-flow-split`, `@task-flow-run`, `@task-flow-sync`, etc.
113
113
 
114
- Após `rbin-task-flow init` ou `update`, use `@task-flow-*` no Agent. Para sync: `@task-flow-sync` (não `task_generation` isolado).
114
+ Após `rbin-task-flow init` ou `reset --keep-tasks`, use `@task-flow-*` no Agent. Para sync: `@task-flow-sync` (não `task_generation` isolado).
115
115
 
116
116
  ---
117
117
 
@@ -201,7 +201,7 @@ Coloque PNG/PDF/MD em `.task-flow/contexts/`. Nas subtarefas geradas, instruçõ
201
201
  | Stubs `task_work` / `task_execution` | ✅ |
202
202
  | Unificar git em `rbin-git-policy` | ✅ |
203
203
 
204
- **No seu projeto:** `rbin-task-flow update` reaplica o template. Evite reativar `alwaysApply: true` em `graphify.mdc` upstream.
204
+ **No seu projeto:** `rbin-task-flow reset --keep-tasks` reaplica o template. Evite reativar `alwaysApply: true` em `graphify.mdc` upstream.
205
205
 
206
206
  **Roadmap:** [OPTIMIZATION-PLAN.md](../OPTIMIZATION-PLAN.md) · tarefas: [OPTIMIZATION-IMPLEMENTATION-TASKS.md](../OPTIMIZATION-IMPLEMENTATION-TASKS.md).
207
207
 
@@ -238,10 +238,11 @@ Cursor também pode ler `AGENTS.md` em alguns fluxos; no RBIN ele é focado em *
238
238
 
239
239
  | Comando CLI | Uso com Cursor |
240
240
  |-------------|----------------|
241
- | `rbin-task-flow init` | Copia rules + task-flow |
242
- | `rbin-task-flow update` | Atualiza rules; preserva `.internal/` |
241
+ | `rbin-task-flow init` | Primeira instalação (rules + task-flow) |
243
242
  | `rbin-task-flow reset` | Recria `.task-flow` do zero |
243
+ | `rbin-task-flow reset --keep-tasks` | Sobe versão sem sobrescrever `tasks.input.txt`, `tasks.status.md`, `.internal/` |
244
244
  | `rbin-task-flow reset --graphify` | Reset + `graphify extract . --backend claude-cli` |
245
+ | `rbin-task-flow reset --keep-tasks --graphify` | Upgrade + mantém tasks + grafo |
245
246
 
246
247
  O Agent executa o workflow (`task-flow: audit`, `task-flow: run`, etc.); o CLI prepara arquivos.
247
248
 
@@ -258,7 +259,7 @@ O Agent executa o workflow (`task-flow: audit`, `task-flow: run`, etc.); o CLI p
258
259
  | Local (padrão) | `init` | Repo limpo; cada dev com setup próprio | Sem sync de rules/skills |
259
260
  | Time | `init --share-ai-config` | Mesmo Task Flow para todos | Mais arquivos de IA no git; tokens por dev ao usar rules |
260
261
 
261
- `update` sem flag reaplica a opção salva em `.task-flow/install-meta.json` (`shareAiConfig`).
262
+ `reset` sem flag reaplica a opção salva em `.task-flow/install-meta.json` (`shareAiConfig`).
262
263
 
263
264
  Para open source: documente no README — contribuidores podem usar `--share-ai-config` ou `init` local.
264
265
 
@@ -268,7 +269,7 @@ Para open source: documente no README — contribuidores podem usar `--share-ai-
268
269
 
269
270
  | Problema | Causa provável | Ação |
270
271
  |----------|----------------|------|
271
- | Agent ignora `task-flow:` | Rules não instaladas / projeto errado | `rbin-task-flow update` |
272
+ | Agent ignora `task-flow:` | Rules não instaladas / projeto errado | `rbin-task-flow reset --keep-tasks` |
272
273
  | Não atualiza `tasks.status.md` | Só mexeu em `status.json` | `@task-flow-run` — regenerar Summary |
273
274
  | `run 3` não roda | Tasks 1–2 incompletas | `task-flow: status` |
274
275
  | Coding standards ignorados | Checklist não no contexto | `@rbin-coding-standards` ou abrir arquivo em `src/` |
package/AGENTS.md CHANGED
@@ -13,6 +13,7 @@
13
13
  | `.task-flow/.internal/tasks.json` | Task definitions |
14
14
  | `.task-flow/.internal/status.json` | Status source of truth |
15
15
  | `.task-flow/contexts/` | Specs/mockups for subtasks |
16
+ | `.task-flow/dev-logs/` | Manual steps + conversation log (AI updates from chat) |
16
17
 
17
18
  ## Git
18
19
 
@@ -52,12 +53,13 @@ No explanatory comments. Complex topics → `dev-logs/*.md`. Allowed: `// ──
52
53
  ## Run (embedded)
53
54
 
54
55
  1. Read `tasks.json` + `status.json`.
55
- 2. `run next X` (default X=1): next X **pending** subtasks in order 1.1, 1.2, …, 2.1…
56
- 3. `run X` / `X,Y` / `all`: all pending for task(s); for `run X`, block if tasks `1..X-1` have any pending subtask.
57
- 4. Per subtask: follow `instructions`; read `contexts/` if cited; implement + verify.
58
- 5. If `.task-flow/guides/graphify-out/graph.json` exists, prefer `graphify query --graph .task-flow/guides/graphify-out/graph.json` before repo-wide grep.
59
- 6. Mark subtask `done` in `status.json`; update `tasks.status.md` Summary.
60
- 7. Parent task `done` when all subtasks done. Suggest commit; never git write.
56
+ 2. **Resolve `manual` first:** read dev-logs + conversation; append Conversation log; mark `done` only when verified.
57
+ 3. `run next X` (default X=1): next X **pending** subtasks (skip unresolved `manual`).
58
+ 4. `run X` / `X,Y` / `all`: all pending for task(s); block if tasks `1..X-1` have non-`done` subtasks.
59
+ 5. Per subtask: `instructions`; `contexts/`; implement + verify; optional `graphify query`.
60
+ 6. **Automatable** `done`; **manual intervention** `manual` + dev-log; user reports in chat; AI updates log and completes when verified.
61
+ 7. Parent task `done` when all subtasks `done`. Suggest commit; never git write.
62
+ 8. **Never** write `guides/reports/` during run.
61
63
 
62
64
  ## Prompt templates (copy)
63
65
 
package/README.md CHANGED
@@ -33,7 +33,7 @@
33
33
  <a id="português"></a>
34
34
  # 🇧🇷 Português
35
35
 
36
- > **v1.25.1** — Padrão `.env` Vercel nos coding standards. De **1.25.0**: `npm install -g rbin-task-flow@1.25.1` e `rbin-task-flow update`. [CHANGELOG](CHANGELOG.md) · [Publicação](RELEASE-1.25.1.md).
36
+ > **v1.30.1** — `reset --keep-tasks`, sem comando `update`, subtarefas `manual` em `dev-logs/`. `npm install -g rbin-task-flow@1.30.1` e `rbin-task-flow reset --keep-tasks`. [CHANGELOG](CHANGELOG.md) · [Publicação](RELEASE-1.30.1.md).
37
37
 
38
38
  ## O Que É Este Projeto?
39
39
 
@@ -74,11 +74,12 @@ rbin-task-flow init
74
74
  rbin-task-flow init # Inicializa no projeto atual
75
75
  rbin-task-flow init --profile minimal # Só 2 regras always-on + skills (menos tokens no Cursor)
76
76
  rbin-task-flow init --share-ai-config # Versiona .cursor/skills/ e .cursor/rules/ no git (time)
77
- rbin-task-flow update # Atualiza configurações (mantém profile em install-meta.json)
78
- rbin-task-flow update --profile standard # Passa a copiar todas as regras .mdc
77
+ rbin-task-flow init --graphify # Init + grafo em .task-flow/guides/graphify-out/
79
78
  rbin-task-flow reset # Reinstala o Task Flow do zero
80
- rbin-task-flow update --graphify # Update + grafo em .task-flow/guides/graphify-out/
79
+ rbin-task-flow reset --keep-tasks # Sobe versão sem sobrescrever suas tasks
80
+ rbin-task-flow reset --profile standard # Passa a copiar todas as regras .mdc
81
81
  rbin-task-flow reset --graphify # Reset + graphify extract (CLI Graphify no PATH)
82
+ rbin-task-flow reset --keep-tasks --graphify # Upgrade + mantém tasks + graphify extract
82
83
  rbin-task-flow version-check # Verifica atualizações de modelos
83
84
  rbin-task-flow info # Mostra informações
84
85
  rbin-task-flow estimate <ids> # Estima tempo (ex: "1" ou "1,2" ou "all")
@@ -91,7 +92,7 @@ Após inicializar, use estes comandos na IA (Cursor/Claude/Codex) para gerenciar
91
92
 
92
93
  **Otimizar por plataforma:** [.task-flow/guides/AI-PLATFORMS.md](.task-flow/guides/AI-PLATFORMS.md) · [Claude](.task-flow/guides/platforms/claude-code.md) · [Cursor](.task-flow/guides/platforms/cursor.md) · [Codex](.task-flow/guides/platforms/codex.md) · [Graphify](.task-flow/guides/GRAPHIFY.md)
93
94
 
94
- **Graphify (opcional):** grafo em `.task-flow/guides/graphify-out/`. Novo projeto: `rbin-task-flow init --graphify`. **Já tem Task Flow:** `npm install -g rbin-task-flow@latest` e `rbin-task-flow update --graphify` no projeto (migra `graphify-out/` da raiz + regera grafo). Detalhes: [.task-flow/README.md](.task-flow/README.md#graphify-opcional) · [GRAPHIFY.md](.task-flow/guides/GRAPHIFY.md).
95
+ **Graphify (opcional):** grafo em `.task-flow/guides/graphify-out/`. Novo projeto: `rbin-task-flow init --graphify`. **Já tem Task Flow:** `npm install -g rbin-task-flow@latest` e `rbin-task-flow reset --keep-tasks --graphify` no projeto (migra `graphify-out/` da raiz + regera grafo). **Manter suas tasks ao subir versão:** `rbin-task-flow reset --keep-tasks`. Detalhes: [.task-flow/README.md](.task-flow/README.md#graphify-opcional) · [GRAPHIFY.md](.task-flow/guides/GRAPHIFY.md).
95
96
 
96
97
  **Claude Code / Cursor skills (v1.20+):** `init` copia 11 skills para `.claude/skills/` e `.cursor/skills/` — use `/task-flow-split`, `/task-flow-sync`, `/task-flow-run`, etc.
97
98
 
@@ -110,7 +111,7 @@ Após inicializar, use estes comandos na IA (Cursor/Claude/Codex) para gerenciar
110
111
  | `task-flow: audit` | **Avalia** o quanto o código bate com os padrões de codificação | Analisa a codebase, dá um score por categoria e pergunta quais melhorias você quer adotar — sem impor nada |
111
112
  | `task-flow: status` | **Visualiza** o progresso rapidamente | Vê resumo com tasks completas, em andamento e quantas subtarefas faltam |
112
113
  | `task-flow: split` | `:3` · `:2` · `:3 50-72` | **Divide** trabalho entre N IAs — gera N comandos `run X,Y,Z` (só plano) |
113
- | `task-flow: run next X` | **Automatiza** o trabalho nas próximas subtarefas | A IA trabalha nas próximas X subtarefas sequencialmente, você acompanha |
114
+ | `task-flow: run next X` | **Automatiza** o trabalho nas próximas subtarefas | IA implementa o que pode; passos manuais → `dev-logs/`; você reporta no chat |
114
115
  | `task-flow: run X` | **Completa** uma tarefa inteira de uma vez | Executa todas as subtarefas de uma tarefa específica (permite trabalho paralelo) |
115
116
  | `task-flow: run X,Y` | **Completa** múltiplas tarefas | Executa tarefas separadas por vírgula (ex: `task-flow: run 10,11`) |
116
117
  | `task-flow: run all` | **Completa** todas as tarefas | Executa todas as tarefas pendentes |
@@ -271,11 +272,17 @@ Para atualizar configurações em um projeto existente:
271
272
  ```bash
272
273
  # Usando NPM (recomendado)
273
274
  cd /caminho/para/seu/projeto
274
- rbin-task-flow update
275
275
 
276
- # Para reiniciar o Task Flow do zero, incluindo .task-flow/.internal
276
+ # Primeira instalação
277
+ rbin-task-flow init
278
+
279
+ # Subir versão do pacote mantendo suas tasks
280
+ npm install -g rbin-task-flow@latest
281
+ rbin-task-flow reset --keep-tasks
282
+ rbin-task-flow reset --keep-tasks --graphify
283
+
284
+ # Reiniciar o Task Flow do zero (perde tasks)
277
285
  rbin-task-flow reset
278
- # Com grafo de código (requer graphify no PATH):
279
286
  rbin-task-flow reset --graphify
280
287
 
281
288
  # Ou usando método legacy
@@ -416,7 +423,7 @@ Para problemas ou perguntas:
416
423
  <a id="english"></a>
417
424
  # 🇬🇧 English
418
425
 
419
- > **v1.25.1** — Vercel `.env` pattern in coding standards. From **1.25.0**: `npm install -g rbin-task-flow@1.25.1` then `rbin-task-flow update`. [CHANGELOG](CHANGELOG.md) · [Release guide](RELEASE-1.25.1.md).
426
+ > **v1.30.1** — `reset --keep-tasks`, no `update` CLI, `manual` subtasks in `dev-logs/`. `npm install -g rbin-task-flow@1.30.1` then `rbin-task-flow reset --keep-tasks`. [CHANGELOG](CHANGELOG.md) · [Release guide](RELEASE-1.30.1.md).
420
427
 
421
428
  ## What Is This Project?
422
429
 
@@ -457,11 +464,12 @@ rbin-task-flow init
457
464
  rbin-task-flow init # Initialize in current project
458
465
  rbin-task-flow init --profile minimal # 2 always-on rules + skills only (lower Cursor token cost)
459
466
  rbin-task-flow init --share-ai-config # Commit .cursor/skills and rules with the team
460
- rbin-task-flow update # Update configs (keeps profile from .task-flow/install-meta.json)
461
- rbin-task-flow update --profile standard # Install all .cursor/rules/*.mdc
467
+ rbin-task-flow init --graphify # Init + graph at .task-flow/guides/graphify-out/
462
468
  rbin-task-flow reset # Reinstall Task Flow from scratch
463
- rbin-task-flow update --graphify # Update + graph at .task-flow/guides/graphify-out/
469
+ rbin-task-flow reset --keep-tasks # Upgrade package without overwriting your tasks
470
+ rbin-task-flow reset --profile standard # Install all .cursor/rules/*.mdc
464
471
  rbin-task-flow reset --graphify # Reset + graphify extract (Graphify CLI on PATH)
472
+ rbin-task-flow reset --keep-tasks --graphify # Upgrade + keep tasks + graphify extract
465
473
  rbin-task-flow version-check # Check for model updates
466
474
  rbin-task-flow info # Show information
467
475
  rbin-task-flow estimate <ids> # Estimate time (e.g., "1" or "1,2" or "all")
@@ -474,7 +482,7 @@ After initializing, use these commands in your AI (Cursor/Claude/Codex) to autom
474
482
 
475
483
  **Per-platform optimization:** [index](.task-flow/guides/AI-PLATFORMS.md) · [Claude](.task-flow/guides/platforms/claude-code.md) · [Cursor](.task-flow/guides/platforms/cursor.md) · [Codex](.task-flow/guides/platforms/codex.md) · [Graphify](.task-flow/guides/GRAPHIFY.md)
476
484
 
477
- **Graphify (optional):** graph at `.task-flow/guides/graphify-out/`. New project: `rbin-task-flow init --graphify`. **Existing project:** `npm install -g rbin-task-flow@latest` then `rbin-task-flow update --graphify` (migrates legacy root `graphify-out/` + re-extracts). See [.task-flow/README.md](.task-flow/README.md#graphify-opcional) · [GRAPHIFY.md](.task-flow/guides/GRAPHIFY.md).
485
+ **Graphify (optional):** graph at `.task-flow/guides/graphify-out/`. New project: `rbin-task-flow init --graphify`. **Existing project:** `npm install -g rbin-task-flow@latest` then `rbin-task-flow reset --keep-tasks --graphify` (migrates legacy root `graphify-out/` + re-extracts). **Keep your tasks when upgrading:** `rbin-task-flow reset --keep-tasks`. See [.task-flow/README.md](.task-flow/README.md#graphify-opcional) · [GRAPHIFY.md](.task-flow/guides/GRAPHIFY.md).
478
486
 
479
487
  **Claude / Cursor skills (v1.20+):** installs 11 skills — use `/task-flow-split`, `/task-flow-sync`, `/task-flow-run`, etc.
480
488
 
@@ -493,7 +501,7 @@ After initializing, use these commands in your AI (Cursor/Claude/Codex) to autom
493
501
  | `task-flow: audit` | **Evaluate** how well your code matches coding standards | Scans the codebase, scores it by category and asks which improvements you want to adopt — never imposes changes |
494
502
  | `task-flow: status` | **Visualize** progress quickly | See summary with completed tasks, in progress, and remaining subtasks |
495
503
  | `task-flow: split` | `:3` · `:2` · `:3 50-72` | **Split** work across N AIs — N `run` commands (plan only) |
496
- | `task-flow: run next X` | **Automate** work on next subtasks | AI works on next X subtasks sequentially, you just follow along |
504
+ | `task-flow: run next X` | **Automate** work on next subtasks | AI implements what it can; manual steps → `dev-logs/`; you report in chat |
497
505
  | `task-flow: run X` | **Complete** an entire task at once | Executes all subtasks of a specific task (allows parallel work) |
498
506
  | `task-flow: run X,Y` | **Complete** multiple tasks | Executes comma-separated tasks (e.g., `task-flow: run 10,11`) |
499
507
  | `task-flow: run all` | **Complete** all tasks | Executes all pending tasks |
@@ -654,11 +662,17 @@ To update configs in an existing project:
654
662
  ```bash
655
663
  # Using NPM (recommended)
656
664
  cd /path/to/your/project
657
- rbin-task-flow update
658
665
 
659
- # To reset Task Flow from scratch, including .task-flow/.internal
666
+ # First install
667
+ rbin-task-flow init
668
+
669
+ # Upgrade package while keeping your tasks
670
+ npm install -g rbin-task-flow@latest
671
+ rbin-task-flow reset --keep-tasks
672
+ rbin-task-flow reset --keep-tasks --graphify
673
+
674
+ # Reset Task Flow from scratch (loses tasks)
660
675
  rbin-task-flow reset
661
- # With code knowledge graph (requires graphify on PATH):
662
676
  rbin-task-flow reset --graphify
663
677
 
664
678
  # Or using legacy method
package/bin/cli.js CHANGED
@@ -22,12 +22,16 @@ function addInstallCommand(name, description, extra = {}) {
22
22
  .option('-g, --graphify', 'Run graphify extract → .task-flow/guides/graphify-out/ (claude-cli backend; requires graphify CLI)')
23
23
  .option(
24
24
  '--profile <profile>',
25
- 'Cursor rules: minimal (2 always-on + skills) or standard (all rules); update without flag keeps .task-flow/install-meta.json'
25
+ 'Cursor rules: minimal (2 always-on + skills) or standard (all rules); reset without flag keeps .task-flow/install-meta.json'
26
26
  )
27
27
  .option(
28
28
  '--share-ai-config',
29
29
  'Do not gitignore .cursor/skills/ or .cursor/rules/ (team can commit shared AI config; see .gitignore comment)'
30
30
  )
31
+ .option(
32
+ '--keep-tasks',
33
+ 'Preserve tasks.input.txt, tasks.status.md, .internal/, and dev-logs/ on reset (upgrade package without losing task definitions)'
34
+ )
31
35
  .action(async (options) => {
32
36
  const targetPath = options.path || process.cwd();
33
37
  try {
@@ -39,6 +43,7 @@ function addInstallCommand(name, description, extra = {}) {
39
43
  graphify: options.graphify,
40
44
  profile,
41
45
  shareAiConfig,
46
+ keepTasks: options.keepTasks === true,
42
47
  });
43
48
  } catch (error) {
44
49
  console.error(chalk.red('\n' + error.message + '\n'));
@@ -48,7 +53,6 @@ function addInstallCommand(name, description, extra = {}) {
48
53
  }
49
54
 
50
55
  addInstallCommand('init', 'Initialize RBIN Task Flow in current directory');
51
- addInstallCommand('update', 'Update RBIN Task Flow in current directory', { update: true });
52
56
  addInstallCommand('reset', 'Reset RBIN Task Flow in current directory', { reset: true });
53
57
 
54
58
  program
@@ -93,9 +97,10 @@ program
93
97
  console.log(chalk.cyan(' rbin-task-flow init --profile minimal') + ' - Low-token install (2 always-on rules + skills)');
94
98
  console.log(chalk.cyan(' rbin-task-flow init --share-ai-config') + ' - Version .cursor/skills and rules in git');
95
99
  console.log(chalk.cyan(' rbin-task-flow init --graphify') + ' - Init + graphify extract --backend claude-cli (if CLI installed)');
96
- console.log(chalk.cyan(' rbin-task-flow update') + ' - Update configurations');
97
100
  console.log(chalk.cyan(' rbin-task-flow reset') + ' - Reset task flow files from scratch');
101
+ console.log(chalk.cyan(' rbin-task-flow reset --keep-tasks') + ' - Upgrade package without overwriting tasks');
98
102
  console.log(chalk.cyan(' rbin-task-flow reset --graphify') + ' - Reset + graphify extract --backend claude-cli (if CLI installed)');
103
+ console.log(chalk.cyan(' rbin-task-flow reset --keep-tasks --graphify') + ' - Upgrade + keep tasks + graphify extract');
99
104
  console.log(chalk.cyan(' rbin-task-flow version-check') + ' - Check for model updates');
100
105
  console.log(chalk.cyan(' rbin-task-flow estimate <ids>') + ' - Estimate time (e.g., "1" or "1,2" or "all")');
101
106
  console.log(chalk.cyan(' rbin-task-flow report <ids>') + ' - Generate report (e.g., "1" or "1,2" or "all")');
package/lib/cursor.js CHANGED
@@ -30,7 +30,7 @@ async function setupCursorIntegration(targetPath, options = {}) {
30
30
 
31
31
  if (profile === 'minimal') {
32
32
  showInfo('Minimal profile: 2 always-on rules; workflows via @task-flow-* skills only');
33
- showInfo('Full rules: rbin-task-flow update --profile standard');
33
+ showInfo('Full rules: rbin-task-flow reset --profile standard --keep-tasks');
34
34
  } else {
35
35
  showInfo('Rules: 2 always-on + intelligent/glob rules; prefer @task-flow-* skills for workflows');
36
36
  }
package/lib/install.js CHANGED
@@ -1,4 +1,5 @@
1
1
  const fs = require('fs-extra');
2
+ const os = require('os');
2
3
  const path = require('path');
3
4
  const chalk = require('chalk');
4
5
  const ora = require('ora');
@@ -23,7 +24,6 @@ const TEMPLATE_DIR = path.join(__dirname, '..');
23
24
  const PACKAGE_VERSION = require('../package.json').version;
24
25
 
25
26
  async function installInProject(targetPath, options = {}) {
26
- const isUpdate = options.update || false;
27
27
  const isReset = options.reset || false;
28
28
 
29
29
  let profile;
@@ -42,8 +42,6 @@ async function installInProject(targetPath, options = {}) {
42
42
 
43
43
  if (isReset) {
44
44
  console.log(chalk.blue('♻️ Resetting RBIN Task Flow...'));
45
- } else if (isUpdate) {
46
- console.log(chalk.blue('🔄 Updating RBIN Task Flow...'));
47
45
  } else {
48
46
  console.log(chalk.blue('🚀 Installing RBIN Task Flow...'));
49
47
  }
@@ -62,6 +60,12 @@ async function installInProject(targetPath, options = {}) {
62
60
  ? chalk.yellow('share-ai-config') + chalk.gray(' (.cursor/skills + .cursor/rules versionáveis)')
63
61
  : chalk.gray('local .cursor/ gitignored (default)')
64
62
  );
63
+ if (options.keepTasks) {
64
+ console.log(
65
+ chalk.blue('📋 Tasks:'),
66
+ chalk.yellow('keep-tasks') + chalk.gray(' (tasks.input.txt, tasks.status.md, .internal/, dev-logs/)')
67
+ );
68
+ }
65
69
  console.log('');
66
70
 
67
71
  const spinner = ora('Processing...').start();
@@ -81,8 +85,14 @@ async function installInProject(targetPath, options = {}) {
81
85
 
82
86
  spinner.text = 'Creating directories...';
83
87
 
88
+ let taskBackup = null;
89
+ const taskFlowPath = path.join(targetPath, '.task-flow');
90
+ if (isReset && options.keepTasks && (await fs.pathExists(taskFlowPath))) {
91
+ taskBackup = await backupTaskFiles(taskFlowPath);
92
+ }
93
+
84
94
  if (isReset) {
85
- await fs.remove(path.join(targetPath, '.task-flow'));
95
+ await fs.remove(taskFlowPath);
86
96
  }
87
97
 
88
98
  const dirs = [
@@ -100,7 +110,12 @@ async function installInProject(targetPath, options = {}) {
100
110
 
101
111
  spinner.text = 'Copying configuration files...';
102
112
 
103
- await copyConfigs(targetPath, { update: isUpdate, reset: isReset, profile });
113
+ await copyConfigs(targetPath, {
114
+ reset: isReset,
115
+ profile,
116
+ keepTasks: options.keepTasks === true,
117
+ taskBackup,
118
+ });
104
119
 
105
120
  spinner.text = 'Updating .gitignore...';
106
121
 
@@ -144,13 +159,12 @@ async function installInProject(targetPath, options = {}) {
144
159
  }
145
160
 
146
161
  async function copyConfigs(targetPath, options = {}) {
147
- const isUpdate = options.update || false;
148
162
  const isReset = options.reset || false;
149
163
  const profile = options.profile;
164
+ const taskBackup = options.taskBackup || null;
150
165
 
151
166
  const rulesResult = await copyCursorRules(targetPath, TEMPLATE_DIR, {
152
167
  profile,
153
- update: isUpdate,
154
168
  reset: isReset,
155
169
  });
156
170
  if (rulesResult?.mode === PROFILE_MINIMAL) {
@@ -200,7 +214,11 @@ async function copyConfigs(targetPath, options = {}) {
200
214
  showSuccess('Codex instructions (AGENTS.md)');
201
215
  }
202
216
 
203
- await copyTaskFlow(targetPath, { update: isUpdate, reset: isReset });
217
+ await copyTaskFlow(targetPath, {
218
+ reset: isReset,
219
+ keepTasks: options.keepTasks === true,
220
+ taskBackup,
221
+ });
204
222
  }
205
223
 
206
224
  const LEGACY_TASK_FLOW_ROOT_FILES = [
@@ -255,9 +273,55 @@ async function migrateLegacyTaskFlowLayout(taskFlowDest) {
255
273
  }
256
274
  }
257
275
 
276
+ async function backupTaskFiles(taskFlowDest) {
277
+ const backup = {};
278
+ const files = ['tasks.input.txt', 'tasks.status.md'];
279
+ for (const name of files) {
280
+ const filePath = path.join(taskFlowDest, name);
281
+ if (await fs.pathExists(filePath)) {
282
+ backup[name] = await fs.readFile(filePath, 'utf8');
283
+ }
284
+ }
285
+ const internalPath = path.join(taskFlowDest, '.internal');
286
+ if (await fs.pathExists(internalPath)) {
287
+ backup['.internal'] = await fs.mkdtemp(path.join(os.tmpdir(), 'rbin-task-flow-internal-'));
288
+ await fs.copy(internalPath, path.join(backup['.internal'], '.internal'));
289
+ }
290
+ const devLogsPath = path.join(taskFlowDest, 'dev-logs');
291
+ if (await fs.pathExists(devLogsPath)) {
292
+ backup['dev-logs'] = await fs.mkdtemp(path.join(os.tmpdir(), 'rbin-task-flow-dev-logs-'));
293
+ await fs.copy(devLogsPath, path.join(backup['dev-logs'], 'dev-logs'));
294
+ }
295
+ return backup;
296
+ }
297
+
298
+ async function restoreTaskFiles(taskFlowDest, backup) {
299
+ if (!backup) return;
300
+ for (const name of ['tasks.input.txt', 'tasks.status.md']) {
301
+ if (backup[name] !== undefined) {
302
+ await fs.writeFile(path.join(taskFlowDest, name), backup[name], 'utf8');
303
+ }
304
+ }
305
+ if (backup['.internal']) {
306
+ const src = path.join(backup['.internal'], '.internal');
307
+ if (await fs.pathExists(src)) {
308
+ await fs.copy(src, path.join(taskFlowDest, '.internal'), { overwrite: true });
309
+ }
310
+ await fs.remove(backup['.internal']);
311
+ }
312
+ if (backup['dev-logs']) {
313
+ const src = path.join(backup['dev-logs'], 'dev-logs');
314
+ if (await fs.pathExists(src)) {
315
+ await fs.copy(src, path.join(taskFlowDest, 'dev-logs'), { overwrite: true });
316
+ }
317
+ await fs.remove(backup['dev-logs']);
318
+ }
319
+ }
320
+
258
321
  async function copyTaskFlow(targetPath, options = {}) {
259
- const isUpdate = options.update || false;
260
322
  const isReset = options.reset || false;
323
+ const keepTasks = options.keepTasks === true;
324
+ const taskBackup = options.taskBackup || null;
261
325
  const taskFlowSrc = path.join(TEMPLATE_DIR, '.task-flow');
262
326
  const taskFlowDest = path.join(targetPath, '.task-flow');
263
327
 
@@ -271,11 +335,15 @@ async function copyTaskFlow(targetPath, options = {}) {
271
335
  path.join(taskFlowDest, 'tasks.status.md'),
272
336
  path.join(taskFlowDest, 'install-meta.json'),
273
337
  ];
338
+ const PRESERVED_KEEP_TASKS = [
339
+ path.join(taskFlowDest, 'tasks.input.txt'),
340
+ path.join(taskFlowDest, 'tasks.status.md'),
341
+ ];
274
342
 
275
343
  await fs.copy(taskFlowSrc, taskFlowDest, {
276
344
  overwrite: true,
277
345
  filter: (src, dest) => {
278
- if (isReset) {
346
+ if (isReset && !keepTasks) {
279
347
  return true;
280
348
  }
281
349
 
@@ -283,7 +351,11 @@ async function copyTaskFlow(targetPath, options = {}) {
283
351
  return false;
284
352
  }
285
353
 
286
- if (!isUpdate && PRESERVED_ON_INIT.includes(dest) && fs.existsSync(dest)) {
354
+ if (keepTasks && PRESERVED_KEEP_TASKS.includes(dest) && fs.existsSync(dest)) {
355
+ return false;
356
+ }
357
+
358
+ if (!isReset && !keepTasks && PRESERVED_ON_INIT.includes(dest) && fs.existsSync(dest)) {
287
359
  return false;
288
360
  }
289
361
 
@@ -291,15 +363,20 @@ async function copyTaskFlow(targetPath, options = {}) {
291
363
  },
292
364
  });
293
365
 
366
+ if (taskBackup) {
367
+ await restoreTaskFiles(taskFlowDest, taskBackup);
368
+ }
369
+
294
370
  await fs.ensureDir(path.join(taskFlowDest, 'contexts'));
371
+ await fs.ensureDir(path.join(taskFlowDest, 'dev-logs'));
295
372
  await fs.ensureDir(path.join(taskFlowDest, 'guides', 'reports'));
296
373
  await migrateLegacyTaskFlowLayout(taskFlowDest);
297
374
 
298
375
  showSuccess('Task Flow directory');
299
- if (isReset) {
376
+ if (keepTasks) {
377
+ showInfo('Kept: tasks.input.txt, tasks.status.md, .internal/, dev-logs/');
378
+ } else if (isReset) {
300
379
  showWarning('Reset completed: .task-flow was recreated from scratch');
301
- } else if (isUpdate) {
302
- showInfo('Protected: .internal/ (your task data is safe)');
303
380
  } else {
304
381
  showInfo('Protected on init: .internal/, tasks.input.txt, tasks.status.md');
305
382
  }
package/lib/profiles.js CHANGED
@@ -68,7 +68,7 @@ async function resolveProfile(targetPath, options = {}) {
68
68
  return PROFILE_STANDARD;
69
69
  }
70
70
 
71
- async function copyCursorRules(targetPath, templateDir, { profile, update, reset }) {
71
+ async function copyCursorRules(targetPath, templateDir, { profile, reset }) {
72
72
  const src = path.join(templateDir, '.cursor', 'rules');
73
73
  const dest = path.join(targetPath, '.cursor', 'rules');
74
74
 
@@ -76,7 +76,7 @@ async function copyCursorRules(targetPath, templateDir, { profile, update, reset
76
76
  return;
77
77
  }
78
78
 
79
- if ((update || reset) && fs.existsSync(dest)) {
79
+ if (reset && fs.existsSync(dest)) {
80
80
  await fs.emptyDir(dest);
81
81
  }
82
82
  await fs.ensureDir(dest);
package/lib/version.js CHANGED
@@ -97,7 +97,7 @@ async function checkModelVersion(modelName, versionInfo, settingsPath, rl) {
97
97
  }
98
98
  await fs.writeJSON(fullSettingsPath, settings, { spaces: 2 });
99
99
  console.log(chalk.green(` ✅ ${modelName} updated to ${versionInfo.latest}`));
100
- console.log(chalk.cyan(' (Repository template updated - run init/update on projects to apply)'));
100
+ console.log(chalk.cyan(' (Repository template updated - run init/reset on projects to apply)'));
101
101
  } else {
102
102
  console.log(chalk.cyan(' Skipped update'));
103
103
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rbin-task-flow",
3
- "version": "1.27.1",
3
+ "version": "1.30.1",
4
4
  "description": "AI-powered task management for Claude and Cursor",
5
5
  "main": "index.js",
6
6
  "bin": {