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.
- {taskai_cli-1.6.2 → taskai_cli-1.6.3}/DEVLOG.md +44 -0
- {taskai_cli-1.6.2 → taskai_cli-1.6.3}/DEVPLAN.md +127 -20
- {taskai_cli-1.6.2 → taskai_cli-1.6.3}/PKG-INFO +66 -27
- taskai_cli-1.6.3/README.md +163 -0
- taskai_cli-1.6.3/TRIAGE.md +135 -0
- taskai_cli-1.6.3/docs/.gitignore +6 -0
- taskai_cli-1.6.3/docs/_static/.gitkeep +0 -0
- taskai_cli-1.6.3/docs/ai-integration.md +87 -0
- taskai_cli-1.6.3/docs/browser-mode.md +29 -0
- taskai_cli-1.6.3/docs/commands.md +8 -0
- taskai_cli-1.6.3/docs/conf.py +117 -0
- taskai_cli-1.6.3/docs/configuration.md +32 -0
- taskai_cli-1.6.3/docs/getting-started.md +133 -0
- taskai_cli-1.6.3/docs/index.md +50 -0
- taskai_cli-1.6.3/docs/interactive-mode.md +23 -0
- taskai_cli-1.6.3/docs/item-data.md +37 -0
- taskai_cli-1.6.3/docs/managing-the-tree.md +72 -0
- taskai_cli-1.6.3/docs/requirements.txt +6 -0
- {taskai_cli-1.6.2 → taskai_cli-1.6.3}/pyproject.toml +1 -1
- {taskai_cli-1.6.2 → taskai_cli-1.6.3}/taskai/browser.py +3 -2
- {taskai_cli-1.6.2 → taskai_cli-1.6.3}/taskai/cli.py +77 -51
- taskai_cli-1.6.3/taskai/errors.py +9 -0
- taskai_cli-1.6.3/taskai/help_menu.py +111 -0
- {taskai_cli-1.6.2 → taskai_cli-1.6.3}/taskai/json_dir_database.py +13 -0
- {taskai_cli-1.6.2 → taskai_cli-1.6.3}/taskai/models.py +1 -1
- {taskai_cli-1.6.2 → taskai_cli-1.6.3}/taskai/services/ai.py +6 -7
- taskai_cli-1.6.3/taskai/services/repair_database.py +50 -0
- {taskai_cli-1.6.2 → taskai_cli-1.6.3}/taskai/static/canvas.js +126 -13
- {taskai_cli-1.6.2 → taskai_cli-1.6.3}/taskai/static/console.js +20 -0
- {taskai_cli-1.6.2 → taskai_cli-1.6.3}/taskai/static/editpanel.js +1 -8
- {taskai_cli-1.6.2 → taskai_cli-1.6.3}/taskai/views.py +0 -30
- taskai_cli-1.6.2/README.md +0 -124
- taskai_cli-1.6.2/docs/conf.py +0 -12
- taskai_cli-1.6.2/docs/index.rst +0 -8
- taskai_cli-1.6.2/docs/requirements.txt +0 -3
- taskai_cli-1.6.2/taskai/help_menu.py +0 -70
- taskai_cli-1.6.2/taskai/services/repair_database.py +0 -33
- {taskai_cli-1.6.2 → taskai_cli-1.6.3}/.github/workflows/publish-to-pypi.yml +0 -0
- {taskai_cli-1.6.2 → taskai_cli-1.6.3}/.gitignore +0 -0
- {taskai_cli-1.6.2 → taskai_cli-1.6.3}/.readthedocs.yaml +0 -0
- {taskai_cli-1.6.2 → taskai_cli-1.6.3}/scripts/bump_version.py +0 -0
- {taskai_cli-1.6.2 → taskai_cli-1.6.3}/taskai/config.py +0 -0
- {taskai_cli-1.6.2 → taskai_cli-1.6.3}/taskai/llm_models.py +0 -0
- {taskai_cli-1.6.2 → taskai_cli-1.6.3}/taskai/services/pomodoro.py +0 -0
- {taskai_cli-1.6.2 → taskai_cli-1.6.3}/taskai/services/user_setup.py +0 -0
- {taskai_cli-1.6.2 → taskai_cli-1.6.3}/taskai/static/index.html +0 -0
- {taskai_cli-1.6.2 → taskai_cli-1.6.3}/taskai/static/style.css +0 -0
- {taskai_cli-1.6.2 → taskai_cli-1.6.3}/test/test_cli.py +0 -0
- {taskai_cli-1.6.2 → taskai_cli-1.6.3}/test/test_execution.py +0 -0
- {taskai_cli-1.6.2 → taskai_cli-1.6.3}/test/test_json_dir_database.py +0 -0
- {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
|
|
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
|
-
-
|
|
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
|
-
- [
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
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:
|
|
339
|
-
|
|
340
|
-
console all funnel through one `/api/command` endpoint
|
|
341
|
-
read, as planned — that's the "less code" payoff of
|
|
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>` (
|
|
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
|
-
- [
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
"
|
|
508
|
-
|
|
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
|
|
513
|
-
|
|
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.
|
|
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
|
|
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
|
|
52
|
-
task
|
|
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
|
|
88
|
-
|
|
89
|
-
|
|
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-
|
|
128
|
+
task config set AI_MODEL <provider>/<model> # e.g. gemini/gemini-3.7-flash
|
|
93
129
|
```
|
|
94
130
|
|
|
95
131
|
---
|
|
96
132
|
|
|
97
|
-
##
|
|
133
|
+
## Web UI
|
|
98
134
|
|
|
99
|
-
```
|
|
100
|
-
task
|
|
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
|
-
|
|
139
|
+
Launches a local web server with a canvas view of your item tree:
|
|
111
140
|
|
|
112
|
-
|
|
113
|
-
task
|
|
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
|
-
##
|
|
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.
|