taskai-cli 1.6.2__tar.gz → 1.6.3__tar.gz

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.
Files changed (51) hide show
  1. {taskai_cli-1.6.2 → taskai_cli-1.6.3}/DEVLOG.md +44 -0
  2. {taskai_cli-1.6.2 → taskai_cli-1.6.3}/DEVPLAN.md +127 -20
  3. {taskai_cli-1.6.2 → taskai_cli-1.6.3}/PKG-INFO +66 -27
  4. taskai_cli-1.6.3/README.md +163 -0
  5. taskai_cli-1.6.3/TRIAGE.md +135 -0
  6. taskai_cli-1.6.3/docs/.gitignore +6 -0
  7. taskai_cli-1.6.3/docs/_static/.gitkeep +0 -0
  8. taskai_cli-1.6.3/docs/ai-integration.md +87 -0
  9. taskai_cli-1.6.3/docs/browser-mode.md +29 -0
  10. taskai_cli-1.6.3/docs/commands.md +8 -0
  11. taskai_cli-1.6.3/docs/conf.py +117 -0
  12. taskai_cli-1.6.3/docs/configuration.md +32 -0
  13. taskai_cli-1.6.3/docs/getting-started.md +133 -0
  14. taskai_cli-1.6.3/docs/index.md +50 -0
  15. taskai_cli-1.6.3/docs/interactive-mode.md +23 -0
  16. taskai_cli-1.6.3/docs/item-data.md +37 -0
  17. taskai_cli-1.6.3/docs/managing-the-tree.md +72 -0
  18. taskai_cli-1.6.3/docs/requirements.txt +6 -0
  19. {taskai_cli-1.6.2 → taskai_cli-1.6.3}/pyproject.toml +1 -1
  20. {taskai_cli-1.6.2 → taskai_cli-1.6.3}/taskai/browser.py +3 -2
  21. {taskai_cli-1.6.2 → taskai_cli-1.6.3}/taskai/cli.py +77 -51
  22. taskai_cli-1.6.3/taskai/errors.py +9 -0
  23. taskai_cli-1.6.3/taskai/help_menu.py +111 -0
  24. {taskai_cli-1.6.2 → taskai_cli-1.6.3}/taskai/json_dir_database.py +13 -0
  25. {taskai_cli-1.6.2 → taskai_cli-1.6.3}/taskai/models.py +1 -1
  26. {taskai_cli-1.6.2 → taskai_cli-1.6.3}/taskai/services/ai.py +6 -7
  27. taskai_cli-1.6.3/taskai/services/repair_database.py +50 -0
  28. {taskai_cli-1.6.2 → taskai_cli-1.6.3}/taskai/static/canvas.js +126 -13
  29. {taskai_cli-1.6.2 → taskai_cli-1.6.3}/taskai/static/console.js +20 -0
  30. {taskai_cli-1.6.2 → taskai_cli-1.6.3}/taskai/static/editpanel.js +1 -8
  31. {taskai_cli-1.6.2 → taskai_cli-1.6.3}/taskai/views.py +0 -30
  32. taskai_cli-1.6.2/README.md +0 -124
  33. taskai_cli-1.6.2/docs/conf.py +0 -12
  34. taskai_cli-1.6.2/docs/index.rst +0 -8
  35. taskai_cli-1.6.2/docs/requirements.txt +0 -3
  36. taskai_cli-1.6.2/taskai/help_menu.py +0 -70
  37. taskai_cli-1.6.2/taskai/services/repair_database.py +0 -33
  38. {taskai_cli-1.6.2 → taskai_cli-1.6.3}/.github/workflows/publish-to-pypi.yml +0 -0
  39. {taskai_cli-1.6.2 → taskai_cli-1.6.3}/.gitignore +0 -0
  40. {taskai_cli-1.6.2 → taskai_cli-1.6.3}/.readthedocs.yaml +0 -0
  41. {taskai_cli-1.6.2 → taskai_cli-1.6.3}/scripts/bump_version.py +0 -0
  42. {taskai_cli-1.6.2 → taskai_cli-1.6.3}/taskai/config.py +0 -0
  43. {taskai_cli-1.6.2 → taskai_cli-1.6.3}/taskai/llm_models.py +0 -0
  44. {taskai_cli-1.6.2 → taskai_cli-1.6.3}/taskai/services/pomodoro.py +0 -0
  45. {taskai_cli-1.6.2 → taskai_cli-1.6.3}/taskai/services/user_setup.py +0 -0
  46. {taskai_cli-1.6.2 → taskai_cli-1.6.3}/taskai/static/index.html +0 -0
  47. {taskai_cli-1.6.2 → taskai_cli-1.6.3}/taskai/static/style.css +0 -0
  48. {taskai_cli-1.6.2 → taskai_cli-1.6.3}/test/test_cli.py +0 -0
  49. {taskai_cli-1.6.2 → taskai_cli-1.6.3}/test/test_execution.py +0 -0
  50. {taskai_cli-1.6.2 → taskai_cli-1.6.3}/test/test_json_dir_database.py +0 -0
  51. {taskai_cli-1.6.2 → taskai_cli-1.6.3}/test/test_view.py +0 -0
@@ -1,3 +1,47 @@
1
+ # 8-29
2
+
3
+ Worked the TRIAGE backlog, then built out the docs.
4
+
5
+ TRIAGE fixes:
6
+ - **Critical:** `_find_model_by_stringmatch` inverted `{id: name}` -> `{name:
7
+ id}`, silently collapsing duplicate names to one arbitrary id (so
8
+ update/delete-by-name could hit the wrong item). Now collects every
9
+ fnmatch hit; one resolves, zero -> `None`, 2+ -> `throw_error` listing the
10
+ ids. Also gave `throw_error` a `verbose` flag so it stops dumping
11
+ `args=/kwargs=` on every error.
12
+ - Added `task unlink {parent} {item}` (mirrors `add_link`).
13
+ - Stripped the dead `for record_type in [TodoItem, Comment]` loop in
14
+ `_find_model_by_stringmatch` and the now-unused `Comment` import.
15
+ - `show_examples()` now prints a real `help_examples` string (via `task
16
+ examples`); removed the redundant `task show examples` branch.
17
+
18
+ Browser: soft links (`linked_ids`) now render as "shadow" nodes — a ghost
19
+ copy of the linked item as an extra child under the linking node (~0.92
20
+ alpha, flat, dashed grey border, italic, `↗` glyph, real id). Edge to it is
21
+ dashed grey with a gradient stroke that goes transparent inside either node.
22
+ Selecting/editing a shadow acts on the real item (`itemForNode` -> `realId`).
23
+
24
+ Docs: README synced with `execute_commands` and given a `task setup`
25
+ walkthrough + Web UI section; `help_menu.py` gained `task browser` / `task
26
+ help` and lost its stale "requires id, not name" grouping (everything takes
27
+ id-or-name now). Then turned `docs/` into a real Read the Docs site — Sphinx
28
+ + MyST + Furo, dynamic version, a `builder-inited` hook that dumps
29
+ `help_general` and the provider table to git-ignored `_generated/` files so
30
+ the reference pages can't drift. Pages (all `.md`): index (gif placeholder +
31
+ feature bullets), getting-started, configuration, managing-the-tree,
32
+ item-data, interactive-mode, browser-mode, ai-integration, commands. No
33
+ caveats/notes in user pages — gaps went to TRIAGE (`dependency_ids`
34
+ unreachable from the CLI; interactive-REPL staleness).
35
+
36
+ DEVPLAN: added Phases 4-7 (browser improvements: comments, big description
37
+ editor, keyboard shortcuts + left panel; CLI view expansion + config keys;
38
+ comprehensive testing; advertising).
39
+
40
+ Still open in TRIAGE: multi-word unquoted input (design-blocked), `task
41
+ browser` `[port]`, the two gaps above.
42
+
43
+ ---
44
+
1
45
  # 8-22
2
46
 
3
47
  Found and fixed a real bug from the `litellm` migration earlier today: it
@@ -57,7 +57,7 @@ is why `taskai/browser.py` reuses `from taskai.cli import db` rather than
57
57
  opening a second connection.
58
58
 
59
59
  **Views.** [taskai/views.py](taskai/views.py): Rich-based tree rendering
60
- (`view_lists`, `view_item`, `view_items`), display format configurable via
60
+ (`view_lists`, `view_item`), display format configurable via
61
61
  `DISPLAY_STRING`/`DISPLAY_COLORS`.
62
62
 
63
63
  **AI services.** [taskai/services/ai.py](taskai/services/ai.py):
@@ -90,9 +90,12 @@ unless you're told to fix them):**
90
90
  name-only-duplicate methods (`show_by_item_name`, `delete_item_by_name`)
91
91
  and several inline `_is_int(...)` dispatch branches in `execute_commands`
92
92
  were deleted outright rather than kept alongside the id path.
93
- - `task show <id1>,<id2>,...` is documented in the README but
93
+ - ~~`task show <id1>,<id2>,...` is documented in the README but
94
94
  `execute_commands`'s `show` case never dispatches to
95
- `Controller.show_items`/`view_items` — there's no wired path to it.
95
+ `Controller.show_items`/`view_items` — there's no wired path to it.~~
96
+ Removed rather than wired up — `Controller.show_items` and `view_items`
97
+ are gone (CLI audit, see DEVLOG); `task show` only ever takes one target
98
+ now.
96
99
  - `Controller.update_item` never calls `Controller._parse_item_kwargs`
97
100
  (`create_item` does) before handing kwargs to `db.update_item`. Confirmed
98
101
  effects: `update <id> --due_by MM-DD-YYYY` throws a pydantic validation
@@ -250,10 +253,25 @@ stdlib `http.server` — no new dependency, consistent with "less code."
250
253
 
251
254
  ### 1.4 — DAG view (v2: full graph + interaction)
252
255
 
253
- - [ ] Draw `dependency_ids` and `linked_ids` as a second edge style (dashed
254
- / different color) layered on top of the tree edges this is what
255
- makes it a DAG rather than just a tree view. Still open — only
256
- parent/child tree edges render today.
256
+ - [~] **`linked_ids` done as "shadow" nodes; `dependency_ids` still
257
+ deferred to 2.0.** A soft link renders as a lightweight *ghost copy*
258
+ of the linked item, placed as an extra child under the linking node
259
+ (`buildShadowNode` in `canvas.js` non-recursing, carries `realId`
260
+ back to the true item; `buildTree` appends one per `linked_ids`
261
+ entry). It's styled subtly apart from a real placement: ~0.92 alpha,
262
+ no drop shadow, dashed grey border, italic label, an `↗` glyph
263
+ top-right (the one colour accent), and it shows the linked item's
264
+ real id rather than the synthetic shadow id. The parent→shadow edge
265
+ is dashed and uncoloured — grey, the dash pattern alone distinguishes
266
+ it from the solid tree edges — and drawn with a gradient stroke that
267
+ goes fully transparent inside either node's square so it never
268
+ crosses node content (`drawLinkEdges`); solid-edge drawing
269
+ (`drawLines`) skips shadow children. Selecting or editing a shadow
270
+ acts on the real item (`itemForNode` resolves `realId`), so the edit
271
+ panel and `update` commands hit the true record. `dependency_ids` edges are still not drawn — and `task
272
+ depend` was itself removed from the CLI in an earlier audit pass, so
273
+ there's no dependency data being created right now anyway; revisit
274
+ both together in 2.0.
257
275
  - [x] Pan (drag) and zoom (wheel) — done via canvas context transforms
258
276
  (`ctx.translate`/`ctx.scale` + a `view` state object), not SVG
259
277
  `viewBox`, same toolchain reasoning as above. Zoom keeps the point
@@ -335,11 +353,11 @@ purpose, current call.
335
353
  of expecting text output.
336
354
  - [ ] Up-arrow history — still open, not done.
337
355
 
338
- At the end of Phase 1: dependency/link edges (1.4) and up-arrow console
339
- history (1.6) are the only pieces left open. The DAG, edit panel, and
340
- console all funnel through one `/api/command` endpoint and one `/api/tree`
341
- read, as planned — that's the "less code" payoff of routing everything
342
- through the existing `Controller`.
356
+ At the end of Phase 1: up-arrow console history (1.6) is the only piece
357
+ left open (dependency/link edges (1.4) deferred to 2.0, see above). The
358
+ DAG, edit panel, and console all funnel through one `/api/command` endpoint
359
+ and one `/api/tree` read, as planned — that's the "less code" payoff of
360
+ routing everything through the existing `Controller`.
343
361
 
344
362
  ---
345
363
 
@@ -459,7 +477,10 @@ like Flash-Lite.
459
477
  - [x] Updated README's Config section to match the new `AI_MODEL`
460
478
  `provider/model` shape and point at `task setup`.
461
479
 
462
- ### 2.4 — `task ai agent <prompt>` (later — real tool-calling loop)
480
+ ### 2.4 — `task ai agent <prompt>` (deferred to 2.0 — real tool-calling loop)
481
+
482
+ **Deferred to 2.0.** Out of scope for the current polish pass; revisit as
483
+ part of the larger 2.0 rework rather than squeezing it in here.
463
484
 
464
485
  A separate entry point, not a replacement for `task ai`. `task ai <prompt>`
465
486
  stays the fast, ungated, one-shot-plan-and-execute path from 2.1-2.3;
@@ -501,15 +522,101 @@ Re-scope this section before starting 2.4.
501
522
  `editmenu.js`) and delete anything exploratory left over from getting
502
523
  the DAG layout working. Still no bundler — just multiple `<script>`
503
524
  tags loaded in order.
504
- - [ ] **Minimalist docs.** A short "Web UI" section in the README (how to
505
- run `task web`, one screenshot) covers most of it; only split into a
506
- separate `docs/` page if the README starts feeling long. Keep the
507
- "less code" principle applied to prose too this doesn't need to be
508
- exhaustive.
525
+ - [~] **Docs.** README is synced with `execute_commands` (command list,
526
+ `task ai` flags, Web UI section, `task setup` walkthrough);
527
+ `help_menu.py` lists `task browser` / `task help`, and its stale
528
+ "requires id, not name" grouping was corrected (every item-taking
529
+ command resolves id-or-name via `_resolve_item` now). Grew past a
530
+ README-only scope into a proper Read the Docs site under `docs/`
531
+ (Sphinx + MyST + Furo).
532
+ **Built:** `conf.py` rebuilt (dynamic version from pyproject, Furo,
533
+ copybutton, sphinx-design; a `builder-inited` hook dumps `help_general`
534
+ and the `PROVIDER_ENV_VARS` table to git-ignored files under
535
+ `docs/_generated/` so the reference/config content can't drift from
536
+ source). Pages, all `.md`: `index` (gif placeholder + "what you can
537
+ do" + toctree), `getting-started`, `configuration`,
538
+ `managing-the-tree`, `item-data`, `interactive-mode`, `browser-mode`,
539
+ `ai-integration`, `commands` (`literalinclude` of the generated help
540
+ text). No "notes"/caveats in any user page — gaps go to TRIAGE
541
+ instead. README links to the site.
542
+ **Still open:** replace `docs/_static/demo.gif` placeholder with a real
543
+ recording; confirm the RTD project slug (assumed `taskai` in `conf.py`
544
+ `html_baseurl` + README); explanation/architecture pages; polish
545
+ (screenshots for browser-mode, custom 404, OpenGraph cards, CI
546
+ `linkcheck`, tested examples, changelog).
509
547
  - [ ] **UX pass.** Empty/loading state for the DAG when a user has no tasks
510
548
  yet (currently the app would just render nothing); a keyboard shortcut
511
549
  to toggle the console (e.g. backtick); consistent spacing/typography
512
- in `style.css`; visual legend distinguishing tree edges from
513
- dependency/link edges.
550
+ in `style.css`. (Edge legend dropped depended on 1.4's dependency/
551
+ link edges, now deferred to 2.0.)
514
552
  - [ ] Re-check the Phase 0 fixes are still holding once the web UI is
515
553
  exercising more command paths than the CLI alone did.
554
+
555
+ ---
556
+
557
+ ## Phase 4 — Browser view improvements
558
+
559
+ Builds on Phase 1's canvas / edit panel / console. Still plain HTML/CSS/JS, no
560
+ framework, everything routed through the existing `/api/tree` + `/api/command`
561
+ endpoints.
562
+
563
+ - [ ] **Show comments.** Items carry `comment_ids` but the browser never
564
+ surfaces them. Render an item's comments in the edit panel — read-only
565
+ list at minimum; adding one posts `comment <id> <text>` through
566
+ `/api/command` like every other field. Consider a comment-count
567
+ affordance on the canvas node itself.
568
+ - [ ] **Much larger description editor.** The `description` field in the edit
569
+ panel is a small single-line-ish input today. Make it a real multi-line
570
+ textarea that dominates the panel (large fixed height or auto-grow), so
571
+ the panel is usable for actual note-taking — likely widen the panel
572
+ itself while a node is selected.
573
+ - [ ] **Keyboard shortcuts + a shortcuts panel.** Add real key bindings
574
+ (toggle console, toggle edit panel, complete / delete the selected
575
+ node, deselect, focus a search box, zoom/pan, …) and a **left-hand
576
+ panel listing them**, mirroring the right-hand edit panel and
577
+ collapsible the same way. Follow the existing `STYLE` object +
578
+ collapsible-panel machinery (`setRightPanelWidth`); this adds a left
579
+ equivalent. Supersedes the single console-toggle shortcut noted in
580
+ Phase 3's UX pass.
581
+
582
+ ---
583
+
584
+ ## Phase 5 — CLI view
585
+
586
+ - [ ] **Expand what `task show` renders, and its options.** Exact scope TBD —
587
+ needs a working session with Alex to pin down. Candidates: filter by
588
+ status / priority / completion, depth limits, flat vs. tree layout,
589
+ sort order, inline comments / links, format and colour toggles. Prompt
590
+ before implementing.
591
+ - [ ] **New view-settings config keys.** Extend `CLIConfig` (today just
592
+ `DISPLAY_STRING` / `DISPLAY_COLORS`) with keys backing whatever the
593
+ expanded view supports; document them in `docs/configuration.md` and
594
+ `help_menu.py` alongside the existing ones.
595
+
596
+ ---
597
+
598
+ ## Phase 6 — Comprehensive testing & bugfixing
599
+
600
+ - [ ] **Broaden the test suite.** Currently 7 tests across `test_cli.py` /
601
+ `test_execution.py` / `test_json_dir_database.py` / `test_view.py`.
602
+ Cover every `execute_commands` branch, id/name resolution (including
603
+ the multi-match error path), `_parse_item_kwargs`, the browser
604
+ endpoints (`/api/tree`, `/api/command`), and the AI command-execution
605
+ loop with a mocked LLM.
606
+ - [ ] **Fix what the tests surface**, and clear the still-open TRIAGE items
607
+ as they come up (multi-word unquoted input, `task browser` `[port]`,
608
+ `dependency_ids` reachability, interactive-REPL staleness).
609
+ - [ ] **Wire CI.** `pytest` on every PR, plus `sphinx-build -W` +
610
+ `linkcheck` for the docs.
611
+
612
+ ---
613
+
614
+ ## Phase 7 — Advertising
615
+
616
+ - [ ] Get the docs site live: confirm the Read the Docs slug, record the
617
+ `docs/_static/demo.gif` terminal demo.
618
+ - [ ] Polish the PyPI listing — `pyproject.toml` has an empty `description`
619
+ and no keywords / classifiers / project URLs.
620
+ - [ ] Write a short "show and tell" (what it is, the everything-is-an-item
621
+ model, the AI layer, the canvas view) built around the gif, and decide
622
+ on channels (Show HN, r/commandline, r/productivity, GitHub topics).
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: taskai-cli
3
- Version: 1.6.2
3
+ Version: 1.6.3
4
4
  Author-email: Alex Paskal <alexcpaskal@gmail.com>
5
5
  Requires-Python: >=3.12
6
6
  Requires-Dist: fastapi>=0.141.1
@@ -15,6 +15,8 @@ Description-Content-Type: text/markdown
15
15
 
16
16
  A command-line task manager with AI features.
17
17
 
18
+ 📖 **Full documentation:** <https://taskai.readthedocs.io>
19
+
18
20
  ```bash
19
21
  pip install taskai-cli
20
22
  ```
@@ -32,10 +34,11 @@ task setup
32
34
 
33
35
  ```
34
36
  task interactive mode
37
+ task help show every command
38
+ task examples worked command sequences for common workflows
35
39
 
36
40
  task show all show everything
37
41
  task show <id|name> show a specific item
38
- task show <id1>,<id2>,... show multiple items
39
42
 
40
43
  task create <name> create a top-level item
41
44
  task add <parent> <name> add a child item
@@ -44,27 +47,31 @@ task rename <id> <new name> rename an item
44
47
  task move <item> <new parent> reparent an item
45
48
  task complete <id> mark complete (recursive)
46
49
  task delete <id|name> delete by id or name
47
- task delete completed delete all completed items
50
+ task clear delete all completed items
48
51
  task clear <parent> delete completed under a parent
49
52
 
50
53
  task comment <id> <text> add a comment
51
- task depend <src_id> <dst_id> src depends on dst
52
- task link <parent> <item> soft-link two items
54
+ task link <parent> <item> soft-link an item under a second parent
55
+ task unlink <parent> <item> remove a soft-link
53
56
  task reorder <id1> before|after <id2>
54
57
 
55
58
  task status <id> <text> set a status string
56
59
  task pomo <on_mins> <off_mins> pomodoro timer
57
60
 
58
61
  task ai <prompt> natural language → commands
62
+ --context <path[,path...]> fold file contents into the prompt
63
+ --reasoning <level> model thinking effort: minimal|low|medium|high|disable|none
59
64
  task ai headstart <id> AI suggests next step, saved as comment
60
65
 
66
+ task browser launch the web UI (see below)
67
+
61
68
  task config show list current config
62
69
  task config set <key> <value> set a config value
63
70
  task config get <key> get a config value
64
71
  task config pop <key> remove a config value
65
72
 
66
73
  task repair repair the database
67
- task nuke delete all data
74
+ task nuke delete all data (asks to confirm)
68
75
  ```
69
76
 
70
77
  ### Item fields
@@ -78,44 +85,68 @@ Pass any of these as `--field value` to `create`, `add`, or `update`:
78
85
  | `priority` | integer | `--priority 2` |
79
86
  | `status` | string | `--status "in progress"` |
80
87
  | `completed` | bool | `--completed true` |
81
- | `depends_on` | comma-separated ids | `--depends_on 3,7` |
82
88
 
83
89
  ---
84
90
 
85
91
  ## Config
86
92
 
87
- AI features require a model, set as a `provider/model` string (via [litellm](https://github.com/BerriAI/litellm)),
88
- plus that provider's credentials set as environment variables (e.g. `GEMINI_API_KEY`, `OPENAI_API_KEY`).
89
- `task setup` will walk you through picking a provider and model and tell you which env vars it needs.
93
+ AI features need a model. `task setup` walks you through choosing a provider
94
+ and model, then tells you which environment variable(s) to set:
95
+
96
+ ```text
97
+ $ task setup
98
+ Beginning setup
99
+ 1. openai
100
+ 2. anthropic
101
+ 3. gemini
102
+ 4. vertex_ai
103
+ 5. groq
104
+ ...
105
+ 20. ollama
106
+
107
+ Select a provider (number or name): 3
108
+ 1. gemini-3.7-flash
109
+ 2. gemini-3.1-pro-preview
110
+ 3. gemini-3.6-flash
111
+ 4. gemini-3.5-flash-lite
112
+ 5. gemini-2.5-pro
113
+
114
+ Select a model for 'gemini' (number or name): 1
115
+ Storing: gemini/gemini-3.7-flash
116
+ Make sure these environment variables are set:
117
+ GEMINI_API_KEY
118
+ Setup complete! Use 'task config set|get|list' to interact with your configuration options
119
+ ```
120
+
121
+ Either prompt also accepts free-typed text, so you can pick a model newer than
122
+ the built-in menu.
123
+
124
+ Or set it directly — a `provider/model` string, using
125
+ [litellm](https://github.com/BerriAI/litellm)'s naming:
90
126
 
91
127
  ```bash
92
- task config set AI_MODEL gemini/gemini-2.0-flash
128
+ task config set AI_MODEL <provider>/<model> # e.g. gemini/gemini-3.7-flash
93
129
  ```
94
130
 
95
131
  ---
96
132
 
97
- ## Example
133
+ ## Web UI
98
134
 
99
- ```
100
- task create "Today"
101
- task add "Today" "Morning run"
102
- task add "Today" "Review pull requests" --status "blocked"
103
- task add "Today" "Call dentist" --due_by 08-02-2026
104
- task show "Today"
105
- task complete 4
106
- task show "Today"
107
- task exit
135
+ ```bash
136
+ task browser
108
137
  ```
109
138
 
110
- Or:
139
+ Launches a local web server with a canvas view of your item tree:
111
140
 
112
- ```bash
113
- task ai "add a task called 'Reply to Alex' under Today, and mark the dentist task as done"
114
- ```
141
+ - **pan / zoom** the graph; completed items are tinted green, and soft-links
142
+ (`task link`) show as dashed "shadow" copies under their host item
143
+ - **click a node** to open an edit panel — each field writes back immediately,
144
+ there's no save button
145
+ - **console** at the bottom for typing raw `task` commands against the same data
115
146
 
116
147
  ---
117
148
 
118
- ## Another Example
149
+ ## Examples
119
150
 
120
151
  ```bash
121
152
  task create "Launch website"
@@ -134,4 +165,12 @@ task ai headstart 3
134
165
  # mark something done and clean up
135
166
  task complete 2
136
167
  task clear "Launch website"
137
- ```
168
+ ```
169
+
170
+ Or drive it entirely from a prompt:
171
+
172
+ ```bash
173
+ task ai "add a task called 'Reply to Alex' under Launch website, and mark the hosting task as done"
174
+ ```
175
+
176
+ Run `task examples` for more worked sequences.
@@ -0,0 +1,163 @@
1
+ # taskai
2
+
3
+ A command-line task manager with AI features.
4
+
5
+ 📖 **Full documentation:** <https://taskai.readthedocs.io>
6
+
7
+ ```bash
8
+ pip install taskai-cli
9
+ ```
10
+
11
+ ---
12
+
13
+ ## Setup
14
+
15
+ ```bash
16
+ task setup
17
+ ```
18
+ ---
19
+
20
+ ## Commands
21
+
22
+ ```
23
+ task interactive mode
24
+ task help show every command
25
+ task examples worked command sequences for common workflows
26
+
27
+ task show all show everything
28
+ task show <id|name> show a specific item
29
+
30
+ task create <name> create a top-level item
31
+ task add <parent> <name> add a child item
32
+ task update <id> --field value update any field
33
+ task rename <id> <new name> rename an item
34
+ task move <item> <new parent> reparent an item
35
+ task complete <id> mark complete (recursive)
36
+ task delete <id|name> delete by id or name
37
+ task clear delete all completed items
38
+ task clear <parent> delete completed under a parent
39
+
40
+ task comment <id> <text> add a comment
41
+ task link <parent> <item> soft-link an item under a second parent
42
+ task unlink <parent> <item> remove a soft-link
43
+ task reorder <id1> before|after <id2>
44
+
45
+ task status <id> <text> set a status string
46
+ task pomo <on_mins> <off_mins> pomodoro timer
47
+
48
+ task ai <prompt> natural language → commands
49
+ --context <path[,path...]> fold file contents into the prompt
50
+ --reasoning <level> model thinking effort: minimal|low|medium|high|disable|none
51
+ task ai headstart <id> AI suggests next step, saved as comment
52
+
53
+ task browser launch the web UI (see below)
54
+
55
+ task config show list current config
56
+ task config set <key> <value> set a config value
57
+ task config get <key> get a config value
58
+ task config pop <key> remove a config value
59
+
60
+ task repair repair the database
61
+ task nuke delete all data (asks to confirm)
62
+ ```
63
+
64
+ ### Item fields
65
+
66
+ Pass any of these as `--field value` to `create`, `add`, or `update`:
67
+
68
+ | Field | Format | Example |
69
+ |---|---|---|
70
+ | `description` | string | `--description "needs review"` |
71
+ | `due_by` | MM-DD-YYYY | `--due_by 08-15-2026` |
72
+ | `priority` | integer | `--priority 2` |
73
+ | `status` | string | `--status "in progress"` |
74
+ | `completed` | bool | `--completed true` |
75
+
76
+ ---
77
+
78
+ ## Config
79
+
80
+ AI features need a model. `task setup` walks you through choosing a provider
81
+ and model, then tells you which environment variable(s) to set:
82
+
83
+ ```text
84
+ $ task setup
85
+ Beginning setup
86
+ 1. openai
87
+ 2. anthropic
88
+ 3. gemini
89
+ 4. vertex_ai
90
+ 5. groq
91
+ ...
92
+ 20. ollama
93
+
94
+ Select a provider (number or name): 3
95
+ 1. gemini-3.7-flash
96
+ 2. gemini-3.1-pro-preview
97
+ 3. gemini-3.6-flash
98
+ 4. gemini-3.5-flash-lite
99
+ 5. gemini-2.5-pro
100
+
101
+ Select a model for 'gemini' (number or name): 1
102
+ Storing: gemini/gemini-3.7-flash
103
+ Make sure these environment variables are set:
104
+ GEMINI_API_KEY
105
+ Setup complete! Use 'task config set|get|list' to interact with your configuration options
106
+ ```
107
+
108
+ Either prompt also accepts free-typed text, so you can pick a model newer than
109
+ the built-in menu.
110
+
111
+ Or set it directly — a `provider/model` string, using
112
+ [litellm](https://github.com/BerriAI/litellm)'s naming:
113
+
114
+ ```bash
115
+ task config set AI_MODEL <provider>/<model> # e.g. gemini/gemini-3.7-flash
116
+ ```
117
+
118
+ ---
119
+
120
+ ## Web UI
121
+
122
+ ```bash
123
+ task browser
124
+ ```
125
+
126
+ Launches a local web server with a canvas view of your item tree:
127
+
128
+ - **pan / zoom** the graph; completed items are tinted green, and soft-links
129
+ (`task link`) show as dashed "shadow" copies under their host item
130
+ - **click a node** to open an edit panel — each field writes back immediately,
131
+ there's no save button
132
+ - **console** at the bottom for typing raw `task` commands against the same data
133
+
134
+ ---
135
+
136
+ ## Examples
137
+
138
+ ```bash
139
+ task create "Launch website"
140
+
141
+ # add subtasks (by name or id)
142
+ task add "Launch website" "Write copy"
143
+ task add "Launch website" "Design mockups" --priority 1
144
+ task add "Launch website" "Set up hosting" --due_by 08-15-2026
145
+
146
+ # check your work
147
+ task show "Launch website"
148
+
149
+ # ask AI what to do first on a specific task
150
+ task ai headstart 3
151
+
152
+ # mark something done and clean up
153
+ task complete 2
154
+ task clear "Launch website"
155
+ ```
156
+
157
+ Or drive it entirely from a prompt:
158
+
159
+ ```bash
160
+ task ai "add a task called 'Reply to Alex' under Launch website, and mark the hosting task as done"
161
+ ```
162
+
163
+ Run `task examples` for more worked sequences.